@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
@@ -1,98 +0,0 @@
1
- 'use strict';
2
-
3
- var cssLexer = require('@master/css-lexer');
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
- let unescape = false;
12
- switch(node.type){
13
- case 'Literal':
14
- value = node.value;
15
- raw = node.raw;
16
- start = node.range[0];
17
- end = node.range[1];
18
- break;
19
- case 'VLiteral':
20
- value = node.value;
21
- raw = sourceCode.getText(node);
22
- start = node.range[0];
23
- end = node.range[1];
24
- break;
25
- case 'TextAttribute':
26
- value = node.value;
27
- start = node.valueSpan.fullStart.offset;
28
- end = node.valueSpan.end.offset;
29
- raw = sourceCode.getText({
30
- ...node,
31
- range: [
32
- start,
33
- end
34
- ]
35
- });
36
- break;
37
- case 'SvelteLiteral':
38
- value = node.value;
39
- raw = sourceCode.getText(node);
40
- start = node.range[0];
41
- end = node.range[1];
42
- break;
43
- case 'TemplateElement':
44
- if (node.parent.expressions.length) {
45
- return;
46
- }
47
- value = node.value.cooked;
48
- raw = node.value.raw;
49
- start = node.range[0] + 1;
50
- end = node.range[1] - 1;
51
- unescape = '`';
52
- break;
53
- default:
54
- return;
55
- }
56
- if (typeof value !== 'string') {
57
- return;
58
- }
59
- if (/^(['"`])([\s\S]*)\1$/.test(raw)) {
60
- unescape = raw[0];
61
- raw = raw.slice(1, -1);
62
- start = start + 1;
63
- end = end - 1;
64
- }
65
- const nodes = cssLexer.parseMasterCSSClassList(raw, {
66
- preserveSpaces: true,
67
- unescape
68
- }).map((item)=>{
69
- const startOffset = start + item.start;
70
- const endOffset = start + item.end;
71
- return {
72
- type: item.type,
73
- value: item.token,
74
- raw: item.raw,
75
- range: [
76
- startOffset,
77
- endOffset
78
- ],
79
- loc: {
80
- start: sourceCode.getLocFromIndex(startOffset),
81
- end: sourceCode.getLocFromIndex(endOffset)
82
- }
83
- };
84
- });
85
- const classNodes = nodes.filter((node)=>node.type === 'class');
86
- return {
87
- nodes,
88
- start,
89
- end,
90
- raw,
91
- value,
92
- unescape,
93
- classNodes,
94
- classValues: classNodes.map((node)=>node.value)
95
- };
96
- }
97
-
98
- module.exports = resolveClassNode;
@@ -1,96 +0,0 @@
1
- import { parseMasterCSSClassList } from '@master/css-lexer';
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
- let unescape = false;
10
- switch(node.type){
11
- case 'Literal':
12
- value = node.value;
13
- raw = node.raw;
14
- start = node.range[0];
15
- end = node.range[1];
16
- break;
17
- case 'VLiteral':
18
- value = node.value;
19
- raw = sourceCode.getText(node);
20
- start = node.range[0];
21
- end = node.range[1];
22
- break;
23
- case 'TextAttribute':
24
- value = node.value;
25
- start = node.valueSpan.fullStart.offset;
26
- end = node.valueSpan.end.offset;
27
- raw = sourceCode.getText({
28
- ...node,
29
- range: [
30
- start,
31
- end
32
- ]
33
- });
34
- break;
35
- case 'SvelteLiteral':
36
- value = node.value;
37
- raw = sourceCode.getText(node);
38
- start = node.range[0];
39
- end = node.range[1];
40
- break;
41
- case 'TemplateElement':
42
- if (node.parent.expressions.length) {
43
- return;
44
- }
45
- value = node.value.cooked;
46
- raw = node.value.raw;
47
- start = node.range[0] + 1;
48
- end = node.range[1] - 1;
49
- unescape = '`';
50
- break;
51
- default:
52
- return;
53
- }
54
- if (typeof value !== 'string') {
55
- return;
56
- }
57
- if (/^(['"`])([\s\S]*)\1$/.test(raw)) {
58
- unescape = raw[0];
59
- raw = raw.slice(1, -1);
60
- start = start + 1;
61
- end = end - 1;
62
- }
63
- const nodes = parseMasterCSSClassList(raw, {
64
- preserveSpaces: true,
65
- unescape
66
- }).map((item)=>{
67
- const startOffset = start + item.start;
68
- const endOffset = start + item.end;
69
- return {
70
- type: item.type,
71
- value: item.token,
72
- raw: item.raw,
73
- range: [
74
- startOffset,
75
- endOffset
76
- ],
77
- loc: {
78
- start: sourceCode.getLocFromIndex(startOffset),
79
- end: sourceCode.getLocFromIndex(endOffset)
80
- }
81
- };
82
- });
83
- const classNodes = nodes.filter((node)=>node.type === 'class');
84
- return {
85
- nodes,
86
- start,
87
- end,
88
- raw,
89
- value,
90
- unescape,
91
- classNodes,
92
- classValues: classNodes.map((node)=>node.value)
93
- };
94
- }
95
-
96
- export { resolveClassNode as default };
@@ -1,78 +0,0 @@
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,76 +0,0 @@
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 };
@@ -1,57 +0,0 @@
1
- 'use strict';
2
-
3
- var resolveClassNode = require('./resolve-class-node.cjs');
4
-
5
- function withVisitClassNode(visit, context) {
6
- const visitNode = (node)=>{
7
- if (!node) return;
8
- switch(node.type){
9
- case 'BinaryExpression':
10
- case 'Identifier':
11
- return;
12
- case 'TemplateLiteral':
13
- node.expressions?.forEach(visitNode);
14
- node.quasis.forEach(visitNode);
15
- return;
16
- case 'JSXExpressionContainer':
17
- visitNode(node.expression);
18
- return;
19
- case 'ConditionalExpression':
20
- visitNode(node.consequent);
21
- visitNode(node.alternate);
22
- return;
23
- case 'ArrayExpression':
24
- node.elements.forEach((el)=>{
25
- visitNode(el);
26
- });
27
- return;
28
- case 'LogicalExpression':
29
- visitNode(node.right);
30
- return;
31
- case 'ObjectExpression':
32
- node.properties.forEach((prop)=>{
33
- visitNode(prop);
34
- });
35
- return;
36
- case 'Property':
37
- if (node.shorthand) return;
38
- if (node.value && [
39
- 'Literal',
40
- 'ArrayExpression',
41
- 'ObjectExpression'
42
- ].includes(node.value.type) && typeof node.value?.value !== 'boolean') {
43
- visitNode(node.value);
44
- } else if (node.key.type === 'Literal') {
45
- visitNode(node.key);
46
- }
47
- return;
48
- default:
49
- const resolved = resolveClassNode(node, context);
50
- if (!resolved) return;
51
- visit(node, resolved);
52
- }
53
- };
54
- return visitNode;
55
- }
56
-
57
- module.exports = withVisitClassNode;
@@ -1,55 +0,0 @@
1
- import resolveClassNode from './resolve-class-node.mjs';
2
-
3
- function withVisitClassNode(visit, context) {
4
- const visitNode = (node)=>{
5
- if (!node) return;
6
- switch(node.type){
7
- case 'BinaryExpression':
8
- case 'Identifier':
9
- return;
10
- case 'TemplateLiteral':
11
- node.expressions?.forEach(visitNode);
12
- node.quasis.forEach(visitNode);
13
- return;
14
- case 'JSXExpressionContainer':
15
- visitNode(node.expression);
16
- return;
17
- case 'ConditionalExpression':
18
- visitNode(node.consequent);
19
- visitNode(node.alternate);
20
- return;
21
- case 'ArrayExpression':
22
- node.elements.forEach((el)=>{
23
- visitNode(el);
24
- });
25
- return;
26
- case 'LogicalExpression':
27
- visitNode(node.right);
28
- return;
29
- case 'ObjectExpression':
30
- node.properties.forEach((prop)=>{
31
- visitNode(prop);
32
- });
33
- return;
34
- case 'Property':
35
- if (node.shorthand) return;
36
- if (node.value && [
37
- 'Literal',
38
- 'ArrayExpression',
39
- 'ObjectExpression'
40
- ].includes(node.value.type) && typeof node.value?.value !== 'boolean') {
41
- visitNode(node.value);
42
- } else if (node.key.type === 'Literal') {
43
- visitNode(node.key);
44
- }
45
- return;
46
- default:
47
- const resolved = resolveClassNode(node, context);
48
- if (!resolved) return;
49
- visit(node, resolved);
50
- }
51
- };
52
- return visitNode;
53
- }
54
-
55
- export { withVisitClassNode as default };