@master/eslint-plugin-css 2.0.0-rc.73 → 2.0.0-rc.74

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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/configs/base.d.ts +5 -2
  3. package/dist/configs/base.js +5 -0
  4. package/dist/configs/legacy.d.ts +5 -2
  5. package/dist/configs/legacy.js +9 -0
  6. package/dist/configs/recommended.d.ts +5 -2
  7. package/dist/configs/recommended.js +13 -0
  8. package/dist/create-rule.d.ts +11 -4
  9. package/dist/create-rule.js +5 -0
  10. package/dist/index.d.ts +13 -10
  11. package/dist/index.js +17 -0
  12. package/dist/plugin.d.ts +5 -2
  13. package/dist/plugin.js +26 -0
  14. package/dist/rules/no-conflicting-classes.d.ts +4 -2
  15. package/dist/rules/no-conflicting-classes.js +76 -0
  16. package/dist/rules/no-invalid-classes.d.ts +5 -3
  17. package/dist/rules/no-invalid-classes.js +41 -0
  18. package/dist/rules/no-unapproved-raw-values.d.ts +7 -5
  19. package/dist/rules/no-unapproved-raw-values.js +61 -0
  20. package/dist/rules/prefer-canonical-classes.d.ts +6 -3
  21. package/dist/rules/prefer-canonical-classes.js +79 -0
  22. package/dist/rules/sort-classes.d.ts +4 -2
  23. package/dist/rules/sort-classes.js +40 -0
  24. package/dist/settings-schema.d.ts +7 -4
  25. package/dist/settings-schema.js +27 -0
  26. package/dist/settings.d.ts +16 -13
  27. package/dist/settings.js +8 -0
  28. package/dist/utils/define-visitors.d.ts +14 -7
  29. package/dist/utils/define-visitors.js +107 -0
  30. package/dist/utils/is-same-or-child-path.d.ts +4 -1
  31. package/dist/utils/is-same-or-child-path.js +8 -0
  32. package/dist/utils/master-css.d.ts +6 -4
  33. package/dist/utils/master-css.js +6 -0
  34. package/dist/utils/resolve-class-node.d.ts +22 -18
  35. package/dist/utils/resolve-class-node.js +85 -0
  36. package/dist/utils/resolve-context.d.ts +16 -12
  37. package/dist/utils/resolve-context.js +69 -0
  38. package/dist/utils/with-visit-class-node.d.ts +8 -4
  39. package/dist/utils/with-visit-class-node.js +51 -0
  40. package/package.json +78 -1
  41. package/dist/configs/base.cjs +0 -11
  42. package/dist/configs/base.mjs +0 -9
  43. package/dist/configs/legacy.cjs +0 -17
  44. package/dist/configs/legacy.mjs +0 -15
  45. package/dist/configs/recommended.cjs +0 -15
  46. package/dist/configs/recommended.mjs +0 -13
  47. package/dist/create-rule.cjs +0 -7
  48. package/dist/create-rule.mjs +0 -5
  49. package/dist/index.cjs +0 -19
  50. package/dist/index.mjs +0 -17
  51. package/dist/plugin.cjs +0 -30
  52. package/dist/plugin.mjs +0 -27
  53. package/dist/rules/no-conflicting-classes.cjs +0 -101
  54. package/dist/rules/no-conflicting-classes.mjs +0 -99
  55. package/dist/rules/no-invalid-classes.cjs +0 -51
  56. package/dist/rules/no-invalid-classes.mjs +0 -49
  57. package/dist/rules/no-unapproved-raw-values.cjs +0 -77
  58. package/dist/rules/no-unapproved-raw-values.mjs +0 -75
  59. package/dist/rules/prefer-canonical-classes.cjs +0 -112
  60. package/dist/rules/prefer-canonical-classes.mjs +0 -110
  61. package/dist/rules/sort-classes.cjs +0 -53
  62. package/dist/rules/sort-classes.mjs +0 -51
  63. package/dist/settings-schema.cjs +0 -38
  64. package/dist/settings-schema.mjs +0 -32
  65. package/dist/settings.cjs +0 -10
  66. package/dist/settings.mjs +0 -8
  67. package/dist/utils/define-visitors.cjs +0 -125
  68. package/dist/utils/define-visitors.mjs +0 -123
  69. package/dist/utils/is-same-or-child-path.cjs +0 -10
  70. package/dist/utils/is-same-or-child-path.mjs +0 -8
  71. package/dist/utils/master-css.cjs +0 -14
  72. package/dist/utils/master-css.mjs +0 -7
  73. package/dist/utils/resolve-class-node.cjs +0 -98
  74. package/dist/utils/resolve-class-node.mjs +0 -96
  75. package/dist/utils/resolve-context.cjs +0 -78
  76. package/dist/utils/resolve-context.mjs +0 -76
  77. package/dist/utils/with-visit-class-node.cjs +0 -57
  78. 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;