113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", {
 | 
						|
  value: true
 | 
						|
});
 | 
						|
exports.default = void 0;
 | 
						|
var _icssUtils = require("icss-utils");
 | 
						|
var _utils = require("../utils");
 | 
						|
const plugin = (options = {}) => {
 | 
						|
  return {
 | 
						|
    postcssPlugin: "postcss-icss-parser",
 | 
						|
    async OnceExit(root) {
 | 
						|
      const importReplacements = Object.create(null);
 | 
						|
      const {
 | 
						|
        icssImports,
 | 
						|
        icssExports
 | 
						|
      } = (0, _icssUtils.extractICSS)(root);
 | 
						|
      const imports = new Map();
 | 
						|
      const tasks = [];
 | 
						|
      const {
 | 
						|
        loaderContext
 | 
						|
      } = options;
 | 
						|
      const resolver = loaderContext.getResolve({
 | 
						|
        dependencyType: "icss",
 | 
						|
        conditionNames: ["style"],
 | 
						|
        extensions: ["..."],
 | 
						|
        mainFields: ["css", "style", "main", "..."],
 | 
						|
        mainFiles: ["index", "..."],
 | 
						|
        preferRelative: true
 | 
						|
      });
 | 
						|
 | 
						|
      // eslint-disable-next-line guard-for-in
 | 
						|
      for (const url in icssImports) {
 | 
						|
        const tokens = icssImports[url];
 | 
						|
        if (Object.keys(tokens).length === 0) {
 | 
						|
          // eslint-disable-next-line no-continue
 | 
						|
          continue;
 | 
						|
        }
 | 
						|
        let normalizedUrl = url;
 | 
						|
        let prefix = "";
 | 
						|
        const queryParts = normalizedUrl.split("!");
 | 
						|
        if (queryParts.length > 1) {
 | 
						|
          normalizedUrl = queryParts.pop();
 | 
						|
          prefix = queryParts.join("!");
 | 
						|
        }
 | 
						|
        const request = (0, _utils.requestify)((0, _utils.normalizeUrl)(normalizedUrl, true), loaderContext.rootContext);
 | 
						|
        const doResolve = async () => {
 | 
						|
          const resolvedUrl = await (0, _utils.resolveRequests)(resolver, loaderContext.context, [...new Set([normalizedUrl, request])]);
 | 
						|
          if (!resolvedUrl) {
 | 
						|
            return;
 | 
						|
          }
 | 
						|
 | 
						|
          // eslint-disable-next-line consistent-return
 | 
						|
          return {
 | 
						|
            url: resolvedUrl,
 | 
						|
            prefix,
 | 
						|
            tokens
 | 
						|
          };
 | 
						|
        };
 | 
						|
        tasks.push(doResolve());
 | 
						|
      }
 | 
						|
      const results = await Promise.all(tasks);
 | 
						|
      for (let index = 0; index <= results.length - 1; index++) {
 | 
						|
        const item = results[index];
 | 
						|
        if (!item) {
 | 
						|
          // eslint-disable-next-line no-continue
 | 
						|
          continue;
 | 
						|
        }
 | 
						|
        const newUrl = item.prefix ? `${item.prefix}!${item.url}` : item.url;
 | 
						|
        const importKey = newUrl;
 | 
						|
        let importName = imports.get(importKey);
 | 
						|
        if (!importName) {
 | 
						|
          importName = `___CSS_LOADER_ICSS_IMPORT_${imports.size}___`;
 | 
						|
          imports.set(importKey, importName);
 | 
						|
          options.imports.push({
 | 
						|
            type: "icss_import",
 | 
						|
            importName,
 | 
						|
            url: options.urlHandler(newUrl),
 | 
						|
            icss: true,
 | 
						|
            index
 | 
						|
          });
 | 
						|
          options.api.push({
 | 
						|
            importName,
 | 
						|
            dedupe: true,
 | 
						|
            index
 | 
						|
          });
 | 
						|
        }
 | 
						|
        for (const [replacementIndex, token] of Object.keys(item.tokens).entries()) {
 | 
						|
          const replacementName = `___CSS_LOADER_ICSS_IMPORT_${index}_REPLACEMENT_${replacementIndex}___`;
 | 
						|
          const localName = item.tokens[token];
 | 
						|
          importReplacements[token] = replacementName;
 | 
						|
          options.replacements.push({
 | 
						|
            replacementName,
 | 
						|
            importName,
 | 
						|
            localName
 | 
						|
          });
 | 
						|
        }
 | 
						|
      }
 | 
						|
      if (Object.keys(importReplacements).length > 0) {
 | 
						|
        (0, _icssUtils.replaceSymbols)(root, importReplacements);
 | 
						|
      }
 | 
						|
      for (const name of Object.keys(icssExports)) {
 | 
						|
        const value = (0, _icssUtils.replaceValueSymbols)(icssExports[name], importReplacements);
 | 
						|
        options.exports.push({
 | 
						|
          name,
 | 
						|
          value
 | 
						|
        });
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
};
 | 
						|
plugin.postcss = true;
 | 
						|
var _default = exports.default = plugin; |