@master/eslint-plugin-css 2.0.0-rc.7 → 2.0.0-rc.70

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 (122) hide show
  1. package/README.md +136 -7
  2. package/dist/common.cjs +7 -0
  3. package/dist/common.d.ts +2 -0
  4. package/dist/common.mjs +4 -0
  5. package/dist/configs/base.cjs +11 -0
  6. package/dist/configs/base.d.ts +3 -0
  7. package/dist/configs/base.mjs +9 -0
  8. package/dist/configs/legacy.cjs +17 -0
  9. package/dist/configs/legacy.d.ts +3 -0
  10. package/dist/configs/legacy.mjs +15 -0
  11. package/dist/configs/recommended.cjs +14 -0
  12. package/dist/configs/recommended.d.ts +2 -13
  13. package/dist/configs/recommended.mjs +12 -1
  14. package/dist/create-rule.cjs +7 -0
  15. package/dist/create-rule.d.ts +5 -0
  16. package/dist/create-rule.mjs +5 -0
  17. package/dist/functions/filter-collision-classes.cjs +29 -0
  18. package/dist/functions/filter-collision-classes.d.ts +2 -0
  19. package/dist/functions/filter-collision-classes.mjs +27 -0
  20. package/dist/index.cjs +19 -0
  21. package/dist/index.d.ts +12 -1
  22. package/dist/index.mjs +17 -1
  23. package/dist/plugin.cjs +26 -0
  24. package/dist/plugin.d.ts +2 -2
  25. package/dist/plugin.mjs +23 -1
  26. package/dist/rules/class-collision.cjs +76 -0
  27. package/dist/rules/class-collision.d.ts +3 -2
  28. package/dist/rules/class-collision.mjs +74 -1
  29. package/dist/rules/class-order.cjs +64 -0
  30. package/dist/rules/class-order.d.ts +3 -2
  31. package/dist/rules/class-order.mjs +62 -1
  32. package/dist/rules/class-validation.cjs +60 -0
  33. package/dist/rules/class-validation.d.ts +3 -2
  34. package/dist/rules/class-validation.mjs +58 -1
  35. package/dist/settings-schema.cjs +32 -0
  36. package/dist/settings-schema.d.ts +3 -0
  37. package/dist/settings-schema.mjs +30 -0
  38. package/dist/settings.cjs +16 -0
  39. package/dist/settings.d.ts +12 -3
  40. package/dist/settings.mjs +14 -1
  41. package/dist/utils/define-visitors.cjs +125 -0
  42. package/dist/utils/define-visitors.d.ts +7 -4
  43. package/dist/utils/define-visitors.mjs +123 -1
  44. package/dist/utils/is-same-or-child-path.cjs +10 -0
  45. package/dist/utils/is-same-or-child-path.d.ts +1 -0
  46. package/dist/utils/is-same-or-child-path.mjs +8 -0
  47. package/dist/utils/master-css.cjs +94 -0
  48. package/dist/utils/master-css.d.ts +21 -0
  49. package/dist/utils/master-css.mjs +81 -0
  50. package/dist/utils/resolve-class-node.cjs +147 -0
  51. package/dist/utils/resolve-class-node.d.ts +12 -0
  52. package/dist/utils/resolve-class-node.mjs +145 -0
  53. package/dist/utils/resolve-context.cjs +78 -0
  54. package/dist/utils/resolve-context.d.ts +11 -2
  55. package/dist/utils/resolve-context.mjs +76 -1
  56. package/dist/utils/with-visit-class-node.cjs +57 -0
  57. package/dist/utils/with-visit-class-node.d.ts +4 -0
  58. package/dist/utils/with-visit-class-node.mjs +55 -0
  59. package/package.json +1 -1
  60. package/dist/configs/config.d.ts +0 -13
  61. package/dist/configs/config.js +0 -1
  62. package/dist/configs/config.mjs +0 -1
  63. package/dist/configs/flat.d.ts +0 -16
  64. package/dist/configs/flat.js +0 -1
  65. package/dist/configs/flat.mjs +0 -1
  66. package/dist/configs/recommended.js +0 -1
  67. package/dist/index.js +0 -1
  68. package/dist/plugin.js +0 -1
  69. package/dist/rules/class-collision.js +0 -1
  70. package/dist/rules/class-order.js +0 -1
  71. package/dist/rules/class-validation.js +0 -1
  72. package/dist/settings.js +0 -1
  73. package/dist/utils/are-declarations-equal.d.ts +0 -1
  74. package/dist/utils/are-declarations-equal.js +0 -1
  75. package/dist/utils/are-declarations-equal.mjs +0 -1
  76. package/dist/utils/define-visitors.js +0 -1
  77. package/dist/utils/extract-classnames-from-value.d.ts +0 -6
  78. package/dist/utils/extract-classnames-from-value.js +0 -1
  79. package/dist/utils/extract-classnames-from-value.mjs +0 -1
  80. package/dist/utils/extract-range-from-node.d.ts +0 -1
  81. package/dist/utils/extract-range-from-node.js +0 -1
  82. package/dist/utils/extract-range-from-node.mjs +0 -1
  83. package/dist/utils/extract-value-from-node.d.ts +0 -1
  84. package/dist/utils/extract-value-from-node.js +0 -1
  85. package/dist/utils/extract-value-from-node.mjs +0 -1
  86. package/dist/utils/find-loc.d.ts +0 -7
  87. package/dist/utils/find-loc.js +0 -1
  88. package/dist/utils/find-loc.mjs +0 -1
  89. package/dist/utils/get-mastercss.d.ts +0 -2
  90. package/dist/utils/get-mastercss.js +0 -1
  91. package/dist/utils/get-mastercss.mjs +0 -1
  92. package/dist/utils/get-template-element-body.d.ts +0 -1
  93. package/dist/utils/get-template-element-body.js +0 -1
  94. package/dist/utils/get-template-element-body.mjs +0 -1
  95. package/dist/utils/get-template-element-prefix.d.ts +0 -1
  96. package/dist/utils/get-template-element-prefix.js +0 -1
  97. package/dist/utils/get-template-element-prefix.mjs +0 -1
  98. package/dist/utils/get-template-element-suffix.d.ts +0 -1
  99. package/dist/utils/get-template-element-suffix.js +0 -1
  100. package/dist/utils/get-template-element-suffix.mjs +0 -1
  101. package/dist/utils/parse-node-recursive.d.ts +0 -13
  102. package/dist/utils/parse-node-recursive.js +0 -1
  103. package/dist/utils/parse-node-recursive.mjs +0 -1
  104. package/dist/utils/reorder-valid-classes-action.d.ts +0 -3
  105. package/dist/utils/reorder-valid-classes-action.js +0 -1
  106. package/dist/utils/reorder-valid-classes-action.mjs +0 -1
  107. package/dist/utils/resolve-context.js +0 -1
  108. package/dist/utils/valid-rules-action.d.ts +0 -3
  109. package/dist/utils/valid-rules-action.js +0 -1
  110. package/dist/utils/valid-rules-action.mjs +0 -1
  111. package/dist/utils/validate-action.d.ts +0 -3
  112. package/dist/utils/validate-action.js +0 -1
  113. package/dist/utils/validate-action.mjs +0 -1
  114. package/dist/utils/workers/reorder-valid-classes.d.ts +0 -2
  115. package/dist/utils/workers/reorder-valid-classes.js +0 -1
  116. package/dist/utils/workers/reorder-valid-classes.mjs +0 -1
  117. package/dist/utils/workers/valid-rules.d.ts +0 -2
  118. package/dist/utils/workers/valid-rules.js +0 -1
  119. package/dist/utils/workers/valid-rules.mjs +0 -1
  120. package/dist/utils/workers/validate.d.ts +0 -5
  121. package/dist/utils/workers/validate.js +0 -1
  122. package/dist/utils/workers/validate.mjs +0 -1
@@ -0,0 +1 @@
1
+ export default function isSameOrChildPath(parentPath: string, childPath: string): boolean;
@@ -0,0 +1,8 @@
1
+ import path from 'node:path';
2
+
3
+ function isSameOrChildPath(parentPath, childPath) {
4
+ const relativePath = path.relative(parentPath, childPath);
5
+ return relativePath === '' || !!relativePath && relativePath !== '..' && !relativePath.startsWith(`..${path.sep}`) && !path.isAbsolute(relativePath);
6
+ }
7
+
8
+ export { isSameOrChildPath as default };
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var css = require('@master/css');
4
+ var cssValidator = require('@master/css-validator');
5
+ var node_module = require('node:module');
6
+ var UtilityType = require('@master/css-schema/utility-type');
7
+
8
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
9
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('utils/master-css.cjs', document.baseURI).href)));
10
+ const defaultManifest = require$1('@master/css-preset/default-manifest.json');
11
+ const CLASS_ATTRIBUTES = [
12
+ 'class',
13
+ 'className'
14
+ ];
15
+ const CLASS_DECLARATIONS = [];
16
+ const CLASS_FUNCTIONS = [
17
+ 'clsx',
18
+ 'cva',
19
+ 'ctl',
20
+ 'cv',
21
+ 'class',
22
+ 'classnames',
23
+ 'classVariant',
24
+ 'styled(?:\\s+)?(?:\\.\\w+)?',
25
+ 'classList(?:\\s+)?\\.(?:add|remove|toggle|replace)'
26
+ ];
27
+ const LAYER_ORDER = [
28
+ 'theme',
29
+ 'base',
30
+ 'defaults',
31
+ 'components',
32
+ 'utilities'
33
+ ];
34
+ function stable(value) {
35
+ if (!value || typeof value !== 'object') return JSON.stringify(value);
36
+ if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;
37
+ return `{${Object.entries(value).sort(([a], [b])=>a.localeCompare(b)).map(([key, item])=>`${JSON.stringify(key)}:${stable(item)}`).join(',')}}`;
38
+ }
39
+ function equalDeclarations(a, b) {
40
+ if (!a || !b || typeof a !== 'object' || typeof b !== 'object') return stable(a) === stable(b);
41
+ const aKeys = Object.keys(a).sort();
42
+ const bKeys = Object.keys(b).sort();
43
+ return stable(aKeys) === stable(bKeys);
44
+ }
45
+ function equalVariants(a, b) {
46
+ const branchA = a.variantBranchKey;
47
+ const branchB = b.variantBranchKey;
48
+ return (branchA !== undefined || branchB !== undefined ? branchA === branchB : a.selectorText === b.selectorText) && a.layerName === b.layerName && stable(a.atRules) === stable(b.atRules);
49
+ }
50
+ function getLayerOrder(layerName) {
51
+ const index = LAYER_ORDER.indexOf(layerName || 'utilities');
52
+ return index === -1 ? LAYER_ORDER.length : index;
53
+ }
54
+ function getReadableGroupOrder(rule) {
55
+ if (rule.atRules) return 3;
56
+ if (rule.mode) return 2;
57
+ if (rule.selectorNodes?.length) return 1;
58
+ return 0;
59
+ }
60
+ function getReadableTypeOrder(rule) {
61
+ if (rule.fixedClass) return 0;
62
+ if (rule.type === UtilityType.Semantic) return 1;
63
+ return 2;
64
+ }
65
+ function sortReadableClasses(classNames, css$1) {
66
+ return [
67
+ ...new Set(classNames)
68
+ ].sort((a, b)=>{
69
+ const ruleA = css$1.generate(a)[0];
70
+ const ruleB = css$1.generate(b)[0];
71
+ if (!ruleA && !ruleB) return a.localeCompare(b);
72
+ if (!ruleA) return 1;
73
+ if (!ruleB) return -1;
74
+ const layerCmp = getLayerOrder(ruleA.layerName) - getLayerOrder(ruleB.layerName);
75
+ if (layerCmp !== 0) return layerCmp;
76
+ const groupCmp = getReadableGroupOrder(ruleA) - getReadableGroupOrder(ruleB);
77
+ if (groupCmp !== 0) return groupCmp;
78
+ const typeCmp = getReadableTypeOrder(ruleA) - getReadableTypeOrder(ruleB);
79
+ if (typeCmp !== 0) return typeCmp;
80
+ return css.compareRulePriority(ruleA, ruleB) || a.localeCompare(b);
81
+ });
82
+ }
83
+
84
+ Object.defineProperty(exports, "createCSSWithNativeDeclarations", {
85
+ enumerable: true,
86
+ get: function () { return cssValidator.createCSSWithNativeDeclarations; }
87
+ });
88
+ exports.CLASS_ATTRIBUTES = CLASS_ATTRIBUTES;
89
+ exports.CLASS_DECLARATIONS = CLASS_DECLARATIONS;
90
+ exports.CLASS_FUNCTIONS = CLASS_FUNCTIONS;
91
+ exports.defaultManifest = defaultManifest;
92
+ exports.equalDeclarations = equalDeclarations;
93
+ exports.equalVariants = equalVariants;
94
+ exports.sortReadableClasses = sortReadableClasses;
@@ -0,0 +1,21 @@
1
+ import { type MasterCSS, type MasterCSSManifest } from '@master/css';
2
+ import { createCSSWithNativeDeclarations } from '@master/css-validator';
3
+ export type { MasterCSS, MasterCSSManifest };
4
+ declare const defaultManifest: MasterCSSManifest;
5
+ export { createCSSWithNativeDeclarations, defaultManifest };
6
+ export declare const CLASS_ATTRIBUTES: string[];
7
+ export declare const CLASS_DECLARATIONS: string[];
8
+ export declare const CLASS_FUNCTIONS: string[];
9
+ export declare function equalDeclarations(a: unknown, b: unknown): boolean;
10
+ export declare function equalVariants(a: {
11
+ selectorText?: string;
12
+ atRules?: unknown;
13
+ layerName?: string;
14
+ variantBranchKey?: string;
15
+ }, b: {
16
+ selectorText?: string;
17
+ atRules?: unknown;
18
+ layerName?: string;
19
+ variantBranchKey?: string;
20
+ }): boolean;
21
+ export declare function sortReadableClasses(classNames: string[], css: MasterCSS): string[];
@@ -0,0 +1,81 @@
1
+ import { compareRulePriority } from '@master/css';
2
+ export { createCSSWithNativeDeclarations } from '@master/css-validator';
3
+ import { createRequire } from 'node:module';
4
+ import UtilityType from '@master/css-schema/utility-type';
5
+
6
+ const require$1 = createRequire(import.meta.url);
7
+ const defaultManifest = require$1('@master/css-preset/default-manifest.json');
8
+ const CLASS_ATTRIBUTES = [
9
+ 'class',
10
+ 'className'
11
+ ];
12
+ const CLASS_DECLARATIONS = [];
13
+ const CLASS_FUNCTIONS = [
14
+ 'clsx',
15
+ 'cva',
16
+ 'ctl',
17
+ 'cv',
18
+ 'class',
19
+ 'classnames',
20
+ 'classVariant',
21
+ 'styled(?:\\s+)?(?:\\.\\w+)?',
22
+ 'classList(?:\\s+)?\\.(?:add|remove|toggle|replace)'
23
+ ];
24
+ const LAYER_ORDER = [
25
+ 'theme',
26
+ 'base',
27
+ 'defaults',
28
+ 'components',
29
+ 'utilities'
30
+ ];
31
+ function stable(value) {
32
+ if (!value || typeof value !== 'object') return JSON.stringify(value);
33
+ if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;
34
+ return `{${Object.entries(value).sort(([a], [b])=>a.localeCompare(b)).map(([key, item])=>`${JSON.stringify(key)}:${stable(item)}`).join(',')}}`;
35
+ }
36
+ function equalDeclarations(a, b) {
37
+ if (!a || !b || typeof a !== 'object' || typeof b !== 'object') return stable(a) === stable(b);
38
+ const aKeys = Object.keys(a).sort();
39
+ const bKeys = Object.keys(b).sort();
40
+ return stable(aKeys) === stable(bKeys);
41
+ }
42
+ function equalVariants(a, b) {
43
+ const branchA = a.variantBranchKey;
44
+ const branchB = b.variantBranchKey;
45
+ return (branchA !== undefined || branchB !== undefined ? branchA === branchB : a.selectorText === b.selectorText) && a.layerName === b.layerName && stable(a.atRules) === stable(b.atRules);
46
+ }
47
+ function getLayerOrder(layerName) {
48
+ const index = LAYER_ORDER.indexOf(layerName || 'utilities');
49
+ return index === -1 ? LAYER_ORDER.length : index;
50
+ }
51
+ function getReadableGroupOrder(rule) {
52
+ if (rule.atRules) return 3;
53
+ if (rule.mode) return 2;
54
+ if (rule.selectorNodes?.length) return 1;
55
+ return 0;
56
+ }
57
+ function getReadableTypeOrder(rule) {
58
+ if (rule.fixedClass) return 0;
59
+ if (rule.type === UtilityType.Semantic) return 1;
60
+ return 2;
61
+ }
62
+ function sortReadableClasses(classNames, css) {
63
+ return [
64
+ ...new Set(classNames)
65
+ ].sort((a, b)=>{
66
+ const ruleA = css.generate(a)[0];
67
+ const ruleB = css.generate(b)[0];
68
+ if (!ruleA && !ruleB) return a.localeCompare(b);
69
+ if (!ruleA) return 1;
70
+ if (!ruleB) return -1;
71
+ const layerCmp = getLayerOrder(ruleA.layerName) - getLayerOrder(ruleB.layerName);
72
+ if (layerCmp !== 0) return layerCmp;
73
+ const groupCmp = getReadableGroupOrder(ruleA) - getReadableGroupOrder(ruleB);
74
+ if (groupCmp !== 0) return groupCmp;
75
+ const typeCmp = getReadableTypeOrder(ruleA) - getReadableTypeOrder(ruleB);
76
+ if (typeCmp !== 0) return typeCmp;
77
+ return compareRulePriority(ruleA, ruleB) || a.localeCompare(b);
78
+ });
79
+ }
80
+
81
+ export { CLASS_ATTRIBUTES, CLASS_DECLARATIONS, CLASS_FUNCTIONS, defaultManifest, equalDeclarations, equalVariants, sortReadableClasses };
@@ -0,0 +1,147 @@
1
+ 'use strict';
2
+
3
+ var common = require('../common.cjs');
4
+
5
+ function resolveClassNode(node, context) {
6
+ const { sourceCode } = context;
7
+ let value = null;
8
+ let raw = null;
9
+ let start = null;
10
+ let end = null;
11
+ switch(node.type){
12
+ case 'Literal':
13
+ value = node.value;
14
+ raw = node.raw;
15
+ start = node.range[0];
16
+ end = node.range[1];
17
+ break;
18
+ case 'VLiteral':
19
+ value = node.value;
20
+ raw = sourceCode.getText(node);
21
+ start = node.range[0];
22
+ end = node.range[1];
23
+ break;
24
+ case 'TextAttribute':
25
+ value = node.value;
26
+ start = node.valueSpan.fullStart.offset;
27
+ end = node.valueSpan.end.offset;
28
+ raw = sourceCode.getText({
29
+ ...node,
30
+ range: [
31
+ start,
32
+ end
33
+ ]
34
+ });
35
+ break;
36
+ case 'SvelteLiteral':
37
+ value = node.value;
38
+ raw = sourceCode.getText(node);
39
+ start = node.range[0];
40
+ end = node.range[1];
41
+ break;
42
+ case 'TemplateElement':
43
+ if (node.parent.expressions.length) {
44
+ return;
45
+ }
46
+ value = node.value.cooked;
47
+ raw = node.value.raw;
48
+ start = node.range[0] + 1;
49
+ end = node.range[1] - 1;
50
+ break;
51
+ default:
52
+ return;
53
+ }
54
+ if (typeof value !== 'string') {
55
+ return;
56
+ }
57
+ if (/^(['"`])(.*)\1$/.test(raw)) {
58
+ raw = raw.slice(1, -1);
59
+ start = start + 1;
60
+ end = end - 1;
61
+ }
62
+ const nodes = [];
63
+ const classValues = value.split(common.HALF_WIDTH_WHITESPACE_REGEX);
64
+ const classRaws = raw.split(common.HALF_WIDTH_WHITESPACE_REGEX);
65
+ const classValueRawMap = new Map();
66
+ const classRawValueMap = new Map();
67
+ for(let i = 0; i < classRaws.length; i++){
68
+ classValueRawMap.set(classValues[i], classRaws[i]);
69
+ classRawValueMap.set(classRaws[i], classValues[i]);
70
+ }
71
+ let lastIndex = 0;
72
+ let match;
73
+ while((match = common.HALF_WIDTH_WHITESPACE_GLOBAL_REGEX.exec(raw)) !== null){
74
+ const spaceRaw = match[0];
75
+ const spaceStart = match.index;
76
+ const spaceEnd = spaceStart + spaceRaw.length;
77
+ if (spaceStart > lastIndex) {
78
+ const classRaw = raw.slice(lastIndex, spaceStart);
79
+ const classValue = classRawValueMap.get(classRaw);
80
+ if (!classValue) return;
81
+ const startOffset = start + lastIndex;
82
+ const endOffset = start + spaceStart;
83
+ nodes.push({
84
+ type: 'class',
85
+ value: classValue,
86
+ raw: classRaw,
87
+ range: [
88
+ startOffset,
89
+ endOffset
90
+ ],
91
+ loc: {
92
+ start: sourceCode.getLocFromIndex(startOffset),
93
+ end: sourceCode.getLocFromIndex(endOffset)
94
+ }
95
+ });
96
+ }
97
+ const spaceStartOffset = start + spaceStart;
98
+ const spaceEndOffset = start + spaceEnd;
99
+ nodes.push({
100
+ type: 'space',
101
+ raw: spaceRaw,
102
+ range: [
103
+ spaceStartOffset,
104
+ spaceEndOffset
105
+ ],
106
+ loc: {
107
+ start: sourceCode.getLocFromIndex(spaceStartOffset),
108
+ end: sourceCode.getLocFromIndex(spaceEndOffset)
109
+ }
110
+ });
111
+ lastIndex = spaceEnd;
112
+ }
113
+ if (lastIndex < raw.length) {
114
+ const classRaw = raw.slice(lastIndex);
115
+ const classValue = classRawValueMap.get(classRaw);
116
+ if (!classValue) return;
117
+ const startOffset = start + lastIndex;
118
+ const endOffset = start + raw.length;
119
+ nodes.push({
120
+ type: 'class',
121
+ value: classValue,
122
+ raw: classRaw,
123
+ range: [
124
+ startOffset,
125
+ endOffset
126
+ ],
127
+ loc: {
128
+ start: sourceCode.getLocFromIndex(startOffset),
129
+ end: sourceCode.getLocFromIndex(endOffset)
130
+ }
131
+ });
132
+ }
133
+ const classNodes = nodes.filter((node)=>node.type === 'class');
134
+ return {
135
+ nodes,
136
+ start,
137
+ end,
138
+ raw,
139
+ value,
140
+ classRawValueMap,
141
+ classValueRawMap,
142
+ classNodes,
143
+ classValues: classNodes.map((node)=>node.value)
144
+ };
145
+ }
146
+
147
+ module.exports = resolveClassNode;
@@ -0,0 +1,12 @@
1
+ import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
2
+ export default function resolveClassNode(node: any, context: RuleContext<any, any[]>): {
3
+ nodes: any[];
4
+ start: number;
5
+ end: number;
6
+ raw: string;
7
+ value: string;
8
+ classRawValueMap: Map<any, any>;
9
+ classValueRawMap: Map<any, any>;
10
+ classNodes: any[];
11
+ classValues: any[];
12
+ };
@@ -0,0 +1,145 @@
1
+ import { HALF_WIDTH_WHITESPACE_REGEX, HALF_WIDTH_WHITESPACE_GLOBAL_REGEX } from '../common.mjs';
2
+
3
+ function resolveClassNode(node, context) {
4
+ const { sourceCode } = context;
5
+ let value = null;
6
+ let raw = null;
7
+ let start = null;
8
+ let end = null;
9
+ switch(node.type){
10
+ case 'Literal':
11
+ value = node.value;
12
+ raw = node.raw;
13
+ start = node.range[0];
14
+ end = node.range[1];
15
+ break;
16
+ case 'VLiteral':
17
+ value = node.value;
18
+ raw = sourceCode.getText(node);
19
+ start = node.range[0];
20
+ end = node.range[1];
21
+ break;
22
+ case 'TextAttribute':
23
+ value = node.value;
24
+ start = node.valueSpan.fullStart.offset;
25
+ end = node.valueSpan.end.offset;
26
+ raw = sourceCode.getText({
27
+ ...node,
28
+ range: [
29
+ start,
30
+ end
31
+ ]
32
+ });
33
+ break;
34
+ case 'SvelteLiteral':
35
+ value = node.value;
36
+ raw = sourceCode.getText(node);
37
+ start = node.range[0];
38
+ end = node.range[1];
39
+ break;
40
+ case 'TemplateElement':
41
+ if (node.parent.expressions.length) {
42
+ return;
43
+ }
44
+ value = node.value.cooked;
45
+ raw = node.value.raw;
46
+ start = node.range[0] + 1;
47
+ end = node.range[1] - 1;
48
+ break;
49
+ default:
50
+ return;
51
+ }
52
+ if (typeof value !== 'string') {
53
+ return;
54
+ }
55
+ if (/^(['"`])(.*)\1$/.test(raw)) {
56
+ raw = raw.slice(1, -1);
57
+ start = start + 1;
58
+ end = end - 1;
59
+ }
60
+ const nodes = [];
61
+ const classValues = value.split(HALF_WIDTH_WHITESPACE_REGEX);
62
+ const classRaws = raw.split(HALF_WIDTH_WHITESPACE_REGEX);
63
+ const classValueRawMap = new Map();
64
+ const classRawValueMap = new Map();
65
+ for(let i = 0; i < classRaws.length; i++){
66
+ classValueRawMap.set(classValues[i], classRaws[i]);
67
+ classRawValueMap.set(classRaws[i], classValues[i]);
68
+ }
69
+ let lastIndex = 0;
70
+ let match;
71
+ while((match = HALF_WIDTH_WHITESPACE_GLOBAL_REGEX.exec(raw)) !== null){
72
+ const spaceRaw = match[0];
73
+ const spaceStart = match.index;
74
+ const spaceEnd = spaceStart + spaceRaw.length;
75
+ if (spaceStart > lastIndex) {
76
+ const classRaw = raw.slice(lastIndex, spaceStart);
77
+ const classValue = classRawValueMap.get(classRaw);
78
+ if (!classValue) return;
79
+ const startOffset = start + lastIndex;
80
+ const endOffset = start + spaceStart;
81
+ nodes.push({
82
+ type: 'class',
83
+ value: classValue,
84
+ raw: classRaw,
85
+ range: [
86
+ startOffset,
87
+ endOffset
88
+ ],
89
+ loc: {
90
+ start: sourceCode.getLocFromIndex(startOffset),
91
+ end: sourceCode.getLocFromIndex(endOffset)
92
+ }
93
+ });
94
+ }
95
+ const spaceStartOffset = start + spaceStart;
96
+ const spaceEndOffset = start + spaceEnd;
97
+ nodes.push({
98
+ type: 'space',
99
+ raw: spaceRaw,
100
+ range: [
101
+ spaceStartOffset,
102
+ spaceEndOffset
103
+ ],
104
+ loc: {
105
+ start: sourceCode.getLocFromIndex(spaceStartOffset),
106
+ end: sourceCode.getLocFromIndex(spaceEndOffset)
107
+ }
108
+ });
109
+ lastIndex = spaceEnd;
110
+ }
111
+ if (lastIndex < raw.length) {
112
+ const classRaw = raw.slice(lastIndex);
113
+ const classValue = classRawValueMap.get(classRaw);
114
+ if (!classValue) return;
115
+ const startOffset = start + lastIndex;
116
+ const endOffset = start + raw.length;
117
+ nodes.push({
118
+ type: 'class',
119
+ value: classValue,
120
+ raw: classRaw,
121
+ range: [
122
+ startOffset,
123
+ endOffset
124
+ ],
125
+ loc: {
126
+ start: sourceCode.getLocFromIndex(startOffset),
127
+ end: sourceCode.getLocFromIndex(endOffset)
128
+ }
129
+ });
130
+ }
131
+ const classNodes = nodes.filter((node)=>node.type === 'class');
132
+ return {
133
+ nodes,
134
+ start,
135
+ end,
136
+ raw,
137
+ value,
138
+ classRawValueMap,
139
+ classValueRawMap,
140
+ classNodes,
141
+ classValues: classNodes.map((node)=>node.value)
142
+ };
143
+ }
144
+
145
+ export { resolveClassNode as default };
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ var settings = require('../settings.cjs');
4
+ var masterCss = require('./master-css.cjs');
5
+ var entries = require('@master/css-project/entries');
6
+ var manifestSync = require('@master/css-project/manifest-sync');
7
+ var path = require('node:path');
8
+ var node_fs = require('node:fs');
9
+ var isSameOrChildPath = require('./is-same-or-child-path.cjs');
10
+ var cssValidator = require('@master/css-validator');
11
+
12
+ const cssCaches = [];
13
+ const workspaceDirectoriesByCwd = new Map();
14
+ function getContextFilename(context) {
15
+ const filename = context.physicalFilename || context.filename;
16
+ if (!filename || filename.startsWith('<')) return;
17
+ const resolvedFilename = path.isAbsolute(filename) ? filename : path.resolve(context.cwd, filename);
18
+ return node_fs.existsSync(resolvedFilename) ? resolvedFilename : undefined;
19
+ }
20
+ function getWorkspaceDirectories(cwd) {
21
+ let directories = workspaceDirectoriesByCwd.get(cwd);
22
+ if (!directories) {
23
+ directories = entries.findMasterCSSWorkspaceDirectoriesSync(cwd);
24
+ workspaceDirectoriesByCwd.set(cwd, directories);
25
+ }
26
+ return directories;
27
+ }
28
+ function findNearestPackageDirectory(filename) {
29
+ let directory = path.dirname(filename);
30
+ const root = path.parse(directory).root;
31
+ while(directory !== root){
32
+ if (node_fs.existsSync(path.join(directory, 'package.json'))) return directory;
33
+ directory = path.dirname(directory);
34
+ }
35
+ return path.dirname(filename);
36
+ }
37
+ function resolveSearchDirectory(context, filename) {
38
+ const cwd = path.resolve(context.cwd || process.cwd());
39
+ const root = path.parse(cwd).root;
40
+ if (cwd !== root && isSameOrChildPath(cwd, filename)) return cwd;
41
+ return findNearestPackageDirectory(filename);
42
+ }
43
+ function resolveWorkspaceDirectory(context, filename) {
44
+ const cwd = resolveSearchDirectory(context, filename);
45
+ let closestDirectory;
46
+ for (const directory of getWorkspaceDirectories(cwd)){
47
+ if (isSameOrChildPath(directory, filename) && (!closestDirectory || directory.length > closestDirectory.length)) {
48
+ closestDirectory = directory;
49
+ }
50
+ }
51
+ return closestDirectory || cwd;
52
+ }
53
+ function resolvePlan(workspaceDir, manifest) {
54
+ const result = manifestSync.loadProjectManifestSync(workspaceDir);
55
+ return result.entries.length ? result.manifest : manifest;
56
+ }
57
+ function resolveContext(context) {
58
+ const resolvedSettings = Object.assign({}, settings, context.settings?.['@master/css']);
59
+ const filename = getContextFilename(context);
60
+ const workspaceDir = filename ? resolveWorkspaceDirectory(context, filename) : context.cwd || process.cwd();
61
+ let css = cssCaches.find((cache)=>cache.manifest === resolvedSettings.manifest && cache.cwd === workspaceDir)?.css;
62
+ if (!css) {
63
+ const manifest = filename ? resolvePlan(workspaceDir, resolvedSettings.manifest) : resolvedSettings.manifest;
64
+ css = cssValidator.createCSSWithNativeDeclarations(manifest || masterCss.defaultManifest);
65
+ cssCaches.push({
66
+ cwd: workspaceDir,
67
+ manifest: resolvedSettings.manifest,
68
+ css
69
+ });
70
+ }
71
+ return {
72
+ settings: resolvedSettings,
73
+ options: context.options[0] || {},
74
+ css
75
+ };
76
+ }
77
+
78
+ module.exports = resolveContext;
@@ -1,4 +1,13 @@
1
- export default function resolveContext(context: any): {
2
- settings: any;
1
+ import type { RuleContext } from '@typescript-eslint/utils/ts-eslint';
2
+ import { MasterCSS } from './master-css';
3
+ export default function resolveContext(context: RuleContext<any, any[]>): {
4
+ settings: {
5
+ classAttributes: string[];
6
+ classFunctions: string[];
7
+ classDeclarations: string[];
8
+ ignoredKeys: string[];
9
+ manifest: any;
10
+ };
3
11
  options: any;
12
+ css: MasterCSS;
4
13
  };
@@ -1 +1,76 @@
1
- import s from"../settings.mjs";function e(t){return{settings:Object.assign(s,t.settings?.["@master/css"]),options:t.options[0]||{}}}export{e as default};
1
+ import settings from '../settings.mjs';
2
+ import { defaultManifest } from './master-css.mjs';
3
+ import { findMasterCSSWorkspaceDirectoriesSync } from '@master/css-project/entries';
4
+ import { loadProjectManifestSync } from '@master/css-project/manifest-sync';
5
+ import path from 'node:path';
6
+ import { existsSync } from 'node:fs';
7
+ import isSameOrChildPath from './is-same-or-child-path.mjs';
8
+ import { createCSSWithNativeDeclarations } from '@master/css-validator';
9
+
10
+ const cssCaches = [];
11
+ const workspaceDirectoriesByCwd = new Map();
12
+ function getContextFilename(context) {
13
+ const filename = context.physicalFilename || context.filename;
14
+ if (!filename || filename.startsWith('<')) return;
15
+ const resolvedFilename = path.isAbsolute(filename) ? filename : path.resolve(context.cwd, filename);
16
+ return existsSync(resolvedFilename) ? resolvedFilename : undefined;
17
+ }
18
+ function getWorkspaceDirectories(cwd) {
19
+ let directories = workspaceDirectoriesByCwd.get(cwd);
20
+ if (!directories) {
21
+ directories = findMasterCSSWorkspaceDirectoriesSync(cwd);
22
+ workspaceDirectoriesByCwd.set(cwd, directories);
23
+ }
24
+ return directories;
25
+ }
26
+ function findNearestPackageDirectory(filename) {
27
+ let directory = path.dirname(filename);
28
+ const root = path.parse(directory).root;
29
+ while(directory !== root){
30
+ if (existsSync(path.join(directory, 'package.json'))) return directory;
31
+ directory = path.dirname(directory);
32
+ }
33
+ return path.dirname(filename);
34
+ }
35
+ function resolveSearchDirectory(context, filename) {
36
+ const cwd = path.resolve(context.cwd || process.cwd());
37
+ const root = path.parse(cwd).root;
38
+ if (cwd !== root && isSameOrChildPath(cwd, filename)) return cwd;
39
+ return findNearestPackageDirectory(filename);
40
+ }
41
+ function resolveWorkspaceDirectory(context, filename) {
42
+ const cwd = resolveSearchDirectory(context, filename);
43
+ let closestDirectory;
44
+ for (const directory of getWorkspaceDirectories(cwd)){
45
+ if (isSameOrChildPath(directory, filename) && (!closestDirectory || directory.length > closestDirectory.length)) {
46
+ closestDirectory = directory;
47
+ }
48
+ }
49
+ return closestDirectory || cwd;
50
+ }
51
+ function resolvePlan(workspaceDir, manifest) {
52
+ const result = loadProjectManifestSync(workspaceDir);
53
+ return result.entries.length ? result.manifest : manifest;
54
+ }
55
+ function resolveContext(context) {
56
+ const resolvedSettings = Object.assign({}, settings, context.settings?.['@master/css']);
57
+ const filename = getContextFilename(context);
58
+ const workspaceDir = filename ? resolveWorkspaceDirectory(context, filename) : context.cwd || process.cwd();
59
+ let css = cssCaches.find((cache)=>cache.manifest === resolvedSettings.manifest && cache.cwd === workspaceDir)?.css;
60
+ if (!css) {
61
+ const manifest = filename ? resolvePlan(workspaceDir, resolvedSettings.manifest) : resolvedSettings.manifest;
62
+ css = createCSSWithNativeDeclarations(manifest || defaultManifest);
63
+ cssCaches.push({
64
+ cwd: workspaceDir,
65
+ manifest: resolvedSettings.manifest,
66
+ css
67
+ });
68
+ }
69
+ return {
70
+ settings: resolvedSettings,
71
+ options: context.options[0] || {},
72
+ css
73
+ };
74
+ }
75
+
76
+ export { resolveContext as default };