@angular-eslint/schematics 18.3.2-alpha.9 → 18.4.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.
@@ -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;AAc/E,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,kCAAkC,WAAW,CAAC;AA+K3D,MAAM,CAAC,OAAO,cAAc,IAAI,CAa/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;AAkL3D,MAAM,CAAC,OAAO,cAAc,IAAI,CAa/B"}
@@ -96,7 +96,10 @@ function applyESLintConfigIfSingleProjectWithNoExistingTSLint(useFlatConfig) {
96
96
  return (0, schematics_1.chain)([
97
97
  useFlatConfig
98
98
  ? (host) => {
99
- host.create('eslint.config.js', (0, utils_1.createStringifiedRootESLintConfig)(null));
99
+ // If the root package.json uses type: module, generate ESM content
100
+ const packageJson = (0, utils_1.readJsonInTree)(host, 'package.json');
101
+ const isESM = packageJson.type === 'module';
102
+ host.create('eslint.config.js', (0, utils_1.createStringifiedRootESLintConfig)(null, isESM));
100
103
  return host;
101
104
  }
102
105
  : (0, utils_1.updateJsonInTree)('.eslintrc.json', () => (0, utils_1.createRootESLintConfig)(null)),
package/dist/utils.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { Path } from '@angular-devkit/core';
2
2
  import type { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
3
+ export declare const supportedFlatConfigNames: string[];
3
4
  /**
4
5
  * This method is specifically for reading JSON files in a Tree
5
6
  * @param host The host tree
@@ -51,7 +52,7 @@ export declare function createRootESLintConfig(prefix: string | null): {
51
52
  };
52
53
  }[];
53
54
  };
54
- export declare function createStringifiedRootESLintConfig(prefix: string | null): string;
55
+ export declare function createStringifiedRootESLintConfig(prefix: string | null, isESM: boolean): string;
55
56
  export declare function createESLintConfigForProject(projectName: string, setParserOptionsProject: boolean): Rule;
56
57
  export declare function sortObjectByKeys(obj: Record<string, unknown>): Record<string, unknown>;
57
58
  /**
@@ -72,5 +73,10 @@ export declare function updateSchematicDefaults(angularJson: Record<string, any>
72
73
  * - their eslint version
73
74
  */
74
75
  export declare function shouldUseFlatConfig(tree: Tree, existingJson?: Record<string, unknown>): boolean;
76
+ export declare function resolveRootESLintConfigPath(tree: Tree): string | null;
77
+ export declare function determineNewProjectESLintConfigContentAndExtension(tree: Tree, rootConfigPath: string, projectRoot: string): {
78
+ isESM: boolean;
79
+ ext: string;
80
+ };
75
81
  export {};
76
82
  //# sourceMappingURL=utils.d.ts.map
@@ -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;AAS/E;;;;;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;AA6BD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,GAAG,MAAM,GAC5B,IAAI,CA2CN;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,WAAW,EAAE,MAAM,EACnB,uBAAuB,EAAE,OAAO,GAC/B,IAAI,CA+DN;AAoBD,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,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;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CA4BT"}
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;AAS/E,eAAO,MAAM,wBAAwB,UAIpC,CAAC;AAEF;;;;;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;AA6BD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,GAAG,MAAM,GAC5B,IAAI,CA2DN;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,EACrB,KAAK,EAAE,OAAO,GACb,MAAM,CAiDR;AAoGD,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,EACnB,uBAAuB,EAAE,OAAO,GAC/B,IAAI,CA2EN;AAuBD,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,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;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CA8BT;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAcrE;AAED,wBAAgB,kDAAkD,CAChE,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB;IACD,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb,CAmCA"}
package/dist/utils.js CHANGED
@@ -3,6 +3,7 @@ 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.supportedFlatConfigNames = void 0;
6
7
  exports.readJsonInTree = readJsonInTree;
7
8
  exports.updateJsonInTree = updateJsonInTree;
8
9
  exports.getTargetsConfigFromProject = getTargetsConfigFromProject;
@@ -16,12 +17,19 @@ exports.determineTargetProjectName = determineTargetProjectName;
16
17
  exports.updateSchematicCollections = updateSchematicCollections;
17
18
  exports.updateSchematicDefaults = updateSchematicDefaults;
18
19
  exports.shouldUseFlatConfig = shouldUseFlatConfig;
20
+ exports.resolveRootESLintConfigPath = resolveRootESLintConfigPath;
21
+ exports.determineNewProjectESLintConfigContentAndExtension = determineNewProjectESLintConfigContentAndExtension;
19
22
  const core_1 = require("@angular-devkit/core");
20
23
  const schematics_1 = require("@angular-devkit/schematics");
21
24
  const ignore_1 = __importDefault(require("ignore"));
22
25
  const semver_1 = __importDefault(require("semver"));
23
26
  const strip_json_comments_1 = __importDefault(require("strip-json-comments"));
24
27
  const DEFAULT_PREFIX = 'app';
28
+ exports.supportedFlatConfigNames = [
29
+ 'eslint.config.js',
30
+ 'eslint.config.mjs',
31
+ 'eslint.config.cjs',
32
+ ];
25
33
  /**
26
34
  * This method is specifically for reading JSON files in a Tree
27
35
  * @param host The host tree
@@ -112,12 +120,18 @@ function addESLintTargetToProject(projectName, targetName) {
112
120
  };
113
121
  let eslintConfig;
114
122
  if (existingProjectConfig.root !== '') {
115
- const flatConfigPath = (0, core_1.join)(existingProjectConfig.root, 'eslint.config.js');
116
- if (tree.exists(flatConfigPath)) {
117
- eslintConfig = flatConfigPath;
123
+ if (shouldUseFlatConfig(tree)) {
124
+ const rootConfigPath = resolveRootESLintConfigPath(tree);
125
+ if (!rootConfigPath || !rootConfigPath.endsWith('js')) {
126
+ throw new Error('Root ESLint config must be a JavaScript file (.js,.mjs,.cjs) when using Flat Config');
127
+ }
128
+ const { ext } = determineNewProjectESLintConfigContentAndExtension(tree, rootConfigPath, existingProjectConfig.root);
129
+ const flatConfigPath = (0, core_1.join)(existingProjectConfig.root, `eslint.config.${ext}`);
130
+ if (tree.exists(flatConfigPath)) {
131
+ eslintConfig = flatConfigPath;
132
+ }
118
133
  }
119
134
  }
120
- // TODO: fix
121
135
  eslintTargetConfig.options.eslintConfig = eslintConfig;
122
136
  existingProjectConfig.architect = existingProjectConfig.architect || {};
123
137
  existingProjectConfig.architect[targetName] = eslintTargetConfig;
@@ -214,13 +228,13 @@ function createRootESLintConfig(prefix) {
214
228
  };
215
229
  }
216
230
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
217
- function createStringifiedRootESLintConfig(prefix) {
231
+ function createStringifiedRootESLintConfig(prefix, isESM) {
218
232
  return `// @ts-check
219
- const eslint = require("@eslint/js");
220
- const tseslint = require("typescript-eslint");
221
- const angular = require("angular-eslint");
233
+ ${isESM ? 'import eslint from "@eslint/js";' : 'const eslint = require("@eslint/js");'}
234
+ ${isESM ? 'import tseslint from "typescript-eslint";' : 'const tseslint = require("typescript-eslint");'}
235
+ ${isESM ? 'import angular from "angular-eslint";' : 'const angular = require("angular-eslint");'}
222
236
 
223
- module.exports = tseslint.config(
237
+ ${isESM ? 'export default' : 'module.exports ='} tseslint.config(
224
238
  {
225
239
  files: ["**/*.ts"],
226
240
  extends: [
@@ -294,12 +308,13 @@ function createProjectESLintConfig(projectRoot, projectType, prefix, setParserOp
294
308
  ],
295
309
  };
296
310
  }
297
- function createStringifiedProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e) {
311
+ function createStringifiedProjectESLintConfig(projectRoot, projectType, prefix, setParserOptionsProject, hasE2e, isESM, rootConfigPath) {
312
+ const relativeRootConfigPath = offsetFromRoot(projectRoot) + rootConfigPath;
298
313
  return `// @ts-check
299
- const tseslint = require("typescript-eslint");
300
- const rootConfig = require("${offsetFromRoot(projectRoot)}eslint.config.js");
314
+ ${isESM ? 'import tseslint from "typescript-eslint";' : 'const tseslint = require("typescript-eslint");'}
315
+ ${isESM ? `import rootConfig from "${relativeRootConfigPath}";` : `const rootConfig = require("${relativeRootConfigPath}");`}
301
316
 
302
- module.exports = tseslint.config(
317
+ ${isESM ? 'export default' : 'module.exports ='} tseslint.config(
303
318
  ...rootConfig,
304
319
  {
305
320
  files: ["**/*.ts"],${setParserOptionsProject
@@ -342,7 +357,7 @@ function createESLintConfigForProject(projectName, setParserOptionsProject) {
342
357
  const { root: projectRoot, projectType, prefix, } = angularJSON.projects[projectName];
343
358
  const hasE2e = determineTargetProjectHasE2E(angularJSON, projectName);
344
359
  const useFlatConfig = shouldUseFlatConfig(tree);
345
- const alreadyHasRootFlatConfig = tree.exists('eslint.config.js');
360
+ const alreadyHasRootFlatConfig = exports.supportedFlatConfigNames.some((name) => tree.exists(name));
346
361
  const alreadyHasRootESLintRC = tree.exists('.eslintrc.json');
347
362
  /**
348
363
  * If the root is an empty string it must be the initial project created at the
@@ -357,7 +372,11 @@ function createESLintConfigForProject(projectName, setParserOptionsProject) {
357
372
  rules.push(createRootESLintConfigFile(prefix || DEFAULT_PREFIX, useFlatConfig));
358
373
  }
359
374
  if (useFlatConfig) {
360
- rules.push((tree) => tree.create((0, core_1.join)((0, core_1.normalize)(projectRoot), 'eslint.config.js'), createStringifiedProjectESLintConfig(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, setParserOptionsProject, hasE2e)));
375
+ const rootConfigPath = resolveRootESLintConfigPath(tree) ?? 'eslint.config.js';
376
+ rules.push((tree) => {
377
+ const { isESM, ext } = determineNewProjectESLintConfigContentAndExtension(tree, rootConfigPath, projectRoot);
378
+ return tree.create((0, core_1.join)((0, core_1.normalize)(projectRoot), `eslint.config.${ext}`), createStringifiedProjectESLintConfig(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, setParserOptionsProject, hasE2e, isESM, rootConfigPath));
379
+ });
361
380
  }
362
381
  else {
363
382
  rules.push(updateJsonInTree((0, core_1.join)((0, core_1.normalize)(projectRoot), '.eslintrc.json'), () => createProjectESLintConfig(projectRoot, projectType || 'library', prefix || DEFAULT_PREFIX, setParserOptionsProject, hasE2e)));
@@ -368,7 +387,10 @@ function createESLintConfigForProject(projectName, setParserOptionsProject) {
368
387
  function createRootESLintConfigFile(prefix, useFlatConfig) {
369
388
  return (tree) => {
370
389
  if (useFlatConfig) {
371
- return tree.create('eslint.config.js', createStringifiedRootESLintConfig(prefix));
390
+ // If the root package.json uses type: module, generate ESM content
391
+ const packageJson = readJsonInTree(tree, 'package.json');
392
+ const isESM = packageJson.type === 'module';
393
+ return tree.create('eslint.config.js', createStringifiedRootESLintConfig(prefix, isESM));
372
394
  }
373
395
  return updateJsonInTree('.eslintrc.json', () => createRootESLintConfig(prefix));
374
396
  };
@@ -440,7 +462,7 @@ function updateSchematicDefaults(angularJson, schematicFullName, defaultValues)
440
462
  function shouldUseFlatConfig(tree, existingJson) {
441
463
  let useFlatConfig = true;
442
464
  try {
443
- const alreadyHasRootFlatConfig = tree.exists('eslint.config.js');
465
+ const alreadyHasRootFlatConfig = exports.supportedFlatConfigNames.some((name) => tree.exists(name));
444
466
  const alreadyHasRootESLintRC = tree.exists('.eslintrc.json');
445
467
  if (alreadyHasRootFlatConfig) {
446
468
  useFlatConfig = true;
@@ -466,3 +488,54 @@ function shouldUseFlatConfig(tree, existingJson) {
466
488
  return useFlatConfig;
467
489
  }
468
490
  }
491
+ function resolveRootESLintConfigPath(tree) {
492
+ if (tree.exists('.eslintrc.json')) {
493
+ return '.eslintrc.json';
494
+ }
495
+ if (tree.exists('eslint.config.js')) {
496
+ return 'eslint.config.js';
497
+ }
498
+ if (tree.exists('eslint.config.mjs')) {
499
+ return 'eslint.config.mjs';
500
+ }
501
+ if (tree.exists('eslint.config.cjs')) {
502
+ return 'eslint.config.cjs';
503
+ }
504
+ return null;
505
+ }
506
+ function determineNewProjectESLintConfigContentAndExtension(tree, rootConfigPath, projectRoot) {
507
+ try {
508
+ /**
509
+ * The decision on exactly what config format an extension to use is based on the format
510
+ * used in the root config, and the project's local package.json type (if any).
511
+ */
512
+ const isRootESM = rootConfigPath.endsWith('.cjs')
513
+ ? false
514
+ : rootConfigPath.endsWith('.mjs') ||
515
+ readJsonInTree(tree, 'package.json').type === 'module';
516
+ const projectPackageJsonPath = (0, core_1.join)((0, core_1.normalize)(projectRoot), 'package.json');
517
+ let isESM = isRootESM;
518
+ let ext = 'js';
519
+ if (tree.exists(projectPackageJsonPath)) {
520
+ const projectPackageJson = readJsonInTree(tree, projectPackageJsonPath);
521
+ const isProjectESM = projectPackageJson.type === 'module';
522
+ if (isRootESM && !isProjectESM) {
523
+ ext = 'mjs';
524
+ isESM = true;
525
+ }
526
+ else if (!isRootESM && isProjectESM) {
527
+ ext = 'cjs';
528
+ }
529
+ }
530
+ return {
531
+ isESM,
532
+ ext,
533
+ };
534
+ }
535
+ catch {
536
+ return {
537
+ isESM: false,
538
+ ext: 'js',
539
+ };
540
+ }
541
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-eslint/schematics",
3
- "version": "18.3.2-alpha.9",
3
+ "version": "18.4.0",
4
4
  "description": "Angular Schematics for angular-eslint",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -39,12 +39,12 @@
39
39
  "ignore": "5.3.2",
40
40
  "semver": "7.6.3",
41
41
  "strip-json-comments": "3.1.1",
42
- "@angular-eslint/eslint-plugin": "18.3.2-alpha.9",
43
- "@angular-eslint/eslint-plugin-template": "18.3.2-alpha.9"
42
+ "@angular-eslint/eslint-plugin": "18.4.0",
43
+ "@angular-eslint/eslint-plugin-template": "18.4.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@typescript-eslint/utils": "8.5.0",
47
- "eslint": "9.9.1"
46
+ "@typescript-eslint/utils": "8.10.0",
47
+ "eslint": "9.13.0"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@angular-devkit/core": ">= 18.0.0 < 19.0.0",