This repository has been archived on 2020-11-02. You can view files and clone it, but cannot push or open issues or pull requests.
2020-11-01 22:46:04 +00:00

91 lines
2.2 KiB
JavaScript

// @ts-nocheck
'use strict';
const _ = require('lodash');
const isAutoprefixable = require('../../utils/isAutoprefixable');
const isStandardSyntaxDeclaration = require('../../utils/isStandardSyntaxDeclaration');
const isStandardSyntaxProperty = require('../../utils/isStandardSyntaxProperty');
const optionsMatches = require('../../utils/optionsMatches');
const postcss = require('postcss');
const report = require('../../utils/report');
const ruleMessages = require('../../utils/ruleMessages');
const styleSearch = require('style-search');
const validateOptions = require('../../utils/validateOptions');
const ruleName = 'value-no-vendor-prefix';
const messages = ruleMessages(ruleName, {
rejected: (value) => `Unexpected vendor-prefix "${value}"`,
});
const valuePrefixes = ['-webkit-', '-moz-', '-ms-', '-o-'];
function rule(actual, options, context) {
return (root, result) => {
const validOptions = validateOptions(
result,
ruleName,
{ actual },
{
optional: true,
actual: options,
possible: {
ignoreValues: [_.isString],
},
},
);
if (!validOptions) {
return;
}
root.walkDecls((decl) => {
if (
!isStandardSyntaxDeclaration(decl) ||
!isStandardSyntaxProperty(decl.prop) ||
!decl.value.startsWith('-')
) {
return;
}
const prop = decl.prop;
const value = decl.value;
const unprefixedValue = postcss.vendor.unprefixed(value);
//return early if value is to be ignored
if (optionsMatches(options, 'ignoreValues', unprefixedValue)) {
return;
}
// Search the full declaration in order to get an accurate index
styleSearch({ source: value.toLowerCase(), target: valuePrefixes }, (match) => {
const fullIdentifier = /^(-[a-z-]+)\b/i.exec(value.slice(match.startIndex))[1];
if (!isAutoprefixable.propertyValue(prop, fullIdentifier)) {
return;
}
if (context.fix) {
decl.value = isAutoprefixable.unprefix(decl.value);
return;
}
report({
message: messages.rejected(fullIdentifier),
node: decl,
index: prop.length + (decl.raws.between || '').length + match.startIndex,
result,
ruleName,
});
});
});
};
}
rule.ruleName = ruleName;
rule.messages = messages;
module.exports = rule;