postcss-icss-parser.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _postcss = _interopRequireDefault(require("postcss"));
  7. var _icssUtils = require("icss-utils");
  8. var _loaderUtils = require("loader-utils");
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. const pluginName = 'postcss-icss-parser';
  11. function normalizeIcssImports(icssImports) {
  12. return Object.keys(icssImports).reduce((accumulator, url) => {
  13. const tokensMap = icssImports[url];
  14. const tokens = Object.keys(tokensMap);
  15. if (tokens.length === 0) {
  16. return accumulator;
  17. }
  18. const normalizedUrl = (0, _loaderUtils.urlToRequest)(url);
  19. if (!accumulator[normalizedUrl]) {
  20. // eslint-disable-next-line no-param-reassign
  21. accumulator[normalizedUrl] = tokensMap;
  22. } else {
  23. // eslint-disable-next-line no-param-reassign
  24. accumulator[normalizedUrl] = { ...accumulator[normalizedUrl],
  25. ...tokensMap
  26. };
  27. }
  28. return accumulator;
  29. }, {});
  30. }
  31. var _default = _postcss.default.plugin(pluginName, () => function process(css, result) {
  32. const importReplacements = Object.create(null);
  33. const {
  34. icssImports,
  35. icssExports
  36. } = (0, _icssUtils.extractICSS)(css);
  37. const normalizedIcssImports = normalizeIcssImports(icssImports);
  38. Object.keys(normalizedIcssImports).forEach((url, importIndex) => {
  39. const importName = `___CSS_LOADER_ICSS_IMPORT_${importIndex}___`;
  40. result.messages.push({
  41. pluginName,
  42. type: 'import',
  43. value: {
  44. type: 'icss-import',
  45. importName,
  46. url
  47. }
  48. });
  49. const tokenMap = normalizedIcssImports[url];
  50. const tokens = Object.keys(tokenMap);
  51. tokens.forEach((token, replacementIndex) => {
  52. const replacementName = `___CSS_LOADER_ICSS_IMPORT_${importIndex}_REPLACEMENT_${replacementIndex}___`;
  53. const localName = tokenMap[token];
  54. importReplacements[token] = replacementName;
  55. result.messages.push({
  56. pluginName,
  57. type: 'replacer',
  58. value: {
  59. type: 'icss-import',
  60. importName,
  61. replacementName,
  62. localName
  63. }
  64. });
  65. });
  66. });
  67. if (Object.keys(importReplacements).length > 0) {
  68. (0, _icssUtils.replaceSymbols)(css, importReplacements);
  69. }
  70. Object.keys(icssExports).forEach(name => {
  71. const value = (0, _icssUtils.replaceValueSymbols)(icssExports[name], importReplacements);
  72. result.messages.push({
  73. pluginName,
  74. type: 'export',
  75. value: {
  76. name,
  77. value
  78. }
  79. });
  80. });
  81. });
  82. exports.default = _default;