@angular-eslint/schematics 22.4.1-alpha.2 → 22.5.1-alpha.0
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 +27 -0
- package/dist/add-eslint-to-project/index.d.ts +2 -0
- package/dist/add-eslint-to-project/index.d.ts.map +1 -1
- package/dist/add-eslint-to-project/index.js +1 -1
- package/dist/add-eslint-to-project/schema.json +12 -1
- package/dist/application/index.d.ts +2 -0
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +2 -2
- package/dist/application/schema.json +12 -1
- package/dist/library/index.d.ts +2 -0
- package/dist/library/index.d.ts.map +1 -1
- package/dist/library/index.js +2 -2
- package/dist/library/schema.json +12 -1
- package/dist/ng-add/index.d.ts.map +1 -1
- package/dist/ng-add/index.js +16 -7
- package/dist/ng-add/schema.d.ts +10 -0
- package/dist/ng-add/schema.d.ts.map +1 -1
- package/dist/ng-add/schema.json +16 -0
- package/dist/utils.d.ts +19 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +90 -14
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -13,3 +13,30 @@ Skips installing npm packages when running `ng add @angular-eslint/schematics`.
|
|
|
13
13
|
```
|
|
14
14
|
ng add @angular-eslint/schematics --skip-install
|
|
15
15
|
```
|
|
16
|
+
|
|
17
|
+
### `--tseslint-preset`
|
|
18
|
+
|
|
19
|
+
Chooses which typescript-eslint shared config the generated `eslint.config.js` extends. Defaults to `recommended`.
|
|
20
|
+
|
|
21
|
+
Allowed values:
|
|
22
|
+
|
|
23
|
+
- `recommended` — `tseslint.configs.recommended` + `tseslint.configs.stylistic` (default)
|
|
24
|
+
- `strict` — `tseslint.configs.strict` + `tseslint.configs.stylistic`
|
|
25
|
+
- `recommendedTypeChecked` — `tseslint.configs.recommendedTypeChecked` + `tseslint.configs.stylisticTypeChecked`, and enables `parserOptions.projectService`
|
|
26
|
+
- `strictTypeChecked` — `tseslint.configs.strictTypeChecked` + `tseslint.configs.stylisticTypeChecked`, and enables `parserOptions.projectService`
|
|
27
|
+
|
|
28
|
+
Type-checked presets make linting more powerful but slower. See [RULES_REQUIRING_TYPE_INFORMATION.md](../../docs/RULES_REQUIRING_TYPE_INFORMATION.md). `strictTypeChecked` currently flags Angular CLI's generated `src/main.ts` bootstrap `.catch(...)` callback; that is expected from the preset.
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
ng add @angular-eslint/schematics --tseslint-preset=strictTypeChecked
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The same option is accepted by `add-eslint-to-project`, `application`, and `library`. It is applied when the root ESLint config is created.
|
|
35
|
+
|
|
36
|
+
### `--set-parser-options-project`
|
|
37
|
+
|
|
38
|
+
Enables `parserOptions.projectService` in the generated ESLint config so that rules requiring type information can run, without changing the typescript-eslint preset. Type-checked `tseslintPreset` values imply this option.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
ng add @angular-eslint/schematics --set-parser-options-project
|
|
42
|
+
```
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Rule } from '@angular-devkit/schematics';
|
|
2
|
+
import { type TseslintPreset } from '../utils';
|
|
2
3
|
interface Schema {
|
|
3
4
|
project?: string;
|
|
4
5
|
setParserOptionsProject?: boolean;
|
|
6
|
+
tseslintPreset?: TseslintPreset;
|
|
5
7
|
}
|
|
6
8
|
export default function addESLintToProject(schema: Schema): Rule;
|
|
7
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add-eslint-to-project/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add-eslint-to-project/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAElB,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAwB/D"}
|
|
@@ -16,7 +16,7 @@ E.g. npx ng g @angular-eslint/schematics:add-eslint-to-project {{YOUR_PROJECT_NA
|
|
|
16
16
|
}
|
|
17
17
|
return (0, schematics_1.chain)([
|
|
18
18
|
// Create the ESLint config file for the project
|
|
19
|
-
(0, utils_1.createESLintConfigForProject)(projectName, schema.setParserOptionsProject ?? false),
|
|
19
|
+
(0, utils_1.createESLintConfigForProject)(projectName, schema.setParserOptionsProject ?? false, (0, utils_1.resolveTseslintPreset)(schema.tseslintPreset)),
|
|
20
20
|
// Set the lint builder and config in angular.json
|
|
21
21
|
(0, utils_1.addESLintTargetToProject)(projectName, 'lint'),
|
|
22
22
|
]);
|
|
@@ -14,8 +14,19 @@
|
|
|
14
14
|
},
|
|
15
15
|
"setParserOptionsProject": {
|
|
16
16
|
"type": "boolean",
|
|
17
|
-
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons.",
|
|
17
|
+
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons. Implied when tseslintPreset is a type-checked preset.",
|
|
18
18
|
"default": false
|
|
19
|
+
},
|
|
20
|
+
"tseslintPreset": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"enum": [
|
|
23
|
+
"recommended",
|
|
24
|
+
"strict",
|
|
25
|
+
"recommendedTypeChecked",
|
|
26
|
+
"strictTypeChecked"
|
|
27
|
+
],
|
|
28
|
+
"default": "recommended",
|
|
29
|
+
"description": "Which typescript-eslint shared config preset to extend in the generated ESLint config. Type-checked presets also enable parserOptions.projectService (required for those rules, but slower). See https://typescript-eslint.io/users/configs/"
|
|
19
30
|
}
|
|
20
31
|
},
|
|
21
32
|
"required": []
|
|
@@ -5,8 +5,10 @@ import type { Rule } from '@angular-devkit/schematics';
|
|
|
5
5
|
* they stay in sync.
|
|
6
6
|
*/
|
|
7
7
|
import type { Schema as AngularSchema } from '@schematics/angular/application/schema';
|
|
8
|
+
import { type TseslintPreset } from '../utils';
|
|
8
9
|
interface Schema extends AngularSchema {
|
|
9
10
|
setParserOptionsProject?: boolean;
|
|
11
|
+
tseslintPreset?: TseslintPreset;
|
|
10
12
|
}
|
|
11
13
|
export default function (options: Schema): Rule;
|
|
12
14
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,4BAA4B,CAAC;AAE/E;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,4BAA4B,CAAC;AAE/E;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAElB,UAAU,MAAO,SAAQ,aAAa;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAeD,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,MAAM,GAAG,IAAI,CAY9C"}
|
|
@@ -6,7 +6,7 @@ const utils_1 = require("../utils");
|
|
|
6
6
|
function eslintRelatedChanges(options) {
|
|
7
7
|
return (0, schematics_1.chain)([
|
|
8
8
|
// Create the ESLint config file for the project
|
|
9
|
-
(0, utils_1.createESLintConfigForProject)(options.name, options.setParserOptionsProject ?? false),
|
|
9
|
+
(0, utils_1.createESLintConfigForProject)(options.name, options.setParserOptionsProject ?? false, (0, utils_1.resolveTseslintPreset)(options.tseslintPreset)),
|
|
10
10
|
// Update the lint builder and config in angular.json
|
|
11
11
|
(0, utils_1.addESLintTargetToProject)(options.name, 'lint'),
|
|
12
12
|
]);
|
|
@@ -15,7 +15,7 @@ function default_1(options) {
|
|
|
15
15
|
return (host, context) => {
|
|
16
16
|
// Remove angular-eslint specific options before passing to the Angular schematic
|
|
17
17
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
-
const { setParserOptionsProject, ...angularOptions } = options;
|
|
18
|
+
const { setParserOptionsProject, tseslintPreset, ...angularOptions } = options;
|
|
19
19
|
return (0, schematics_1.chain)([
|
|
20
20
|
(0, schematics_1.externalSchematic)('@schematics/angular', 'application', angularOptions),
|
|
21
21
|
eslintRelatedChanges(options),
|
|
@@ -141,8 +141,19 @@
|
|
|
141
141
|
},
|
|
142
142
|
"setParserOptionsProject": {
|
|
143
143
|
"type": "boolean",
|
|
144
|
-
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons.",
|
|
144
|
+
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons. Implied when tseslintPreset is a type-checked preset.",
|
|
145
145
|
"default": false
|
|
146
|
+
},
|
|
147
|
+
"tseslintPreset": {
|
|
148
|
+
"type": "string",
|
|
149
|
+
"enum": [
|
|
150
|
+
"recommended",
|
|
151
|
+
"strict",
|
|
152
|
+
"recommendedTypeChecked",
|
|
153
|
+
"strictTypeChecked"
|
|
154
|
+
],
|
|
155
|
+
"default": "recommended",
|
|
156
|
+
"description": "Which typescript-eslint shared config preset to extend in the generated ESLint config. Type-checked presets also enable parserOptions.projectService (required for those rules, but slower). See https://typescript-eslint.io/users/configs/"
|
|
146
157
|
}
|
|
147
158
|
},
|
|
148
159
|
"required": ["name"]
|
package/dist/library/index.d.ts
CHANGED
|
@@ -5,8 +5,10 @@ import type { Rule } from '@angular-devkit/schematics';
|
|
|
5
5
|
* they stay in sync.
|
|
6
6
|
*/
|
|
7
7
|
import type { Schema as AngularSchema } from '@schematics/angular/library/schema';
|
|
8
|
+
import { type TseslintPreset } from '../utils';
|
|
8
9
|
interface Schema extends AngularSchema {
|
|
9
10
|
setParserOptionsProject?: boolean;
|
|
11
|
+
tseslintPreset?: TseslintPreset;
|
|
10
12
|
}
|
|
11
13
|
export default function (options: Schema): Rule;
|
|
12
14
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/library/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,4BAA4B,CAAC;AAE/E;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/library/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,4BAA4B,CAAC;AAE/E;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAElB,UAAU,MAAO,SAAQ,aAAa;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAeD,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,MAAM,GAAG,IAAI,CAY9C"}
|
package/dist/library/index.js
CHANGED
|
@@ -6,7 +6,7 @@ const utils_1 = require("../utils");
|
|
|
6
6
|
function eslintRelatedChanges(options) {
|
|
7
7
|
return (0, schematics_1.chain)([
|
|
8
8
|
// Create the ESLint config file for the project
|
|
9
|
-
(0, utils_1.createESLintConfigForProject)(options.name, options.setParserOptionsProject ?? false),
|
|
9
|
+
(0, utils_1.createESLintConfigForProject)(options.name, options.setParserOptionsProject ?? false, (0, utils_1.resolveTseslintPreset)(options.tseslintPreset)),
|
|
10
10
|
// Update the lint builder and config in angular.json
|
|
11
11
|
(0, utils_1.addESLintTargetToProject)(options.name, 'lint'),
|
|
12
12
|
]);
|
|
@@ -15,7 +15,7 @@ function default_1(options) {
|
|
|
15
15
|
return (host, context) => {
|
|
16
16
|
// Remove angular-eslint specific options before passing to the Angular schematic
|
|
17
17
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
-
const { setParserOptionsProject, ...angularOptions } = options;
|
|
18
|
+
const { setParserOptionsProject, tseslintPreset, ...angularOptions } = options;
|
|
19
19
|
return (0, schematics_1.chain)([
|
|
20
20
|
(0, schematics_1.externalSchematic)('@schematics/angular', 'library', angularOptions),
|
|
21
21
|
eslintRelatedChanges(options),
|
package/dist/library/schema.json
CHANGED
|
@@ -62,8 +62,19 @@
|
|
|
62
62
|
},
|
|
63
63
|
"setParserOptionsProject": {
|
|
64
64
|
"type": "boolean",
|
|
65
|
-
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons.",
|
|
65
|
+
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons. Implied when tseslintPreset is a type-checked preset.",
|
|
66
66
|
"default": false
|
|
67
|
+
},
|
|
68
|
+
"tseslintPreset": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"enum": [
|
|
71
|
+
"recommended",
|
|
72
|
+
"strict",
|
|
73
|
+
"recommendedTypeChecked",
|
|
74
|
+
"strictTypeChecked"
|
|
75
|
+
],
|
|
76
|
+
"default": "recommended",
|
|
77
|
+
"description": "Which typescript-eslint shared config preset to extend in the generated ESLint config. Type-checked presets also enable parserOptions.projectService (required for those rules, but slower). See https://typescript-eslint.io/users/configs/"
|
|
67
78
|
}
|
|
68
79
|
},
|
|
69
80
|
"required": ["name"]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ng-add/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,4BAA4B,CAAC;AAO/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ng-add/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA0B,MAAM,4BAA4B,CAAC;AAO/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAyOvC;;;;GAIG;AACH,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,MAAM,GAAG,IAAI,CAc9C"}
|
package/dist/ng-add/index.js
CHANGED
|
@@ -80,8 +80,10 @@ function applyDevDependenciesForFlatConfig(json) {
|
|
|
80
80
|
delete json.devDependencies['@typescript-eslint/eslint-plugin'];
|
|
81
81
|
delete json.devDependencies['@typescript-eslint/utils'];
|
|
82
82
|
}
|
|
83
|
-
function applyESLintConfigIfSingleProjectWithNoExistingTSLint() {
|
|
83
|
+
function applyESLintConfigIfSingleProjectWithNoExistingTSLint(options) {
|
|
84
84
|
return (host, context) => {
|
|
85
|
+
const tseslintPreset = (0, utils_1.resolveTseslintPreset)(options.tseslintPreset);
|
|
86
|
+
const setParserOptionsProject = (0, utils_1.shouldEnableProjectService)(options.setParserOptionsProject ?? false, tseslintPreset);
|
|
85
87
|
const angularJson = (0, utils_1.readJsonInTree)(host, 'angular.json');
|
|
86
88
|
if (!angularJson || !angularJson.projects) {
|
|
87
89
|
return;
|
|
@@ -96,13 +98,17 @@ function applyESLintConfigIfSingleProjectWithNoExistingTSLint() {
|
|
|
96
98
|
*/
|
|
97
99
|
const projectNames = Object.keys(angularJson.projects);
|
|
98
100
|
if (projectNames.length === 0) {
|
|
101
|
+
(0, utils_1.warnIfTypeCheckedPreset)(context, tseslintPreset);
|
|
99
102
|
return (0, schematics_1.chain)([
|
|
100
|
-
(
|
|
103
|
+
(tree) => {
|
|
101
104
|
// If the root package.json uses type: module, generate ESM content
|
|
102
|
-
const packageJson = (0, utils_1.readJsonInTree)(
|
|
105
|
+
const packageJson = (0, utils_1.readJsonInTree)(tree, 'package.json');
|
|
103
106
|
const isESM = packageJson.type === 'module';
|
|
104
|
-
|
|
105
|
-
|
|
107
|
+
tree.create('eslint.config.js', (0, utils_1.createStringifiedRootESLintConfig)(null, isESM, {
|
|
108
|
+
tseslintPreset,
|
|
109
|
+
setParserOptionsProject,
|
|
110
|
+
}));
|
|
111
|
+
return tree;
|
|
106
112
|
},
|
|
107
113
|
(0, utils_1.updateJsonInTree)('angular.json', (json) => (0, utils_1.updateSchematicCollections)(json, 'angular-eslint')),
|
|
108
114
|
]);
|
|
@@ -131,7 +137,10 @@ We detected that you have a single project in your workspace and no existing lin
|
|
|
131
137
|
Please see https://github.com/angular-eslint/angular-eslint for more information.
|
|
132
138
|
`.trimStart());
|
|
133
139
|
return (0, schematics_1.chain)([
|
|
134
|
-
(0, schematics_1.schematic)('add-eslint-to-project', {
|
|
140
|
+
(0, schematics_1.schematic)('add-eslint-to-project', {
|
|
141
|
+
tseslintPreset,
|
|
142
|
+
setParserOptionsProject,
|
|
143
|
+
}),
|
|
135
144
|
(0, utils_1.updateJsonInTree)('angular.json', (json) => (0, utils_1.updateSchematicCollections)(json, 'angular-eslint')),
|
|
136
145
|
]);
|
|
137
146
|
};
|
|
@@ -171,7 +180,7 @@ function default_1(options) {
|
|
|
171
180
|
assertAngularVersionCompatibility(json, context);
|
|
172
181
|
return (0, schematics_1.chain)([
|
|
173
182
|
addAngularESLintPackages(json, options),
|
|
174
|
-
applyESLintConfigIfSingleProjectWithNoExistingTSLint(),
|
|
183
|
+
applyESLintConfigIfSingleProjectWithNoExistingTSLint(options),
|
|
175
184
|
])(host, context);
|
|
176
185
|
};
|
|
177
186
|
}
|
package/dist/ng-add/schema.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TseslintPreset } from '../utils';
|
|
1
2
|
/**
|
|
2
3
|
* Options available to the ng-add schematic.
|
|
3
4
|
*/
|
|
@@ -6,5 +7,14 @@ export interface Schema {
|
|
|
6
7
|
* Skip installing dependencies after modifying package.json.
|
|
7
8
|
*/
|
|
8
9
|
skipInstall?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Enable rules that require type information by configuring
|
|
12
|
+
* `parserOptions.projectService`. Implied by type-checked tseslintPreset values.
|
|
13
|
+
*/
|
|
14
|
+
setParserOptionsProject?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* typescript-eslint shared config preset to extend in the generated ESLint config.
|
|
17
|
+
*/
|
|
18
|
+
tseslintPreset?: TseslintPreset;
|
|
9
19
|
}
|
|
10
20
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/ng-add/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/ng-add/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC"}
|
package/dist/ng-add/schema.json
CHANGED
|
@@ -9,6 +9,22 @@
|
|
|
9
9
|
"description": "Skip package installation after adding dependencies",
|
|
10
10
|
"default": false,
|
|
11
11
|
"alias": "skip-install"
|
|
12
|
+
},
|
|
13
|
+
"setParserOptionsProject": {
|
|
14
|
+
"type": "boolean",
|
|
15
|
+
"description": "Whether or not to enable rules that require type information by configuring the ESLint `parserOptions.projectService` option. We do not do this by default for lint performance reasons. Implied when tseslintPreset is a type-checked preset.",
|
|
16
|
+
"default": false
|
|
17
|
+
},
|
|
18
|
+
"tseslintPreset": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"enum": [
|
|
21
|
+
"recommended",
|
|
22
|
+
"strict",
|
|
23
|
+
"recommendedTypeChecked",
|
|
24
|
+
"strictTypeChecked"
|
|
25
|
+
],
|
|
26
|
+
"default": "recommended",
|
|
27
|
+
"description": "Which typescript-eslint shared config preset to extend in the generated ESLint config. Type-checked presets also enable parserOptions.projectService (required for those rules, but slower). See https://typescript-eslint.io/users/configs/"
|
|
12
28
|
}
|
|
13
29
|
},
|
|
14
30
|
"required": []
|
package/dist/utils.d.ts
CHANGED
|
@@ -38,8 +38,25 @@ export declare function addESLintTargetToProject(projectName: string, targetName
|
|
|
38
38
|
* Utility to act on all files in a tree that are not ignored by git.
|
|
39
39
|
*/
|
|
40
40
|
export declare function visitNotIgnoredFiles(visitor: (file: Path, host: Tree, context: SchematicContext) => void | Rule, dir?: Path): Rule;
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
/**
|
|
42
|
+
* typescript-eslint shared config presets that the schematics can scaffold.
|
|
43
|
+
*
|
|
44
|
+
* Type-checked variants also enable `parserOptions.projectService` in the
|
|
45
|
+
* generated root config, which is required for those rules to run.
|
|
46
|
+
*/
|
|
47
|
+
export declare const TS_ESLINT_PRESETS: readonly ["recommended", "strict", "recommendedTypeChecked", "strictTypeChecked"];
|
|
48
|
+
export type TseslintPreset = (typeof TS_ESLINT_PRESETS)[number];
|
|
49
|
+
export declare const DEFAULT_TS_ESLINT_PRESET: TseslintPreset;
|
|
50
|
+
export interface CreateRootESLintConfigOptions {
|
|
51
|
+
tseslintPreset?: TseslintPreset;
|
|
52
|
+
setParserOptionsProject?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export declare function isTypeCheckedTseslintPreset(preset: TseslintPreset): boolean;
|
|
55
|
+
export declare function resolveTseslintPreset(value: string | undefined): TseslintPreset;
|
|
56
|
+
export declare function shouldEnableProjectService(setParserOptionsProject: boolean, tseslintPreset?: TseslintPreset): boolean;
|
|
57
|
+
export declare function warnIfTypeCheckedPreset(context: SchematicContext, tseslintPreset: TseslintPreset): void;
|
|
58
|
+
export declare function createStringifiedRootESLintConfig(prefix: string | null, isESM: boolean, options?: CreateRootESLintConfigOptions): string;
|
|
59
|
+
export declare function createESLintConfigForProject(projectName: string, setParserOptionsProject: boolean, tseslintPreset?: TseslintPreset): Rule;
|
|
43
60
|
export declare function sortObjectByKeys(obj: Record<string, unknown>): Record<string, unknown>;
|
|
44
61
|
/**
|
|
45
62
|
* To make certain schematic usage conversion more ergonomic, if the user does not specify a project
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAQ/E;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,UAOlC,CAAC;AAEF;;;;;GAKG;AAEH,wBAAgB,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAenE;AAED;;;;;GAKG;AAEH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAC7C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,KAAK,CAAC,GAClD,IAAI,CAYN;AAED,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE3E,wBAAgB,2BAA2B,CACzC,aAAa,EAAE;IAAE,SAAS,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,OAAO,CAAC,EAAE,aAAa,CAAA;CAAE,GACzE,aAAa,GAAG,IAAI,CAYtB;AA6BD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,GAAG,MAAM,GAC5B,IAAI,CA4DN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,EAC3E,GAAG,GAAE,IAAoB,GACxB,IAAI,CA8BN;AAID,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -3,12 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.defaultFlatConfigNames = void 0;
|
|
6
|
+
exports.DEFAULT_TS_ESLINT_PRESET = exports.TS_ESLINT_PRESETS = exports.defaultFlatConfigNames = void 0;
|
|
7
7
|
exports.readJsonInTree = readJsonInTree;
|
|
8
8
|
exports.updateJsonInTree = updateJsonInTree;
|
|
9
9
|
exports.getTargetsConfigFromProject = getTargetsConfigFromProject;
|
|
10
10
|
exports.addESLintTargetToProject = addESLintTargetToProject;
|
|
11
11
|
exports.visitNotIgnoredFiles = visitNotIgnoredFiles;
|
|
12
|
+
exports.isTypeCheckedTseslintPreset = isTypeCheckedTseslintPreset;
|
|
13
|
+
exports.resolveTseslintPreset = resolveTseslintPreset;
|
|
14
|
+
exports.shouldEnableProjectService = shouldEnableProjectService;
|
|
15
|
+
exports.warnIfTypeCheckedPreset = warnIfTypeCheckedPreset;
|
|
12
16
|
exports.createStringifiedRootESLintConfig = createStringifiedRootESLintConfig;
|
|
13
17
|
exports.createESLintConfigForProject = createESLintConfigForProject;
|
|
14
18
|
exports.sortObjectByKeys = sortObjectByKeys;
|
|
@@ -177,7 +181,73 @@ function visitNotIgnoredFiles(visitor, dir = (0, core_1.normalize)('')) {
|
|
|
177
181
|
visit(dir);
|
|
178
182
|
};
|
|
179
183
|
}
|
|
180
|
-
|
|
184
|
+
/**
|
|
185
|
+
* typescript-eslint shared config presets that the schematics can scaffold.
|
|
186
|
+
*
|
|
187
|
+
* Type-checked variants also enable `parserOptions.projectService` in the
|
|
188
|
+
* generated root config, which is required for those rules to run.
|
|
189
|
+
*/
|
|
190
|
+
exports.TS_ESLINT_PRESETS = [
|
|
191
|
+
'recommended',
|
|
192
|
+
'strict',
|
|
193
|
+
'recommendedTypeChecked',
|
|
194
|
+
'strictTypeChecked',
|
|
195
|
+
];
|
|
196
|
+
exports.DEFAULT_TS_ESLINT_PRESET = 'recommended';
|
|
197
|
+
function isTypeCheckedTseslintPreset(preset) {
|
|
198
|
+
return preset === 'recommendedTypeChecked' || preset === 'strictTypeChecked';
|
|
199
|
+
}
|
|
200
|
+
function resolveTseslintPreset(value) {
|
|
201
|
+
if (value && exports.TS_ESLINT_PRESETS.includes(value)) {
|
|
202
|
+
return value;
|
|
203
|
+
}
|
|
204
|
+
return exports.DEFAULT_TS_ESLINT_PRESET;
|
|
205
|
+
}
|
|
206
|
+
function shouldEnableProjectService(setParserOptionsProject, tseslintPreset = exports.DEFAULT_TS_ESLINT_PRESET) {
|
|
207
|
+
return setParserOptionsProject || isTypeCheckedTseslintPreset(tseslintPreset);
|
|
208
|
+
}
|
|
209
|
+
function warnIfTypeCheckedPreset(context, tseslintPreset) {
|
|
210
|
+
if (!isTypeCheckedTseslintPreset(tseslintPreset)) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
context.logger.warn(`Typed linting is enabled because tseslintPreset="${tseslintPreset}". This makes ESLint more powerful but slower than the default recommended preset. See https://github.com/angular-eslint/angular-eslint/blob/main/docs/RULES_REQUIRING_TYPE_INFORMATION.md`);
|
|
214
|
+
}
|
|
215
|
+
function getTsEslintExtendsSnippet(preset) {
|
|
216
|
+
switch (preset) {
|
|
217
|
+
case 'strict':
|
|
218
|
+
return `tseslint.configs.strict,
|
|
219
|
+
tseslint.configs.stylistic,`;
|
|
220
|
+
case 'recommendedTypeChecked':
|
|
221
|
+
return `tseslint.configs.recommendedTypeChecked,
|
|
222
|
+
tseslint.configs.stylisticTypeChecked,`;
|
|
223
|
+
case 'strictTypeChecked':
|
|
224
|
+
return `tseslint.configs.strictTypeChecked,
|
|
225
|
+
tseslint.configs.stylisticTypeChecked,`;
|
|
226
|
+
case 'recommended':
|
|
227
|
+
default:
|
|
228
|
+
return `tseslint.configs.recommended,
|
|
229
|
+
tseslint.configs.stylistic,`;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function getProjectServiceBlock(enabled, includeTypeCheckedComment) {
|
|
233
|
+
if (!enabled) {
|
|
234
|
+
return '';
|
|
235
|
+
}
|
|
236
|
+
const comment = includeTypeCheckedComment
|
|
237
|
+
? `
|
|
238
|
+
// Enable typed linting via the typescript-eslint Project Service.
|
|
239
|
+
// This is slower than untyped linting; see https://typescript-eslint.io/getting-started/typed-linting`
|
|
240
|
+
: '';
|
|
241
|
+
return `${comment}
|
|
242
|
+
languageOptions: {
|
|
243
|
+
parserOptions: {
|
|
244
|
+
projectService: true,
|
|
245
|
+
},
|
|
246
|
+
},`;
|
|
247
|
+
}
|
|
248
|
+
function createStringifiedRootESLintConfig(prefix, isESM, options = {}) {
|
|
249
|
+
const tseslintPreset = resolveTseslintPreset(options.tseslintPreset);
|
|
250
|
+
const includeProjectService = shouldEnableProjectService(options.setParserOptionsProject ?? false, tseslintPreset);
|
|
181
251
|
return `// @ts-check
|
|
182
252
|
${isESM ? 'import eslint from "@eslint/js";' : 'const eslint = require("@eslint/js");'}
|
|
183
253
|
${isESM ? 'import { defineConfig } from "eslint/config";' : 'const { defineConfig } = require("eslint/config");'}
|
|
@@ -186,11 +256,10 @@ ${isESM ? 'import angular from "angular-eslint";' : 'const angular = require("an
|
|
|
186
256
|
|
|
187
257
|
${isESM ? 'export default' : 'module.exports ='} defineConfig([
|
|
188
258
|
{
|
|
189
|
-
files: ["**/*.ts"],
|
|
259
|
+
files: ["**/*.ts"],${getProjectServiceBlock(includeProjectService, isTypeCheckedTseslintPreset(tseslintPreset))}
|
|
190
260
|
extends: [
|
|
191
261
|
eslint.configs.recommended,
|
|
192
|
-
|
|
193
|
-
tseslint.configs.stylistic,
|
|
262
|
+
${getTsEslintExtendsSnippet(tseslintPreset)}
|
|
194
263
|
angular.configs.tsRecommended,
|
|
195
264
|
],
|
|
196
265
|
processor: angular.processInlineTemplates,
|
|
@@ -269,37 +338,44 @@ ${isESM ? 'export default' : 'module.exports ='} defineConfig([
|
|
|
269
338
|
]);
|
|
270
339
|
`;
|
|
271
340
|
}
|
|
272
|
-
function createESLintConfigForProject(projectName, setParserOptionsProject) {
|
|
273
|
-
return (tree) => {
|
|
341
|
+
function createESLintConfigForProject(projectName, setParserOptionsProject, tseslintPreset = exports.DEFAULT_TS_ESLINT_PRESET) {
|
|
342
|
+
return (tree, context) => {
|
|
343
|
+
const resolvedPreset = resolveTseslintPreset(tseslintPreset);
|
|
344
|
+
const enableProjectService = shouldEnableProjectService(setParserOptionsProject, resolvedPreset);
|
|
345
|
+
warnIfTypeCheckedPreset(context, resolvedPreset);
|
|
274
346
|
const angularJSON = readJsonInTree(tree, 'angular.json');
|
|
275
347
|
const { root: projectRoot, projectType, prefix, } = angularJSON.projects[projectName];
|
|
276
348
|
const alreadyHasRootFlatConfig = exports.defaultFlatConfigNames.some((name) => tree.exists(name));
|
|
349
|
+
const rootConfigOptions = {
|
|
350
|
+
tseslintPreset: resolvedPreset,
|
|
351
|
+
setParserOptionsProject: enableProjectService,
|
|
352
|
+
};
|
|
277
353
|
/**
|
|
278
354
|
* If the root is an empty string it must be the initial project created at the
|
|
279
355
|
* root by the Angular CLI's workspace schematic
|
|
280
356
|
*/
|
|
281
357
|
if (projectRoot === '') {
|
|
282
|
-
return createRootESLintConfigFile(prefix || DEFAULT_PREFIX);
|
|
358
|
+
return createRootESLintConfigFile(prefix || DEFAULT_PREFIX, rootConfigOptions);
|
|
283
359
|
}
|
|
284
360
|
const rules = [];
|
|
285
361
|
// If, for whatever reason, the root eslint.config.* doesn't exist yet, create it
|
|
286
362
|
if (!alreadyHasRootFlatConfig) {
|
|
287
|
-
rules.push(createRootESLintConfigFile(prefix || DEFAULT_PREFIX));
|
|
363
|
+
rules.push(createRootESLintConfigFile(prefix || DEFAULT_PREFIX, rootConfigOptions));
|
|
288
364
|
}
|
|
289
365
|
const rootConfigPath = resolveRootESLintConfigPath(tree) ?? 'eslint.config.js';
|
|
290
|
-
rules.push((
|
|
291
|
-
const { isESM, ext } = determineNewProjectESLintConfigContentAndExtension(
|
|
292
|
-
return
|
|
366
|
+
rules.push((host) => {
|
|
367
|
+
const { isESM, ext } = determineNewProjectESLintConfigContentAndExtension(host, rootConfigPath, projectRoot);
|
|
368
|
+
return host.create((0, core_1.join)((0, core_1.normalize)(projectRoot), `eslint.config.${ext}`), createStringifiedProjectESLintConfig(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, enableProjectService, isESM, rootConfigPath));
|
|
293
369
|
});
|
|
294
370
|
return (0, schematics_1.chain)(rules);
|
|
295
371
|
};
|
|
296
372
|
}
|
|
297
|
-
function createRootESLintConfigFile(prefix) {
|
|
373
|
+
function createRootESLintConfigFile(prefix, options = {}) {
|
|
298
374
|
return (tree) => {
|
|
299
375
|
// If the root package.json uses type: module, generate ESM content
|
|
300
376
|
const packageJson = readJsonInTree(tree, 'package.json');
|
|
301
377
|
const isESM = packageJson.type === 'module';
|
|
302
|
-
return tree.create('eslint.config.js', createStringifiedRootESLintConfig(prefix, isESM));
|
|
378
|
+
return tree.create('eslint.config.js', createStringifiedRootESLintConfig(prefix, isESM, options));
|
|
303
379
|
};
|
|
304
380
|
}
|
|
305
381
|
function sortObjectByKeys(obj) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular-eslint/schematics",
|
|
3
|
-
"version": "22.
|
|
3
|
+
"version": "22.5.1-alpha.0",
|
|
4
4
|
"description": "Angular Schematics for angular-eslint",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@angular-devkit/core": ">= 22.0.0 < 23.0.0",
|
|
41
41
|
"@angular-devkit/schematics": ">= 22.0.0 < 23.0.0",
|
|
42
|
-
"@angular-eslint/eslint-plugin": "22.
|
|
43
|
-
"@angular-eslint/eslint-plugin-template": "22.
|
|
42
|
+
"@angular-eslint/eslint-plugin": "22.5.1-alpha.0",
|
|
43
|
+
"@angular-eslint/eslint-plugin-template": "22.5.1-alpha.0",
|
|
44
44
|
"ignore": "7.0.8",
|
|
45
45
|
"semver": "7.8.5",
|
|
46
46
|
"strip-json-comments": "3.1.1"
|