@angular-eslint/schematics 18.0.0-alpha.5 → 18.0.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 +4 -0
- package/dist/add-eslint-to-project/index.d.ts.map +1 -1
- package/dist/add-eslint-to-project/index.js +6 -5
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +6 -6
- package/dist/devkit-imports.d.ts +11 -0
- package/dist/devkit-imports.d.ts.map +1 -0
- package/dist/devkit-imports.js +21 -0
- package/dist/library/index.d.ts.map +1 -1
- package/dist/library/index.js +6 -6
- package/dist/ng-add/index.d.ts +2 -0
- package/dist/ng-add/index.d.ts.map +1 -1
- package/dist/ng-add/index.js +63 -49
- package/dist/utils.d.ts +12 -17
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +163 -151
- package/package.json +11 -9
package/README.md
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
1
|
# @angular-eslint/schematics
|
|
2
|
+
|
|
3
|
+
Please see https://github.com/angular-eslint/angular-eslint for full usage instructions and guidance.
|
|
4
|
+
|
|
5
|
+
The `@angular-eslint/schematics` package is a set of custom Angular CLI Schematics which are used to add and update dependencies and configuration files which are relevant for running ESLint on an Angular workspace.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add-eslint-to-project/index.ts"],"names":[],"mappings":"AAQA,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;;AAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add-eslint-to-project/index.ts"],"names":[],"mappings":"AAQA,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;;AAED,wBAsBG"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const devkit_imports_1 = require("../devkit-imports");
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
|
-
exports.default = (0,
|
|
6
|
-
const projectName = (0, utils_1.
|
|
5
|
+
exports.default = (0, devkit_imports_1.convertNxGenerator)(async (tree, options) => {
|
|
6
|
+
const projectName = (0, utils_1.determineTargetProjectName)(tree, options.project);
|
|
7
7
|
if (!projectName) {
|
|
8
8
|
throw new Error('\n' +
|
|
9
9
|
`
|
|
@@ -12,7 +12,8 @@ Error: You must specify a project to add ESLint to because you have multiple pro
|
|
|
12
12
|
E.g. npx ng g @angular-eslint/schematics:add-eslint-to-project {{YOUR_PROJECT_NAME_GOES_HERE}}
|
|
13
13
|
`.trim());
|
|
14
14
|
}
|
|
15
|
+
// Create the config file first so that we can check for its existence when setting the target
|
|
16
|
+
(0, utils_1.createESLintConfigForProject)(tree, projectName, options.setParserOptionsProject ?? false);
|
|
15
17
|
// Update the lint builder and config in angular.json
|
|
16
|
-
(0, utils_1.
|
|
17
|
-
(0, utils_1.createESLintConfigForProject__NX)(tree, projectName, options.setParserOptionsProject ?? false);
|
|
18
|
+
(0, utils_1.addESLintTargetToProject)(tree, projectName, 'lint');
|
|
18
19
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAWtF,UAAU,MAAO,SAAQ,aAAa;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;;AAED,wBAqBG"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
const ngcli_adapter_1 = require("@nx/devkit/ngcli-adapter");
|
|
3
|
+
const devkit_imports_1 = require("../devkit-imports");
|
|
5
4
|
const utils_1 = require("../utils");
|
|
6
|
-
exports.default = (0,
|
|
5
|
+
exports.default = (0, devkit_imports_1.convertNxGenerator)(async (tree, options) => {
|
|
7
6
|
// Remove angular-eslint specific options before passing to the Angular schematic
|
|
8
7
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
9
8
|
const { setParserOptionsProject, ...angularOptions } = options;
|
|
10
|
-
const applicationGenerator = (0,
|
|
9
|
+
const applicationGenerator = (0, devkit_imports_1.wrapAngularDevkitSchematic)('@schematics/angular', 'application');
|
|
11
10
|
await applicationGenerator(tree, angularOptions);
|
|
11
|
+
// Create the config file first so that we can check for its existence when setting the target
|
|
12
|
+
(0, utils_1.createESLintConfigForProject)(tree, options.name, options.setParserOptionsProject ?? false);
|
|
12
13
|
// Update the lint builder and config in angular.json
|
|
13
|
-
(0, utils_1.
|
|
14
|
-
(0, utils_1.createESLintConfigForProject__NX)(tree, options.name, options.setParserOptionsProject ?? false);
|
|
14
|
+
(0, utils_1.addESLintTargetToProject)(tree, options.name, 'lint');
|
|
15
15
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In order to prevent the project graph cache from showing up at the root of the user's
|
|
3
|
+
* workspace, we set a custom cache directory before importing anything from `@nx/devkit`.
|
|
4
|
+
*
|
|
5
|
+
* `no-restricted-imports` eslint rule has been configured for this project to prevent
|
|
6
|
+
* accidental imports in other files. All imports should come from here to ensure consistency.
|
|
7
|
+
*/
|
|
8
|
+
export { convertNxGenerator, offsetFromRoot, readJson, writeJson, } from '@nx/devkit';
|
|
9
|
+
export type { ProjectConfiguration, Tree } from '@nx/devkit';
|
|
10
|
+
export { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter';
|
|
11
|
+
//# sourceMappingURL=devkit-imports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devkit-imports.d.ts","sourceRoot":"","sources":["../src/devkit-imports.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In order to prevent the project graph cache from showing up at the root of the user's
|
|
4
|
+
* workspace, we set a custom cache directory before importing anything from `@nx/devkit`.
|
|
5
|
+
*
|
|
6
|
+
* `no-restricted-imports` eslint rule has been configured for this project to prevent
|
|
7
|
+
* accidental imports in other files. All imports should come from here to ensure consistency.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.wrapAngularDevkitSchematic = exports.writeJson = exports.readJson = exports.offsetFromRoot = exports.convertNxGenerator = void 0;
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
process.env.NX_PROJECT_GRAPH_CACHE_DIRECTORY = (0, node_path_1.join)(__dirname, '..', '.nx-cache');
|
|
13
|
+
/* eslint-disable no-restricted-imports */
|
|
14
|
+
var devkit_1 = require("@nx/devkit");
|
|
15
|
+
Object.defineProperty(exports, "convertNxGenerator", { enumerable: true, get: function () { return devkit_1.convertNxGenerator; } });
|
|
16
|
+
Object.defineProperty(exports, "offsetFromRoot", { enumerable: true, get: function () { return devkit_1.offsetFromRoot; } });
|
|
17
|
+
Object.defineProperty(exports, "readJson", { enumerable: true, get: function () { return devkit_1.readJson; } });
|
|
18
|
+
Object.defineProperty(exports, "writeJson", { enumerable: true, get: function () { return devkit_1.writeJson; } });
|
|
19
|
+
var ngcli_adapter_1 = require("@nx/devkit/ngcli-adapter");
|
|
20
|
+
Object.defineProperty(exports, "wrapAngularDevkitSchematic", { enumerable: true, get: function () { return ngcli_adapter_1.wrapAngularDevkitSchematic; } });
|
|
21
|
+
/* eslint-enable no-restricted-imports */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/library/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/library/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAWlF,UAAU,MAAO,SAAQ,aAAa;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;;AAED,wBAqBG"}
|
package/dist/library/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
const ngcli_adapter_1 = require("@nx/devkit/ngcli-adapter");
|
|
3
|
+
const devkit_imports_1 = require("../devkit-imports");
|
|
5
4
|
const utils_1 = require("../utils");
|
|
6
|
-
exports.default = (0,
|
|
5
|
+
exports.default = (0, devkit_imports_1.convertNxGenerator)(async (tree, options) => {
|
|
7
6
|
// Remove angular-eslint specific options before passing to the Angular schematic
|
|
8
7
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
9
8
|
const { setParserOptionsProject, ...angularOptions } = options;
|
|
10
|
-
const libraryGenerator = (0,
|
|
9
|
+
const libraryGenerator = (0, devkit_imports_1.wrapAngularDevkitSchematic)('@schematics/angular', 'library');
|
|
11
10
|
await libraryGenerator(tree, angularOptions);
|
|
11
|
+
// Create the config file first so that we can check for its existence when setting the target
|
|
12
|
+
(0, utils_1.createESLintConfigForProject)(tree, options.name, options.setParserOptionsProject ?? false);
|
|
12
13
|
// Update the lint builder and config in angular.json
|
|
13
|
-
(0, utils_1.
|
|
14
|
-
(0, utils_1.createESLintConfigForProject__NX)(tree, options.name, options.setParserOptionsProject ?? false);
|
|
14
|
+
(0, utils_1.addESLintTargetToProject)(tree, options.name, 'lint');
|
|
15
15
|
});
|
package/dist/ng-add/index.d.ts
CHANGED
|
@@ -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;
|
|
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;AAc/E,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,kCAAkC,WAAW,CAAC;AA+K3D,MAAM,CAAC,OAAO,cAAc,IAAI,CAa/B"}
|
package/dist/ng-add/index.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FIXED_TYPESCRIPT_ESLINT_V7_VERSION = exports.FIXED_ESLINT_V8_VERSION = void 0;
|
|
3
4
|
const schematics_1 = require("@angular-devkit/schematics");
|
|
4
5
|
const tasks_1 = require("@angular-devkit/schematics/tasks");
|
|
5
6
|
const utils_1 = require("../utils");
|
|
7
|
+
exports.FIXED_ESLINT_V8_VERSION = '8.57.0';
|
|
8
|
+
exports.FIXED_TYPESCRIPT_ESLINT_V7_VERSION = '7.11.0';
|
|
6
9
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
7
10
|
const packageJSON = require('../../package.json');
|
|
8
|
-
function addAngularESLintPackages() {
|
|
11
|
+
function addAngularESLintPackages(json, useFlatConfig) {
|
|
9
12
|
return (host, context) => {
|
|
10
13
|
if (!host.exists('package.json')) {
|
|
11
14
|
throw new Error('Could not find a `package.json` file at the root of your workspace');
|
|
@@ -13,50 +16,67 @@ function addAngularESLintPackages() {
|
|
|
13
16
|
if (host.exists('tsconfig.base.json')) {
|
|
14
17
|
throw new Error('\nError: Angular CLI v10.1.0 and later (and no `tsconfig.base.json`) is required in order to run this schematic. Please update your workspace and try again.\n');
|
|
15
18
|
}
|
|
16
|
-
const projectPackageJSON = host.read('package.json').toString('utf-8');
|
|
17
|
-
const json = JSON.parse(projectPackageJSON);
|
|
18
|
-
json.devDependencies = json.devDependencies || {};
|
|
19
|
-
json.devDependencies['eslint'] =
|
|
20
|
-
`^${packageJSON.devDependencies['eslint']}`;
|
|
21
19
|
json.scripts = json.scripts || {};
|
|
22
20
|
json.scripts['lint'] = json.scripts['lint'] || 'ng lint';
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
json.devDependencies['@angular-eslint/eslint-plugin-template'] =
|
|
29
|
-
packageJSON.version;
|
|
30
|
-
/**
|
|
31
|
-
* It seems in certain versions of Angular CLI `ng add` will automatically add the
|
|
32
|
-
* @angular-eslint/schematics package to the dependencies section, so clean that up
|
|
33
|
-
* at this point
|
|
34
|
-
*/
|
|
35
|
-
if (json.dependencies?.['@angular-eslint/schematics']) {
|
|
36
|
-
delete json.dependencies['@angular-eslint/schematics'];
|
|
21
|
+
if (useFlatConfig) {
|
|
22
|
+
applyDevDependenciesForFlatConfig(json);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
applyDevDependenciesForESLintRC(json);
|
|
37
26
|
}
|
|
38
|
-
json.devDependencies['@angular-eslint/schematics'] = packageJSON.version;
|
|
39
|
-
json.devDependencies['@angular-eslint/template-parser'] =
|
|
40
|
-
packageJSON.version;
|
|
41
|
-
/**
|
|
42
|
-
* @typescript-eslint packages
|
|
43
|
-
*/
|
|
44
|
-
const typescriptESLintVersion = packageJSON.devDependencies['@typescript-eslint/utils'];
|
|
45
|
-
json.devDependencies['@typescript-eslint/eslint-plugin'] =
|
|
46
|
-
typescriptESLintVersion;
|
|
47
|
-
json.devDependencies['@typescript-eslint/parser'] = typescriptESLintVersion;
|
|
48
27
|
json.devDependencies = (0, utils_1.sortObjectByKeys)(json.devDependencies);
|
|
49
28
|
host.overwrite('package.json', JSON.stringify(json, null, 2));
|
|
50
29
|
context.addTask(new tasks_1.NodePackageInstallTask());
|
|
51
30
|
context.logger.info(`
|
|
52
|
-
All
|
|
31
|
+
All angular-eslint dependencies have been successfully installed 🎉
|
|
53
32
|
|
|
54
33
|
Please see https://github.com/angular-eslint/angular-eslint for how to add ESLint configuration to your project.
|
|
55
34
|
`);
|
|
56
35
|
return host;
|
|
57
36
|
};
|
|
58
37
|
}
|
|
59
|
-
function
|
|
38
|
+
function applyDevDependenciesForESLintRC(json) {
|
|
39
|
+
json.devDependencies['eslint'] = exports.FIXED_ESLINT_V8_VERSION;
|
|
40
|
+
/**
|
|
41
|
+
* @angular-eslint packages
|
|
42
|
+
*/
|
|
43
|
+
json.devDependencies['@angular-eslint/builder'] = packageJSON.version;
|
|
44
|
+
json.devDependencies['@angular-eslint/eslint-plugin'] = packageJSON.version;
|
|
45
|
+
json.devDependencies['@angular-eslint/eslint-plugin-template'] =
|
|
46
|
+
packageJSON.version;
|
|
47
|
+
json.devDependencies['@angular-eslint/schematics'] = packageJSON.version;
|
|
48
|
+
json.devDependencies['@angular-eslint/template-parser'] = packageJSON.version;
|
|
49
|
+
/**
|
|
50
|
+
* @typescript-eslint packages
|
|
51
|
+
*/
|
|
52
|
+
json.devDependencies['@typescript-eslint/eslint-plugin'] =
|
|
53
|
+
exports.FIXED_TYPESCRIPT_ESLINT_V7_VERSION;
|
|
54
|
+
json.devDependencies['@typescript-eslint/parser'] =
|
|
55
|
+
exports.FIXED_TYPESCRIPT_ESLINT_V7_VERSION;
|
|
56
|
+
}
|
|
57
|
+
function applyDevDependenciesForFlatConfig(json) {
|
|
58
|
+
json.devDependencies['eslint'] = `^${packageJSON.devDependencies['eslint']}`;
|
|
59
|
+
/**
|
|
60
|
+
* angular-eslint packages
|
|
61
|
+
*/
|
|
62
|
+
json.devDependencies['angular-eslint'] = packageJSON.version;
|
|
63
|
+
// Clean up individual packages from devDependencies
|
|
64
|
+
delete json.devDependencies['@angular-eslint/builder'];
|
|
65
|
+
delete json.devDependencies['@angular-eslint/eslint-plugin'];
|
|
66
|
+
delete json.devDependencies['@angular-eslint/eslint-plugin-template'];
|
|
67
|
+
delete json.devDependencies['@angular-eslint/schematics'];
|
|
68
|
+
delete json.devDependencies['@angular-eslint/template-parser'];
|
|
69
|
+
/**
|
|
70
|
+
* typescript-eslint
|
|
71
|
+
*/
|
|
72
|
+
const typescriptESLintVersion = packageJSON.devDependencies['@typescript-eslint/utils'];
|
|
73
|
+
json.devDependencies['typescript-eslint'] = typescriptESLintVersion;
|
|
74
|
+
// Clean up individual packages from devDependencies
|
|
75
|
+
delete json.devDependencies['@typescript-eslint/parser'];
|
|
76
|
+
delete json.devDependencies['@typescript-eslint/eslint-plugin'];
|
|
77
|
+
delete json.devDependencies['@typescript-eslint/utils'];
|
|
78
|
+
}
|
|
79
|
+
function applyESLintConfigIfSingleProjectWithNoExistingTSLint(useFlatConfig) {
|
|
60
80
|
return (host, context) => {
|
|
61
81
|
const angularJson = (0, utils_1.readJsonInTree)(host, 'angular.json');
|
|
62
82
|
if (!angularJson || !angularJson.projects) {
|
|
@@ -73,7 +93,12 @@ function applyESLintConfigIfSingleProjectWithNoExistingTSLint() {
|
|
|
73
93
|
const projectNames = Object.keys(angularJson.projects);
|
|
74
94
|
if (projectNames.length === 0) {
|
|
75
95
|
return (0, schematics_1.chain)([
|
|
76
|
-
|
|
96
|
+
useFlatConfig
|
|
97
|
+
? (host) => {
|
|
98
|
+
host.create('eslint.config.js', (0, utils_1.createStringifiedRootESLintConfig)(null));
|
|
99
|
+
return host;
|
|
100
|
+
}
|
|
101
|
+
: (0, utils_1.updateJsonInTree)('.eslintrc.json', () => (0, utils_1.createRootESLintConfig)(null)),
|
|
77
102
|
(0, utils_1.updateJsonInTree)('angular.json', (json) => (0, utils_1.updateSchematicCollections)(json)),
|
|
78
103
|
]);
|
|
79
104
|
}
|
|
@@ -108,23 +133,12 @@ Please see https://github.com/angular-eslint/angular-eslint for more information
|
|
|
108
133
|
}
|
|
109
134
|
function default_1() {
|
|
110
135
|
return (host, context) => {
|
|
136
|
+
const workspacePackageJSON = host.read('package.json').toString('utf-8');
|
|
137
|
+
const json = JSON.parse(workspacePackageJSON);
|
|
138
|
+
const useFlatConfig = (0, utils_1.shouldUseFlatConfig)(host, json);
|
|
111
139
|
return (0, schematics_1.chain)([
|
|
112
|
-
addAngularESLintPackages(),
|
|
113
|
-
applyESLintConfigIfSingleProjectWithNoExistingTSLint(),
|
|
114
|
-
() => {
|
|
115
|
-
const additionalGitignoreEntries = `.nx/cache
|
|
116
|
-
.nx/workspace-data
|
|
117
|
-
`;
|
|
118
|
-
if (!host.exists('.gitignore')) {
|
|
119
|
-
host.create('.gitignore', additionalGitignoreEntries);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
const gitIgnore = host.read('.gitignore')?.toString();
|
|
123
|
-
if (gitIgnore?.includes('.nx')) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
host.overwrite('.gitignore', `${gitIgnore}\n${additionalGitignoreEntries}`);
|
|
127
|
-
},
|
|
140
|
+
addAngularESLintPackages(json, useFlatConfig),
|
|
141
|
+
applyESLintConfigIfSingleProjectWithNoExistingTSLint(useFlatConfig),
|
|
128
142
|
])(host, context);
|
|
129
143
|
};
|
|
130
144
|
}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Some utils taken from various parts of Nx:
|
|
3
|
-
* https://github.com/nrwl/nx
|
|
4
|
-
*
|
|
5
|
-
* Thanks, Nrwl folks!
|
|
6
|
-
*/
|
|
7
1
|
import type { Path } from '@angular-devkit/core';
|
|
8
2
|
import type { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
|
|
9
|
-
import type { Tree as NxTree } from '
|
|
3
|
+
import type { Tree as NxTree } from './devkit-imports';
|
|
10
4
|
/**
|
|
11
5
|
* This method is specifically for reading JSON files in a Tree
|
|
12
6
|
* @param host The host tree
|
|
@@ -30,8 +24,7 @@ export declare function getTargetsConfigFromProject(projectConfig: {
|
|
|
30
24
|
} & {
|
|
31
25
|
targets?: TargetsConfig;
|
|
32
26
|
}): TargetsConfig | null;
|
|
33
|
-
export declare function
|
|
34
|
-
export declare function addESLintTargetToProject(projectName: string, targetName: 'eslint' | 'lint'): Rule;
|
|
27
|
+
export declare function addESLintTargetToProject(tree: NxTree, projectName: string, targetName: 'eslint' | 'lint'): void;
|
|
35
28
|
/**
|
|
36
29
|
* Utility to act on all files in a tree that are not ignored by git.
|
|
37
30
|
*/
|
|
@@ -59,24 +52,26 @@ export declare function createRootESLintConfig(prefix: string | null): {
|
|
|
59
52
|
};
|
|
60
53
|
}[];
|
|
61
54
|
};
|
|
62
|
-
export declare function
|
|
63
|
-
export declare function createESLintConfigForProject(projectName: string, setParserOptionsProject: boolean):
|
|
55
|
+
export declare function createStringifiedRootESLintConfig(prefix: string | null): string;
|
|
56
|
+
export declare function createESLintConfigForProject(tree: NxTree, projectName: string, setParserOptionsProject: boolean): void;
|
|
64
57
|
export declare function sortObjectByKeys(obj: Record<string, unknown>): Record<string, unknown>;
|
|
65
58
|
/**
|
|
66
59
|
* To make certain schematic usage conversion more ergonomic, if the user does not specify a project
|
|
67
60
|
* and only has a single project in their angular.json we will just go ahead and use that one.
|
|
68
61
|
*/
|
|
69
|
-
export declare function
|
|
70
|
-
/**
|
|
71
|
-
* To make certain schematic usage conversion more ergonomic, if the user does not specify a project
|
|
72
|
-
* and only has a single project in their angular.json we will just go ahead and use that one.
|
|
73
|
-
*/
|
|
74
|
-
export declare function determineTargetProjectName(tree: Tree, maybeProject?: string): string | null;
|
|
62
|
+
export declare function determineTargetProjectName(tree: NxTree, maybeProject?: string): string | null;
|
|
75
63
|
/**
|
|
76
64
|
* See `schematicCollections` docs here:
|
|
77
65
|
* https://github.com/angular/angular-cli/blob/8431b3f0769b5f95b9e13807a09293d820c4b017/docs/specifications/schematic-collections-config.md
|
|
78
66
|
*/
|
|
79
67
|
export declare function updateSchematicCollections(angularJson: Record<string, any>): Record<string, any>;
|
|
80
68
|
export declare function updateSchematicDefaults(angularJson: Record<string, any>, schematicFullName: string, defaultValues: Record<string, unknown>): Record<string, any>;
|
|
69
|
+
/**
|
|
70
|
+
* In order to support both flat config and eslintrc we need to dynamically figure out
|
|
71
|
+
* what the user should be using based on:
|
|
72
|
+
* - their existing files
|
|
73
|
+
* - their eslint version
|
|
74
|
+
*/
|
|
75
|
+
export declare function shouldUseFlatConfig(tree: NxTree | Tree, existingJson?: Record<string, unknown>): boolean;
|
|
81
76
|
export {};
|
|
82
77
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA
|
|
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;AAM/E,OAAO,KAAK,EAAE,IAAI,IAAI,MAAM,EAAwB,MAAM,kBAAkB,CAAC;AAK7E;;;;;GAKG;AAEH,wBAAgB,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAcnE;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;AAqBD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,GAAG,MAAM,QAqC9B;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;AA0BD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;EAyC3D;AAGD,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAiDR;AAiGD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,uBAAuB,EAAE,OAAO,QAsDjC;AAgBD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAUf;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBAS1E;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,uBAUvC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CA4BT"}
|
package/dist/utils.js
CHANGED
|
@@ -3,12 +3,13 @@ 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.
|
|
6
|
+
exports.shouldUseFlatConfig = exports.updateSchematicDefaults = exports.updateSchematicCollections = exports.determineTargetProjectName = exports.sortObjectByKeys = exports.createESLintConfigForProject = exports.createStringifiedRootESLintConfig = exports.createRootESLintConfig = exports.visitNotIgnoredFiles = exports.addESLintTargetToProject = exports.getTargetsConfigFromProject = exports.updateJsonInTree = exports.readJsonInTree = void 0;
|
|
7
7
|
const core_1 = require("@angular-devkit/core");
|
|
8
8
|
const schematics_1 = require("@angular-devkit/schematics");
|
|
9
|
-
const devkit_1 = require("@nx/devkit");
|
|
10
9
|
const ignore_1 = __importDefault(require("ignore"));
|
|
10
|
+
const semver_1 = __importDefault(require("semver"));
|
|
11
11
|
const strip_json_comments_1 = __importDefault(require("strip-json-comments"));
|
|
12
|
+
const devkit_imports_1 = require("./devkit-imports");
|
|
12
13
|
const DEFAULT_PREFIX = 'app';
|
|
13
14
|
/**
|
|
14
15
|
* This method is specifically for reading JSON files in a Tree
|
|
@@ -48,11 +49,6 @@ function updateJsonInTree(path, callback) {
|
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
exports.updateJsonInTree = updateJsonInTree;
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
52
|
-
function getWorkspacePath(host) {
|
|
53
|
-
const possibleFiles = ['/workspace.json', '/angular.json', '/.angular.json'];
|
|
54
|
-
return possibleFiles.filter((path) => host.exists(path))[0];
|
|
55
|
-
}
|
|
56
52
|
function getTargetsConfigFromProject(projectConfig) {
|
|
57
53
|
if (!projectConfig) {
|
|
58
54
|
return null;
|
|
@@ -67,35 +63,19 @@ function getTargetsConfigFromProject(projectConfig) {
|
|
|
67
63
|
return null;
|
|
68
64
|
}
|
|
69
65
|
exports.getTargetsConfigFromProject = getTargetsConfigFromProject;
|
|
70
|
-
function offsetFromRoot(fullPathToSourceDir) {
|
|
71
|
-
const parts = (0, core_1.normalize)(fullPathToSourceDir).split('/');
|
|
72
|
-
let offset = '';
|
|
73
|
-
for (let i = 0; i < parts.length; ++i) {
|
|
74
|
-
offset += '../';
|
|
75
|
-
}
|
|
76
|
-
return offset;
|
|
77
|
-
}
|
|
78
66
|
function serializeJson(json) {
|
|
79
67
|
return `${JSON.stringify(json, null, 2)}\n`;
|
|
80
68
|
}
|
|
81
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
-
function updateWorkspaceInTree(callback) {
|
|
83
|
-
return (host, context) => {
|
|
84
|
-
const path = getWorkspacePath(host);
|
|
85
|
-
host.overwrite(path, serializeJson(callback(readJsonInTree(host, path), context, host)));
|
|
86
|
-
return host;
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
69
|
function readProjectConfiguration(tree, projectName) {
|
|
90
|
-
const angularJSON = (0,
|
|
70
|
+
const angularJSON = (0, devkit_imports_1.readJson)(tree, 'angular.json');
|
|
91
71
|
return angularJSON.projects[projectName];
|
|
92
72
|
}
|
|
93
73
|
function updateProjectConfiguration(tree, projectName, projectConfig) {
|
|
94
|
-
const angularJSON = (0,
|
|
74
|
+
const angularJSON = (0, devkit_imports_1.readJson)(tree, 'angular.json');
|
|
95
75
|
angularJSON.projects[projectName] = projectConfig;
|
|
96
|
-
(0,
|
|
76
|
+
(0, devkit_imports_1.writeJson)(tree, 'angular.json', angularJSON);
|
|
97
77
|
}
|
|
98
|
-
function
|
|
78
|
+
function addESLintTargetToProject(tree, projectName, targetName) {
|
|
99
79
|
const existingProjectConfig = readProjectConfiguration(tree, projectName);
|
|
100
80
|
let lintFilePatternsRoot = '';
|
|
101
81
|
// Default Angular CLI project at the root of the workspace
|
|
@@ -114,35 +94,18 @@ function addESLintTargetToProject__NX(tree, projectName, targetName) {
|
|
|
114
94
|
],
|
|
115
95
|
},
|
|
116
96
|
};
|
|
97
|
+
let eslintConfig;
|
|
98
|
+
if (existingProjectConfig.root !== '') {
|
|
99
|
+
const flatConfigPath = (0, core_1.join)(existingProjectConfig.root, 'eslint.config.js');
|
|
100
|
+
if (tree.exists(flatConfigPath)) {
|
|
101
|
+
eslintConfig = flatConfigPath;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
eslintTargetConfig.options.eslintConfig = eslintConfig;
|
|
117
105
|
existingProjectConfig.architect = existingProjectConfig.architect || {};
|
|
118
106
|
existingProjectConfig.architect[targetName] = eslintTargetConfig;
|
|
119
107
|
updateProjectConfiguration(tree, projectName, existingProjectConfig);
|
|
120
108
|
}
|
|
121
|
-
exports.addESLintTargetToProject__NX = addESLintTargetToProject__NX;
|
|
122
|
-
function addESLintTargetToProject(projectName, targetName) {
|
|
123
|
-
return updateWorkspaceInTree((workspaceJson) => {
|
|
124
|
-
const existingProjectConfig = workspaceJson.projects[projectName];
|
|
125
|
-
let lintFilePatternsRoot = '';
|
|
126
|
-
// Default Angular CLI project at the root of the workspace
|
|
127
|
-
if (existingProjectConfig.root === '') {
|
|
128
|
-
lintFilePatternsRoot = existingProjectConfig.sourceRoot || 'src';
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
lintFilePatternsRoot = existingProjectConfig.root;
|
|
132
|
-
}
|
|
133
|
-
const eslintTargetConfig = {
|
|
134
|
-
builder: '@angular-eslint/builder:lint',
|
|
135
|
-
options: {
|
|
136
|
-
lintFilePatterns: [
|
|
137
|
-
`${lintFilePatternsRoot}/**/*.ts`,
|
|
138
|
-
`${lintFilePatternsRoot}/**/*.html`,
|
|
139
|
-
],
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
existingProjectConfig.architect[targetName] = eslintTargetConfig;
|
|
143
|
-
return workspaceJson;
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
109
|
exports.addESLintTargetToProject = addESLintTargetToProject;
|
|
147
110
|
/**
|
|
148
111
|
* Utility to act on all files in a tree that are not ignored by git.
|
|
@@ -235,9 +198,59 @@ function createRootESLintConfig(prefix) {
|
|
|
235
198
|
};
|
|
236
199
|
}
|
|
237
200
|
exports.createRootESLintConfig = createRootESLintConfig;
|
|
201
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
202
|
+
function createStringifiedRootESLintConfig(prefix) {
|
|
203
|
+
return `// @ts-check
|
|
204
|
+
const eslint = require("@eslint/js");
|
|
205
|
+
const tseslint = require("typescript-eslint");
|
|
206
|
+
const angular = require("angular-eslint");
|
|
207
|
+
|
|
208
|
+
module.exports = tseslint.config(
|
|
209
|
+
{
|
|
210
|
+
files: ["**/*.ts"],
|
|
211
|
+
extends: [
|
|
212
|
+
eslint.configs.recommended,
|
|
213
|
+
...tseslint.configs.recommended,
|
|
214
|
+
...tseslint.configs.stylistic,
|
|
215
|
+
...angular.configs.tsRecommended,
|
|
216
|
+
],
|
|
217
|
+
processor: angular.processInlineTemplates,
|
|
218
|
+
rules: ${prefix
|
|
219
|
+
? `{
|
|
220
|
+
"@angular-eslint/directive-selector": [
|
|
221
|
+
"error",
|
|
222
|
+
{
|
|
223
|
+
type: "attribute",
|
|
224
|
+
prefix: "${prefix}",
|
|
225
|
+
style: "camelCase",
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
"@angular-eslint/component-selector": [
|
|
229
|
+
"error",
|
|
230
|
+
{
|
|
231
|
+
type: "element",
|
|
232
|
+
prefix: "${prefix}",
|
|
233
|
+
style: "kebab-case",
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
}`
|
|
237
|
+
: '{}'},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
files: ["**/*.html"],
|
|
241
|
+
extends: [
|
|
242
|
+
...angular.configs.templateRecommended,
|
|
243
|
+
...angular.configs.templateAccessibility,
|
|
244
|
+
],
|
|
245
|
+
rules: {},
|
|
246
|
+
}
|
|
247
|
+
);
|
|
248
|
+
`;
|
|
249
|
+
}
|
|
250
|
+
exports.createStringifiedRootESLintConfig = createStringifiedRootESLintConfig;
|
|
238
251
|
function createProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e) {
|
|
239
252
|
return {
|
|
240
|
-
extends: `${offsetFromRoot(projectRoot)}.eslintrc.json`,
|
|
253
|
+
extends: `${(0, devkit_imports_1.offsetFromRoot)(projectRoot)}.eslintrc.json`,
|
|
241
254
|
ignorePatterns: ['!**/*'],
|
|
242
255
|
overrides: [
|
|
243
256
|
{
|
|
@@ -267,92 +280,80 @@ function createProjectESLintConfig(projectRoot, projectType, prefix, setParserOp
|
|
|
267
280
|
],
|
|
268
281
|
};
|
|
269
282
|
}
|
|
270
|
-
function
|
|
271
|
-
return
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
283
|
+
function createStringifiedProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e) {
|
|
284
|
+
return `// @ts-check
|
|
285
|
+
const tseslint = require("typescript-eslint");
|
|
286
|
+
const rootConfig = require("${(0, devkit_imports_1.offsetFromRoot)(projectRoot)}eslint.config.js");
|
|
287
|
+
|
|
288
|
+
module.exports = tseslint.config(
|
|
289
|
+
...rootConfig,
|
|
290
|
+
{
|
|
291
|
+
files: ["**/*.ts"],${setParserOptionsProject
|
|
292
|
+
? `
|
|
293
|
+
languageOptions: {
|
|
294
|
+
parserOptions: {
|
|
295
|
+
projectService: true,
|
|
296
|
+
},
|
|
297
|
+
},`
|
|
298
|
+
: ''}
|
|
299
|
+
rules: {
|
|
300
|
+
"@angular-eslint/directive-selector": [
|
|
301
|
+
"error",
|
|
302
|
+
{
|
|
303
|
+
type: "attribute",
|
|
304
|
+
prefix: "${prefix}",
|
|
305
|
+
style: "camelCase",
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
"@angular-eslint/component-selector": [
|
|
309
|
+
"error",
|
|
310
|
+
{
|
|
311
|
+
type: "element",
|
|
312
|
+
prefix: "${prefix}",
|
|
313
|
+
style: "kebab-case",
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
files: ["**/*.html"],
|
|
320
|
+
rules: {},
|
|
321
|
+
}
|
|
322
|
+
);
|
|
323
|
+
`;
|
|
301
324
|
}
|
|
302
|
-
function
|
|
325
|
+
function createESLintConfigForProject(tree, projectName, setParserOptionsProject) {
|
|
303
326
|
const existingProjectConfig = readProjectConfiguration(tree, projectName);
|
|
304
327
|
const targets = existingProjectConfig.architect || existingProjectConfig.targets;
|
|
305
328
|
const { root: projectRoot, projectType, prefix } = existingProjectConfig;
|
|
306
329
|
const hasE2e = !!targets?.e2e;
|
|
330
|
+
const useFlatConfig = shouldUseFlatConfig(tree);
|
|
331
|
+
const alreadyHasRootFlatConfig = tree.exists('eslint.config.js');
|
|
332
|
+
const alreadyHasRootESLintRC = tree.exists('.eslintrc.json');
|
|
307
333
|
/**
|
|
308
334
|
* If the root is an empty string it must be the initial project created at the
|
|
309
335
|
* root by the Angular CLI's workspace schematic
|
|
310
336
|
*/
|
|
311
337
|
if (projectRoot === '') {
|
|
312
|
-
return
|
|
338
|
+
return createRootESLintConfigFile(tree, prefix || DEFAULT_PREFIX, useFlatConfig);
|
|
313
339
|
}
|
|
314
|
-
// If, for whatever reason, the root .eslintrc.json doesn't exist yet, create it
|
|
315
|
-
if (!
|
|
316
|
-
|
|
340
|
+
// If, for whatever reason, the root eslint.config.js/.eslintrc.json doesn't exist yet, create it
|
|
341
|
+
if (!alreadyHasRootESLintRC && !alreadyHasRootFlatConfig) {
|
|
342
|
+
createRootESLintConfigFile(tree, prefix || DEFAULT_PREFIX, useFlatConfig);
|
|
343
|
+
}
|
|
344
|
+
if (useFlatConfig) {
|
|
345
|
+
tree.write((0, core_1.join)((0, core_1.normalize)(projectRoot), 'eslint.config.js'), createStringifiedProjectESLintConfig(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, setParserOptionsProject, hasE2e));
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
(0, devkit_imports_1.writeJson)(tree, (0, core_1.join)((0, core_1.normalize)(projectRoot), '.eslintrc.json'), createProjectESLintConfig(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, setParserOptionsProject, hasE2e));
|
|
317
349
|
}
|
|
318
|
-
(0, devkit_1.writeJson)(tree, (0, core_1.join)((0, core_1.normalize)(projectRoot), '.eslintrc.json'), createProjectESLintConfig__NX(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, setParserOptionsProject, hasE2e));
|
|
319
|
-
}
|
|
320
|
-
exports.createESLintConfigForProject__NX = createESLintConfigForProject__NX;
|
|
321
|
-
function createESLintConfigForProject(projectName, setParserOptionsProject) {
|
|
322
|
-
return (tree) => {
|
|
323
|
-
const angularJSON = readJsonInTree(tree, 'angular.json');
|
|
324
|
-
const { root: projectRoot, projectType, prefix, } = angularJSON.projects[projectName];
|
|
325
|
-
const hasE2e = determineTargetProjectHasE2E(angularJSON, projectName);
|
|
326
|
-
/**
|
|
327
|
-
* If the root is an empty string it must be the initial project created at the
|
|
328
|
-
* root by the Angular CLI's workspace schematic
|
|
329
|
-
*/
|
|
330
|
-
if (projectRoot === '') {
|
|
331
|
-
return createRootESLintConfigFile(projectName);
|
|
332
|
-
}
|
|
333
|
-
return (0, schematics_1.chain)([
|
|
334
|
-
// If, for whatever reason, the root .eslintrc.json doesn't exist yet, create it
|
|
335
|
-
tree.exists('.eslintrc.json')
|
|
336
|
-
? () => undefined
|
|
337
|
-
: createRootESLintConfigFile(projectName),
|
|
338
|
-
updateJsonInTree((0, core_1.join)((0, core_1.normalize)(projectRoot), '.eslintrc.json'), () => createProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e)),
|
|
339
|
-
]);
|
|
340
|
-
};
|
|
341
350
|
}
|
|
342
351
|
exports.createESLintConfigForProject = createESLintConfigForProject;
|
|
343
|
-
function createRootESLintConfigFile(
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
const { prefix } = angularJSON.projects[projectName];
|
|
349
|
-
lintPrefix = prefix;
|
|
350
|
-
}
|
|
351
|
-
return updateJsonInTree('.eslintrc.json', () => createRootESLintConfig(lintPrefix));
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
function createRootESLintConfigFile__NX(tree, prefix) {
|
|
355
|
-
return (0, devkit_1.writeJson)(tree, '.eslintrc.json', createRootESLintConfig(prefix));
|
|
352
|
+
function createRootESLintConfigFile(tree, prefix, useFlatConfig) {
|
|
353
|
+
if (useFlatConfig) {
|
|
354
|
+
return tree.write('eslint.config.js', createStringifiedRootESLintConfig(prefix));
|
|
355
|
+
}
|
|
356
|
+
return (0, devkit_imports_1.writeJson)(tree, '.eslintrc.json', createRootESLintConfig(prefix));
|
|
356
357
|
}
|
|
357
358
|
function sortObjectByKeys(obj) {
|
|
358
359
|
return Object.keys(obj)
|
|
@@ -365,22 +366,6 @@ function sortObjectByKeys(obj) {
|
|
|
365
366
|
}, {});
|
|
366
367
|
}
|
|
367
368
|
exports.sortObjectByKeys = sortObjectByKeys;
|
|
368
|
-
/**
|
|
369
|
-
* To make certain schematic usage conversion more ergonomic, if the user does not specify a project
|
|
370
|
-
* and only has a single project in their angular.json we will just go ahead and use that one.
|
|
371
|
-
*/
|
|
372
|
-
function determineTargetProjectName__NX(tree, maybeProject) {
|
|
373
|
-
if (maybeProject) {
|
|
374
|
-
return maybeProject;
|
|
375
|
-
}
|
|
376
|
-
const workspaceJson = (0, devkit_1.readJson)(tree, 'angular.json');
|
|
377
|
-
const projects = Object.keys(workspaceJson.projects);
|
|
378
|
-
if (projects.length === 1) {
|
|
379
|
-
return projects[0];
|
|
380
|
-
}
|
|
381
|
-
return null;
|
|
382
|
-
}
|
|
383
|
-
exports.determineTargetProjectName__NX = determineTargetProjectName__NX;
|
|
384
369
|
/**
|
|
385
370
|
* To make certain schematic usage conversion more ergonomic, if the user does not specify a project
|
|
386
371
|
* and only has a single project in their angular.json we will just go ahead and use that one.
|
|
@@ -389,7 +374,7 @@ function determineTargetProjectName(tree, maybeProject) {
|
|
|
389
374
|
if (maybeProject) {
|
|
390
375
|
return maybeProject;
|
|
391
376
|
}
|
|
392
|
-
const workspaceJson =
|
|
377
|
+
const workspaceJson = (0, devkit_imports_1.readJson)(tree, 'angular.json');
|
|
393
378
|
const projects = Object.keys(workspaceJson.projects);
|
|
394
379
|
if (projects.length === 1) {
|
|
395
380
|
return projects[0];
|
|
@@ -397,15 +382,6 @@ function determineTargetProjectName(tree, maybeProject) {
|
|
|
397
382
|
return null;
|
|
398
383
|
}
|
|
399
384
|
exports.determineTargetProjectName = determineTargetProjectName;
|
|
400
|
-
/**
|
|
401
|
-
* Checking if the target project has e2e setup
|
|
402
|
-
* Method will check if angular project architect has e2e configuration to determine if e2e setup
|
|
403
|
-
*/
|
|
404
|
-
function determineTargetProjectHasE2E(
|
|
405
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
|
|
406
|
-
angularJSON, projectName) {
|
|
407
|
-
return !!getTargetsConfigFromProject(angularJSON.projects[projectName])?.e2e;
|
|
408
|
-
}
|
|
409
385
|
/**
|
|
410
386
|
* See `schematicCollections` docs here:
|
|
411
387
|
* https://github.com/angular/angular-cli/blob/8431b3f0769b5f95b9e13807a09293d820c4b017/docs/specifications/schematic-collections-config.md
|
|
@@ -432,3 +408,39 @@ function updateSchematicDefaults(angularJson, schematicFullName, defaultValues)
|
|
|
432
408
|
return angularJson;
|
|
433
409
|
}
|
|
434
410
|
exports.updateSchematicDefaults = updateSchematicDefaults;
|
|
411
|
+
/**
|
|
412
|
+
* In order to support both flat config and eslintrc we need to dynamically figure out
|
|
413
|
+
* what the user should be using based on:
|
|
414
|
+
* - their existing files
|
|
415
|
+
* - their eslint version
|
|
416
|
+
*/
|
|
417
|
+
function shouldUseFlatConfig(tree, existingJson) {
|
|
418
|
+
let useFlatConfig = true;
|
|
419
|
+
try {
|
|
420
|
+
const alreadyHasRootFlatConfig = tree.exists('eslint.config.js');
|
|
421
|
+
const alreadyHasRootESLintRC = tree.exists('.eslintrc.json');
|
|
422
|
+
if (alreadyHasRootFlatConfig) {
|
|
423
|
+
useFlatConfig = true;
|
|
424
|
+
}
|
|
425
|
+
else if (alreadyHasRootESLintRC) {
|
|
426
|
+
useFlatConfig = false;
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
const json = existingJson ??
|
|
430
|
+
JSON.parse(tree.read('package.json').toString('utf-8'));
|
|
431
|
+
json.devDependencies = json.devDependencies || {};
|
|
432
|
+
const existingESLintVersion = json.devDependencies['eslint'];
|
|
433
|
+
if (existingESLintVersion) {
|
|
434
|
+
const v = semver_1.default.minVersion(existingESLintVersion);
|
|
435
|
+
if (v) {
|
|
436
|
+
useFlatConfig = semver_1.default.gte(v.raw, '9.0.0');
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return useFlatConfig;
|
|
441
|
+
}
|
|
442
|
+
catch {
|
|
443
|
+
return useFlatConfig;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
exports.shouldUseFlatConfig = shouldUseFlatConfig;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular-eslint/schematics",
|
|
3
|
-
"version": "18.0.0
|
|
3
|
+
"version": "18.0.0",
|
|
4
4
|
"description": "Angular Schematics for angular-eslint",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,28 +27,30 @@
|
|
|
27
27
|
"@angular-eslint/eslint-plugin",
|
|
28
28
|
"@angular-eslint/eslint-plugin-template",
|
|
29
29
|
"@angular-eslint/template-parser",
|
|
30
|
-
"@angular-eslint/utils"
|
|
30
|
+
"@angular-eslint/test-utils",
|
|
31
|
+
"@angular-eslint/utils",
|
|
32
|
+
"angular-eslint"
|
|
31
33
|
]
|
|
32
34
|
},
|
|
33
35
|
"ng-add": {
|
|
34
36
|
"save": "devDependencies"
|
|
35
37
|
},
|
|
36
38
|
"dependencies": {
|
|
37
|
-
"@angular-eslint/eslint-plugin": "18.0.0
|
|
38
|
-
"@angular-eslint/eslint-plugin-template": "18.0.0
|
|
39
|
+
"@angular-eslint/eslint-plugin": "18.0.0",
|
|
40
|
+
"@angular-eslint/eslint-plugin-template": "18.0.0",
|
|
39
41
|
"@nx/devkit": "^19.0.6",
|
|
40
42
|
"ignore": "5.3.1",
|
|
41
43
|
"nx": "^19.0.6",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
+
"semver": "7.6.2",
|
|
45
|
+
"strip-json-comments": "3.1.1"
|
|
44
46
|
},
|
|
45
47
|
"devDependencies": {
|
|
46
|
-
"@
|
|
47
|
-
"@typescript-eslint/utils": "8.0.0-alpha.16",
|
|
48
|
+
"@typescript-eslint/utils": "8.0.0-alpha.20",
|
|
48
49
|
"eslint": "9.3.0"
|
|
49
50
|
},
|
|
50
51
|
"peerDependencies": {
|
|
51
|
-
"@angular/
|
|
52
|
+
"@angular-devkit/core": ">= 18.0.0 < 19.0.0",
|
|
53
|
+
"@angular-devkit/schematics": ">= 18.0.0 < 19.0.0"
|
|
52
54
|
},
|
|
53
55
|
"gitHead": "e2006e5e9c99e5a943d1a999e0efa5247d29ec24"
|
|
54
56
|
}
|