postcss-icss-parser.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. function makeRequestableIcssImports(icssImports) {
  11. return Object.keys(icssImports).reduce((accumulator, url) => {
  12. const tokensMap = icssImports[url];
  13. const tokens = Object.keys(tokensMap);
  14. if (tokens.length === 0) {
  15. return accumulator;
  16. }
  17. const normalizedUrl = (0, _loaderUtils.urlToRequest)(url);
  18. if (!accumulator[normalizedUrl]) {
  19. // eslint-disable-next-line no-param-reassign
  20. accumulator[normalizedUrl] = tokensMap;
  21. } else {
  22. // eslint-disable-next-line no-param-reassign
  23. accumulator[normalizedUrl] = { ...accumulator[normalizedUrl],
  24. ...tokensMap
  25. };
  26. }
  27. return accumulator;
  28. }, {});
  29. }
  30. var _default = _postcss.default.plugin('postcss-icss-parser', options => (css, result) => {
  31. const importReplacements = Object.create(null);
  32. const extractedICSS = (0, _icssUtils.extractICSS)(css);
  33. const icssImports = makeRequestableIcssImports(extractedICSS.icssImports);
  34. for (const [importIndex, url] of Object.keys(icssImports).entries()) {
  35. const importName = `___CSS_LOADER_ICSS_IMPORT_${importIndex}___`;
  36. result.messages.push({
  37. type: 'import',
  38. value: {
  39. importName,
  40. url: options.urlHandler ? options.urlHandler(url) : url
  41. }
  42. }, {
  43. type: 'api-import',
  44. value: {
  45. type: 'internal',
  46. importName,
  47. dedupe: true
  48. }
  49. });
  50. const tokenMap = icssImports[url];
  51. const tokens = Object.keys(tokenMap);
  52. for (const [replacementIndex, token] of tokens.entries()) {
  53. const replacementName = `___CSS_LOADER_ICSS_IMPORT_${importIndex}_REPLACEMENT_${replacementIndex}___`;
  54. const localName = tokenMap[token];
  55. importReplacements[token] = replacementName;
  56. result.messages.push({
  57. type: 'icss-replacement',
  58. value: {
  59. replacementName,
  60. importName,
  61. localName
  62. }
  63. });
  64. }
  65. }
  66. if (Object.keys(importReplacements).length > 0) {
  67. (0, _icssUtils.replaceSymbols)(css, importReplacements);
  68. }
  69. const {
  70. icssExports
  71. } = extractedICSS;
  72. for (const name of Object.keys(icssExports)) {
  73. const value = (0, _icssUtils.replaceValueSymbols)(icssExports[name], importReplacements);
  74. result.messages.push({
  75. type: 'export',
  76. value: {
  77. name,
  78. value
  79. }
  80. });
  81. }
  82. });
  83. exports.default = _default;