@angular-eslint/schematics 17.5.3-alpha.0 → 17.5.3-alpha.1

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 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,wBAqBG"}
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"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const devkit_imports_1 = require("../devkit-imports");
4
4
  const utils_1 = require("../utils");
5
5
  exports.default = (0, devkit_imports_1.convertNxGenerator)(async (tree, options) => {
6
- const projectName = (0, utils_1.determineTargetProjectName__NX)(tree, options.project);
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.addESLintTargetToProject__NX)(tree, projectName, 'lint');
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":"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,wBAoBG"}
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"}
@@ -8,7 +8,8 @@ exports.default = (0, devkit_imports_1.convertNxGenerator)(async (tree, options)
8
8
  const { setParserOptionsProject, ...angularOptions } = options;
9
9
  const applicationGenerator = (0, devkit_imports_1.wrapAngularDevkitSchematic)('@schematics/angular', 'application');
10
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);
11
13
  // Update the lint builder and config in angular.json
12
- (0, utils_1.addESLintTargetToProject__NX)(tree, options.name, 'lint');
13
- (0, utils_1.createESLintConfigForProject__NX)(tree, options.name, options.setParserOptionsProject ?? false);
14
+ (0, utils_1.addESLintTargetToProject)(tree, options.name, 'lint');
14
15
  });
@@ -1 +1 @@
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,wBAoBG"}
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"}
@@ -8,7 +8,8 @@ exports.default = (0, devkit_imports_1.convertNxGenerator)(async (tree, options)
8
8
  const { setParserOptionsProject, ...angularOptions } = options;
9
9
  const libraryGenerator = (0, devkit_imports_1.wrapAngularDevkitSchematic)('@schematics/angular', 'library');
10
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);
11
13
  // Update the lint builder and config in angular.json
12
- (0, utils_1.addESLintTargetToProject__NX)(tree, options.name, 'lint');
13
- (0, utils_1.createESLintConfigForProject__NX)(tree, options.name, options.setParserOptionsProject ?? false);
14
+ (0, utils_1.addESLintTargetToProject)(tree, options.name, 'lint');
14
15
  });
@@ -1,3 +1,5 @@
1
1
  import type { Rule } from '@angular-devkit/schematics';
2
+ export declare const FIXED_ESLINT_V8_VERSION = "8.57.0";
3
+ export declare const FIXED_TYPESCRIPT_ESLINT_V7_VERSION = "7.11.0";
2
4
  export default function (): Rule;
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAiJ/E,MAAM,CAAC,OAAO,cAAc,IAAI,CAwB/B"}
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"}
@@ -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
- * @angular-eslint packages
25
- */
26
- json.devDependencies['@angular-eslint/builder'] = packageJSON.version;
27
- json.devDependencies['@angular-eslint/eslint-plugin'] = packageJSON.version;
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 @angular-eslint dependencies have been successfully installed 🎉
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 applyESLintConfigIfSingleProjectWithNoExistingTSLint() {
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
- (0, utils_1.updateJsonInTree)('.eslintrc.json', () => (0, utils_1.createRootESLintConfig)(null)),
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,9 +1,3 @@
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
3
  import type { Tree as NxTree } from './devkit-imports';
@@ -30,8 +24,7 @@ export declare function getTargetsConfigFromProject(projectConfig: {
30
24
  } & {
31
25
  targets?: TargetsConfig;
32
26
  }): TargetsConfig | null;
33
- export declare function addESLintTargetToProject__NX(tree: NxTree, projectName: string, targetName: 'eslint' | 'lint'): void;
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 createESLintConfigForProject__NX(tree: NxTree, projectName: string, setParserOptionsProject: boolean): void;
63
- export declare function createESLintConfigForProject(projectName: string, setParserOptionsProject: boolean): Rule;
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 determineTargetProjectName__NX(tree: NxTree, maybeProject?: string): string | null;
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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAK/E,OAAO,KAAK,EAAE,IAAI,IAAI,MAAM,EAAwB,MAAM,kBAAkB,CAAC;AAS7E;;;;;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;AAQD,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;AA4CD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,GAAG,MAAM,QA2B9B;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,GAAG,MAAM,GAC5B,IAAI,CA2BN;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;AA0FD,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,uBAAuB,EAAE,OAAO,QAiCjC;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,EACnB,uBAAuB,EAAE,OAAO,GAC/B,IAAI,CAmCN;AAsBD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAUf;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAUf;AAcD;;;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"}
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,10 +3,11 @@ 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.updateSchematicDefaults = exports.updateSchematicCollections = exports.determineTargetProjectName = exports.determineTargetProjectName__NX = exports.sortObjectByKeys = exports.createESLintConfigForProject = exports.createESLintConfigForProject__NX = exports.createRootESLintConfig = exports.visitNotIgnoredFiles = exports.addESLintTargetToProject = exports.addESLintTargetToProject__NX = exports.getTargetsConfigFromProject = exports.updateJsonInTree = exports.readJsonInTree = void 0;
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
9
  const ignore_1 = __importDefault(require("ignore"));
10
+ const semver_1 = __importDefault(require("semver"));
10
11
  const strip_json_comments_1 = __importDefault(require("strip-json-comments"));
11
12
  const devkit_imports_1 = require("./devkit-imports");
12
13
  const DEFAULT_PREFIX = 'app';
@@ -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,25 +63,9 @@ 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
70
  const angularJSON = (0, devkit_imports_1.readJson)(tree, 'angular.json');
91
71
  return angularJSON.projects[projectName];
@@ -95,7 +75,7 @@ function updateProjectConfiguration(tree, projectName, projectConfig) {
95
75
  angularJSON.projects[projectName] = projectConfig;
96
76
  (0, devkit_imports_1.writeJson)(tree, 'angular.json', angularJSON);
97
77
  }
98
- function addESLintTargetToProject__NX(tree, projectName, targetName) {
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,39 +198,57 @@ function createRootESLintConfig(prefix) {
235
198
  };
236
199
  }
237
200
  exports.createRootESLintConfig = createRootESLintConfig;
238
- function createProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e) {
239
- return {
240
- extends: `${offsetFromRoot(projectRoot)}.eslintrc.json`,
241
- ignorePatterns: ['!**/*'],
242
- overrides: [
243
- {
244
- files: ['*.ts'],
245
- ...(setParserOptionsProject
246
- ? {
247
- parserOptions: {
248
- project: setESLintProjectBasedOnProjectType(projectRoot, projectType, hasE2e),
249
- },
250
- }
251
- : null),
252
- rules: {
253
- '@angular-eslint/directive-selector': [
254
- 'error',
255
- { type: 'attribute', prefix, style: 'camelCase' },
256
- ],
257
- '@angular-eslint/component-selector': [
258
- 'error',
259
- { type: 'element', prefix, style: 'kebab-case' },
260
- ],
261
- },
262
- },
263
- {
264
- files: ['*.html'],
265
- rules: {},
266
- },
267
- ],
268
- };
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
+ `;
269
249
  }
270
- function createProjectESLintConfig__NX(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e) {
250
+ exports.createStringifiedRootESLintConfig = createStringifiedRootESLintConfig;
251
+ function createProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e) {
271
252
  return {
272
253
  extends: `${(0, devkit_imports_1.offsetFromRoot)(projectRoot)}.eslintrc.json`,
273
254
  ignorePatterns: ['!**/*'],
@@ -299,59 +280,79 @@ function createProjectESLintConfig__NX(projectRoot, projectType, prefix, setPars
299
280
  ],
300
281
  };
301
282
  }
302
- function createESLintConfigForProject__NX(tree, projectName, setParserOptionsProject) {
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
+ `;
324
+ }
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 createRootESLintConfigFile__NX(tree, prefix || DEFAULT_PREFIX);
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 (!tree.exists('.eslintrc.json')) {
316
- createRootESLintConfigFile__NX(tree, prefix || DEFAULT_PREFIX);
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_imports_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(projectName) {
344
- return (tree) => {
345
- const angularJSON = readJsonInTree(tree, getWorkspacePath(tree));
346
- let lintPrefix = null;
347
- if (angularJSON.projects?.[projectName]) {
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) {
352
+ function createRootESLintConfigFile(tree, prefix, useFlatConfig) {
353
+ if (useFlatConfig) {
354
+ return tree.write('eslint.config.js', createStringifiedRootESLintConfig(prefix));
355
+ }
355
356
  return (0, devkit_imports_1.writeJson)(tree, '.eslintrc.json', createRootESLintConfig(prefix));
356
357
  }
357
358
  function sortObjectByKeys(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_imports_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 = readJsonInTree(tree, getWorkspacePath(tree));
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": "17.5.3-alpha.0",
3
+ "version": "17.5.3-alpha.1",
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": "17.5.3-alpha.0",
38
- "@angular-eslint/eslint-plugin-template": "17.5.3-alpha.0",
39
- "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0",
39
+ "@angular-eslint/eslint-plugin": "17.5.3-alpha.1",
40
+ "@angular-eslint/eslint-plugin-template": "17.5.3-alpha.1",
41
+ "@nx/devkit": "^19.0.6",
40
42
  "ignore": "5.3.1",
41
- "nx": "^17.2.8 || ^18.0.0 || ^19.0.0",
42
- "strip-json-comments": "3.1.1",
43
- "tmp": "0.2.3"
43
+ "nx": "^19.0.6",
44
+ "semver": "7.6.2",
45
+ "strip-json-comments": "3.1.1"
44
46
  },
45
47
  "devDependencies": {
46
- "@types/tmp": "0.2.6",
47
- "@typescript-eslint/utils": "7.11.0",
48
- "eslint": "8.57.0"
48
+ "@typescript-eslint/utils": "8.0.0-alpha.20",
49
+ "eslint": "9.3.0"
49
50
  },
50
51
  "peerDependencies": {
51
- "@angular/cli": ">= 17.0.0 < 18.0.0"
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
  }