12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- module.exports = function postcssPrefixSelector(options) {
- const prefix = options.prefix;
- const prefixWithSpace = /\s+$/.test(prefix) ? prefix : `${prefix} `;
- const ignoreFiles = options.ignoreFiles ? [].concat(options.ignoreFiles) : [];
- const includeFiles = options.includeFiles
- ? [].concat(options.includeFiles)
- : [];
- return function (root) {
- if (
- ignoreFiles.length &&
- root.source.input.file &&
- isFileInArray(root.source.input.file, ignoreFiles)
- ) {
- return;
- }
- if (
- includeFiles.length &&
- root.source.input.file &&
- !isFileInArray(root.source.input.file, includeFiles)
- ) {
- return;
- }
- root.walkRules((rule) => {
- const keyframeRules = [
- 'keyframes',
- '-webkit-keyframes',
- '-moz-keyframes',
- '-o-keyframes',
- ];
- if (rule.parent && keyframeRules.includes(rule.parent.name)) {
- return;
- }
- rule.selectors = rule.selectors.map((selector) => {
- if (options.exclude && excludeSelector(selector, options.exclude)) {
- return selector;
- }
- if (options.transform) {
- return options.transform(
- prefix,
- selector,
- prefixWithSpace + selector,
- root.source.input.file,
- rule
- );
- }
- return prefixWithSpace + selector;
- });
- });
- };
- };
- function isFileInArray(file, arr) {
- return arr.some((ruleOrString) => {
- if (ruleOrString instanceof RegExp) {
- return ruleOrString.test(file);
- }
- return file.includes(ruleOrString);
- });
- }
- function excludeSelector(selector, excludeArr) {
- return excludeArr.some((excludeRule) => {
- if (excludeRule instanceof RegExp) {
- return excludeRule.test(selector);
- }
- return selector === excludeRule;
- });
- }
|