101 lines
2.8 KiB
JavaScript
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;
|