@o3r/eslint-plugin 11.6.0-prerelease.7 → 11.6.0-prerelease.9
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +22 -21
- package/schematics/ng-add/index.d.ts.map +1 -1
- package/src/index.js +4 -5
- package/src/public_api.d.ts +3 -0
- package/src/public_api.js +1 -0
- package/src/rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize.d.ts +3 -2
- package/src/rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize.js +60 -60
- package/src/rules/json/json-dependency-versions-harmonize/version-harmonize.js +1 -1
- package/src/rules/json/utils.js +2 -2
- package/src/rules/template/no-inner-html/no-inner-html.d.ts +1 -1
- package/src/rules/template/no-inner-html/no-inner-html.js +30 -31
- package/src/rules/template/template-async-number-limitation/template-async-number-limitation.d.ts +2 -2
- package/src/rules/template/template-async-number-limitation/template-async-number-limitation.js +24 -24
- package/src/rules/template/utils.js +3 -3
- package/src/rules/typescript/matching-configuration-name/matching-configuration-name.d.ts +1 -1
- package/src/rules/typescript/matching-configuration-name/matching-configuration-name.js +40 -40
- package/src/rules/typescript/no-folder-import-for-module/no-folder-import-for-module.d.ts +1 -1
- package/src/rules/typescript/no-folder-import-for-module/no-folder-import-for-module.js +28 -24
- package/src/rules/typescript/no-multiple-type-configuration-property/no-multiple-type-configuration-property.d.ts +1 -1
- package/src/rules/typescript/no-multiple-type-configuration-property/no-multiple-type-configuration-property.js +3 -5
- package/src/rules/typescript/o3r-categories-tags/o3r-categories-tags.d.ts +1 -1
- package/src/rules/typescript/o3r-categories-tags/o3r-categories-tags.js +82 -82
- package/src/rules/typescript/o3r-widget-tags/o3r-widget-tags.d.ts +1 -1
- package/src/rules/typescript/o3r-widget-tags/o3r-widget-tags.js +142 -142
- package/src/rules/utils.d.ts +1 -1
- package/src/rules/utils.js +4 -7
- package/src/rules/yaml/utils.js +2 -2
- package/src/rules/yaml/yarnrc-package-extensions-harmonize/yarnrc-package-extensions-harmonize.d.ts +2 -2
- package/src/rules/yaml/yarnrc-package-extensions-harmonize/yarnrc-package-extensions-harmonize.js +45 -45
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@o3r/eslint-plugin",
|
3
|
-
"version": "11.6.0-prerelease.
|
3
|
+
"version": "11.6.0-prerelease.9",
|
4
4
|
"publishConfig": {
|
5
5
|
"access": "public"
|
6
6
|
},
|
@@ -24,7 +24,7 @@
|
|
24
24
|
"build:builders": "tsc -b tsconfig.builders.json --pretty && yarn generate-cjs-manifest"
|
25
25
|
},
|
26
26
|
"dependencies": {
|
27
|
-
"@typescript-eslint/utils": "
|
27
|
+
"@typescript-eslint/utils": "~8.12.2",
|
28
28
|
"globby": "^11.1.0",
|
29
29
|
"semver": "^7.5.2",
|
30
30
|
"tslib": "^2.6.2",
|
@@ -46,46 +46,46 @@
|
|
46
46
|
},
|
47
47
|
"peerDependencies": {
|
48
48
|
"@angular-devkit/schematics": "~18.2.0",
|
49
|
-
"@angular-eslint/template-parser": "~18.
|
50
|
-
"@angular-eslint/test-utils": "~18.
|
49
|
+
"@angular-eslint/template-parser": "~18.4.0",
|
50
|
+
"@angular-eslint/test-utils": "~18.4.0",
|
51
51
|
"@angular/compiler": "~18.2.0",
|
52
|
-
"
|
53
|
-
"@typescript-eslint/eslint-plugin": "^7.0.1",
|
54
|
-
"@typescript-eslint/parser": "^7.14.1",
|
55
|
-
"@typescript-eslint/rule-tester": "^7.11.0",
|
56
|
-
"eslint": "^8.57.0",
|
52
|
+
"eslint": "^8.57.0 || ~9.14.0",
|
57
53
|
"jsonc-eslint-parser": "~2.4.0",
|
58
54
|
"yaml-eslint-parser": "^1.2.2"
|
59
55
|
},
|
60
56
|
"devDependencies": {
|
61
57
|
"@angular-devkit/core": "~18.2.0",
|
62
58
|
"@angular-devkit/schematics": "~18.2.0",
|
63
|
-
"@angular-eslint/
|
64
|
-
"@angular-eslint/template-parser": "~18.3.0",
|
65
|
-
"@angular-eslint/test-utils": "~18.3.0",
|
59
|
+
"@angular-eslint/test-utils": "~18.4.0",
|
66
60
|
"@angular/compiler": "~18.2.0",
|
67
61
|
"@babel/core": "~7.26.0",
|
68
62
|
"@babel/preset-typescript": "~7.26.0",
|
69
63
|
"@compodoc/compodoc": "^1.1.19",
|
64
|
+
"@eslint-community/eslint-plugin-eslint-comments": "^4.4.0",
|
70
65
|
"@eslint/eslintrc": "^3.0.0",
|
71
66
|
"@nx/eslint-plugin": "~19.5.0",
|
72
67
|
"@nx/jest": "~19.5.0",
|
73
|
-
"@o3r/build-helpers": "^11.6.0-prerelease.
|
74
|
-
"@o3r/
|
75
|
-
"@
|
68
|
+
"@o3r/build-helpers": "^11.6.0-prerelease.9",
|
69
|
+
"@o3r/eslint-config": "^11.6.0-prerelease.9",
|
70
|
+
"@o3r/test-helpers": "^11.6.0-prerelease.9",
|
71
|
+
"@stylistic/eslint-plugin": "~2.7.0",
|
76
72
|
"@types/eslint": "~9.6.0",
|
77
73
|
"@types/jest": "~29.5.2",
|
78
74
|
"@types/node": "^20.0.0",
|
79
75
|
"@types/semver": "^7.3.13",
|
80
|
-
"@typescript-eslint/
|
81
|
-
"@typescript-eslint/
|
82
|
-
"
|
76
|
+
"@typescript-eslint/parser": "~8.12.2",
|
77
|
+
"@typescript-eslint/rule-tester": "~8.12.2",
|
78
|
+
"angular-eslint": "~18.4.0",
|
83
79
|
"cpy-cli": "^5.0.0",
|
84
|
-
"eslint": "
|
80
|
+
"eslint": "~9.14.0",
|
81
|
+
"eslint-plugin-import": "^2.31.0",
|
82
|
+
"eslint-plugin-import-newlines": "^1.4.0",
|
85
83
|
"eslint-plugin-jest": "~28.8.0",
|
86
|
-
"eslint-plugin-jsdoc": "~
|
84
|
+
"eslint-plugin-jsdoc": "~50.2.0",
|
87
85
|
"eslint-plugin-prefer-arrow": "~1.2.3",
|
88
|
-
"eslint-plugin-unicorn": "^
|
86
|
+
"eslint-plugin-unicorn": "^56.0.0",
|
87
|
+
"eslint-plugin-unused-imports": "^4.1.4",
|
88
|
+
"globals": "^15.9.0",
|
89
89
|
"jest": "~29.7.0",
|
90
90
|
"jest-junit": "~16.0.0",
|
91
91
|
"jsonc-eslint-parser": "~2.4.0",
|
@@ -96,6 +96,7 @@
|
|
96
96
|
"ts-jest": "~29.2.0",
|
97
97
|
"type-fest": "^4.10.2",
|
98
98
|
"typescript": "~5.5.4",
|
99
|
+
"typescript-eslint": "~8.12.2",
|
99
100
|
"yaml-eslint-parser": "^1.2.2"
|
100
101
|
},
|
101
102
|
"schematics": "./collection.json",
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../schematics/ng-add/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACL,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAG5B"}
|
package/src/index.js
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
|
4
|
-
const no_folder_import_for_module_1 = require("./rules/typescript/no-folder-import-for-module/no-folder-import-for-module");
|
5
|
-
const o3r_widget_tags_1 = require("./rules/typescript/o3r-widget-tags/o3r-widget-tags");
|
3
|
+
const json_dependency_versions_harmonize_1 = require("./rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize");
|
6
4
|
const no_inner_html_1 = require("./rules/template/no-inner-html/no-inner-html");
|
7
5
|
const template_async_number_limitation_1 = require("./rules/template/template-async-number-limitation/template-async-number-limitation");
|
8
|
-
const json_dependency_versions_harmonize_1 = require("./rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize");
|
9
|
-
const yarnrc_package_extensions_harmonize_1 = require("./rules/yaml/yarnrc-package-extensions-harmonize/yarnrc-package-extensions-harmonize");
|
10
6
|
const matching_configuration_name_1 = require("./rules/typescript/matching-configuration-name/matching-configuration-name");
|
7
|
+
const no_folder_import_for_module_1 = require("./rules/typescript/no-folder-import-for-module/no-folder-import-for-module");
|
11
8
|
const no_multiple_type_configuration_property_1 = require("./rules/typescript/no-multiple-type-configuration-property/no-multiple-type-configuration-property");
|
12
9
|
const o3r_categories_tags_1 = require("./rules/typescript/o3r-categories-tags/o3r-categories-tags");
|
10
|
+
const o3r_widget_tags_1 = require("./rules/typescript/o3r-widget-tags/o3r-widget-tags");
|
11
|
+
const yarnrc_package_extensions_harmonize_1 = require("./rules/yaml/yarnrc-package-extensions-harmonize/yarnrc-package-extensions-harmonize");
|
13
12
|
module.exports = {
|
14
13
|
rules: {
|
15
14
|
'no-folder-import-for-module': no_folder_import_for_module_1.default,
|
package/src/public_api.d.ts
CHANGED
@@ -1 +1,4 @@
|
|
1
1
|
export * from './index';
|
2
|
+
export type { NoMultipleTypeConfigurationPropertyOption } from './rules/typescript/no-multiple-type-configuration-property/no-multiple-type-configuration-property';
|
3
|
+
export type { O3rCategoriesTagsRuleOption } from './rules/typescript/o3r-categories-tags/o3r-categories-tags';
|
4
|
+
export type { O3rWidgetTagsRuleOption } from './rules/typescript/o3r-widget-tags/o3r-widget-tags';
|
package/src/public_api.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const tslib_1 = require("tslib");
|
4
|
+
// eslint-disable-next-line import/export -- needed to export the eslint plugin in the same format as in index.ts
|
4
5
|
tslib_1.__exportStar(require("./index"), exports);
|
package/src/rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize.d.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
/** Options for the ESLint rule @o3r/json-dependency-versions-harmonize */
|
2
|
+
export interface VersionsHarmonizeOptions {
|
2
3
|
/** List of package name to ignore when determining the dependencies versions */
|
3
4
|
ignoredPackages?: string[];
|
4
5
|
/** List of dependencies to ignore */
|
@@ -15,5 +16,5 @@ interface Options {
|
|
15
16
|
/** Align the Engines versions */
|
16
17
|
alignEngines?: boolean;
|
17
18
|
}
|
18
|
-
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"error" | "versionUpdate", [
|
19
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"error" | "versionUpdate", [VersionsHarmonizeOptions, ...any[]], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
19
20
|
export default _default;
|
package/src/rules/json/json-dependency-versions-harmonize/json-dependency-versions-harmonize.js
CHANGED
@@ -78,74 +78,74 @@ exports.default = (0, utils_1.createRule)({
|
|
78
78
|
const workspace = (0, version_harmonize_1.findWorkspacePackageJsons)(dirname);
|
79
79
|
const dependencyTypesWithInterest = [...options.dependencyTypes, ...(options.alignEngines ? [enginesField] : [])];
|
80
80
|
const bestRanges = workspace && (0, version_harmonize_1.getBestRanges)(dependencyTypesWithInterest, workspace.packages.filter(({ content }) => !content.name || !options.ignoredPackages.includes(content.name)));
|
81
|
-
const ignoredDependencies = options.ignoredDependencies.map((dep) => new RegExp(dep.replace(/[
|
81
|
+
const ignoredDependencies = options.ignoredDependencies.map((dep) => new RegExp(dep.replace(/[$()+.?[\\\]^{|}]/g, '\\$&').replace(/\*/g, '.*')));
|
82
82
|
const dependencyTypes = [...dependencyTypesWithInterest, ...(options.alignResolutions ? resolutionsFields : [])];
|
83
83
|
if (parserServices.isJSON) {
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
{
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
84
|
+
const rule = (node) => {
|
85
|
+
if (node.expression.type === 'JSONObjectExpression') {
|
86
|
+
const deps = node.expression.properties
|
87
|
+
.filter(({ key }) => dependencyTypes.includes(key.type === 'JSONLiteral' ? key.value.toString() : key.name));
|
88
|
+
if (deps.length > 0 && bestRanges) {
|
89
|
+
deps
|
90
|
+
.map((depGroup) => depGroup.value)
|
91
|
+
.filter((depGroup) => depGroup.type === 'JSONObjectExpression')
|
92
|
+
.forEach((depGroup) => {
|
93
|
+
const report = (name, resolvedName, dep, range, bestRange) => {
|
94
|
+
if (bestRange && bestRange !== range) {
|
95
|
+
if (!options.alignPeerDependencies && depGroup.parent.type === 'JSONProperty' && range
|
96
|
+
&& (depGroup.parent.key.type === 'JSONLiteral' ? depGroup.parent.key.value.toString() : depGroup.parent.key.name) === 'peerDependencies'
|
97
|
+
&& semver.subset(bestRange, range)) {
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
context.report({
|
101
|
+
loc: dep.value.loc,
|
102
|
+
messageId: 'error',
|
103
|
+
data: {
|
104
|
+
depName: name,
|
105
|
+
version: bestRange,
|
106
|
+
packageJsonFile: bestRanges[resolvedName].path
|
107
|
+
},
|
108
|
+
fix: (fixer) => fixer.replaceTextRange(dep.value.range, `"${bestRange}"`),
|
109
|
+
suggest: [
|
110
|
+
{
|
111
|
+
messageId: 'versionUpdate',
|
112
|
+
data: {
|
113
|
+
version: bestRange
|
114
|
+
},
|
115
|
+
fix: (fixer) => fixer.replaceTextRange(dep.value.range, `"${bestRange}"`)
|
116
|
+
}
|
117
|
+
]
|
118
|
+
});
|
119
|
+
}
|
120
|
+
};
|
121
|
+
depGroup.properties.forEach((dependencyNode) => {
|
122
|
+
const isResolutionsField = options.alignResolutions && depGroup.parent.type === 'JSONProperty'
|
123
|
+
&& resolutionsFields.includes(depGroup.parent.key.type === 'JSONLiteral' ? depGroup.parent.key.value.toString() : depGroup.parent.key.name);
|
124
|
+
const getNodeDetails = (dep) => {
|
125
|
+
const name = dep.key.type === 'JSONLiteral' ? dep.key.value.toString() : dep.key.name;
|
126
|
+
const nameParts = name.split('/');
|
127
|
+
if (ignoredDependencies.some((ignore) => ignore.test(name))) {
|
128
|
+
return;
|
129
|
+
}
|
130
|
+
const range = dep.value.type === 'JSONLiteral' ? dep.value.value : (dep.value.type === 'JSONIdentifier' ? dep.value.name : undefined);
|
131
|
+
if (!range && dep.value.type === 'JSONObjectExpression') {
|
132
|
+
return dep.value.properties
|
133
|
+
.forEach((prop) => getNodeDetails(prop));
|
121
134
|
}
|
135
|
+
const resolutionSubNameIndex = isResolutionsField ? nameParts.findIndex((_, i) => !!bestRanges[nameParts.slice(nameParts.length - i).join('/')]) : -1;
|
136
|
+
const resolvedName = resolutionSubNameIndex > -1 ? nameParts.slice(nameParts.length - resolutionSubNameIndex).join('/') : name;
|
137
|
+
const bestRange = (0, version_harmonize_1.getBestRange)(range, bestRanges[resolvedName]?.range);
|
138
|
+
report(name, resolvedName, dep, range, bestRange);
|
122
139
|
};
|
123
|
-
|
124
|
-
const isResolutionsField = options.alignResolutions && depGroup.parent.type === 'JSONProperty' &&
|
125
|
-
resolutionsFields.includes(depGroup.parent.key.type === 'JSONLiteral' ? depGroup.parent.key.value.toString() : depGroup.parent.key.name);
|
126
|
-
const getNodeDetails = (dep) => {
|
127
|
-
const name = dep.key.type === 'JSONLiteral' ? dep.key.value.toString() : dep.key.name;
|
128
|
-
const nameParts = name.split('/');
|
129
|
-
if (ignoredDependencies.some((ignore) => ignore.test(name))) {
|
130
|
-
return;
|
131
|
-
}
|
132
|
-
const range = dep.value.type === 'JSONLiteral' ? dep.value.value : (dep.value.type === 'JSONIdentifier' ? dep.value.name : undefined);
|
133
|
-
if (!range && dep.value.type === 'JSONObjectExpression') {
|
134
|
-
return dep.value.properties
|
135
|
-
.forEach((prop) => getNodeDetails(prop));
|
136
|
-
}
|
137
|
-
const resolutionSubNameIndex = isResolutionsField ? nameParts.findIndex((_, i) => !!bestRanges[nameParts.slice(nameParts.length - i).join('/')]) : -1;
|
138
|
-
const resolvedName = resolutionSubNameIndex > -1 ? nameParts.slice(nameParts.length - resolutionSubNameIndex).join('/') : name;
|
139
|
-
const bestRange = (0, version_harmonize_1.getBestRange)(range, bestRanges[resolvedName]?.range);
|
140
|
-
report(name, resolvedName, dep, range, bestRange);
|
141
|
-
};
|
142
|
-
getNodeDetails(dependencyNode);
|
143
|
-
});
|
140
|
+
getNodeDetails(dependencyNode);
|
144
141
|
});
|
145
|
-
}
|
142
|
+
});
|
146
143
|
}
|
147
144
|
}
|
148
145
|
};
|
146
|
+
return {
|
147
|
+
JSONExpressionStatement: rule
|
148
|
+
};
|
149
149
|
}
|
150
150
|
return {};
|
151
151
|
}
|
@@ -1,11 +1,11 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.getBestRanges = exports.getBestRange = exports.findWorkspacePackageJsons = void 0;
|
4
|
-
const semver = require("semver");
|
5
4
|
const fs = require("node:fs");
|
6
5
|
const node_fs_1 = require("node:fs");
|
7
6
|
const node_path_1 = require("node:path");
|
8
7
|
const globby_1 = require("globby");
|
8
|
+
const semver = require("semver");
|
9
9
|
/**
|
10
10
|
* Find the closest package.json file containing workspace definition in the parent directories
|
11
11
|
* @param directory Current directory to search for
|
package/src/rules/json/utils.js
CHANGED
@@ -15,7 +15,7 @@ function isJsoncParserServices(parserServices) {
|
|
15
15
|
* @param context Rule context
|
16
16
|
*/
|
17
17
|
function getJsoncParserServices(context) {
|
18
|
-
const parserService = context.parserServices;
|
18
|
+
const parserService = context.sourceCode.parserServices;
|
19
19
|
if (!isJsoncParserServices(parserService)) {
|
20
20
|
/*
|
21
21
|
* The user needs to have configured "parser" in their eslint config and set it
|
@@ -31,7 +31,7 @@ function getJsoncParserServices(context) {
|
|
31
31
|
* @param context
|
32
32
|
*/
|
33
33
|
function ensureJsoncParser(context) {
|
34
|
-
if (!(context.parserServices)) {
|
34
|
+
if (!(context.sourceCode.parserServices)) {
|
35
35
|
/*
|
36
36
|
* The user needs to have configured "parser" in their eslint config and set it
|
37
37
|
* to jsonc-eslint-parser
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/** Rule Name */
|
2
2
|
export declare const name = "no-inner-html";
|
3
3
|
type Messages = 'error' | 'fix';
|
4
|
-
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<Messages, [], import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
4
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<Messages, [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
5
5
|
export default _default;
|
@@ -1,19 +1,18 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.name = void 0;
|
4
|
-
const utils_1 = require("
|
5
|
-
const utils_2 = require("
|
4
|
+
const utils_1 = require("../../utils");
|
5
|
+
const utils_2 = require("../utils");
|
6
6
|
/** Rule Name */
|
7
7
|
exports.name = 'no-inner-html';
|
8
|
-
exports.default = (0,
|
8
|
+
exports.default = (0, utils_1.createRule)({
|
9
9
|
name: exports.name,
|
10
10
|
defaultOptions: [],
|
11
11
|
meta: {
|
12
12
|
type: 'problem',
|
13
13
|
hasSuggestions: true,
|
14
14
|
docs: {
|
15
|
-
description: 'Ensures that your template does not use innerHTML'
|
16
|
-
recommended: 'recommended'
|
15
|
+
description: 'Ensures that your template does not use innerHTML'
|
17
16
|
},
|
18
17
|
schema: [],
|
19
18
|
messages: {
|
@@ -24,34 +23,34 @@ exports.default = (0, utils_2.createRule)({
|
|
24
23
|
},
|
25
24
|
create: (context) => {
|
26
25
|
// To throw error if use without @angular-eslint/template-parser
|
27
|
-
(0,
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
column: innerHTMLAttribute.keySpan.end.col,
|
40
|
-
line: innerHTMLAttribute.keySpan.end.line
|
41
|
-
},
|
42
|
-
start: {
|
43
|
-
column: innerHTMLAttribute.keySpan.start.col,
|
44
|
-
line: innerHTMLAttribute.keySpan.start.line
|
45
|
-
}
|
26
|
+
(0, utils_2.getTemplateParserServices)(context);
|
27
|
+
const rule = (node) => {
|
28
|
+
const innerHTMLAttribute = node.attributes.find((a) => /innerhtml/i.test(a.name));
|
29
|
+
if (innerHTMLAttribute && innerHTMLAttribute.keySpan) {
|
30
|
+
context.report({
|
31
|
+
messageId: 'error',
|
32
|
+
loc: {
|
33
|
+
column: innerHTMLAttribute.keySpan.start.col,
|
34
|
+
line: innerHTMLAttribute.keySpan.start.line,
|
35
|
+
end: {
|
36
|
+
column: innerHTMLAttribute.keySpan.end.col,
|
37
|
+
line: innerHTMLAttribute.keySpan.end.line
|
46
38
|
},
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
39
|
+
start: {
|
40
|
+
column: innerHTMLAttribute.keySpan.start.col,
|
41
|
+
line: innerHTMLAttribute.keySpan.start.line
|
42
|
+
}
|
43
|
+
},
|
44
|
+
fix: (fixer) => fixer.replaceTextRange([innerHTMLAttribute.keySpan.start.offset, innerHTMLAttribute.keySpan.end.offset], 'innerText'),
|
45
|
+
suggest: [{
|
46
|
+
messageId: 'fix',
|
47
|
+
fix: (fixer) => fixer.replaceTextRange([innerHTMLAttribute.keySpan.start.offset, innerHTMLAttribute.keySpan.end.offset], 'innerText')
|
48
|
+
}]
|
49
|
+
});
|
54
50
|
}
|
55
51
|
};
|
52
|
+
return {
|
53
|
+
Element$1: rule
|
54
|
+
};
|
56
55
|
}
|
57
56
|
});
|
package/src/rules/template/template-async-number-limitation/template-async-number-limitation.d.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
interface
|
1
|
+
export interface TemplateAsyncNumberLimitationOptions {
|
2
2
|
maximumAsyncOnTag: number;
|
3
3
|
}
|
4
4
|
/** Rule Name */
|
5
5
|
export declare const name = "template-async-number-limitation";
|
6
|
-
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"tooManyAsyncOnTag", [
|
6
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"tooManyAsyncOnTag", [TemplateAsyncNumberLimitationOptions, ...any[]], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
7
7
|
export default _default;
|
package/src/rules/template/template-async-number-limitation/template-async-number-limitation.js
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.name = void 0;
|
4
|
-
const utils_1 = require("
|
5
|
-
const utils_2 = require("
|
4
|
+
const utils_1 = require("../../utils");
|
5
|
+
const utils_2 = require("../utils");
|
6
6
|
/** Rule Name */
|
7
7
|
exports.name = 'template-async-number-limitation';
|
8
8
|
const defaultOptions = [{
|
9
9
|
maximumAsyncOnTag: 5
|
10
10
|
}];
|
11
|
-
exports.default = (0,
|
11
|
+
exports.default = (0, utils_1.createRule)({
|
12
12
|
name: exports.name,
|
13
13
|
meta: {
|
14
14
|
type: 'problem',
|
@@ -35,29 +35,29 @@ exports.default = (0, utils_2.createRule)({
|
|
35
35
|
},
|
36
36
|
defaultOptions,
|
37
37
|
create: (context, [options]) => {
|
38
|
-
const parserServices = (0,
|
38
|
+
const parserServices = (0, utils_2.getTemplateParserServices)(context);
|
39
39
|
const asyncRegExp = /\| *async\b/g;
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
loc
|
58
|
-
});
|
59
|
-
}
|
40
|
+
const rule = ({ attributes, inputs, sourceSpan }) => {
|
41
|
+
const values = [
|
42
|
+
...attributes.map(({ value }) => value),
|
43
|
+
...inputs.map((attr) => attr.value.toString())
|
44
|
+
];
|
45
|
+
const asyncNumber = values
|
46
|
+
.reduce((acc, value) => acc + (value.match(asyncRegExp)?.length ?? 0), 0);
|
47
|
+
if (asyncNumber > options.maximumAsyncOnTag) {
|
48
|
+
const loc = parserServices.convertNodeSourceSpanToLoc(sourceSpan);
|
49
|
+
context.report({
|
50
|
+
messageId: 'tooManyAsyncOnTag',
|
51
|
+
data: {
|
52
|
+
asyncNumber,
|
53
|
+
maximumAsyncOnTag: options.maximumAsyncOnTag
|
54
|
+
},
|
55
|
+
loc
|
56
|
+
});
|
60
57
|
}
|
61
58
|
};
|
59
|
+
return {
|
60
|
+
Element$1: rule
|
61
|
+
};
|
62
62
|
}
|
63
63
|
});
|
@@ -8,15 +8,15 @@ exports.ensureTemplateParser = ensureTemplateParser;
|
|
8
8
|
* @param parserServices Parser services object
|
9
9
|
*/
|
10
10
|
function isTemplateParserServices(parserServices) {
|
11
|
-
return parserServices && (typeof parserServices.convertElementSourceSpanToLoc === 'function'
|
12
|
-
typeof parserServices.convertNodeSourceSpanToLoc === 'function');
|
11
|
+
return parserServices && (typeof parserServices.convertElementSourceSpanToLoc === 'function'
|
12
|
+
|| typeof parserServices.convertNodeSourceSpanToLoc === 'function');
|
13
13
|
}
|
14
14
|
/**
|
15
15
|
* Retrieve the template parser services object or throw if the invalid parser is used
|
16
16
|
* @param context Rule context
|
17
17
|
*/
|
18
18
|
function getTemplateParserServices(context) {
|
19
|
-
const parserService = context.parserServices;
|
19
|
+
const parserService = context.sourceCode.parserServices;
|
20
20
|
if (!isTemplateParserServices(parserService)) {
|
21
21
|
/*
|
22
22
|
* The user needs to have configured "parser" in their eslint config and set it
|
@@ -1,2 +1,2 @@
|
|
1
|
-
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"
|
1
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"error" | "suggestion", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
2
2
|
export default _default;
|
@@ -10,8 +10,8 @@ exports.default = (0, utils_2.createRule)({
|
|
10
10
|
fixable: 'code',
|
11
11
|
type: 'problem',
|
12
12
|
docs: {
|
13
|
-
|
14
|
-
|
13
|
+
description: 'Ensures that the configuration interface name matches the first parameter of `computeItemIdentifier`'
|
14
|
+
+ ' (or `computeConfigurationName`) used beside the configuration interface to expose its ID (as generated by the configuration module).'
|
15
15
|
},
|
16
16
|
schema: [],
|
17
17
|
messages: {
|
@@ -21,49 +21,49 @@ exports.default = (0, utils_2.createRule)({
|
|
21
21
|
},
|
22
22
|
defaultOptions: [],
|
23
23
|
create: (context) => {
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
&&
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
24
|
+
const rule = (node) => {
|
25
|
+
if (node.callee.type !== utils_1.TSESTree.AST_NODE_TYPES.Identifier
|
26
|
+
|| !nameDeterminingFunctionNames.includes(node.callee.name)
|
27
|
+
|| node.arguments.length === 0
|
28
|
+
|| node.arguments[0].type !== utils_1.TSESTree.AST_NODE_TYPES.Literal
|
29
|
+
|| typeof node.arguments[0].value !== 'string') {
|
30
|
+
return;
|
31
|
+
}
|
32
|
+
const { sourceCode } = context;
|
33
|
+
const interfaceNames = sourceCode.ast.body
|
34
|
+
.filter((statement) => statement.type === utils_1.TSESTree.AST_NODE_TYPES.ExportNamedDeclaration
|
35
|
+
&& statement.declaration?.type === utils_1.TSESTree.AST_NODE_TYPES.TSInterfaceDeclaration
|
36
|
+
&& (statement.declaration.extends || []).some((heritageClause) => heritageClause.expression.type === utils_1.TSESTree.AST_NODE_TYPES.Identifier
|
37
|
+
&& heritageClause.expression.name === 'Configuration'))
|
38
|
+
.map((statement) => statement.declaration.id.name);
|
39
|
+
const fnArgInterfaceName = node.arguments[0].value;
|
40
|
+
if (interfaceNames.length > 0 && !interfaceNames.includes(fnArgInterfaceName)) {
|
41
|
+
return context.report({
|
42
|
+
node: node.arguments[0],
|
43
|
+
loc: node.arguments[0].loc,
|
44
|
+
messageId: 'error',
|
45
|
+
data: {
|
46
|
+
currentValue: fnArgInterfaceName,
|
47
|
+
possibleValues: interfaceNames.join(', ')
|
48
|
+
},
|
49
|
+
fix: (fixer) => {
|
50
|
+
return fixer.replaceText(node.arguments[0], `'${interfaceNames[0]}'`);
|
51
|
+
},
|
52
|
+
suggest: interfaceNames.map((interfaceName) => ({
|
53
|
+
messageId: 'suggestion',
|
47
54
|
data: {
|
48
55
|
currentValue: fnArgInterfaceName,
|
49
|
-
|
56
|
+
recommendedValue: interfaceName
|
50
57
|
},
|
51
58
|
fix: (fixer) => {
|
52
|
-
return fixer.replaceText(node.arguments[0], `'${
|
53
|
-
}
|
54
|
-
|
55
|
-
|
56
|
-
data: {
|
57
|
-
currentValue: fnArgInterfaceName,
|
58
|
-
recommendedValue: interfaceName
|
59
|
-
},
|
60
|
-
fix: (fixer) => {
|
61
|
-
return fixer.replaceText(node.arguments[0], `'${interfaceName}'`);
|
62
|
-
}
|
63
|
-
}))
|
64
|
-
});
|
65
|
-
}
|
59
|
+
return fixer.replaceText(node.arguments[0], `'${interfaceName}'`);
|
60
|
+
}
|
61
|
+
}))
|
62
|
+
});
|
66
63
|
}
|
67
64
|
};
|
65
|
+
return {
|
66
|
+
CallExpression: rule
|
67
|
+
};
|
68
68
|
}
|
69
69
|
});
|