waft-css-lint
Version:
WAFT Standard shareable config for stylelint
63 lines (62 loc) • 2.8 kB
JavaScript
;
const stylelint = require("stylelint");
const { report, ruleMessages, validateOptions } = stylelint.utils;
const ruleName = "custom-rules-plugin/property-blacklist";
const checkValue = (allowValues, value) => {
let passed = false;
for (let i = 0; i < allowValues.length; i++) {
const v = allowValues[i];
if (value.includes(v)) {
passed = true;
return passed;
}
}
return passed;
};
const messages = ruleMessages(ruleName, {
expected: (decl, configProp, support) => {
if (configProp.message) {
return typeof configProp.message === 'function' ? configProp.message(decl) : configProp.message;
}
return support ? `${decl.value} property is not supported` : `${decl.prop} property is not supported`;
},
});
module.exports = stylelint.createPlugin(ruleName, function (primaryOption, secondaryOptionObject) {
return function (postcssRoot, postcssResult) {
let map = {};
postcssRoot.walkDecls((decl) => {
if (decl) {
const reportProps = {
ruleName,
result: postcssResult,
node: decl,
word: decl.value,
};
if (!map[decl.parent.source.start.offset] && primaryOption.selector && !primaryOption.selector.format(decl.parent.selector)) {
map[decl.parent.source.start.offset] = `${decl.parent.source.start.offset}`;
const { source } = decl.parent;
decl.source = source;
report(Object.assign(Object.assign({}, reportProps), { word: decl.parent.selector, message: messages.expected(decl, primaryOption.selector) }));
}
const configProp = primaryOption[decl.prop];
if (configProp) {
if (!configProp.support) {
report(Object.assign(Object.assign({}, reportProps), { message: messages.expected(decl, configProp, 0) }));
}
else {
if (configProp.format && !configProp.format(decl)) {
report(Object.assign(Object.assign({}, reportProps), { message: messages.expected(decl, configProp, 1) }));
return;
}
if (configProp.values && !checkValue(configProp.values, decl.value)) {
report(Object.assign(Object.assign({}, reportProps), { message: messages.expected(decl, configProp, 1) }));
}
}
}
}
});
map = null;
};
});
module.exports.ruleName = ruleName;
module.exports.messages = messages;