Skip to content

Commit

Permalink
build: add stylelint rule to prevent usage of /deep/ (#4841)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
crisbeto authored and mmalerba committed May 31, 2017
1 parent 964033c commit 8804caf
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
4 changes: 3 additions & 1 deletion stylelint-config.json
Original file line number Diff line number Diff line change
@@ -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$"
Expand Down
37 changes: 37 additions & 0 deletions tools/stylelint/selector-no-deep/index.js
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 8804caf

Please sign in to comment.