build: add stylelint rule to prevent usage of /deep/ (#4841)

* build: add stylelint rule to prevent usage of /deep/

Adds a custom Stylelint rule to prevent usages of `/deep/` inside selectors.

Relates #4726.

* fix: address feedback
This commit is contained in:
Kristiyan Kostadinov
2017-06-01 01:18:58 +02:00
committed by mmalerba
parent 964033ce8d
commit 8804caf3f5
2 changed files with 40 additions and 1 deletions
+3 -1
View File
@@ -1,10 +1,12 @@
{
"plugins": [
"./tools/stylelint/no-prefixes/no-prefixes.js",
"./tools/stylelint/selector-nested-pattern-scoped/index.js"
"./tools/stylelint/selector-nested-pattern-scoped/index.js",
"./tools/stylelint/selector-no-deep/index.js"
],
"rules": {
"material/no-prefixes": [["last 2 versions", "not ie <= 10", "not ie_mob <= 10"]],
"material/selector-no-deep": true,
"material/selector-nested-pattern-scoped": [".*[^&]$", {
"message": "The & operator is not allowed at the end of theme selectors.",
"filePattern": "-theme\\.scss$"
+37
View File
@@ -0,0 +1,37 @@
const stylelint = require('stylelint');
const isStandardSyntaxRule = require('stylelint/lib/utils/isStandardSyntaxRule');
const isStandardSyntaxSelector = require('stylelint/lib/utils/isStandardSyntaxSelector');
const ruleName = 'material/selector-no-deep';
const messages = stylelint.utils.ruleMessages(ruleName, {
expected: selector => `Usage of the /deep/ in "${selector}" is not allowed`,
});
/**
* Stylelint plugin that prevents uses of /deep/ in selectors.
*/
const plugin = stylelint.createPlugin(ruleName, isEnabled => {
return (root, result) => {
if (!isEnabled) return;
root.walkRules(rule => {
if (rule.parent.type === 'rule' &&
isStandardSyntaxRule(rule) &&
isStandardSyntaxSelector(rule.selector) &&
rule.selector.includes('/deep/')) {
stylelint.utils.report({
result,
ruleName,
message: messages.expected(rule.selector),
node: rule
});
}
});
};
});
plugin.ruleName = ruleName;
plugin.messages = messages;
module.exports = plugin;