conventions.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Gengkun He @ahabhgk
  4. */
  5. "use strict";
  6. /** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */
  7. // Copy from css-loader
  8. /**
  9. * @param {string} string string
  10. * @returns {string} result
  11. */
  12. const preserveCamelCase = string => {
  13. let result = string;
  14. let isLastCharLower = false;
  15. let isLastCharUpper = false;
  16. let isLastLastCharUpper = false;
  17. for (let i = 0; i < result.length; i++) {
  18. const character = result[i];
  19. if (isLastCharLower && /[\p{Lu}]/u.test(character)) {
  20. result = `${result.slice(0, i)}-${result.slice(i)}`;
  21. isLastCharLower = false;
  22. isLastLastCharUpper = isLastCharUpper;
  23. isLastCharUpper = true;
  24. i += 1;
  25. } else if (
  26. isLastCharUpper &&
  27. isLastLastCharUpper &&
  28. /[\p{Ll}]/u.test(character)
  29. ) {
  30. result = `${result.slice(0, i - 1)}-${result.slice(i - 1)}`;
  31. isLastLastCharUpper = isLastCharUpper;
  32. isLastCharUpper = false;
  33. isLastCharLower = true;
  34. } else {
  35. isLastCharLower =
  36. character.toLowerCase() === character &&
  37. character.toUpperCase() !== character;
  38. isLastLastCharUpper = isLastCharUpper;
  39. isLastCharUpper =
  40. character.toUpperCase() === character &&
  41. character.toLowerCase() !== character;
  42. }
  43. }
  44. return result;
  45. };
  46. // Copy from css-loader
  47. /**
  48. * @param {string} input input
  49. * @returns {string} result
  50. */
  51. module.exports.camelCase = input => {
  52. let result = input.trim();
  53. if (result.length === 0) {
  54. return "";
  55. }
  56. if (result.length === 1) {
  57. return result.toLowerCase();
  58. }
  59. const hasUpperCase = result !== result.toLowerCase();
  60. if (hasUpperCase) {
  61. result = preserveCamelCase(result);
  62. }
  63. return result
  64. .replace(/^[_.\- ]+/, "")
  65. .toLowerCase()
  66. .replace(/[_.\- ]+([\p{Alpha}\p{N}_]|$)/gu, (_, p1) => p1.toUpperCase())
  67. .replace(/\d+([\p{Alpha}\p{N}_]|$)/gu, m => m.toUpperCase());
  68. };
  69. /**
  70. * @param {string} input input
  71. * @param {CssGeneratorExportsConvention | undefined} convention convention
  72. * @returns {string[]} results
  73. */
  74. module.exports.cssExportConvention = (input, convention) => {
  75. const set = new Set();
  76. if (typeof convention === "function") {
  77. set.add(convention(input));
  78. } else {
  79. switch (convention) {
  80. case "camel-case": {
  81. set.add(input);
  82. set.add(module.exports.camelCase(input));
  83. break;
  84. }
  85. case "camel-case-only": {
  86. set.add(module.exports.camelCase(input));
  87. break;
  88. }
  89. case "dashes": {
  90. set.add(input);
  91. set.add(module.exports.dashesCamelCase(input));
  92. break;
  93. }
  94. case "dashes-only": {
  95. set.add(module.exports.dashesCamelCase(input));
  96. break;
  97. }
  98. case "as-is": {
  99. set.add(input);
  100. break;
  101. }
  102. }
  103. }
  104. return [...set];
  105. };
  106. // Copy from css-loader
  107. /**
  108. * @param {string} input input
  109. * @returns {string} result
  110. */
  111. module.exports.dashesCamelCase = input =>
  112. input.replace(/-+(\w)/g, (match, firstLetter) => firstLetter.toUpperCase());