Echo/node_modules/css-loader/dist/plugins/postcss-icss-parser.js
2021-02-11 21:31:41 +08:00

101 lines
2.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _postcss = _interopRequireDefault(require("postcss"));
var _postcssValueParser = _interopRequireDefault(require("postcss-value-parser"));
var _icssUtils = require("icss-utils");
var _loaderUtils = _interopRequireDefault(require("loader-utils"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const pluginName = 'postcss-icss-parser';
var _default = _postcss.default.plugin(pluginName, () => function process(css, result) {
const imports = {};
const icss = (0, _icssUtils.extractICSS)(css);
const exports = icss.icssExports;
Object.keys(icss.icssImports).forEach(key => {
const url = _loaderUtils.default.parseString(key);
Object.keys(icss.icssImports[key]).forEach(prop => {
const index = Object.keys(imports).length;
imports[`$${prop}`] = index;
result.messages.push({
pluginName,
type: 'icss-import',
item: {
url,
export: icss.icssImports[key][prop],
index
}
});
const alreadyIncluded = result.messages.find(message => message.pluginName === pluginName && message.type === 'import' && message.item.url === url && message.item.media === '');
if (alreadyIncluded) {
return;
}
result.messages.push({
pluginName,
type: 'import',
item: {
url,
media: ''
}
});
});
});
function replaceImportsInString(str) {
const tokens = (0, _postcssValueParser.default)(str);
tokens.walk(node => {
if (node.type !== 'word') {
return;
}
const token = node.value;
const importIndex = imports[`$${token}`];
if (typeof importIndex === 'number') {
// eslint-disable-next-line no-param-reassign
node.value = `___CSS_LOADER_IMPORT___${importIndex}___`;
}
});
return tokens.toString();
} // Replace tokens in declarations
css.walkDecls(decl => {
// eslint-disable-next-line no-param-reassign
decl.value = replaceImportsInString(decl.value.toString());
}); // Replace tokens in at-rules
css.walkAtRules(atrule => {
// Due reusing `ast` from `postcss-loader` some plugins may lack
// `params` property, we need to account for this possibility
if (atrule.params) {
// eslint-disable-next-line no-param-reassign
atrule.params = replaceImportsInString(atrule.params.toString());
}
}); // Replace tokens in export
Object.keys(exports).forEach(exportName => {
result.messages.push({
pluginName,
type: 'export',
item: {
key: exportName,
value: replaceImportsInString(exports[exportName])
}
});
});
});
exports.default = _default;