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; |