@master/eslint-plugin-css 2.0.0-rc.3 → 2.0.0-rc.32
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 +1 -1
- package/dist/create-rule.cjs +8 -0
- package/dist/create-rule.d.ts +3 -0
- package/dist/create-rule.mjs +6 -0
- package/dist/functions/filter-collision-classes.cjs +9 -0
- package/dist/functions/filter-collision-classes.d.ts +3 -0
- package/dist/functions/filter-collision-classes.mjs +11 -0
- package/dist/functions/filter-collision-classes.worker.cjs +35 -0
- package/dist/functions/filter-collision-classes.worker.d.ts +1 -0
- package/dist/functions/filter-collision-classes.worker.mjs +33 -0
- package/dist/functions/get-css.cjs +19 -0
- package/dist/functions/get-css.d.ts +1 -0
- package/dist/functions/get-css.mjs +17 -0
- package/dist/functions/reorder-valid-classes.cjs +9 -0
- package/dist/functions/reorder-valid-classes.d.ts +3 -0
- package/dist/functions/reorder-valid-classes.mjs +11 -0
- package/dist/functions/reorder-valid-classes.worker.cjs +13 -0
- package/dist/functions/reorder-valid-classes.worker.d.ts +1 -0
- package/dist/functions/reorder-valid-classes.worker.mjs +11 -0
- package/dist/functions/validate.cjs +9 -0
- package/dist/functions/validate.d.ts +3 -0
- package/dist/functions/validate.mjs +11 -0
- package/dist/functions/validate.worker.cjs +15 -0
- package/dist/functions/validate.worker.d.ts +5 -0
- package/dist/functions/validate.worker.mjs +13 -0
- package/dist/index.cjs +39 -0
- package/dist/index.d.ts +61 -1
- package/dist/index.mjs +37 -1
- package/dist/plugin.cjs +18 -0
- package/dist/plugin.d.ts +10 -2
- package/dist/plugin.mjs +16 -1
- package/dist/rules/class-collision.cjs +68 -0
- package/dist/rules/class-collision.d.ts +1 -2
- package/dist/rules/class-collision.mjs +66 -1
- package/dist/rules/class-order.cjs +174 -0
- package/dist/rules/class-order.d.ts +1 -2
- package/dist/rules/class-order.mjs +172 -1
- package/dist/rules/class-validation.cjs +70 -0
- package/dist/rules/class-validation.d.ts +1 -2
- package/dist/rules/class-validation.mjs +68 -1
- package/dist/settings-schema.cjs +35 -0
- package/dist/settings-schema.d.ts +3 -0
- package/dist/settings-schema.mjs +33 -0
- package/dist/settings.cjs +16 -0
- package/dist/settings.d.ts +10 -2
- package/dist/settings.mjs +14 -1
- package/dist/utils/define-visitors.cjs +92 -0
- package/dist/utils/define-visitors.d.ts +6 -4
- package/dist/utils/define-visitors.mjs +90 -1
- package/dist/utils/extract-classnames-from-value.cjs +34 -0
- package/dist/utils/extract-classnames-from-value.mjs +32 -1
- package/dist/utils/extract-range-from-node.cjs +18 -0
- package/dist/utils/extract-range-from-node.mjs +16 -1
- package/dist/utils/extract-value-from-node.cjs +23 -0
- package/dist/utils/extract-value-from-node.mjs +21 -1
- package/dist/utils/find-loc.cjs +40 -0
- package/dist/utils/find-loc.mjs +38 -1
- package/dist/utils/get-template-element-body.cjs +12 -0
- package/dist/utils/get-template-element-body.mjs +10 -1
- package/dist/utils/get-template-element-prefix.cjs +11 -0
- package/dist/utils/get-template-element-prefix.mjs +9 -1
- package/dist/utils/get-template-element-suffix.cjs +10 -0
- package/dist/utils/get-template-element-suffix.mjs +8 -1
- package/dist/utils/parse-node-recursive.cjs +130 -0
- package/dist/utils/parse-node-recursive.d.ts +2 -2
- package/dist/utils/parse-node-recursive.mjs +128 -1
- package/dist/utils/resolve-context.cjs +13 -0
- package/dist/utils/resolve-context.d.ts +9 -2
- package/dist/utils/resolve-context.mjs +11 -1
- 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.d.ts +0 -14
- package/dist/configs/recommended.js +0 -1
- package/dist/configs/recommended.mjs +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.js +0 -1
- package/dist/utils/extract-range-from-node.js +0 -1
- package/dist/utils/extract-value-from-node.js +0 -1
- package/dist/utils/find-loc.js +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.js +0 -1
- package/dist/utils/get-template-element-prefix.js +0 -1
- package/dist/utils/get-template-element-suffix.js +0 -1
- package/dist/utils/parse-node-recursive.js +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,7 +41,7 @@
|
|
|
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/release.yml">
|
|
45
45
|
<picture>
|
|
46
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
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">
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
+
declare const _default: <Options extends readonly unknown[], MessageIds extends string>({ name, meta, ...rule }: Readonly<ESLintUtils.RuleWithMetaAndName<Options, MessageIds>>) => ESLintUtils.RuleModule<MessageIds, Options, ESLintUtils.RuleListener>;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var synckit = require('synckit');
|
|
4
|
+
var filterCollisionClasses_worker = require('./filter-collision-classes.worker.cjs');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
|
|
7
|
+
var filterCollisionClasses = process.env.NODE_ENV === 'test' ? filterCollisionClasses_worker : synckit.createSyncFn(path.join(__dirname, 'filter-collision-classes.worker.cjs'));
|
|
8
|
+
|
|
9
|
+
module.exports = filterCollisionClasses;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import __url_for_shim from 'url';
|
|
2
|
+
import __path_for_shim from 'path';
|
|
3
|
+
const __filename = __url_for_shim.fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __path_for_shim.dirname(__filename);
|
|
5
|
+
import { createSyncFn } from 'synckit';
|
|
6
|
+
import runFilterCollisionClasses from './filter-collision-classes.worker.mjs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
var filterCollisionClasses = process.env.NODE_ENV === 'test' ? runFilterCollisionClasses : createSyncFn(join(__dirname, 'filter-collision-classes.worker.cjs'));
|
|
9
|
+
export {
|
|
10
|
+
filterCollisionClasses as default
|
|
11
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var synckit = require('synckit');
|
|
4
|
+
var getCss = require('./get-css.cjs');
|
|
5
|
+
var cssValidator = require('@master/css-validator');
|
|
6
|
+
var css = require('@master/css');
|
|
7
|
+
|
|
8
|
+
function runFilterCollisionClasses(classNames, config) {
|
|
9
|
+
const currentCSS = getCss(config);
|
|
10
|
+
const validRules = classNames.map((eachClassName)=>cssValidator.generateValidRules(eachClassName, {
|
|
11
|
+
css: currentCSS
|
|
12
|
+
})[0]).filter(Boolean);
|
|
13
|
+
const collisionClassesRecord = {};
|
|
14
|
+
for(let i = 0; i < classNames.length; i++){
|
|
15
|
+
const className = classNames[i];
|
|
16
|
+
const rule = validRules.find((eachValidRule)=>eachValidRule.className === className);
|
|
17
|
+
const collisionClasses = [];
|
|
18
|
+
if (rule) {
|
|
19
|
+
for(let j = 0; j < classNames.length; j++){
|
|
20
|
+
const compareClassName = classNames[j];
|
|
21
|
+
const compareRule = validRules.find((eachValidRule)=>eachValidRule.className === compareClassName);
|
|
22
|
+
if (i !== j && compareRule && css.areRulesDuplicated(rule, compareRule) && css.areRuleStatesEqual(rule, compareRule)) {
|
|
23
|
+
collisionClasses.push(compareClassName);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (collisionClasses.length > 0) {
|
|
27
|
+
collisionClassesRecord[className] = collisionClasses;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return collisionClassesRecord;
|
|
32
|
+
}
|
|
33
|
+
synckit.runAsWorker(runFilterCollisionClasses);
|
|
34
|
+
|
|
35
|
+
module.exports = runFilterCollisionClasses;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function runFilterCollisionClasses(classNames: string[], config: string | object): Record<string, string[]>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { runAsWorker } from 'synckit';
|
|
2
|
+
import getCSS from './get-css.mjs';
|
|
3
|
+
import { generateValidRules } from '@master/css-validator';
|
|
4
|
+
import { areRulesDuplicated, areRuleStatesEqual } from '@master/css';
|
|
5
|
+
|
|
6
|
+
function runFilterCollisionClasses(classNames, config) {
|
|
7
|
+
const currentCSS = getCSS(config);
|
|
8
|
+
const validRules = classNames.map((eachClassName)=>generateValidRules(eachClassName, {
|
|
9
|
+
css: currentCSS
|
|
10
|
+
})[0]).filter(Boolean);
|
|
11
|
+
const collisionClassesRecord = {};
|
|
12
|
+
for(let i = 0; i < classNames.length; i++){
|
|
13
|
+
const className = classNames[i];
|
|
14
|
+
const rule = validRules.find((eachValidRule)=>eachValidRule.className === className);
|
|
15
|
+
const collisionClasses = [];
|
|
16
|
+
if (rule) {
|
|
17
|
+
for(let j = 0; j < classNames.length; j++){
|
|
18
|
+
const compareClassName = classNames[j];
|
|
19
|
+
const compareRule = validRules.find((eachValidRule)=>eachValidRule.className === compareClassName);
|
|
20
|
+
if (i !== j && compareRule && areRulesDuplicated(rule, compareRule) && areRuleStatesEqual(rule, compareRule)) {
|
|
21
|
+
collisionClasses.push(compareClassName);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (collisionClasses.length > 0) {
|
|
25
|
+
collisionClassesRecord[className] = collisionClasses;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return collisionClassesRecord;
|
|
30
|
+
}
|
|
31
|
+
runAsWorker(runFilterCollisionClasses);
|
|
32
|
+
|
|
33
|
+
export { runFilterCollisionClasses as default };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css = require('@master/css');
|
|
4
|
+
var exploreConfig = require('@master/css-explore-config');
|
|
5
|
+
|
|
6
|
+
let currentCSS;
|
|
7
|
+
let currentConfig;
|
|
8
|
+
function getCSS(config) {
|
|
9
|
+
if (!currentCSS || currentConfig !== config) {
|
|
10
|
+
currentCSS = new css.MasterCSS(typeof config === 'object' ? config : exploreConfig({
|
|
11
|
+
name: config,
|
|
12
|
+
found: undefined
|
|
13
|
+
}));
|
|
14
|
+
currentConfig = config;
|
|
15
|
+
}
|
|
16
|
+
return currentCSS;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = getCSS;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function getCSS(config: any): any;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MasterCSS } from '@master/css';
|
|
2
|
+
import exploreConfig from '@master/css-explore-config';
|
|
3
|
+
|
|
4
|
+
let currentCSS;
|
|
5
|
+
let currentConfig;
|
|
6
|
+
function getCSS(config) {
|
|
7
|
+
if (!currentCSS || currentConfig !== config) {
|
|
8
|
+
currentCSS = new MasterCSS(typeof config === 'object' ? config : exploreConfig({
|
|
9
|
+
name: config,
|
|
10
|
+
found: undefined
|
|
11
|
+
}));
|
|
12
|
+
currentConfig = config;
|
|
13
|
+
}
|
|
14
|
+
return currentCSS;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { getCSS as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var synckit = require('synckit');
|
|
4
|
+
var reorderValidClasses_worker = require('./reorder-valid-classes.worker.cjs');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
|
|
7
|
+
var reorderValidClasses = process.env.NODE_ENV === 'test' ? reorderValidClasses_worker : synckit.createSyncFn(path.join(__dirname, 'reorder-valid-classes.worker.cjs'));
|
|
8
|
+
|
|
9
|
+
module.exports = reorderValidClasses;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import __url_for_shim from 'url';
|
|
2
|
+
import __path_for_shim from 'path';
|
|
3
|
+
const __filename = __url_for_shim.fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __path_for_shim.dirname(__filename);
|
|
5
|
+
import { createSyncFn } from 'synckit';
|
|
6
|
+
import runReorderValidClasses from './reorder-valid-classes.worker.mjs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
var reorderValidClasses = process.env.NODE_ENV === 'test' ? runReorderValidClasses : createSyncFn(join(__dirname, 'reorder-valid-classes.worker.cjs'));
|
|
9
|
+
export {
|
|
10
|
+
reorderValidClasses as default
|
|
11
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css = require('@master/css');
|
|
4
|
+
var synckit = require('synckit');
|
|
5
|
+
var getCss = require('./get-css.cjs');
|
|
6
|
+
|
|
7
|
+
function runReorderValidClasses(classNames, config) {
|
|
8
|
+
const currentCSS = getCss(config);
|
|
9
|
+
return css.reorderForReadableClasses(classNames, currentCSS).filter((eachOrderedClassName)=>classNames.includes(eachOrderedClassName));
|
|
10
|
+
}
|
|
11
|
+
synckit.runAsWorker(runReorderValidClasses);
|
|
12
|
+
|
|
13
|
+
module.exports = runReorderValidClasses;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function runReorderValidClasses(classNames: string[], config: string | object): string[];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { reorderForReadableClasses } from '@master/css';
|
|
2
|
+
import { runAsWorker } from 'synckit';
|
|
3
|
+
import getCSS from './get-css.mjs';
|
|
4
|
+
|
|
5
|
+
function runReorderValidClasses(classNames, config) {
|
|
6
|
+
const currentCSS = getCSS(config);
|
|
7
|
+
return reorderForReadableClasses(classNames, currentCSS).filter((eachOrderedClassName)=>classNames.includes(eachOrderedClassName));
|
|
8
|
+
}
|
|
9
|
+
runAsWorker(runReorderValidClasses);
|
|
10
|
+
|
|
11
|
+
export { runReorderValidClasses as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var synckit = require('synckit');
|
|
4
|
+
var validate_worker = require('./validate.worker.cjs');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
|
|
7
|
+
var validate = process.env.NODE_ENV === 'test' ? validate_worker : synckit.createSyncFn(path.join(__dirname, 'validate.worker.cjs'));
|
|
8
|
+
|
|
9
|
+
module.exports = validate;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import __url_for_shim from 'url';
|
|
2
|
+
import __path_for_shim from 'path';
|
|
3
|
+
const __filename = __url_for_shim.fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __path_for_shim.dirname(__filename);
|
|
5
|
+
import { createSyncFn } from 'synckit';
|
|
6
|
+
import runValidate from './validate.worker.mjs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
var validate = process.env.NODE_ENV === 'test' ? runValidate : createSyncFn(join(__dirname, 'validate.worker.cjs'));
|
|
9
|
+
export {
|
|
10
|
+
validate as default
|
|
11
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var synckit = require('synckit');
|
|
4
|
+
var getCss = require('./get-css.cjs');
|
|
5
|
+
var cssValidator = require('@master/css-validator');
|
|
6
|
+
|
|
7
|
+
function runValidate(className, config) {
|
|
8
|
+
const currentCSS = getCss(config);
|
|
9
|
+
return cssValidator.validate(className, {
|
|
10
|
+
css: currentCSS
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
synckit.runAsWorker(runValidate);
|
|
14
|
+
|
|
15
|
+
module.exports = runValidate;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { runAsWorker } from 'synckit';
|
|
2
|
+
import getCSS from './get-css.mjs';
|
|
3
|
+
import { validate } from '@master/css-validator';
|
|
4
|
+
|
|
5
|
+
function runValidate(className, config) {
|
|
6
|
+
const currentCSS = getCSS(config);
|
|
7
|
+
return validate(className, {
|
|
8
|
+
css: currentCSS
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
runAsWorker(runValidate);
|
|
12
|
+
|
|
13
|
+
export { runValidate as default };
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var plugin = require('./plugin.cjs');
|
|
4
|
+
var settings = require('./settings.cjs');
|
|
5
|
+
|
|
6
|
+
const parserOptions = {
|
|
7
|
+
ecmaFeatures: {
|
|
8
|
+
jsx: true
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const rules = {
|
|
12
|
+
'@master/css/class-order': 'warn',
|
|
13
|
+
'@master/css/class-validation': 'error',
|
|
14
|
+
'@master/css/class-collision': 'warn'
|
|
15
|
+
};
|
|
16
|
+
/** @type {import('typescript-eslint').Config} */ var index = {
|
|
17
|
+
...plugin,
|
|
18
|
+
configs: {
|
|
19
|
+
recommended: {
|
|
20
|
+
plugins: [
|
|
21
|
+
'@master/css'
|
|
22
|
+
],
|
|
23
|
+
rules,
|
|
24
|
+
parserOptions
|
|
25
|
+
},
|
|
26
|
+
flat: {
|
|
27
|
+
plugins: {
|
|
28
|
+
'@master/css': plugin
|
|
29
|
+
},
|
|
30
|
+
rules,
|
|
31
|
+
languageOptions: {
|
|
32
|
+
parserOptions
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
settings
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
module.exports = index;
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,61 @@
|
|
|
1
|
-
|
|
1
|
+
/** @type {import('typescript-eslint').Config} */
|
|
2
|
+
declare const _default: {
|
|
3
|
+
configs: {
|
|
4
|
+
recommended: {
|
|
5
|
+
plugins: string[];
|
|
6
|
+
rules: {
|
|
7
|
+
'@master/css/class-order': string;
|
|
8
|
+
'@master/css/class-validation': string;
|
|
9
|
+
'@master/css/class-collision': string;
|
|
10
|
+
};
|
|
11
|
+
parserOptions: {
|
|
12
|
+
ecmaFeatures: {
|
|
13
|
+
jsx: boolean;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
flat: {
|
|
18
|
+
plugins: {
|
|
19
|
+
'@master/css': {
|
|
20
|
+
meta: {
|
|
21
|
+
name: string;
|
|
22
|
+
};
|
|
23
|
+
rules: {
|
|
24
|
+
'class-collision': import("@typescript-eslint/utils/ts-eslint").RuleModule<"collisionClass", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
25
|
+
'class-order': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidClassOrder", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
26
|
+
'class-validation': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidClass" | "disallowUnknownClass", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
rules: {
|
|
31
|
+
'@master/css/class-order': string;
|
|
32
|
+
'@master/css/class-validation': string;
|
|
33
|
+
'@master/css/class-collision': string;
|
|
34
|
+
};
|
|
35
|
+
languageOptions: {
|
|
36
|
+
parserOptions: {
|
|
37
|
+
ecmaFeatures: {
|
|
38
|
+
jsx: boolean;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
settings: {
|
|
45
|
+
classAttributes: string[];
|
|
46
|
+
classFunctions: string[];
|
|
47
|
+
classDeclarations: string[];
|
|
48
|
+
ignoredKeys: string[];
|
|
49
|
+
/** @type {import('typescript-eslint').Config} */
|
|
50
|
+
config: string;
|
|
51
|
+
};
|
|
52
|
+
meta: {
|
|
53
|
+
name: string;
|
|
54
|
+
};
|
|
55
|
+
rules: {
|
|
56
|
+
'class-collision': import("@typescript-eslint/utils/ts-eslint").RuleModule<"collisionClass", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
57
|
+
'class-order': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidClassOrder", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
58
|
+
'class-validation': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidClass" | "disallowUnknownClass", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export default _default;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1,37 @@
|
|
|
1
|
-
|
|
1
|
+
import plugin from './plugin.mjs';
|
|
2
|
+
import settings from './settings.mjs';
|
|
3
|
+
|
|
4
|
+
const parserOptions = {
|
|
5
|
+
ecmaFeatures: {
|
|
6
|
+
jsx: true
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
const rules = {
|
|
10
|
+
'@master/css/class-order': 'warn',
|
|
11
|
+
'@master/css/class-validation': 'error',
|
|
12
|
+
'@master/css/class-collision': 'warn'
|
|
13
|
+
};
|
|
14
|
+
/** @type {import('typescript-eslint').Config} */ var index = {
|
|
15
|
+
...plugin,
|
|
16
|
+
configs: {
|
|
17
|
+
recommended: {
|
|
18
|
+
plugins: [
|
|
19
|
+
'@master/css'
|
|
20
|
+
],
|
|
21
|
+
rules,
|
|
22
|
+
parserOptions
|
|
23
|
+
},
|
|
24
|
+
flat: {
|
|
25
|
+
plugins: {
|
|
26
|
+
'@master/css': plugin
|
|
27
|
+
},
|
|
28
|
+
rules,
|
|
29
|
+
languageOptions: {
|
|
30
|
+
parserOptions
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
settings
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { index as default };
|
package/dist/plugin.cjs
ADDED
|
@@ -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.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
declare const plugin: {
|
|
2
|
+
meta: {
|
|
3
|
+
name: string;
|
|
4
|
+
};
|
|
5
|
+
rules: {
|
|
6
|
+
'class-collision': import("@typescript-eslint/utils/ts-eslint").RuleModule<"collisionClass", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
7
|
+
'class-order': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidClassOrder", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
8
|
+
'class-validation': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidClass" | "disallowUnknownClass", [], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
3
11
|
export default plugin;
|
package/dist/plugin.mjs
CHANGED
|
@@ -1 +1,16 @@
|
|
|
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
|
+
|
|
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,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var defineVisitors = require('../utils/define-visitors.cjs');
|
|
4
|
+
var resolveContext = require('../utils/resolve-context.cjs');
|
|
5
|
+
var findLoc = require('../utils/find-loc.cjs');
|
|
6
|
+
var parseNodeRecursive = require('../utils/parse-node-recursive.cjs');
|
|
7
|
+
var filterCollisionClasses = require('../functions/filter-collision-classes.cjs');
|
|
8
|
+
var createRule = require('../create-rule.cjs');
|
|
9
|
+
var settingsSchema = require('../settings-schema.cjs');
|
|
10
|
+
|
|
11
|
+
var classCollision = createRule({
|
|
12
|
+
name: 'class-collision-detection',
|
|
13
|
+
meta: {
|
|
14
|
+
type: 'layout',
|
|
15
|
+
docs: {
|
|
16
|
+
description: 'Avoid applying classes with the same CSS declaration',
|
|
17
|
+
recommended: 'recommended'
|
|
18
|
+
},
|
|
19
|
+
messages: {
|
|
20
|
+
collisionClass: '{{message}}'
|
|
21
|
+
},
|
|
22
|
+
fixable: 'code',
|
|
23
|
+
schema: [
|
|
24
|
+
settingsSchema
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
defaultOptions: [],
|
|
28
|
+
create (context) {
|
|
29
|
+
const { options, settings } = resolveContext(context);
|
|
30
|
+
const visitNode = (node, arg = null)=>{
|
|
31
|
+
parseNodeRecursive.parseNodeRecursive(node, arg, (classNames, node, originalClassNamesValue, start, end)=>{
|
|
32
|
+
const sourceCode = context.sourceCode;
|
|
33
|
+
const sourceCodeLines = sourceCode.lines;
|
|
34
|
+
const nodeStartLine = node.loc.start.line;
|
|
35
|
+
const nodeEndLine = node.loc.end.line;
|
|
36
|
+
const collisionClassesRecord = filterCollisionClasses(classNames, settings.config);
|
|
37
|
+
for(const className in collisionClassesRecord){
|
|
38
|
+
const collisionClasses = collisionClassesRecord[className];
|
|
39
|
+
const collisionClassNamesMsg = collisionClasses.map((x)=>`"${x}"`).join(' and ');
|
|
40
|
+
let fixClassNames = originalClassNamesValue;
|
|
41
|
+
for (const collisionClassName of collisionClasses){
|
|
42
|
+
const regexSafe = collisionClassName.replace(/(\\|\.|\(|\)|\[|\]|\{|\}|\+|\*|\?|\^|\$|\||\/)/g, '\\$1');
|
|
43
|
+
fixClassNames = fixClassNames.replace(new RegExp(`\\s+${regexSafe}|${regexSafe}\\s+`), '');
|
|
44
|
+
}
|
|
45
|
+
context.report({
|
|
46
|
+
loc: findLoc(className, sourceCodeLines, nodeStartLine, nodeEndLine),
|
|
47
|
+
messageId: 'collisionClass',
|
|
48
|
+
data: {
|
|
49
|
+
message: `"${className}" applies the same CSS declarations as ${collisionClassNamesMsg}.`
|
|
50
|
+
},
|
|
51
|
+
fix: function(fixer) {
|
|
52
|
+
return fixer.replaceTextRange([
|
|
53
|
+
start,
|
|
54
|
+
end
|
|
55
|
+
], fixClassNames);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}, false, false, settings.ignoredKeys, context);
|
|
60
|
+
};
|
|
61
|
+
return defineVisitors({
|
|
62
|
+
context,
|
|
63
|
+
settings
|
|
64
|
+
}, visitNode);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
module.exports = classCollision;
|
|
@@ -1 +1,66 @@
|
|
|
1
|
-
import
|
|
1
|
+
import defineVisitors from '../utils/define-visitors.mjs';
|
|
2
|
+
import resolveContext from '../utils/resolve-context.mjs';
|
|
3
|
+
import findLoc from '../utils/find-loc.mjs';
|
|
4
|
+
import { parseNodeRecursive } from '../utils/parse-node-recursive.mjs';
|
|
5
|
+
import filterCollisionClasses from '../functions/filter-collision-classes.mjs';
|
|
6
|
+
import createRule from '../create-rule.mjs';
|
|
7
|
+
import settingsSchema from '../settings-schema.mjs';
|
|
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 CSS declaration',
|
|
15
|
+
recommended: 'recommended'
|
|
16
|
+
},
|
|
17
|
+
messages: {
|
|
18
|
+
collisionClass: '{{message}}'
|
|
19
|
+
},
|
|
20
|
+
fixable: 'code',
|
|
21
|
+
schema: [
|
|
22
|
+
settingsSchema
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
defaultOptions: [],
|
|
26
|
+
create (context) {
|
|
27
|
+
const { options, settings } = resolveContext(context);
|
|
28
|
+
const visitNode = (node, arg = null)=>{
|
|
29
|
+
parseNodeRecursive(node, arg, (classNames, node, originalClassNamesValue, start, end)=>{
|
|
30
|
+
const sourceCode = context.sourceCode;
|
|
31
|
+
const sourceCodeLines = sourceCode.lines;
|
|
32
|
+
const nodeStartLine = node.loc.start.line;
|
|
33
|
+
const nodeEndLine = node.loc.end.line;
|
|
34
|
+
const collisionClassesRecord = filterCollisionClasses(classNames, settings.config);
|
|
35
|
+
for(const className in collisionClassesRecord){
|
|
36
|
+
const collisionClasses = collisionClassesRecord[className];
|
|
37
|
+
const collisionClassNamesMsg = collisionClasses.map((x)=>`"${x}"`).join(' and ');
|
|
38
|
+
let fixClassNames = originalClassNamesValue;
|
|
39
|
+
for (const collisionClassName of collisionClasses){
|
|
40
|
+
const regexSafe = collisionClassName.replace(/(\\|\.|\(|\)|\[|\]|\{|\}|\+|\*|\?|\^|\$|\||\/)/g, '\\$1');
|
|
41
|
+
fixClassNames = fixClassNames.replace(new RegExp(`\\s+${regexSafe}|${regexSafe}\\s+`), '');
|
|
42
|
+
}
|
|
43
|
+
context.report({
|
|
44
|
+
loc: findLoc(className, sourceCodeLines, nodeStartLine, nodeEndLine),
|
|
45
|
+
messageId: 'collisionClass',
|
|
46
|
+
data: {
|
|
47
|
+
message: `"${className}" applies the same CSS declarations as ${collisionClassNamesMsg}.`
|
|
48
|
+
},
|
|
49
|
+
fix: function(fixer) {
|
|
50
|
+
return fixer.replaceTextRange([
|
|
51
|
+
start,
|
|
52
|
+
end
|
|
53
|
+
], fixClassNames);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}, false, false, settings.ignoredKeys, context);
|
|
58
|
+
};
|
|
59
|
+
return defineVisitors({
|
|
60
|
+
context,
|
|
61
|
+
settings
|
|
62
|
+
}, visitNode);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export { classCollision as default };
|