mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
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:
committed by
mmalerba
parent
964033ce8d
commit
8804caf3f5
@@ -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$"
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user