postcss-icss-parser.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _icssUtils = require("icss-utils");
  7. var _utils = require("../utils");
  8. const plugin = (options = {}) => {
  9. return {
  10. postcssPlugin: "postcss-icss-parser",
  11. async OnceExit(root) {
  12. const importReplacements = Object.create(null);
  13. const {
  14. icssImports,
  15. icssExports
  16. } = (0, _icssUtils.extractICSS)(root);
  17. const imports = new Map();
  18. const tasks = [];
  19. const {
  20. loaderContext
  21. } = options;
  22. const resolver = loaderContext.getResolve({
  23. dependencyType: "icss",
  24. conditionNames: ["style"],
  25. extensions: ["..."],
  26. mainFields: ["css", "style", "main", "..."],
  27. mainFiles: ["index", "..."],
  28. preferRelative: true
  29. }); // eslint-disable-next-line guard-for-in
  30. for (const url in icssImports) {
  31. const tokens = icssImports[url];
  32. if (Object.keys(tokens).length === 0) {
  33. // eslint-disable-next-line no-continue
  34. continue;
  35. }
  36. let normalizedUrl = url;
  37. let prefix = "";
  38. const queryParts = normalizedUrl.split("!");
  39. if (queryParts.length > 1) {
  40. normalizedUrl = queryParts.pop();
  41. prefix = queryParts.join("!");
  42. }
  43. const request = (0, _utils.requestify)((0, _utils.normalizeUrl)(normalizedUrl, true), loaderContext.rootContext);
  44. const doResolve = async () => {
  45. const resolvedUrl = await (0, _utils.resolveRequests)(resolver, loaderContext.context, [...new Set([normalizedUrl, request])]);
  46. if (!resolvedUrl) {
  47. return;
  48. } // eslint-disable-next-line consistent-return
  49. return {
  50. url: resolvedUrl,
  51. prefix,
  52. tokens
  53. };
  54. };
  55. tasks.push(doResolve());
  56. }
  57. const results = await Promise.all(tasks);
  58. for (let index = 0; index <= results.length - 1; index++) {
  59. const item = results[index];
  60. if (!item) {
  61. // eslint-disable-next-line no-continue
  62. continue;
  63. }
  64. const newUrl = item.prefix ? `${item.prefix}!${item.url}` : item.url;
  65. const importKey = newUrl;
  66. let importName = imports.get(importKey);
  67. if (!importName) {
  68. importName = `___CSS_LOADER_ICSS_IMPORT_${imports.size}___`;
  69. imports.set(importKey, importName);
  70. options.imports.push({
  71. type: "icss_import",
  72. importName,
  73. url: options.urlHandler(newUrl),
  74. icss: true,
  75. index
  76. });
  77. options.api.push({
  78. importName,
  79. dedupe: true,
  80. index
  81. });
  82. }
  83. for (const [replacementIndex, token] of Object.keys(item.tokens).entries()) {
  84. const replacementName = `___CSS_LOADER_ICSS_IMPORT_${index}_REPLACEMENT_${replacementIndex}___`;
  85. const localName = item.tokens[token];
  86. importReplacements[token] = replacementName;
  87. options.replacements.push({
  88. replacementName,
  89. importName,
  90. localName
  91. });
  92. }
  93. }
  94. if (Object.keys(importReplacements).length > 0) {
  95. (0, _icssUtils.replaceSymbols)(root, importReplacements);
  96. }
  97. for (const name of Object.keys(icssExports)) {
  98. const value = (0, _icssUtils.replaceValueSymbols)(icssExports[name], importReplacements);
  99. options.exports.push({
  100. name,
  101. value
  102. });
  103. }
  104. }
  105. };
  106. };
  107. plugin.postcss = true;
  108. var _default = plugin;
  109. exports.default = _default;