@master/eslint-plugin-css 2.0.0-rc.73 → 2.0.0-rc.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/configs/base.d.ts +5 -2
- package/dist/configs/base.js +5 -0
- package/dist/configs/legacy.d.ts +5 -2
- package/dist/configs/legacy.js +9 -0
- package/dist/configs/recommended.d.ts +5 -2
- package/dist/configs/recommended.js +13 -0
- package/dist/create-rule.d.ts +11 -4
- package/dist/create-rule.js +5 -0
- package/dist/index.d.ts +13 -10
- package/dist/index.js +17 -0
- package/dist/plugin.d.ts +5 -2
- package/dist/plugin.js +26 -0
- package/dist/rules/no-conflicting-classes.d.ts +4 -2
- package/dist/rules/no-conflicting-classes.js +76 -0
- package/dist/rules/no-invalid-classes.d.ts +5 -3
- package/dist/rules/no-invalid-classes.js +41 -0
- package/dist/rules/no-unapproved-raw-values.d.ts +7 -5
- package/dist/rules/no-unapproved-raw-values.js +61 -0
- package/dist/rules/prefer-canonical-classes.d.ts +6 -3
- package/dist/rules/prefer-canonical-classes.js +79 -0
- package/dist/rules/sort-classes.d.ts +4 -2
- package/dist/rules/sort-classes.js +40 -0
- package/dist/settings-schema.d.ts +7 -4
- package/dist/settings-schema.js +27 -0
- package/dist/settings.d.ts +16 -13
- package/dist/settings.js +8 -0
- package/dist/utils/define-visitors.d.ts +14 -7
- package/dist/utils/define-visitors.js +107 -0
- package/dist/utils/is-same-or-child-path.d.ts +4 -1
- package/dist/utils/is-same-or-child-path.js +8 -0
- package/dist/utils/master-css.d.ts +6 -4
- package/dist/utils/master-css.js +6 -0
- package/dist/utils/resolve-class-node.d.ts +22 -18
- package/dist/utils/resolve-class-node.js +85 -0
- package/dist/utils/resolve-context.d.ts +16 -12
- package/dist/utils/resolve-context.js +69 -0
- package/dist/utils/with-visit-class-node.d.ts +8 -4
- package/dist/utils/with-visit-class-node.js +51 -0
- package/package.json +78 -1
- package/dist/configs/base.cjs +0 -11
- package/dist/configs/base.mjs +0 -9
- package/dist/configs/legacy.cjs +0 -17
- package/dist/configs/legacy.mjs +0 -15
- package/dist/configs/recommended.cjs +0 -15
- package/dist/configs/recommended.mjs +0 -13
- package/dist/create-rule.cjs +0 -7
- package/dist/create-rule.mjs +0 -5
- package/dist/index.cjs +0 -19
- package/dist/index.mjs +0 -17
- package/dist/plugin.cjs +0 -30
- package/dist/plugin.mjs +0 -27
- package/dist/rules/no-conflicting-classes.cjs +0 -101
- package/dist/rules/no-conflicting-classes.mjs +0 -99
- package/dist/rules/no-invalid-classes.cjs +0 -51
- package/dist/rules/no-invalid-classes.mjs +0 -49
- package/dist/rules/no-unapproved-raw-values.cjs +0 -77
- package/dist/rules/no-unapproved-raw-values.mjs +0 -75
- package/dist/rules/prefer-canonical-classes.cjs +0 -112
- package/dist/rules/prefer-canonical-classes.mjs +0 -110
- package/dist/rules/sort-classes.cjs +0 -53
- package/dist/rules/sort-classes.mjs +0 -51
- package/dist/settings-schema.cjs +0 -38
- package/dist/settings-schema.mjs +0 -32
- package/dist/settings.cjs +0 -10
- package/dist/settings.mjs +0 -8
- package/dist/utils/define-visitors.cjs +0 -125
- package/dist/utils/define-visitors.mjs +0 -123
- package/dist/utils/is-same-or-child-path.cjs +0 -10
- package/dist/utils/is-same-or-child-path.mjs +0 -8
- package/dist/utils/master-css.cjs +0 -14
- package/dist/utils/master-css.mjs +0 -7
- package/dist/utils/resolve-class-node.cjs +0 -98
- package/dist/utils/resolve-class-node.mjs +0 -96
- package/dist/utils/resolve-context.cjs +0 -78
- package/dist/utils/resolve-context.mjs +0 -76
- package/dist/utils/with-visit-class-node.cjs +0 -57
- package/dist/utils/with-visit-class-node.mjs +0 -55
package/dist/index.cjs
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var settings = require('./settings.cjs');
|
|
4
|
-
var legacy = require('./configs/legacy.cjs');
|
|
5
|
-
var base = require('./configs/base.cjs');
|
|
6
|
-
var recommended = require('./configs/recommended.cjs');
|
|
7
|
-
var plugin = require('./plugin.cjs');
|
|
8
|
-
|
|
9
|
-
const masterCSSPlugin = {
|
|
10
|
-
...plugin,
|
|
11
|
-
configs: {
|
|
12
|
-
legacy,
|
|
13
|
-
base,
|
|
14
|
-
recommended
|
|
15
|
-
},
|
|
16
|
-
settings
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
module.exports = masterCSSPlugin;
|
package/dist/index.mjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import settings from './settings.mjs';
|
|
2
|
-
import legacy from './configs/legacy.mjs';
|
|
3
|
-
import base from './configs/base.mjs';
|
|
4
|
-
import recommended from './configs/recommended.mjs';
|
|
5
|
-
import plugin from './plugin.mjs';
|
|
6
|
-
|
|
7
|
-
const masterCSSPlugin = {
|
|
8
|
-
...plugin,
|
|
9
|
-
configs: {
|
|
10
|
-
legacy,
|
|
11
|
-
base,
|
|
12
|
-
recommended
|
|
13
|
-
},
|
|
14
|
-
settings
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export { masterCSSPlugin as default };
|
package/dist/plugin.cjs
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var noConflictingClasses = require('./rules/no-conflicting-classes.cjs');
|
|
4
|
-
var noInvalidClasses = require('./rules/no-invalid-classes.cjs');
|
|
5
|
-
var noUnapprovedRawValues = require('./rules/no-unapproved-raw-values.cjs');
|
|
6
|
-
var preferCanonicalClasses = require('./rules/prefer-canonical-classes.cjs');
|
|
7
|
-
var sortClasses = require('./rules/sort-classes.cjs');
|
|
8
|
-
var fs = require('fs');
|
|
9
|
-
var url = require('url');
|
|
10
|
-
var path = require('path');
|
|
11
|
-
|
|
12
|
-
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
13
|
-
const __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('plugin.cjs', document.baseURI).href)));
|
|
14
|
-
const __dirname$1 = path.dirname(__filename$1);
|
|
15
|
-
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname$1, '..', 'package.json'), 'utf-8'));
|
|
16
|
-
const plugin = {
|
|
17
|
-
meta: {
|
|
18
|
-
name: pkg.name,
|
|
19
|
-
version: pkg.version
|
|
20
|
-
},
|
|
21
|
-
rules: {
|
|
22
|
-
'no-conflicting-classes': noConflictingClasses,
|
|
23
|
-
'no-invalid-classes': noInvalidClasses,
|
|
24
|
-
'no-unapproved-raw-values': noUnapprovedRawValues,
|
|
25
|
-
'prefer-canonical-classes': preferCanonicalClasses,
|
|
26
|
-
'sort-classes': sortClasses
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
module.exports = plugin;
|
package/dist/plugin.mjs
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import noConflictingClasses from './rules/no-conflicting-classes.mjs';
|
|
2
|
-
import noInvalidClasses from './rules/no-invalid-classes.mjs';
|
|
3
|
-
import noUnapprovedRawValues from './rules/no-unapproved-raw-values.mjs';
|
|
4
|
-
import preferCanonicalClasses from './rules/prefer-canonical-classes.mjs';
|
|
5
|
-
import sortClasses from './rules/sort-classes.mjs';
|
|
6
|
-
import { readFileSync } from 'fs';
|
|
7
|
-
import { fileURLToPath } from 'url';
|
|
8
|
-
import { dirname, resolve } from 'path';
|
|
9
|
-
|
|
10
|
-
const __filename$1 = fileURLToPath(import.meta.url);
|
|
11
|
-
const __dirname$1 = dirname(__filename$1);
|
|
12
|
-
const pkg = JSON.parse(readFileSync(resolve(__dirname$1, '..', 'package.json'), 'utf-8'));
|
|
13
|
-
const plugin = {
|
|
14
|
-
meta: {
|
|
15
|
-
name: pkg.name,
|
|
16
|
-
version: pkg.version
|
|
17
|
-
},
|
|
18
|
-
rules: {
|
|
19
|
-
'no-conflicting-classes': noConflictingClasses,
|
|
20
|
-
'no-invalid-classes': noInvalidClasses,
|
|
21
|
-
'no-unapproved-raw-values': noUnapprovedRawValues,
|
|
22
|
-
'prefer-canonical-classes': preferCanonicalClasses,
|
|
23
|
-
'sort-classes': sortClasses
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export { plugin as default };
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var defineVisitors = require('../utils/define-visitors.cjs');
|
|
4
|
-
var resolveContext = require('../utils/resolve-context.cjs');
|
|
5
|
-
var createRule = require('../create-rule.cjs');
|
|
6
|
-
var cssLint = require('@master/css-lint');
|
|
7
|
-
|
|
8
|
-
var noConflictingClasses = createRule({
|
|
9
|
-
name: 'no-conflicting-classes',
|
|
10
|
-
meta: {
|
|
11
|
-
type: 'layout',
|
|
12
|
-
docs: {
|
|
13
|
-
description: 'Disallow conflicting Master CSS classes'
|
|
14
|
-
},
|
|
15
|
-
messages: {
|
|
16
|
-
collisionClass: '{{message}}',
|
|
17
|
-
partialCollisionClass: 'Prefer "{{replacement}}" over "{{actual}}" because "{{conflict}}" overrides part of it.'
|
|
18
|
-
},
|
|
19
|
-
fixable: 'code',
|
|
20
|
-
schema: []
|
|
21
|
-
},
|
|
22
|
-
defaultOptions: [],
|
|
23
|
-
create (context) {
|
|
24
|
-
const { settings, css } = resolveContext(context);
|
|
25
|
-
return defineVisitors({
|
|
26
|
-
context,
|
|
27
|
-
settings
|
|
28
|
-
}, (_, { raw, start, end, unescape, classNodes, classValues })=>{
|
|
29
|
-
const conflicts = cssLint.findClassConflicts(classValues, css);
|
|
30
|
-
if (conflicts.length) {
|
|
31
|
-
const classNamesToRemove = conflicts.map(({ className })=>className);
|
|
32
|
-
const keptClassNames = [
|
|
33
|
-
...new Set(conflicts.flatMap(({ conflicts })=>conflicts))
|
|
34
|
-
];
|
|
35
|
-
const formatClassName = (className)=>`"${className}"`;
|
|
36
|
-
const formatClassList = (classNames)=>{
|
|
37
|
-
if (classNames.length <= 2) return classNames.map(formatClassName).join(' and ');
|
|
38
|
-
return `${classNames.slice(0, -1).map(formatClassName).join(', ')}, and ${formatClassName(classNames[classNames.length - 1])}`;
|
|
39
|
-
};
|
|
40
|
-
const fixedRaw = cssLint.removeClassNamesFromClassList(raw, classNamesToRemove, {
|
|
41
|
-
unescape
|
|
42
|
-
});
|
|
43
|
-
const firstClassNode = classNodes.find((node)=>node.value === classNamesToRemove[0]);
|
|
44
|
-
context.report({
|
|
45
|
-
loc: firstClassNode.loc,
|
|
46
|
-
messageId: 'collisionClass',
|
|
47
|
-
data: {
|
|
48
|
-
message: `${formatClassList(classNamesToRemove)} ${classNamesToRemove.length === 1 ? 'is' : 'are'} overridden by ${formatClassList(keptClassNames)}.`
|
|
49
|
-
},
|
|
50
|
-
fix: function(fixer) {
|
|
51
|
-
return fixer.replaceTextRange([
|
|
52
|
-
start,
|
|
53
|
-
end
|
|
54
|
-
], fixedRaw);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const partialConflicts = cssLint.findPartialClassConflicts(classValues, css);
|
|
60
|
-
if (!partialConflicts.length) return;
|
|
61
|
-
let fixedRaw = raw;
|
|
62
|
-
for (const conflict of partialConflicts){
|
|
63
|
-
fixedRaw = cssLint.replaceClassNameInClassList(fixedRaw, conflict.className, conflict.replacement, {
|
|
64
|
-
unescape
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
const classNodeQueues = new Map();
|
|
68
|
-
for (const classNode of classNodes){
|
|
69
|
-
const queue = classNodeQueues.get(classNode.value);
|
|
70
|
-
if (queue) {
|
|
71
|
-
queue.push(classNode);
|
|
72
|
-
} else {
|
|
73
|
-
classNodeQueues.set(classNode.value, [
|
|
74
|
-
classNode
|
|
75
|
-
]);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
for (const conflict of partialConflicts){
|
|
79
|
-
const classNode = classNodeQueues.get(conflict.className)?.shift();
|
|
80
|
-
if (!classNode) continue;
|
|
81
|
-
context.report({
|
|
82
|
-
loc: classNode.loc,
|
|
83
|
-
messageId: 'partialCollisionClass',
|
|
84
|
-
data: {
|
|
85
|
-
actual: conflict.className,
|
|
86
|
-
replacement: conflict.replacement,
|
|
87
|
-
conflict: conflict.conflict
|
|
88
|
-
},
|
|
89
|
-
fix (fixer) {
|
|
90
|
-
return fixer.replaceTextRange([
|
|
91
|
-
start,
|
|
92
|
-
end
|
|
93
|
-
], fixedRaw);
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
module.exports = noConflictingClasses;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import defineVisitors from '../utils/define-visitors.mjs';
|
|
2
|
-
import resolveContext from '../utils/resolve-context.mjs';
|
|
3
|
-
import createRule from '../create-rule.mjs';
|
|
4
|
-
import { findClassConflicts, removeClassNamesFromClassList, findPartialClassConflicts, replaceClassNameInClassList } from '@master/css-lint';
|
|
5
|
-
|
|
6
|
-
var noConflictingClasses = createRule({
|
|
7
|
-
name: 'no-conflicting-classes',
|
|
8
|
-
meta: {
|
|
9
|
-
type: 'layout',
|
|
10
|
-
docs: {
|
|
11
|
-
description: 'Disallow conflicting Master CSS classes'
|
|
12
|
-
},
|
|
13
|
-
messages: {
|
|
14
|
-
collisionClass: '{{message}}',
|
|
15
|
-
partialCollisionClass: 'Prefer "{{replacement}}" over "{{actual}}" because "{{conflict}}" overrides part of it.'
|
|
16
|
-
},
|
|
17
|
-
fixable: 'code',
|
|
18
|
-
schema: []
|
|
19
|
-
},
|
|
20
|
-
defaultOptions: [],
|
|
21
|
-
create (context) {
|
|
22
|
-
const { settings, css } = resolveContext(context);
|
|
23
|
-
return defineVisitors({
|
|
24
|
-
context,
|
|
25
|
-
settings
|
|
26
|
-
}, (_, { raw, start, end, unescape, classNodes, classValues })=>{
|
|
27
|
-
const conflicts = findClassConflicts(classValues, css);
|
|
28
|
-
if (conflicts.length) {
|
|
29
|
-
const classNamesToRemove = conflicts.map(({ className })=>className);
|
|
30
|
-
const keptClassNames = [
|
|
31
|
-
...new Set(conflicts.flatMap(({ conflicts })=>conflicts))
|
|
32
|
-
];
|
|
33
|
-
const formatClassName = (className)=>`"${className}"`;
|
|
34
|
-
const formatClassList = (classNames)=>{
|
|
35
|
-
if (classNames.length <= 2) return classNames.map(formatClassName).join(' and ');
|
|
36
|
-
return `${classNames.slice(0, -1).map(formatClassName).join(', ')}, and ${formatClassName(classNames[classNames.length - 1])}`;
|
|
37
|
-
};
|
|
38
|
-
const fixedRaw = removeClassNamesFromClassList(raw, classNamesToRemove, {
|
|
39
|
-
unescape
|
|
40
|
-
});
|
|
41
|
-
const firstClassNode = classNodes.find((node)=>node.value === classNamesToRemove[0]);
|
|
42
|
-
context.report({
|
|
43
|
-
loc: firstClassNode.loc,
|
|
44
|
-
messageId: 'collisionClass',
|
|
45
|
-
data: {
|
|
46
|
-
message: `${formatClassList(classNamesToRemove)} ${classNamesToRemove.length === 1 ? 'is' : 'are'} overridden by ${formatClassList(keptClassNames)}.`
|
|
47
|
-
},
|
|
48
|
-
fix: function(fixer) {
|
|
49
|
-
return fixer.replaceTextRange([
|
|
50
|
-
start,
|
|
51
|
-
end
|
|
52
|
-
], fixedRaw);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const partialConflicts = findPartialClassConflicts(classValues, css);
|
|
58
|
-
if (!partialConflicts.length) return;
|
|
59
|
-
let fixedRaw = raw;
|
|
60
|
-
for (const conflict of partialConflicts){
|
|
61
|
-
fixedRaw = replaceClassNameInClassList(fixedRaw, conflict.className, conflict.replacement, {
|
|
62
|
-
unescape
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
const classNodeQueues = new Map();
|
|
66
|
-
for (const classNode of classNodes){
|
|
67
|
-
const queue = classNodeQueues.get(classNode.value);
|
|
68
|
-
if (queue) {
|
|
69
|
-
queue.push(classNode);
|
|
70
|
-
} else {
|
|
71
|
-
classNodeQueues.set(classNode.value, [
|
|
72
|
-
classNode
|
|
73
|
-
]);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
for (const conflict of partialConflicts){
|
|
77
|
-
const classNode = classNodeQueues.get(conflict.className)?.shift();
|
|
78
|
-
if (!classNode) continue;
|
|
79
|
-
context.report({
|
|
80
|
-
loc: classNode.loc,
|
|
81
|
-
messageId: 'partialCollisionClass',
|
|
82
|
-
data: {
|
|
83
|
-
actual: conflict.className,
|
|
84
|
-
replacement: conflict.replacement,
|
|
85
|
-
conflict: conflict.conflict
|
|
86
|
-
},
|
|
87
|
-
fix (fixer) {
|
|
88
|
-
return fixer.replaceTextRange([
|
|
89
|
-
start,
|
|
90
|
-
end
|
|
91
|
-
], fixedRaw);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
export { noConflictingClasses as default };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var defineVisitors = require('../utils/define-visitors.cjs');
|
|
4
|
-
var resolveContext = require('../utils/resolve-context.cjs');
|
|
5
|
-
var createRule = require('../create-rule.cjs');
|
|
6
|
-
var settingsSchema = require('../settings-schema.cjs');
|
|
7
|
-
var cssLint = require('@master/css-lint');
|
|
8
|
-
|
|
9
|
-
var noInvalidClasses = createRule({
|
|
10
|
-
name: 'no-invalid-classes',
|
|
11
|
-
meta: {
|
|
12
|
-
type: 'problem',
|
|
13
|
-
docs: {
|
|
14
|
-
description: 'Disallow invalid Master CSS classes'
|
|
15
|
-
},
|
|
16
|
-
messages: {
|
|
17
|
-
invalidClass: '{{message}}',
|
|
18
|
-
disallowUnknownClass: '{{message}}'
|
|
19
|
-
},
|
|
20
|
-
fixable: null,
|
|
21
|
-
schema: [
|
|
22
|
-
settingsSchema.noInvalidClassesOptionsSchema
|
|
23
|
-
]
|
|
24
|
-
},
|
|
25
|
-
defaultOptions: [],
|
|
26
|
-
create: function(context) {
|
|
27
|
-
const { options, settings, css } = resolveContext(context);
|
|
28
|
-
return defineVisitors({
|
|
29
|
-
context,
|
|
30
|
-
settings
|
|
31
|
-
}, (_, { classNodes })=>{
|
|
32
|
-
for (const node of classNodes){
|
|
33
|
-
const issues = cssLint.getClassValidationIssues(node.value, css, {
|
|
34
|
-
disallowUnknownClass: options.disallowUnknownClass,
|
|
35
|
-
displayClassName: node.raw
|
|
36
|
-
});
|
|
37
|
-
for (const issue of issues){
|
|
38
|
-
context.report({
|
|
39
|
-
loc: node.loc,
|
|
40
|
-
messageId: issue.kind === 'invalid' ? 'invalidClass' : 'disallowUnknownClass',
|
|
41
|
-
data: {
|
|
42
|
-
message: issue.message
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
module.exports = noInvalidClasses;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import defineVisitors from '../utils/define-visitors.mjs';
|
|
2
|
-
import resolveContext from '../utils/resolve-context.mjs';
|
|
3
|
-
import createRule from '../create-rule.mjs';
|
|
4
|
-
import { noInvalidClassesOptionsSchema } from '../settings-schema.mjs';
|
|
5
|
-
import { getClassValidationIssues } from '@master/css-lint';
|
|
6
|
-
|
|
7
|
-
var noInvalidClasses = createRule({
|
|
8
|
-
name: 'no-invalid-classes',
|
|
9
|
-
meta: {
|
|
10
|
-
type: 'problem',
|
|
11
|
-
docs: {
|
|
12
|
-
description: 'Disallow invalid Master CSS classes'
|
|
13
|
-
},
|
|
14
|
-
messages: {
|
|
15
|
-
invalidClass: '{{message}}',
|
|
16
|
-
disallowUnknownClass: '{{message}}'
|
|
17
|
-
},
|
|
18
|
-
fixable: null,
|
|
19
|
-
schema: [
|
|
20
|
-
noInvalidClassesOptionsSchema
|
|
21
|
-
]
|
|
22
|
-
},
|
|
23
|
-
defaultOptions: [],
|
|
24
|
-
create: function(context) {
|
|
25
|
-
const { options, settings, css } = resolveContext(context);
|
|
26
|
-
return defineVisitors({
|
|
27
|
-
context,
|
|
28
|
-
settings
|
|
29
|
-
}, (_, { classNodes })=>{
|
|
30
|
-
for (const node of classNodes){
|
|
31
|
-
const issues = getClassValidationIssues(node.value, css, {
|
|
32
|
-
disallowUnknownClass: options.disallowUnknownClass,
|
|
33
|
-
displayClassName: node.raw
|
|
34
|
-
});
|
|
35
|
-
for (const issue of issues){
|
|
36
|
-
context.report({
|
|
37
|
-
loc: node.loc,
|
|
38
|
-
messageId: issue.kind === 'invalid' ? 'invalidClass' : 'disallowUnknownClass',
|
|
39
|
-
data: {
|
|
40
|
-
message: issue.message
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
export { noInvalidClasses as default };
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var defineVisitors = require('../utils/define-visitors.cjs');
|
|
4
|
-
var resolveContext = require('../utils/resolve-context.cjs');
|
|
5
|
-
var createRule = require('../create-rule.cjs');
|
|
6
|
-
var cssLint = require('@master/css-lint');
|
|
7
|
-
|
|
8
|
-
var noUnapprovedRawValues = createRule({
|
|
9
|
-
name: 'no-unapproved-raw-values',
|
|
10
|
-
meta: {
|
|
11
|
-
type: 'suggestion',
|
|
12
|
-
docs: {
|
|
13
|
-
description: 'Disallow unapproved raw values in token-backed Master CSS classes'
|
|
14
|
-
},
|
|
15
|
-
messages: {
|
|
16
|
-
unapprovedRawValue: 'Unexpected raw value "{{value}}" in "{{className}}". Use a token or allow it explicitly.'
|
|
17
|
-
},
|
|
18
|
-
fixable: null,
|
|
19
|
-
schema: [
|
|
20
|
-
{
|
|
21
|
-
type: 'object',
|
|
22
|
-
properties: {
|
|
23
|
-
allowRawValues: {
|
|
24
|
-
type: 'boolean'
|
|
25
|
-
},
|
|
26
|
-
allowProperties: {
|
|
27
|
-
type: 'array',
|
|
28
|
-
items: {
|
|
29
|
-
type: 'string'
|
|
30
|
-
},
|
|
31
|
-
uniqueItems: true
|
|
32
|
-
},
|
|
33
|
-
allowedPatterns: {
|
|
34
|
-
type: 'array',
|
|
35
|
-
items: {
|
|
36
|
-
type: 'string'
|
|
37
|
-
},
|
|
38
|
-
uniqueItems: true
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
additionalProperties: false
|
|
42
|
-
}
|
|
43
|
-
]
|
|
44
|
-
},
|
|
45
|
-
defaultOptions: [
|
|
46
|
-
{
|
|
47
|
-
allowRawValues: false,
|
|
48
|
-
allowProperties: [],
|
|
49
|
-
allowedPatterns: []
|
|
50
|
-
}
|
|
51
|
-
],
|
|
52
|
-
create (context) {
|
|
53
|
-
const { settings, css } = resolveContext(context);
|
|
54
|
-
const options = context.options[0] || {};
|
|
55
|
-
return defineVisitors({
|
|
56
|
-
context,
|
|
57
|
-
settings
|
|
58
|
-
}, (node, { classNodes, classValues })=>{
|
|
59
|
-
const issues = cssLint.findUnapprovedRawValueClasses(classValues, css, options);
|
|
60
|
-
for (const issue of issues){
|
|
61
|
-
const classNode = classNodes.find((node)=>node.value === issue.className);
|
|
62
|
-
if (!classNode) continue;
|
|
63
|
-
context.report({
|
|
64
|
-
node,
|
|
65
|
-
loc: classNode.loc,
|
|
66
|
-
messageId: 'unapprovedRawValue',
|
|
67
|
-
data: {
|
|
68
|
-
className: issue.className,
|
|
69
|
-
value: issue.value
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
module.exports = noUnapprovedRawValues;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import defineVisitors from '../utils/define-visitors.mjs';
|
|
2
|
-
import resolveContext from '../utils/resolve-context.mjs';
|
|
3
|
-
import createRule from '../create-rule.mjs';
|
|
4
|
-
import { findUnapprovedRawValueClasses } from '@master/css-lint';
|
|
5
|
-
|
|
6
|
-
var noUnapprovedRawValues = createRule({
|
|
7
|
-
name: 'no-unapproved-raw-values',
|
|
8
|
-
meta: {
|
|
9
|
-
type: 'suggestion',
|
|
10
|
-
docs: {
|
|
11
|
-
description: 'Disallow unapproved raw values in token-backed Master CSS classes'
|
|
12
|
-
},
|
|
13
|
-
messages: {
|
|
14
|
-
unapprovedRawValue: 'Unexpected raw value "{{value}}" in "{{className}}". Use a token or allow it explicitly.'
|
|
15
|
-
},
|
|
16
|
-
fixable: null,
|
|
17
|
-
schema: [
|
|
18
|
-
{
|
|
19
|
-
type: 'object',
|
|
20
|
-
properties: {
|
|
21
|
-
allowRawValues: {
|
|
22
|
-
type: 'boolean'
|
|
23
|
-
},
|
|
24
|
-
allowProperties: {
|
|
25
|
-
type: 'array',
|
|
26
|
-
items: {
|
|
27
|
-
type: 'string'
|
|
28
|
-
},
|
|
29
|
-
uniqueItems: true
|
|
30
|
-
},
|
|
31
|
-
allowedPatterns: {
|
|
32
|
-
type: 'array',
|
|
33
|
-
items: {
|
|
34
|
-
type: 'string'
|
|
35
|
-
},
|
|
36
|
-
uniqueItems: true
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
additionalProperties: false
|
|
40
|
-
}
|
|
41
|
-
]
|
|
42
|
-
},
|
|
43
|
-
defaultOptions: [
|
|
44
|
-
{
|
|
45
|
-
allowRawValues: false,
|
|
46
|
-
allowProperties: [],
|
|
47
|
-
allowedPatterns: []
|
|
48
|
-
}
|
|
49
|
-
],
|
|
50
|
-
create (context) {
|
|
51
|
-
const { settings, css } = resolveContext(context);
|
|
52
|
-
const options = context.options[0] || {};
|
|
53
|
-
return defineVisitors({
|
|
54
|
-
context,
|
|
55
|
-
settings
|
|
56
|
-
}, (node, { classNodes, classValues })=>{
|
|
57
|
-
const issues = findUnapprovedRawValueClasses(classValues, css, options);
|
|
58
|
-
for (const issue of issues){
|
|
59
|
-
const classNode = classNodes.find((node)=>node.value === issue.className);
|
|
60
|
-
if (!classNode) continue;
|
|
61
|
-
context.report({
|
|
62
|
-
node,
|
|
63
|
-
loc: classNode.loc,
|
|
64
|
-
messageId: 'unapprovedRawValue',
|
|
65
|
-
data: {
|
|
66
|
-
className: issue.className,
|
|
67
|
-
value: issue.value
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
export { noUnapprovedRawValues as default };
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var defineVisitors = require('../utils/define-visitors.cjs');
|
|
4
|
-
var resolveContext = require('../utils/resolve-context.cjs');
|
|
5
|
-
var createRule = require('../create-rule.cjs');
|
|
6
|
-
var cssLint = require('@master/css-lint');
|
|
7
|
-
|
|
8
|
-
var preferCanonicalClasses = createRule({
|
|
9
|
-
name: 'prefer-canonical-classes',
|
|
10
|
-
meta: {
|
|
11
|
-
type: 'suggestion',
|
|
12
|
-
docs: {
|
|
13
|
-
description: 'Prefer canonical Master CSS classes'
|
|
14
|
-
},
|
|
15
|
-
messages: {
|
|
16
|
-
preferClass: 'Prefer "{{recommended}}" over "{{actual}}".'
|
|
17
|
-
},
|
|
18
|
-
fixable: 'code',
|
|
19
|
-
schema: [
|
|
20
|
-
{
|
|
21
|
-
type: 'object',
|
|
22
|
-
properties: {
|
|
23
|
-
preferStaticUtilities: {
|
|
24
|
-
type: 'boolean'
|
|
25
|
-
},
|
|
26
|
-
preferThemeTokens: {
|
|
27
|
-
type: 'boolean'
|
|
28
|
-
},
|
|
29
|
-
preferPropertyAliases: {
|
|
30
|
-
type: 'boolean'
|
|
31
|
-
},
|
|
32
|
-
preferVariableReferences: {
|
|
33
|
-
type: 'boolean'
|
|
34
|
-
},
|
|
35
|
-
preferMultiValueTokens: {
|
|
36
|
-
type: 'boolean'
|
|
37
|
-
},
|
|
38
|
-
preferCompositionUtilities: {
|
|
39
|
-
type: 'boolean'
|
|
40
|
-
},
|
|
41
|
-
preferConditionOrder: {
|
|
42
|
-
type: 'boolean'
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
additionalProperties: false
|
|
46
|
-
}
|
|
47
|
-
]
|
|
48
|
-
},
|
|
49
|
-
defaultOptions: [
|
|
50
|
-
cssLint.defaultCanonicalClassNameOptions
|
|
51
|
-
],
|
|
52
|
-
create (context) {
|
|
53
|
-
const { settings, css } = resolveContext(context);
|
|
54
|
-
const options = {
|
|
55
|
-
...cssLint.defaultCanonicalClassNameOptions,
|
|
56
|
-
...context.options[0] || {}
|
|
57
|
-
};
|
|
58
|
-
return defineVisitors({
|
|
59
|
-
context,
|
|
60
|
-
settings
|
|
61
|
-
}, (node, { raw, start, end, unescape, classNodes, classValues })=>{
|
|
62
|
-
const groupSuggestions = cssLint.suggestCanonicalClassGroups(classValues, css, options);
|
|
63
|
-
const coveredClassNames = new Set(groupSuggestions.flatMap((suggestion)=>suggestion.classNames));
|
|
64
|
-
const reports = [];
|
|
65
|
-
let fixedRaw = raw;
|
|
66
|
-
for (const suggestion of groupSuggestions){
|
|
67
|
-
const firstClassNode = classNodes.find((node)=>node.value === suggestion.classNames[0]);
|
|
68
|
-
if (!firstClassNode) continue;
|
|
69
|
-
fixedRaw = cssLint.replaceClassGroupInClassList(fixedRaw, suggestion.classNames, suggestion.recommended, {
|
|
70
|
-
unescape
|
|
71
|
-
});
|
|
72
|
-
reports.push({
|
|
73
|
-
loc: firstClassNode.loc,
|
|
74
|
-
actual: suggestion.classNames.join(' '),
|
|
75
|
-
recommended: suggestion.recommended
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
for (const classNode of classNodes){
|
|
79
|
-
if (coveredClassNames.has(classNode.value)) continue;
|
|
80
|
-
const recommended = cssLint.suggestCanonicalClassName(classNode.value, css, options);
|
|
81
|
-
if (!recommended) continue;
|
|
82
|
-
fixedRaw = cssLint.replaceClassNameInClassList(fixedRaw, classNode.value, recommended, {
|
|
83
|
-
unescape
|
|
84
|
-
});
|
|
85
|
-
reports.push({
|
|
86
|
-
loc: classNode.loc,
|
|
87
|
-
actual: classNode.value,
|
|
88
|
-
recommended
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
for (const report of reports){
|
|
92
|
-
context.report({
|
|
93
|
-
node,
|
|
94
|
-
loc: report.loc,
|
|
95
|
-
messageId: 'preferClass',
|
|
96
|
-
data: {
|
|
97
|
-
actual: report.actual,
|
|
98
|
-
recommended: report.recommended
|
|
99
|
-
},
|
|
100
|
-
fix (fixer) {
|
|
101
|
-
return fixer.replaceTextRange([
|
|
102
|
-
start,
|
|
103
|
-
end
|
|
104
|
-
], fixedRaw);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
module.exports = preferCanonicalClasses;
|