@master/eslint-plugin-css 2.0.0-rc.7 → 2.0.0-rc.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -7
- package/dist/common.cjs +7 -0
- package/dist/common.d.ts +2 -0
- package/dist/common.mjs +4 -0
- package/dist/configs/base.cjs +11 -0
- package/dist/configs/base.d.ts +3 -0
- package/dist/configs/base.mjs +9 -0
- package/dist/configs/legacy.cjs +17 -0
- package/dist/configs/legacy.d.ts +3 -0
- package/dist/configs/legacy.mjs +15 -0
- package/dist/configs/recommended.cjs +14 -0
- package/dist/configs/recommended.d.ts +2 -13
- package/dist/configs/recommended.mjs +12 -1
- package/dist/create-rule.cjs +7 -0
- package/dist/create-rule.d.ts +5 -0
- package/dist/create-rule.mjs +5 -0
- package/dist/functions/filter-collision-classes.cjs +29 -0
- package/dist/functions/filter-collision-classes.d.ts +2 -0
- package/dist/functions/filter-collision-classes.mjs +27 -0
- package/dist/index.cjs +19 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.mjs +17 -1
- package/dist/plugin.cjs +26 -0
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.mjs +23 -1
- package/dist/rules/class-collision.cjs +76 -0
- package/dist/rules/class-collision.d.ts +3 -2
- package/dist/rules/class-collision.mjs +74 -1
- package/dist/rules/class-order.cjs +64 -0
- package/dist/rules/class-order.d.ts +3 -2
- package/dist/rules/class-order.mjs +62 -1
- package/dist/rules/class-validation.cjs +60 -0
- package/dist/rules/class-validation.d.ts +3 -2
- package/dist/rules/class-validation.mjs +58 -1
- package/dist/settings-schema.cjs +32 -0
- package/dist/settings-schema.d.ts +3 -0
- package/dist/settings-schema.mjs +30 -0
- package/dist/settings.cjs +16 -0
- package/dist/settings.d.ts +12 -3
- package/dist/settings.mjs +14 -1
- package/dist/utils/define-visitors.cjs +125 -0
- package/dist/utils/define-visitors.d.ts +7 -4
- package/dist/utils/define-visitors.mjs +123 -1
- package/dist/utils/is-same-or-child-path.cjs +10 -0
- package/dist/utils/is-same-or-child-path.d.ts +1 -0
- package/dist/utils/is-same-or-child-path.mjs +8 -0
- package/dist/utils/master-css.cjs +94 -0
- package/dist/utils/master-css.d.ts +21 -0
- package/dist/utils/master-css.mjs +81 -0
- package/dist/utils/resolve-class-node.cjs +147 -0
- package/dist/utils/resolve-class-node.d.ts +12 -0
- package/dist/utils/resolve-class-node.mjs +145 -0
- package/dist/utils/resolve-context.cjs +78 -0
- package/dist/utils/resolve-context.d.ts +11 -2
- package/dist/utils/resolve-context.mjs +76 -1
- package/dist/utils/with-visit-class-node.cjs +57 -0
- package/dist/utils/with-visit-class-node.d.ts +4 -0
- package/dist/utils/with-visit-class-node.mjs +55 -0
- package/package.json +1 -1
- package/dist/configs/config.d.ts +0 -13
- package/dist/configs/config.js +0 -1
- package/dist/configs/config.mjs +0 -1
- package/dist/configs/flat.d.ts +0 -16
- package/dist/configs/flat.js +0 -1
- package/dist/configs/flat.mjs +0 -1
- package/dist/configs/recommended.js +0 -1
- package/dist/index.js +0 -1
- package/dist/plugin.js +0 -1
- package/dist/rules/class-collision.js +0 -1
- package/dist/rules/class-order.js +0 -1
- package/dist/rules/class-validation.js +0 -1
- package/dist/settings.js +0 -1
- package/dist/utils/are-declarations-equal.d.ts +0 -1
- package/dist/utils/are-declarations-equal.js +0 -1
- package/dist/utils/are-declarations-equal.mjs +0 -1
- package/dist/utils/define-visitors.js +0 -1
- package/dist/utils/extract-classnames-from-value.d.ts +0 -6
- package/dist/utils/extract-classnames-from-value.js +0 -1
- package/dist/utils/extract-classnames-from-value.mjs +0 -1
- package/dist/utils/extract-range-from-node.d.ts +0 -1
- package/dist/utils/extract-range-from-node.js +0 -1
- package/dist/utils/extract-range-from-node.mjs +0 -1
- package/dist/utils/extract-value-from-node.d.ts +0 -1
- package/dist/utils/extract-value-from-node.js +0 -1
- package/dist/utils/extract-value-from-node.mjs +0 -1
- package/dist/utils/find-loc.d.ts +0 -7
- package/dist/utils/find-loc.js +0 -1
- package/dist/utils/find-loc.mjs +0 -1
- package/dist/utils/get-mastercss.d.ts +0 -2
- package/dist/utils/get-mastercss.js +0 -1
- package/dist/utils/get-mastercss.mjs +0 -1
- package/dist/utils/get-template-element-body.d.ts +0 -1
- package/dist/utils/get-template-element-body.js +0 -1
- package/dist/utils/get-template-element-body.mjs +0 -1
- package/dist/utils/get-template-element-prefix.d.ts +0 -1
- package/dist/utils/get-template-element-prefix.js +0 -1
- package/dist/utils/get-template-element-prefix.mjs +0 -1
- package/dist/utils/get-template-element-suffix.d.ts +0 -1
- package/dist/utils/get-template-element-suffix.js +0 -1
- package/dist/utils/get-template-element-suffix.mjs +0 -1
- package/dist/utils/parse-node-recursive.d.ts +0 -13
- package/dist/utils/parse-node-recursive.js +0 -1
- package/dist/utils/parse-node-recursive.mjs +0 -1
- package/dist/utils/reorder-valid-classes-action.d.ts +0 -3
- package/dist/utils/reorder-valid-classes-action.js +0 -1
- package/dist/utils/reorder-valid-classes-action.mjs +0 -1
- package/dist/utils/resolve-context.js +0 -1
- package/dist/utils/valid-rules-action.d.ts +0 -3
- package/dist/utils/valid-rules-action.js +0 -1
- package/dist/utils/valid-rules-action.mjs +0 -1
- package/dist/utils/validate-action.d.ts +0 -3
- package/dist/utils/validate-action.js +0 -1
- package/dist/utils/validate-action.mjs +0 -1
- package/dist/utils/workers/reorder-valid-classes.d.ts +0 -2
- package/dist/utils/workers/reorder-valid-classes.js +0 -1
- package/dist/utils/workers/reorder-valid-classes.mjs +0 -1
- package/dist/utils/workers/valid-rules.d.ts +0 -2
- package/dist/utils/workers/valid-rules.js +0 -1
- package/dist/utils/workers/valid-rules.mjs +0 -1
- package/dist/utils/workers/validate.d.ts +0 -5
- package/dist/utils/workers/validate.js +0 -1
- package/dist/utils/workers/validate.mjs +0 -1
package/README.md
CHANGED
|
@@ -41,19 +41,148 @@
|
|
|
41
41
|
<img alt="Follow @mastercorg" src="https://img.shields.io/static/v1?label=%20&message=twitter&color=f6f7f8&logo=twitter&style=for-the-badge">
|
|
42
42
|
</picture>
|
|
43
43
|
</a>
|
|
44
|
-
<a aria-label="Github Actions" href="https://github.com/
|
|
44
|
+
<a aria-label="Github Actions" href="https://github.com/master-co/css/actions/workflows/ci-release.yml">
|
|
45
45
|
<picture>
|
|
46
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/actions/workflow/status/master-co/css/release.yml?branch=rc&label=%20&message=twitter&color=212022&logo=githubactions&style=for-the-badge">
|
|
47
|
-
<source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/actions/workflow/status/master-co/css/release.yml?branch=rc&label=%20&message=twitter&color=f6f7f8&logo=githubactions&style=for-the-badge&logoColor=%23000">
|
|
48
|
-
<img alt="Github release actions" src="https://img.shields.io/github/actions/workflow/status/master-co/css/release.yml?branch=rc&label=%20&message=twitter&color=f6f7f8&logo=githubactions&style=for-the-badge&logoColor=%23000">
|
|
46
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/actions/workflow/status/master-co/css/ci-release.yml?branch=rc&label=%20&message=twitter&color=212022&logo=githubactions&style=for-the-badge">
|
|
47
|
+
<source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/actions/workflow/status/master-co/css/ci-release.yml?branch=rc&label=%20&message=twitter&color=f6f7f8&logo=githubactions&style=for-the-badge&logoColor=%23000">
|
|
48
|
+
<img alt="Github release actions" src="https://img.shields.io/github/actions/workflow/status/master-co/css/ci-release.yml?branch=rc&label=%20&message=twitter&color=f6f7f8&logo=githubactions&style=for-the-badge&logoColor=%23000">
|
|
49
49
|
</picture>
|
|
50
50
|
</a>
|
|
51
51
|
</p>
|
|
52
52
|
|
|
53
53
|
</div>
|
|
54
54
|
|
|
55
|
-
##
|
|
56
|
-
|
|
55
|
+
## Installation
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install -D @master/eslint-plugin-css
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The recommended config is also available through `@master/eslint-config-css`.
|
|
62
|
+
|
|
63
|
+
## Usage
|
|
64
|
+
|
|
65
|
+
Use ESLint flat configuration:
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
import css from '@master/eslint-config-css'
|
|
69
|
+
import htmlParser from '@angular-eslint/template-parser'
|
|
70
|
+
import tsParser from '@typescript-eslint/parser'
|
|
71
|
+
|
|
72
|
+
/** @type {import('eslint').Linter.Config[]} */
|
|
73
|
+
export default [
|
|
74
|
+
{
|
|
75
|
+
files: ['**/*.html'],
|
|
76
|
+
languageOptions: {
|
|
77
|
+
parser: htmlParser
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
files: ['**/*.{ts,tsx}'],
|
|
82
|
+
languageOptions: {
|
|
83
|
+
parser: tsParser
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
css,
|
|
87
|
+
{
|
|
88
|
+
rules: {
|
|
89
|
+
'@master/css/class-validation': ['error', {
|
|
90
|
+
disallowUnknownClass: true
|
|
91
|
+
}]
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Rules
|
|
98
|
+
|
|
99
|
+
### `@master/css/class-order`
|
|
100
|
+
|
|
101
|
+
Enforces a consistent and logical order of classes.
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
export default [
|
|
105
|
+
{
|
|
106
|
+
rules: {
|
|
107
|
+
'@master/css/class-order': 'warn'
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### `@master/css/class-validation`
|
|
114
|
+
|
|
115
|
+
Detects Master CSS syntax errors.
|
|
116
|
+
|
|
117
|
+
```js
|
|
118
|
+
export default [
|
|
119
|
+
{
|
|
120
|
+
rules: {
|
|
121
|
+
'@master/css/class-validation': 'error'
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Set `disallowUnknownClass: true` to reject classes that do not match the active manifest:
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
export default [
|
|
131
|
+
{
|
|
132
|
+
rules: {
|
|
133
|
+
'@master/css/class-validation': ['error', {
|
|
134
|
+
disallowUnknownClass: true
|
|
135
|
+
}]
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### `@master/css/class-collision`
|
|
142
|
+
|
|
143
|
+
Detects classes that emit the same CSS declaration.
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
export default [
|
|
147
|
+
{
|
|
148
|
+
rules: {
|
|
149
|
+
'@master/css/class-collision': 'warn'
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Settings
|
|
156
|
+
|
|
157
|
+
Settings live under the `@master/css` settings key:
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
export default [
|
|
161
|
+
{
|
|
162
|
+
settings: {
|
|
163
|
+
'@master/css': {
|
|
164
|
+
classAttributes: ['class', 'className'],
|
|
165
|
+
classFunctions: ['clsx', 'classList.add'],
|
|
166
|
+
classDeclarations: ['classes'],
|
|
167
|
+
ignoredKeys: ['compoundVariants', 'defaultVariants'],
|
|
168
|
+
manifest
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
| Setting | Type | Description |
|
|
176
|
+
| --- | --- | --- |
|
|
177
|
+
| `classAttributes` | `string[]` | Element attributes containing class strings. |
|
|
178
|
+
| `classFunctions` | `string[]` | Function names whose arguments should be checked. |
|
|
179
|
+
| `classDeclarations` | `string[]` | Variable/member names whose declarations should be checked. |
|
|
180
|
+
| `ignoredKeys` | `string[]` | Object keys ignored during checking. Defaults include variant metadata keys. |
|
|
181
|
+
| `manifest` | `MasterCSSManifest` | Explicit compiled manifest. By default, ESLint loads the project CSS entry discovered from the current working directory. |
|
|
182
|
+
|
|
183
|
+
## Related docs
|
|
184
|
+
|
|
185
|
+
See the [code linting guide](https://rc.css.master.co/guide/code-linting) for setup guides across frameworks and editors.
|
|
57
186
|
|
|
58
187
|
## Credits
|
|
59
|
-
This plugin is heavily inspired by the awesome [eslint-plugin-tailwindcss](https://github.com/francoismassart/eslint-plugin-tailwindcss). We want to thank for their initial work, which served as the foundation for this project. While significant modifications have been made, the core ideas and concepts from A Plugin have been instrumental in developing this plugin.
|
|
188
|
+
This plugin is heavily inspired by the awesome [eslint-plugin-tailwindcss](https://github.com/francoismassart/eslint-plugin-tailwindcss). We want to thank for their initial work, which served as the foundation for this project. While significant modifications have been made, the core ideas and concepts from A Plugin have been instrumental in developing this plugin.
|
package/dist/common.cjs
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const HALF_WIDTH_WHITESPACE_REGEX = /([\t\n\f\r ]+)/;
|
|
4
|
+
const HALF_WIDTH_WHITESPACE_GLOBAL_REGEX = /([\t\n\f\r ]+)/g;
|
|
5
|
+
|
|
6
|
+
exports.HALF_WIDTH_WHITESPACE_GLOBAL_REGEX = HALF_WIDTH_WHITESPACE_GLOBAL_REGEX;
|
|
7
|
+
exports.HALF_WIDTH_WHITESPACE_REGEX = HALF_WIDTH_WHITESPACE_REGEX;
|
package/dist/common.d.ts
ADDED
package/dist/common.mjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var base = require('./base.cjs');
|
|
4
|
+
|
|
5
|
+
var recommended = {
|
|
6
|
+
...base,
|
|
7
|
+
rules: {
|
|
8
|
+
'@master/css/class-order': 'warn',
|
|
9
|
+
'@master/css/class-validation': 'error',
|
|
10
|
+
'@master/css/class-collision': 'warn'
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
module.exports = recommended;
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
readonly '@master/css/class-order': "warn";
|
|
4
|
-
readonly '@master/css/class-validation': "error";
|
|
5
|
-
readonly '@master/css/class-collision': "warn";
|
|
6
|
-
};
|
|
7
|
-
parserOptions: {
|
|
8
|
-
readonly ecmaFeatures: {
|
|
9
|
-
readonly jsx: true;
|
|
10
|
-
};
|
|
11
|
-
};
|
|
12
|
-
plugins: string[];
|
|
13
|
-
};
|
|
1
|
+
import type { Linter } from 'eslint';
|
|
2
|
+
declare const _default: Linter.Config;
|
|
14
3
|
export default _default;
|
|
@@ -1 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import base from './base.mjs';
|
|
2
|
+
|
|
3
|
+
var recommended = {
|
|
4
|
+
...base,
|
|
5
|
+
rules: {
|
|
6
|
+
'@master/css/class-order': 'warn',
|
|
7
|
+
'@master/css/class-validation': 'error',
|
|
8
|
+
'@master/css/class-collision': 'warn'
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { recommended as default };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
+
declare const _default: <Options extends readonly unknown[], MessageIds extends string>({ meta, name, ...rule }: Readonly<ESLintUtils.RuleWithMetaAndName<Options, MessageIds, unknown>>) => ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener> & {
|
|
3
|
+
name: string;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cssValidator = require('@master/css-validator');
|
|
4
|
+
var masterCss = require('../utils/master-css.cjs');
|
|
5
|
+
|
|
6
|
+
function filterCollisionClasses(classNames, css) {
|
|
7
|
+
const validRules = classNames.map((eachClassName)=>cssValidator.generateValidRules(eachClassName, css)[0]).filter(Boolean);
|
|
8
|
+
const collisionClassesRecord = {};
|
|
9
|
+
for(let i = 0; i < classNames.length; i++){
|
|
10
|
+
const className = classNames[i];
|
|
11
|
+
const rule = validRules.find((eachValidRule)=>eachValidRule.name === className);
|
|
12
|
+
const collisionClasses = [];
|
|
13
|
+
if (rule) {
|
|
14
|
+
for(let j = 0; j < classNames.length; j++){
|
|
15
|
+
const compareClassName = classNames[j];
|
|
16
|
+
const compareRule = validRules.find((eachValidRule)=>eachValidRule.name === compareClassName);
|
|
17
|
+
if (i !== j && compareRule && masterCss.equalDeclarations(rule.declarations, compareRule.declarations) && masterCss.equalVariants(rule, compareRule)) {
|
|
18
|
+
collisionClasses.push(compareClassName);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (collisionClasses.length > 0) {
|
|
22
|
+
collisionClassesRecord[className] = collisionClasses;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return collisionClassesRecord;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = filterCollisionClasses;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { generateValidRules } from '@master/css-validator';
|
|
2
|
+
import { equalDeclarations, equalVariants } from '../utils/master-css.mjs';
|
|
3
|
+
|
|
4
|
+
function filterCollisionClasses(classNames, css) {
|
|
5
|
+
const validRules = classNames.map((eachClassName)=>generateValidRules(eachClassName, css)[0]).filter(Boolean);
|
|
6
|
+
const collisionClassesRecord = {};
|
|
7
|
+
for(let i = 0; i < classNames.length; i++){
|
|
8
|
+
const className = classNames[i];
|
|
9
|
+
const rule = validRules.find((eachValidRule)=>eachValidRule.name === className);
|
|
10
|
+
const collisionClasses = [];
|
|
11
|
+
if (rule) {
|
|
12
|
+
for(let j = 0; j < classNames.length; j++){
|
|
13
|
+
const compareClassName = classNames[j];
|
|
14
|
+
const compareRule = validRules.find((eachValidRule)=>eachValidRule.name === compareClassName);
|
|
15
|
+
if (i !== j && compareRule && equalDeclarations(rule.declarations, compareRule.declarations) && equalVariants(rule, compareRule)) {
|
|
16
|
+
collisionClasses.push(compareClassName);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (collisionClasses.length > 0) {
|
|
20
|
+
collisionClassesRecord[className] = collisionClasses;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return collisionClassesRecord;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { filterCollisionClasses as default };
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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.d.ts
CHANGED
|
@@ -1 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import settings from './settings';
|
|
2
|
+
import type { Linter } from 'eslint';
|
|
3
|
+
import type { TSESLint } from '@typescript-eslint/utils';
|
|
4
|
+
declare const masterCSSPlugin: Omit<TSESLint.Linter.Plugin, 'configs'> & {
|
|
5
|
+
configs: {
|
|
6
|
+
legacy: unknown;
|
|
7
|
+
base: Linter.Config;
|
|
8
|
+
recommended: Linter.Config;
|
|
9
|
+
};
|
|
10
|
+
settings: typeof settings;
|
|
11
|
+
};
|
|
12
|
+
export default masterCSSPlugin;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
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
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
var fs = require('fs');
|
|
7
|
+
var url = require('url');
|
|
8
|
+
var path = require('path');
|
|
9
|
+
|
|
10
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
11
|
+
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)));
|
|
12
|
+
const __dirname$1 = path.dirname(__filename$1);
|
|
13
|
+
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname$1, '..', 'package.json'), 'utf-8'));
|
|
14
|
+
const plugin = {
|
|
15
|
+
meta: {
|
|
16
|
+
name: pkg.name,
|
|
17
|
+
version: pkg.version
|
|
18
|
+
},
|
|
19
|
+
rules: {
|
|
20
|
+
'class-collision': classCollision,
|
|
21
|
+
'class-order': classOrder,
|
|
22
|
+
'class-validation': classValidation
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
module.exports = plugin;
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
declare const plugin:
|
|
1
|
+
import type { TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
declare const plugin: TSESLint.Linter.Plugin;
|
|
3
3
|
export default plugin;
|
package/dist/plugin.mjs
CHANGED
|
@@ -1 +1,23 @@
|
|
|
1
|
-
import
|
|
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
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname, resolve } from 'path';
|
|
7
|
+
|
|
8
|
+
const __filename$1 = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname$1 = dirname(__filename$1);
|
|
10
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname$1, '..', 'package.json'), 'utf-8'));
|
|
11
|
+
const plugin = {
|
|
12
|
+
meta: {
|
|
13
|
+
name: pkg.name,
|
|
14
|
+
version: pkg.version
|
|
15
|
+
},
|
|
16
|
+
rules: {
|
|
17
|
+
'class-collision': classCollision,
|
|
18
|
+
'class-order': classOrder,
|
|
19
|
+
'class-validation': classValidation
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { plugin as default };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var defineVisitors = require('../utils/define-visitors.cjs');
|
|
4
|
+
var resolveContext = require('../utils/resolve-context.cjs');
|
|
5
|
+
var filterCollisionClasses = require('../functions/filter-collision-classes.cjs');
|
|
6
|
+
var createRule = require('../create-rule.cjs');
|
|
7
|
+
var settingsSchema = require('../settings-schema.cjs');
|
|
8
|
+
|
|
9
|
+
var classCollision = createRule({
|
|
10
|
+
name: 'class-collision-detection',
|
|
11
|
+
meta: {
|
|
12
|
+
type: 'layout',
|
|
13
|
+
docs: {
|
|
14
|
+
description: 'Avoid applying classes with the same declarations'
|
|
15
|
+
},
|
|
16
|
+
messages: {
|
|
17
|
+
collisionClass: '{{message}}'
|
|
18
|
+
},
|
|
19
|
+
fixable: 'code',
|
|
20
|
+
schema: [
|
|
21
|
+
settingsSchema
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
defaultOptions: [],
|
|
25
|
+
create (context) {
|
|
26
|
+
const { settings, css } = resolveContext(context);
|
|
27
|
+
return defineVisitors({
|
|
28
|
+
context,
|
|
29
|
+
settings
|
|
30
|
+
}, (node, { raw, start, end, nodes, classNodes, classValues })=>{
|
|
31
|
+
const collisionClassesRecord = filterCollisionClasses(classValues, css);
|
|
32
|
+
for(const className in collisionClassesRecord){
|
|
33
|
+
const collisionClasses = collisionClassesRecord[className];
|
|
34
|
+
const collisionClassNamesMsg = collisionClasses.map((x)=>`"${x}"`).join(' and ');
|
|
35
|
+
const classNode = classNodes.find((node)=>node.value === className);
|
|
36
|
+
const fixedNodes = [
|
|
37
|
+
...nodes
|
|
38
|
+
];
|
|
39
|
+
const removeCollision = (removedClassNode)=>{
|
|
40
|
+
for(let i = 0; i < fixedNodes.length; i++){
|
|
41
|
+
const fixedNode = fixedNodes[i];
|
|
42
|
+
const target = fixedNode === removedClassNode;
|
|
43
|
+
if (target) {
|
|
44
|
+
const prev = fixedNodes[i - 1];
|
|
45
|
+
const isSpaceBefore = prev && prev.type === 'space';
|
|
46
|
+
fixedNodes.splice(i, 1);
|
|
47
|
+
if (isSpaceBefore) {
|
|
48
|
+
fixedNodes.splice(i - 1, 1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
collisionClasses.forEach((collisionClass)=>{
|
|
54
|
+
const collisionNode = classNodes.find((node)=>node.value === collisionClass);
|
|
55
|
+
removeCollision(collisionNode);
|
|
56
|
+
});
|
|
57
|
+
const fixedRaw = fixedNodes.map((node)=>node.raw).join('');
|
|
58
|
+
context.report({
|
|
59
|
+
loc: classNode.loc,
|
|
60
|
+
messageId: 'collisionClass',
|
|
61
|
+
data: {
|
|
62
|
+
message: `"${className}" applies the same declarations as ${collisionClassNamesMsg}.`
|
|
63
|
+
},
|
|
64
|
+
fix: function(fixer) {
|
|
65
|
+
return fixer.replaceTextRange([
|
|
66
|
+
start,
|
|
67
|
+
end
|
|
68
|
+
], fixedRaw);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
module.exports = classCollision;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"collisionClass", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
2
|
+
name: string;
|
|
3
|
+
};
|
|
3
4
|
export default _default;
|
|
@@ -1 +1,74 @@
|
|
|
1
|
-
import
|
|
1
|
+
import defineVisitors from '../utils/define-visitors.mjs';
|
|
2
|
+
import resolveContext from '../utils/resolve-context.mjs';
|
|
3
|
+
import filterCollisionClasses from '../functions/filter-collision-classes.mjs';
|
|
4
|
+
import createRule from '../create-rule.mjs';
|
|
5
|
+
import settingsSchema from '../settings-schema.mjs';
|
|
6
|
+
|
|
7
|
+
var classCollision = createRule({
|
|
8
|
+
name: 'class-collision-detection',
|
|
9
|
+
meta: {
|
|
10
|
+
type: 'layout',
|
|
11
|
+
docs: {
|
|
12
|
+
description: 'Avoid applying classes with the same declarations'
|
|
13
|
+
},
|
|
14
|
+
messages: {
|
|
15
|
+
collisionClass: '{{message}}'
|
|
16
|
+
},
|
|
17
|
+
fixable: 'code',
|
|
18
|
+
schema: [
|
|
19
|
+
settingsSchema
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
defaultOptions: [],
|
|
23
|
+
create (context) {
|
|
24
|
+
const { settings, css } = resolveContext(context);
|
|
25
|
+
return defineVisitors({
|
|
26
|
+
context,
|
|
27
|
+
settings
|
|
28
|
+
}, (node, { raw, start, end, nodes, classNodes, classValues })=>{
|
|
29
|
+
const collisionClassesRecord = filterCollisionClasses(classValues, css);
|
|
30
|
+
for(const className in collisionClassesRecord){
|
|
31
|
+
const collisionClasses = collisionClassesRecord[className];
|
|
32
|
+
const collisionClassNamesMsg = collisionClasses.map((x)=>`"${x}"`).join(' and ');
|
|
33
|
+
const classNode = classNodes.find((node)=>node.value === className);
|
|
34
|
+
const fixedNodes = [
|
|
35
|
+
...nodes
|
|
36
|
+
];
|
|
37
|
+
const removeCollision = (removedClassNode)=>{
|
|
38
|
+
for(let i = 0; i < fixedNodes.length; i++){
|
|
39
|
+
const fixedNode = fixedNodes[i];
|
|
40
|
+
const target = fixedNode === removedClassNode;
|
|
41
|
+
if (target) {
|
|
42
|
+
const prev = fixedNodes[i - 1];
|
|
43
|
+
const isSpaceBefore = prev && prev.type === 'space';
|
|
44
|
+
fixedNodes.splice(i, 1);
|
|
45
|
+
if (isSpaceBefore) {
|
|
46
|
+
fixedNodes.splice(i - 1, 1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
collisionClasses.forEach((collisionClass)=>{
|
|
52
|
+
const collisionNode = classNodes.find((node)=>node.value === collisionClass);
|
|
53
|
+
removeCollision(collisionNode);
|
|
54
|
+
});
|
|
55
|
+
const fixedRaw = fixedNodes.map((node)=>node.raw).join('');
|
|
56
|
+
context.report({
|
|
57
|
+
loc: classNode.loc,
|
|
58
|
+
messageId: 'collisionClass',
|
|
59
|
+
data: {
|
|
60
|
+
message: `"${className}" applies the same declarations as ${collisionClassNamesMsg}.`
|
|
61
|
+
},
|
|
62
|
+
fix: function(fixer) {
|
|
63
|
+
return fixer.replaceTextRange([
|
|
64
|
+
start,
|
|
65
|
+
end
|
|
66
|
+
], fixedRaw);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export { classCollision as default };
|