You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.8 KiB
101 lines
2.8 KiB
"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; |