@master/eslint-plugin-css 2.0.0-rc.15 → 2.0.0-rc.16

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 (83) hide show
  1. package/dist/configs/config.cjs +16 -0
  2. package/dist/configs/config.mjs +14 -1
  3. package/dist/configs/flat.cjs +13 -0
  4. package/dist/configs/flat.mjs +11 -1
  5. package/dist/configs/recommended.cjs +12 -0
  6. package/dist/configs/recommended.mjs +10 -1
  7. package/dist/index.cjs +15 -0
  8. package/dist/index.mjs +13 -1
  9. package/dist/plugin.cjs +18 -0
  10. package/dist/plugin.mjs +16 -1
  11. package/dist/rules/class-collision.cjs +103 -0
  12. package/dist/rules/class-collision.mjs +101 -1
  13. package/dist/rules/class-order.cjs +196 -0
  14. package/dist/rules/class-order.mjs +194 -1
  15. package/dist/rules/class-validation.cjs +91 -0
  16. package/dist/rules/class-validation.mjs +89 -1
  17. package/dist/settings.cjs +13 -0
  18. package/dist/settings.mjs +11 -1
  19. package/dist/utils/are-declarations-equal.cjs +21 -0
  20. package/dist/utils/are-declarations-equal.mjs +19 -1
  21. package/dist/utils/define-visitors.cjs +74 -0
  22. package/dist/utils/define-visitors.mjs +72 -1
  23. package/dist/utils/extract-classnames-from-value.cjs +34 -0
  24. package/dist/utils/extract-classnames-from-value.mjs +32 -1
  25. package/dist/utils/extract-range-from-node.cjs +18 -0
  26. package/dist/utils/extract-range-from-node.mjs +16 -1
  27. package/dist/utils/extract-value-from-node.cjs +23 -0
  28. package/dist/utils/extract-value-from-node.mjs +21 -1
  29. package/dist/utils/find-loc.cjs +40 -0
  30. package/dist/utils/find-loc.mjs +38 -1
  31. package/dist/utils/get-mastercss.cjs +16 -0
  32. package/dist/utils/get-mastercss.d.ts +1 -1
  33. package/dist/utils/get-mastercss.mjs +14 -1
  34. package/dist/utils/get-template-element-body.cjs +12 -0
  35. package/dist/utils/get-template-element-body.mjs +10 -1
  36. package/dist/utils/get-template-element-prefix.cjs +11 -0
  37. package/dist/utils/get-template-element-prefix.mjs +9 -1
  38. package/dist/utils/get-template-element-suffix.cjs +10 -0
  39. package/dist/utils/get-template-element-suffix.mjs +8 -1
  40. package/dist/utils/parse-node-recursive.cjs +122 -0
  41. package/dist/utils/parse-node-recursive.mjs +120 -1
  42. package/dist/utils/reorder-valid-classes-action.cjs +9 -0
  43. package/dist/utils/reorder-valid-classes-action.mjs +7 -1
  44. package/dist/utils/resolve-context.cjs +13 -0
  45. package/dist/utils/resolve-context.mjs +11 -1
  46. package/dist/utils/valid-rules-action.cjs +9 -0
  47. package/dist/utils/valid-rules-action.mjs +7 -1
  48. package/dist/utils/validate-action.cjs +9 -0
  49. package/dist/utils/validate-action.mjs +7 -1
  50. package/dist/utils/workers/reorder-valid-classes.cjs +15 -0
  51. package/dist/utils/workers/reorder-valid-classes.mjs +13 -1
  52. package/dist/utils/workers/valid-rules.cjs +23 -0
  53. package/dist/utils/workers/valid-rules.mjs +21 -1
  54. package/dist/utils/workers/validate.cjs +15 -0
  55. package/dist/utils/workers/validate.mjs +13 -1
  56. package/package.json +1 -1
  57. package/dist/configs/config.js +0 -1
  58. package/dist/configs/flat.js +0 -1
  59. package/dist/configs/recommended.js +0 -1
  60. package/dist/index.js +0 -1
  61. package/dist/plugin.js +0 -1
  62. package/dist/rules/class-collision.js +0 -1
  63. package/dist/rules/class-order.js +0 -1
  64. package/dist/rules/class-validation.js +0 -1
  65. package/dist/settings.js +0 -1
  66. package/dist/utils/are-declarations-equal.js +0 -1
  67. package/dist/utils/define-visitors.js +0 -1
  68. package/dist/utils/extract-classnames-from-value.js +0 -1
  69. package/dist/utils/extract-range-from-node.js +0 -1
  70. package/dist/utils/extract-value-from-node.js +0 -1
  71. package/dist/utils/find-loc.js +0 -1
  72. package/dist/utils/get-mastercss.js +0 -1
  73. package/dist/utils/get-template-element-body.js +0 -1
  74. package/dist/utils/get-template-element-prefix.js +0 -1
  75. package/dist/utils/get-template-element-suffix.js +0 -1
  76. package/dist/utils/parse-node-recursive.js +0 -1
  77. package/dist/utils/reorder-valid-classes-action.js +0 -1
  78. package/dist/utils/resolve-context.js +0 -1
  79. package/dist/utils/valid-rules-action.js +0 -1
  80. package/dist/utils/validate-action.js +0 -1
  81. package/dist/utils/workers/reorder-valid-classes.js +0 -1
  82. package/dist/utils/workers/valid-rules.js +0 -1
  83. package/dist/utils/workers/validate.js +0 -1
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const config = {
4
+ rules: {
5
+ '@master/css/class-order': 'warn',
6
+ '@master/css/class-validation': 'error',
7
+ '@master/css/class-collision': 'warn'
8
+ },
9
+ parserOptions: {
10
+ ecmaFeatures: {
11
+ jsx: true
12
+ }
13
+ }
14
+ };
15
+
16
+ module.exports = config;
@@ -1 +1,14 @@
1
- const s={rules:{"@master/css/class-order":"warn","@master/css/class-validation":"error","@master/css/class-collision":"warn"},parserOptions:{ecmaFeatures:{jsx:!0}}};var r=s;export{r as default};
1
+ const config = {
2
+ rules: {
3
+ '@master/css/class-order': 'warn',
4
+ '@master/css/class-validation': 'error',
5
+ '@master/css/class-collision': 'warn'
6
+ },
7
+ parserOptions: {
8
+ ecmaFeatures: {
9
+ jsx: true
10
+ }
11
+ }
12
+ };
13
+
14
+ export { config as default };
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var plugin = require('../plugin.cjs');
4
+ var config = require('./config.cjs');
5
+
6
+ var flat = {
7
+ plugins: {
8
+ '@master/css': plugin
9
+ },
10
+ ...config
11
+ };
12
+
13
+ module.exports = flat;
@@ -1 +1,11 @@
1
- import o from"../plugin.mjs";import r from"./config.mjs";var p={plugins:{"@master/css":o},...r};export{p as default};
1
+ import plugin from '../plugin.mjs';
2
+ import config from './config.mjs';
3
+
4
+ var flat = {
5
+ plugins: {
6
+ '@master/css': plugin
7
+ },
8
+ ...config
9
+ };
10
+
11
+ export { flat as default };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var config = require('./config.cjs');
4
+
5
+ var recommended = {
6
+ plugins: [
7
+ '@master/css'
8
+ ],
9
+ ...config
10
+ };
11
+
12
+ module.exports = recommended;
@@ -1 +1,10 @@
1
- import o from"./config.mjs";var s={plugins:["@master/css"],...o};export{s as default};
1
+ import config from './config.mjs';
2
+
3
+ var recommended = {
4
+ plugins: [
5
+ '@master/css'
6
+ ],
7
+ ...config
8
+ };
9
+
10
+ export { recommended as default };
package/dist/index.cjs ADDED
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var plugin = require('./plugin.cjs');
4
+ var settings = require('./settings.cjs');
5
+ var recommended = require('./configs/recommended.cjs');
6
+ var flat = require('./configs/flat.cjs');
7
+
8
+ module.exports = {
9
+ ...plugin,
10
+ configs: {
11
+ recommended,
12
+ flat
13
+ },
14
+ settings
15
+ };
package/dist/index.mjs CHANGED
@@ -1 +1,13 @@
1
- var i=(r,o)=>()=>(o||r((o={exports:{}}).exports,o),o.exports);import t from"./plugin.mjs";import f from"./settings.mjs";import p from"./configs/recommended.mjs";import e from"./configs/flat.mjs";var n=i((x,m)=>{m.exports={...t,configs:{recommended:p,flat:e},settings:f}});export default n();
1
+ import plugin from './plugin.mjs';
2
+ import settings from './settings.mjs';
3
+ import recommended from './configs/recommended.mjs';
4
+ import flat from './configs/flat.mjs';
5
+
6
+ module.exports = {
7
+ ...plugin,
8
+ configs: {
9
+ recommended,
10
+ flat
11
+ },
12
+ settings
13
+ };
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ var classCollision = require('./rules/class-collision.cjs');
4
+ var classOrder = require('./rules/class-order.cjs');
5
+ var classValidation = require('./rules/class-validation.cjs');
6
+
7
+ const plugin = {
8
+ meta: {
9
+ name: '@master/eslint-plugin-css'
10
+ },
11
+ rules: {
12
+ 'class-collision': classCollision,
13
+ 'class-order': classOrder,
14
+ 'class-validation': classValidation
15
+ }
16
+ };
17
+
18
+ module.exports = plugin;
package/dist/plugin.mjs CHANGED
@@ -1 +1,16 @@
1
- import s from"./rules/class-collision.mjs";import i from"./rules/class-order.mjs";import l from"./rules/class-validation.mjs";const o={meta:{name:"@master/eslint-plugin-css"},rules:{"class-collision":s,"class-order":i,"class-validation":l}};var n=o;export{n as default};
1
+ import classCollision from './rules/class-collision.mjs';
2
+ import classOrder from './rules/class-order.mjs';
3
+ import classValidation from './rules/class-validation.mjs';
4
+
5
+ const plugin = {
6
+ meta: {
7
+ name: '@master/eslint-plugin-css'
8
+ },
9
+ rules: {
10
+ 'class-collision': classCollision,
11
+ 'class-order': classOrder,
12
+ 'class-validation': classValidation
13
+ }
14
+ };
15
+
16
+ export { plugin as default };
@@ -0,0 +1,103 @@
1
+ 'use strict';
2
+
3
+ var areDeclarationsEqual = require('../utils/are-declarations-equal.cjs');
4
+ var defineVisitors = require('../utils/define-visitors.cjs');
5
+ var resolveContext = require('../utils/resolve-context.cjs');
6
+ var findLoc = require('../utils/find-loc.cjs');
7
+ var parseNodeRecursive = require('../utils/parse-node-recursive.cjs');
8
+ var validRulesAction = require('../utils/valid-rules-action.cjs');
9
+
10
+ var classCollision = {
11
+ meta: {
12
+ docs: {
13
+ description: 'Avoid applying classes with the same CSS declaration',
14
+ category: 'Stylistic Issues',
15
+ recommended: false,
16
+ url: 'https://rc.css.master.co/docs/code-linting#class-collision-detection'
17
+ },
18
+ messages: {
19
+ collisionClass: '{{message}}'
20
+ },
21
+ fixable: 'code',
22
+ schema: [
23
+ {
24
+ type: 'object',
25
+ properties: {
26
+ calleeMatching: {
27
+ type: 'string'
28
+ },
29
+ classMatching: {
30
+ type: 'string'
31
+ },
32
+ ignoredKeys: {
33
+ type: 'array',
34
+ items: {
35
+ type: 'string',
36
+ minLength: 0
37
+ },
38
+ uniqueItems: true
39
+ },
40
+ config: {
41
+ type: [
42
+ 'string',
43
+ 'object'
44
+ ]
45
+ }
46
+ }
47
+ }
48
+ ]
49
+ },
50
+ create (context) {
51
+ const { options, settings } = resolveContext(context);
52
+ const visitNode = (node, arg = null)=>{
53
+ parseNodeRecursive.parseNodeRecursive(node, arg, (classNames, node, originalClassNamesValue, start, end)=>{
54
+ const sourceCode = context.sourceCode;
55
+ const sourceCodeLines = sourceCode.lines;
56
+ const nodeStartLine = node.loc.start.line;
57
+ const nodeEndLine = node.loc.end.line;
58
+ const ruleOfClass = validRulesAction(classNames, settings.config);
59
+ for(let i = 0; i < classNames.length; i++){
60
+ const className = classNames[i];
61
+ const rule = ruleOfClass[className];
62
+ const conflicts = [];
63
+ if (rule) {
64
+ for(let j = 0; j < classNames.length; j++){
65
+ const compareClassName = classNames[j];
66
+ const compareRule = ruleOfClass[compareClassName];
67
+ if (i !== j && compareRule && areDeclarationsEqual(rule.declarations, compareRule.declarations) && rule.stateToken === compareRule.stateToken) {
68
+ conflicts.push(compareClassName);
69
+ }
70
+ }
71
+ }
72
+ if (conflicts.length > 0) {
73
+ const conflictClassNamesMsg = conflicts.map((x)=>`"${x}"`).join(' and ');
74
+ let fixClassNames = originalClassNamesValue;
75
+ for (const conflictClassName of conflicts){
76
+ const regexSafe = conflictClassName.replace(/(\\|\.|\(|\)|\[|\]|\{|\}|\+|\*|\?|\^|\$|\||\/)/g, '\\$1');
77
+ fixClassNames = fixClassNames.replace(new RegExp(`\\s+${regexSafe}|${regexSafe}\\s+`), '');
78
+ }
79
+ context.report({
80
+ loc: findLoc(className, sourceCodeLines, nodeStartLine, nodeEndLine),
81
+ messageId: 'collisionClass',
82
+ data: {
83
+ message: `"${className}" applies the same CSS declarations as ${conflictClassNamesMsg}.`
84
+ },
85
+ fix: function(fixer) {
86
+ return fixer.replaceTextRange([
87
+ start,
88
+ end
89
+ ], fixClassNames);
90
+ }
91
+ });
92
+ }
93
+ }
94
+ }, false, false, settings.ignoredKeys, context);
95
+ };
96
+ return defineVisitors({
97
+ context,
98
+ settings
99
+ }, visitNode);
100
+ }
101
+ };
102
+
103
+ module.exports = classCollision;
@@ -1 +1,101 @@
1
- import $ from"../utils/are-declarations-equal.mjs";import v from"../utils/define-visitors.mjs";import L from"../utils/resolve-context.mjs";import j from"../utils/find-loc.mjs";import{parseNodeRecursive as x}from"../utils/parse-node-recursive.mjs";import M from"../utils/valid-rules-action.mjs";var O={meta:{docs:{description:"Avoid applying classes with the same CSS declaration",category:"Stylistic Issues",recommended:!1,url:"https://rc.css.master.co/docs/code-linting#class-collision-detection"},messages:{collisionClass:"{{message}}"},fixable:"code",schema:[{type:"object",properties:{calleeMatching:{type:"string"},classMatching:{type:"string"},ignoredKeys:{type:"array",items:{type:"string",minLength:0},uniqueItems:!0},config:{type:["string","object"]}}}]},create(t){const{options:N,settings:a}=L(t);return v({context:t,settings:a},(f,g=null)=>{x(f,g,(i,d,u,C,h)=>{const y=t.sourceCode.lines,R=d.loc.start.line,S=d.loc.end.line,p=M(i,a.config);for(let n=0;n<i.length;n++){const c=i[n],l=p[c],r=[];if(l)for(let s=0;s<i.length;s++){const o=i[s],e=p[o];n!==s&&e&&$(l.declarations,e.declarations)&&l.stateToken===e.stateToken&&r.push(o)}if(r.length>0){const s=r.map(e=>`"${e}"`).join(" and ");let o=u;for(const e of r){const m=e.replace(/(\\|\.|\(|\)|\[|\]|\{|\}|\+|\*|\?|\^|\$|\||\/)/g,"\\$1");o=o.replace(new RegExp(`\\s+${m}|${m}\\s+`),"")}t.report({loc:j(c,y,R,S),messageId:"collisionClass",data:{message:`"${c}" applies the same CSS declarations as ${s}.`},fix:function(e){return e.replaceTextRange([C,h],o)}})}}},!1,!1,a.ignoredKeys,t)})}};export{O as default};
1
+ import areDeclarationsEqual from '../utils/are-declarations-equal.mjs';
2
+ import defineVisitors from '../utils/define-visitors.mjs';
3
+ import resolveContext from '../utils/resolve-context.mjs';
4
+ import findLoc from '../utils/find-loc.mjs';
5
+ import { parseNodeRecursive } from '../utils/parse-node-recursive.mjs';
6
+ import validRulesAction from '../utils/valid-rules-action.mjs';
7
+
8
+ var classCollision = {
9
+ meta: {
10
+ docs: {
11
+ description: 'Avoid applying classes with the same CSS declaration',
12
+ category: 'Stylistic Issues',
13
+ recommended: false,
14
+ url: 'https://rc.css.master.co/docs/code-linting#class-collision-detection'
15
+ },
16
+ messages: {
17
+ collisionClass: '{{message}}'
18
+ },
19
+ fixable: 'code',
20
+ schema: [
21
+ {
22
+ type: 'object',
23
+ properties: {
24
+ calleeMatching: {
25
+ type: 'string'
26
+ },
27
+ classMatching: {
28
+ type: 'string'
29
+ },
30
+ ignoredKeys: {
31
+ type: 'array',
32
+ items: {
33
+ type: 'string',
34
+ minLength: 0
35
+ },
36
+ uniqueItems: true
37
+ },
38
+ config: {
39
+ type: [
40
+ 'string',
41
+ 'object'
42
+ ]
43
+ }
44
+ }
45
+ }
46
+ ]
47
+ },
48
+ create (context) {
49
+ const { options, settings } = resolveContext(context);
50
+ const visitNode = (node, arg = null)=>{
51
+ parseNodeRecursive(node, arg, (classNames, node, originalClassNamesValue, start, end)=>{
52
+ const sourceCode = context.sourceCode;
53
+ const sourceCodeLines = sourceCode.lines;
54
+ const nodeStartLine = node.loc.start.line;
55
+ const nodeEndLine = node.loc.end.line;
56
+ const ruleOfClass = validRulesAction(classNames, settings.config);
57
+ for(let i = 0; i < classNames.length; i++){
58
+ const className = classNames[i];
59
+ const rule = ruleOfClass[className];
60
+ const conflicts = [];
61
+ if (rule) {
62
+ for(let j = 0; j < classNames.length; j++){
63
+ const compareClassName = classNames[j];
64
+ const compareRule = ruleOfClass[compareClassName];
65
+ if (i !== j && compareRule && areDeclarationsEqual(rule.declarations, compareRule.declarations) && rule.stateToken === compareRule.stateToken) {
66
+ conflicts.push(compareClassName);
67
+ }
68
+ }
69
+ }
70
+ if (conflicts.length > 0) {
71
+ const conflictClassNamesMsg = conflicts.map((x)=>`"${x}"`).join(' and ');
72
+ let fixClassNames = originalClassNamesValue;
73
+ for (const conflictClassName of conflicts){
74
+ const regexSafe = conflictClassName.replace(/(\\|\.|\(|\)|\[|\]|\{|\}|\+|\*|\?|\^|\$|\||\/)/g, '\\$1');
75
+ fixClassNames = fixClassNames.replace(new RegExp(`\\s+${regexSafe}|${regexSafe}\\s+`), '');
76
+ }
77
+ context.report({
78
+ loc: findLoc(className, sourceCodeLines, nodeStartLine, nodeEndLine),
79
+ messageId: 'collisionClass',
80
+ data: {
81
+ message: `"${className}" applies the same CSS declarations as ${conflictClassNamesMsg}.`
82
+ },
83
+ fix: function(fixer) {
84
+ return fixer.replaceTextRange([
85
+ start,
86
+ end
87
+ ], fixClassNames);
88
+ }
89
+ });
90
+ }
91
+ }
92
+ }, false, false, settings.ignoredKeys, context);
93
+ };
94
+ return defineVisitors({
95
+ context,
96
+ settings
97
+ }, visitNode);
98
+ }
99
+ };
100
+
101
+ export { classCollision as default };
@@ -0,0 +1,196 @@
1
+ 'use strict';
2
+
3
+ var defineVisitors = require('../utils/define-visitors.cjs');
4
+ var resolveContext = require('../utils/resolve-context.cjs');
5
+ var getTemplateElementBody = require('../utils/get-template-element-body.cjs');
6
+ var getTemplateElementSuffix = require('../utils/get-template-element-suffix.cjs');
7
+ var getTemplateElementPrefix = require('../utils/get-template-element-prefix.cjs');
8
+ var extractValueFromNode = require('../utils/extract-value-from-node.cjs');
9
+ var extractRangeFromNode = require('../utils/extract-range-from-node.cjs');
10
+ var extractClassnamesFromValue = require('../utils/extract-classnames-from-value.cjs');
11
+ var findLoc = require('../utils/find-loc.cjs');
12
+ var reorderValidClassesAction = require('../utils/reorder-valid-classes-action.cjs');
13
+
14
+ var classOrder = {
15
+ meta: {
16
+ docs: {
17
+ description: 'Enforce a consistent and logical order of classes',
18
+ category: 'Stylistic Issues',
19
+ recommended: false,
20
+ url: 'https://rc.css.master.co/docs/code-linting#consistent-class-order'
21
+ },
22
+ messages: {
23
+ invalidClassOrder: 'No consistent class order followed.'
24
+ },
25
+ fixable: 'code',
26
+ schema: [
27
+ {
28
+ type: 'object',
29
+ properties: {
30
+ calleeMatching: {
31
+ type: 'string'
32
+ },
33
+ classMatching: {
34
+ type: 'string'
35
+ },
36
+ ignoredKeys: {
37
+ type: 'array',
38
+ items: {
39
+ type: 'string',
40
+ minLength: 0
41
+ },
42
+ uniqueItems: true
43
+ },
44
+ config: {
45
+ type: [
46
+ 'string',
47
+ 'object'
48
+ ]
49
+ }
50
+ }
51
+ }
52
+ ]
53
+ },
54
+ create: function(context) {
55
+ const { options, settings } = resolveContext(context);
56
+ const sourceCode = context.sourceCode;
57
+ const visitNode = (node, arg = null)=>{
58
+ let originalClassNamesValue = null;
59
+ let start = null;
60
+ let end = null;
61
+ let prefix = '';
62
+ let suffix = '';
63
+ let expStrings = [];
64
+ if (arg === null) {
65
+ originalClassNamesValue = extractValueFromNode(node);
66
+ const range = extractRangeFromNode(node);
67
+ if (node.type === 'TextAttribute') {
68
+ start = range[0];
69
+ end = range[1];
70
+ } else {
71
+ start = range[0] + 1;
72
+ end = range[1] - 1;
73
+ }
74
+ } else {
75
+ switch(arg.type){
76
+ case 'Identifier':
77
+ return;
78
+ case 'TemplateLiteral':
79
+ arg.expressions.forEach((exp)=>{
80
+ visitNode(node, exp);
81
+ });
82
+ originalClassNamesValue = sourceCode.getText(arg);
83
+ originalClassNamesValue = originalClassNamesValue.substring(1, originalClassNamesValue.length - 1);
84
+ expStrings = originalClassNamesValue.match(/\$\{(?:(?<!\\\\)(['"`]).*?(?<!\\\\)\1|[^}])*?\}/g) ?? [];
85
+ for(let i = 0; i < expStrings.length; i++){
86
+ originalClassNamesValue = originalClassNamesValue.replace(expStrings[i], `EXPRESSION_STRING_NUM_${i}`);
87
+ }
88
+ start = arg.range[0] + 1;
89
+ end = arg.range[1] - 1;
90
+ break;
91
+ case 'ConditionalExpression':
92
+ visitNode(node, arg.consequent);
93
+ visitNode(node, arg.alternate);
94
+ return;
95
+ case 'LogicalExpression':
96
+ visitNode(node, arg.right);
97
+ return;
98
+ case 'ArrayExpression':
99
+ arg.elements.forEach((el)=>{
100
+ visitNode(node, el);
101
+ });
102
+ return;
103
+ case 'ObjectExpression':
104
+ const isUsedByClassNamesPlugin = node.callee && node.callee.name === 'classnames';
105
+ const isVue = node.key && node.key.type === 'VDirectiveKey';
106
+ arg.properties.forEach((prop)=>{
107
+ const propVal = isUsedByClassNamesPlugin || isVue ? prop.key : prop.value;
108
+ visitNode(node, propVal);
109
+ });
110
+ return;
111
+ case 'Property':
112
+ visitNode(node, arg.key);
113
+ break;
114
+ case 'Literal':
115
+ originalClassNamesValue = arg.value;
116
+ start = arg.range[0] + 1;
117
+ end = arg.range[1] - 1;
118
+ break;
119
+ case 'SvelteLiteral':
120
+ originalClassNamesValue = arg.value;
121
+ if (originalClassNamesValue === '') {
122
+ return;
123
+ }
124
+ start = arg.range[0];
125
+ end = arg.range[1];
126
+ break;
127
+ case 'TemplateElement':
128
+ originalClassNamesValue = arg.value.raw;
129
+ if (originalClassNamesValue === '') {
130
+ return;
131
+ }
132
+ start = arg.range[0];
133
+ end = arg.range[1];
134
+ // https://github.com/eslint/eslint/issues/13360
135
+ // The problem is that range computation includes the backticks (`test`)
136
+ // but value.raw does not include them, so there is a mismatch.
137
+ // start/end does not include the backticks, therefore it matches value.raw.
138
+ const txt = context.sourceCode.getText(arg);
139
+ prefix = getTemplateElementPrefix(txt, originalClassNamesValue);
140
+ suffix = getTemplateElementSuffix(txt, originalClassNamesValue);
141
+ originalClassNamesValue = getTemplateElementBody(txt, prefix, suffix);
142
+ break;
143
+ }
144
+ }
145
+ const { classNames, whitespaces, headSpace, tailSpace } = extractClassnamesFromValue(originalClassNamesValue);
146
+ if (classNames.length <= 1) {
147
+ // Don't run sorting for a single or empty className
148
+ return;
149
+ }
150
+ let orderedClassNames = reorderValidClassesAction(classNames, settings.config);
151
+ orderedClassNames = classNames.filter((x)=>!orderedClassNames.includes(x)).concat(orderedClassNames).filter((x)=>x.trim() !== '');
152
+ // Generates the validated/sorted attribute value
153
+ let validatedClassNamesValue = '';
154
+ for(let i = 0; i < orderedClassNames.length; i++){
155
+ const w = whitespaces[i] ?? '';
156
+ const cls = orderedClassNames[i];
157
+ validatedClassNamesValue += headSpace ? `${w}${cls}` : `${cls}${w}`;
158
+ if (cls) {
159
+ if (!tailSpace && i === orderedClassNames.length - 1) {
160
+ validatedClassNamesValue = validatedClassNamesValue.replace(/\s+$/, '');
161
+ }
162
+ if (headSpace && tailSpace && i === orderedClassNames.length - 1) {
163
+ validatedClassNamesValue += whitespaces[whitespaces.length - 1] ?? '';
164
+ }
165
+ }
166
+ }
167
+ for(let i = 0; i < expStrings.length; i++){
168
+ originalClassNamesValue = originalClassNamesValue.replace(`EXPRESSION_STRING_NUM_${i}`, expStrings[i]);
169
+ validatedClassNamesValue = validatedClassNamesValue.replace(`EXPRESSION_STRING_NUM_${i}`, expStrings[i]);
170
+ }
171
+ if (originalClassNamesValue !== validatedClassNamesValue) {
172
+ validatedClassNamesValue = prefix + validatedClassNamesValue + suffix;
173
+ const sourceCodeLines = sourceCode.lines;
174
+ const nodeStartLine = node.loc.start.line;
175
+ const nodeEndLine = node.loc.end.line;
176
+ const descriptor = {
177
+ loc: findLoc(originalClassNamesValue, sourceCodeLines, nodeStartLine, nodeEndLine),
178
+ messageId: 'invalidClassOrder',
179
+ fix: function(fixer) {
180
+ return fixer.replaceTextRange([
181
+ start,
182
+ end
183
+ ], validatedClassNamesValue);
184
+ }
185
+ };
186
+ context.report(descriptor);
187
+ }
188
+ };
189
+ return defineVisitors({
190
+ context,
191
+ settings
192
+ }, visitNode);
193
+ }
194
+ };
195
+
196
+ module.exports = classOrder;