This is an automated email from the ASF dual-hosted git repository.

MartijnVisser pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 0b16dd32ab1 [FLINK-40032][runtime-web] Migrate web-dashboard eslint to 
v9 (flat config)
0b16dd32ab1 is described below

commit 0b16dd32ab17a0458708c6d41f647975a337edac
Author: Purushottam Sinha <[email protected]>
AuthorDate: Fri Jul 3 02:26:04 2026 +0530

    [FLINK-40032][runtime-web] Migrate web-dashboard eslint to v9 (flat config)
    
    Replace .eslintrc.js and .eslintignore with eslint.config.js flat
    config. @angular-eslint 21 already supports eslint 9, so this adds the
    unified angular-eslint and typescript-eslint packages (which provide
    flat-config-ready presets and parser wiring) alongside the existing
    split @angular-eslint/* packages needed by the Angular CLI builder and
    schematics. eslint-plugin-prettier stays on v4.x since v5 requires
    prettier 3, which is a separate deferred upgrade.
    
    Generated-by: Claude Code (claude-opus-4-8)
---
 flink-runtime-web/web-dashboard/.eslintignore     |  28 --
 flink-runtime-web/web-dashboard/.eslintrc.js      | 159 -------
 flink-runtime-web/web-dashboard/eslint.config.js  | 192 +++++++++
 flink-runtime-web/web-dashboard/package-lock.json | 500 +++++++++++++---------
 flink-runtime-web/web-dashboard/package.json      |  14 +-
 5 files changed, 505 insertions(+), 388 deletions(-)

diff --git a/flink-runtime-web/web-dashboard/.eslintignore 
b/flink-runtime-web/web-dashboard/.eslintignore
deleted file mode 100644
index aa93ecd4c68..00000000000
--- a/flink-runtime-web/web-dashboard/.eslintignore
+++ /dev/null
@@ -1,28 +0,0 @@
-.idea
-gen
-web
-/tsc-out
-/dist
-
-# Logs
-/logs
-*.log
-npm-debug.log*
-
-# Dependency directories
-node_modules/
-
-# TypeScript cache
-*.tsbuildinfo
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# dotenv environment variables file
-.env
-.env.test
-
-.cache
diff --git a/flink-runtime-web/web-dashboard/.eslintrc.js 
b/flink-runtime-web/web-dashboard/.eslintrc.js
deleted file mode 100644
index 6eb9fd825e2..00000000000
--- a/flink-runtime-web/web-dashboard/.eslintrc.js
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-module.exports = {
-  root: true,
-  overrides: [
-    {
-      files: ['*.ts'],
-      parser: '@typescript-eslint/parser',
-      parserOptions: {
-        ecmaVersion: 2021,
-        sourceType: 'module',
-        tsconfigRootDir: __dirname,
-        project: ['tsconfig.json'],
-        createDefaultProgram: true
-      },
-      plugins: ['@typescript-eslint', 'jsdoc', 'import', 'unused-imports'],
-      extends: [
-        'plugin:@angular-eslint/recommended',
-        'plugin:@angular-eslint/template/process-inline-templates',
-        'plugin:prettier/recommended'
-      ],
-      rules: {
-        'jsdoc/tag-lines': [
-          'error',
-          'never',
-          {
-            "startLines": 1
-          }
-        ],
-        '@angular-eslint/no-host-metadata-property': 'off',
-        '@angular-eslint/prefer-inject': 'off',
-        '@typescript-eslint/no-explicit-any': 'error',
-        '@typescript-eslint/no-non-null-assertion': 'off',
-        '@typescript-eslint/array-type': [
-          'error',
-          {
-            default: 'array-simple'
-          }
-        ],
-        '@typescript-eslint/no-wrapper-object-types': 'error',
-        '@typescript-eslint/no-unsafe-function-type': 'error',
-        '@typescript-eslint/no-empty-object-type': [
-          'error',
-          {
-              allowInterfaces: 'always' // 
flink-runtime-web/web-dashboard/src/app/interfaces/job-checkpoint.ts 
(PendingSubTaskCheckpointStatistics)
-          }
-        ],
-        '@typescript-eslint/consistent-type-definitions': 'error',
-        '@typescript-eslint/explicit-member-accessibility': [
-          'off',
-          {
-            accessibility: 'explicit'
-          }
-        ],
-        '@typescript-eslint/no-floating-promises': 'off',
-        '@typescript-eslint/no-for-in-array': 'error',
-        '@typescript-eslint/no-inferrable-types': [
-          'error',
-          {
-            ignoreParameters: true,
-            ignoreProperties: true
-          }
-        ],
-        '@typescript-eslint/no-this-alias': 'error',
-        '@typescript-eslint/naming-convention': 'off',
-        '@typescript-eslint/no-unused-expressions': 'off',
-        '@typescript-eslint/explicit-function-return-type': [
-          'error',
-          {
-            allowExpressions: true,
-            allowConciseArrowFunctionExpressionsStartingWithVoid: true
-          }
-        ],
-        'prefer-arrow/prefer-arrow-functions': 'off',
-        'unused-imports/no-unused-imports': 'error',
-        'import/no-duplicates': 'error',
-        'import/no-unused-modules': 'error',
-        'import/no-unassigned-import': ['error', { allow: 
['@angular/localize/init', 'zone.js', 'zone.js/**'] }],
-        'import/order': [
-          'error',
-          {
-            alphabetize: {
-              order: 'asc',
-              caseInsensitive: false
-            },
-            'newlines-between': 'always',
-            groups: ['external', 'builtin', 'internal', ['parent', 'sibling', 
'index']],
-            pathGroups: [
-              {
-                pattern: '{@angular/**,rxjs,rxjs/operators}',
-                group: 'external',
-                position: 'before'
-              },
-              {
-                pattern: '{services,interfaces,utils,config}',
-                group: 'internal',
-                position: 'before'
-              }
-            ],
-            pathGroupsExcludedImportTypes: []
-          }
-        ],
-        'no-empty-function': 'off',
-        'no-unused-expressions': 'error',
-        'no-use-before-define': 'off',
-        'no-bitwise': 'off',
-        'no-duplicate-imports': 'error',
-        'no-invalid-this': 'off',
-        'no-irregular-whitespace': 'error',
-        'no-magic-numbers': 'off',
-        'no-multiple-empty-lines': 'error',
-        'no-redeclare': 'off',
-        'no-underscore-dangle': 'off',
-        'no-sparse-arrays': 'error',
-        'no-template-curly-in-string': 'off',
-        'prefer-object-spread': 'error',
-        'prefer-template': 'error',
-        yoda: 'error'
-      }
-    },
-    {
-      files: ['*.html'],
-      extends: ['plugin:@angular-eslint/template/recommended'],
-      rules: {
-        // The @if/@for control-flow migration is deferred to a dedicated 
follow-up (needs prettier 3
-        // to format it); keep *ngIf/*ngFor in this dependency-upgrade PR.
-        '@angular-eslint/template/prefer-control-flow': 'off'
-      }
-    },
-    {
-      files: ['*.html'],
-      excludedFiles: ['*inline-template-*.component.html'],
-      extends: ['plugin:prettier/recommended'],
-      rules: {
-        'prettier/prettier': [
-          'error',
-          {
-            parser: 'angular'
-          }
-        ]
-      }
-    }
-  ]
-};
diff --git a/flink-runtime-web/web-dashboard/eslint.config.js 
b/flink-runtime-web/web-dashboard/eslint.config.js
new file mode 100644
index 00000000000..cc3a8a83cd1
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/eslint.config.js
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+const { defineConfig, globalIgnores } = require('eslint/config');
+const angular = require('angular-eslint');
+const tseslint = require('typescript-eslint');
+const eslintConfigPrettier = require('eslint-config-prettier');
+const eslintPluginPrettier = require('eslint-plugin-prettier');
+const jsdocPlugin = require('eslint-plugin-jsdoc');
+const importPlugin = require('eslint-plugin-import');
+const unusedImportsPlugin = require('eslint-plugin-unused-imports');
+const preferArrowPlugin = require('eslint-plugin-prefer-arrow');
+
+module.exports = defineConfig([
+  globalIgnores([
+    '.idea',
+    'gen',
+    'web',
+    'tsc-out',
+    'dist',
+    'logs',
+    '**/*.log',
+    'npm-debug.log*',
+    'node_modules',
+    '**/*.tsbuildinfo',
+    '.npm',
+    '.eslintcache',
+    '.env',
+    '.env.test',
+    '.cache'
+  ]),
+  {
+    files: ['**/*.ts'],
+    extends: [...angular.configs.tsRecommended],
+    processor: angular.processInlineTemplates,
+    languageOptions: {
+      parser: tseslint.parser,
+      parserOptions: {
+        ecmaVersion: 2021,
+        sourceType: 'module',
+        tsconfigRootDir: __dirname,
+        project: ['tsconfig.json']
+      }
+    },
+    plugins: {
+      '@typescript-eslint': tseslint.plugin,
+      jsdoc: jsdocPlugin,
+      import: importPlugin,
+      'unused-imports': unusedImportsPlugin,
+      'prefer-arrow': preferArrowPlugin,
+      prettier: eslintPluginPrettier
+    },
+    rules: {
+      ...eslintConfigPrettier.rules,
+      'prettier/prettier': 'error',
+      'jsdoc/tag-lines': [
+        'error',
+        'never',
+        {
+          "startLines": 1
+        }
+      ],
+      '@angular-eslint/no-host-metadata-property': 'off',
+      '@angular-eslint/prefer-inject': 'off',
+      '@typescript-eslint/no-explicit-any': 'error',
+      '@typescript-eslint/no-non-null-assertion': 'off',
+      '@typescript-eslint/array-type': [
+        'error',
+        {
+          default: 'array-simple'
+        }
+      ],
+      '@typescript-eslint/no-wrapper-object-types': 'error',
+      '@typescript-eslint/no-unsafe-function-type': 'error',
+      '@typescript-eslint/no-empty-object-type': [
+        'error',
+        {
+            allowInterfaces: 'always' // 
flink-runtime-web/web-dashboard/src/app/interfaces/job-checkpoint.ts 
(PendingSubTaskCheckpointStatistics)
+        }
+      ],
+      '@typescript-eslint/consistent-type-definitions': 'error',
+      '@typescript-eslint/explicit-member-accessibility': [
+        'off',
+        {
+          accessibility: 'explicit'
+        }
+      ],
+      '@typescript-eslint/no-floating-promises': 'off',
+      '@typescript-eslint/no-for-in-array': 'error',
+      '@typescript-eslint/no-inferrable-types': [
+        'error',
+        {
+          ignoreParameters: true,
+          ignoreProperties: true
+        }
+      ],
+      '@typescript-eslint/no-this-alias': 'error',
+      '@typescript-eslint/naming-convention': 'off',
+      '@typescript-eslint/no-unused-expressions': 'off',
+      '@typescript-eslint/explicit-function-return-type': [
+        'error',
+        {
+          allowExpressions: true,
+          allowConciseArrowFunctionExpressionsStartingWithVoid: true
+        }
+      ],
+      'prefer-arrow/prefer-arrow-functions': 'off',
+      'unused-imports/no-unused-imports': 'error',
+      'import/no-duplicates': 'error',
+      'import/no-unused-modules': 'error',
+      'import/no-unassigned-import': ['error', { allow: 
['@angular/localize/init', 'zone.js', 'zone.js/**'] }],
+      'import/order': [
+        'error',
+        {
+          alphabetize: {
+            order: 'asc',
+            caseInsensitive: false
+          },
+          'newlines-between': 'always',
+          groups: ['external', 'builtin', 'internal', ['parent', 'sibling', 
'index']],
+          pathGroups: [
+            {
+              pattern: '{@angular/**,rxjs,rxjs/operators}',
+              group: 'external',
+              position: 'before'
+            },
+            {
+              pattern: '{services,interfaces,utils,config}',
+              group: 'internal',
+              position: 'before'
+            }
+          ],
+          pathGroupsExcludedImportTypes: []
+        }
+      ],
+      'no-empty-function': 'off',
+      'no-unused-expressions': 'error',
+      'no-use-before-define': 'off',
+      'no-bitwise': 'off',
+      'no-duplicate-imports': 'error',
+      'no-invalid-this': 'off',
+      'no-irregular-whitespace': 'error',
+      'no-magic-numbers': 'off',
+      'no-multiple-empty-lines': 'error',
+      'no-redeclare': 'off',
+      'no-underscore-dangle': 'off',
+      'no-sparse-arrays': 'error',
+      'no-template-curly-in-string': 'off',
+      'prefer-object-spread': 'error',
+      'prefer-template': 'error',
+      yoda: 'error'
+    }
+  },
+  {
+    files: ['**/*.html'],
+    extends: [...angular.configs.templateRecommended],
+    rules: {
+      // The @if/@for control-flow migration is deferred to a dedicated 
follow-up (needs prettier 3
+      // to format it); keep *ngIf/*ngFor in this dependency-upgrade PR.
+      '@angular-eslint/template/prefer-control-flow': 'off'
+    }
+  },
+  {
+    files: ['**/*.html'],
+    ignores: ['**/*inline-template-*.component.html'],
+    plugins: {
+      prettier: eslintPluginPrettier
+    },
+    rules: {
+      'prettier/prettier': [
+        'error',
+        {
+          parser: 'angular'
+        }
+      ]
+    }
+  }
+]);
diff --git a/flink-runtime-web/web-dashboard/package-lock.json 
b/flink-runtime-web/web-dashboard/package-lock.json
index d55221c730e..517e86e548a 100644
--- a/flink-runtime-web/web-dashboard/package-lock.json
+++ b/flink-runtime-web/web-dashboard/package-lock.json
@@ -41,10 +41,9 @@
         "@types/jasmine": "~3.10.19",
         "@types/jasminewd2": "~2.0.13",
         "@types/node": "^22.16.0",
-        "@typescript-eslint/eslint-plugin": "^8.62.1",
-        "@typescript-eslint/parser": "^8.62.1",
-        "eslint": "^8.57.1",
-        "eslint-config-prettier": "^8.10.2",
+        "angular-eslint": "21.4.0",
+        "eslint": "^9.39.4",
+        "eslint-config-prettier": "^10.1.8",
         "eslint-plugin-import": "^2.32.0",
         "eslint-plugin-jsdoc": "^50.8.0",
         "eslint-plugin-prefer-arrow": "^1.2.3",
@@ -59,7 +58,8 @@
         "stylelint-order": "^5.0.0",
         "stylelint-prettier": "^2.0.0",
         "ts-node": "^10.9.2",
-        "typescript": "~5.9.3"
+        "typescript": "~5.9.3",
+        "typescript-eslint": "^8.62.1"
       }
     },
     "node_modules/@algolia/abtesting": {
@@ -4228,25 +4228,97 @@
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
     },
+    "node_modules/@eslint/config-array": {
+      "version": "0.21.2",
+      "resolved": 
"https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz";,
+      "integrity": 
"sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/object-schema": "^2.1.7",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.5"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": 
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz";,
+      "integrity": 
"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+      "version": "1.1.15",
+      "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz";,
+      "integrity": 
"sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/minimatch": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz";,
+      "integrity": 
"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.4.2",
+      "resolved": 
"https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz";,
+      "integrity": 
"sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.17.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/core": {
+      "version": "0.17.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz";,
+      "integrity": 
"sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.1.4",
-      "resolved": 
"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz";,
-      "integrity": 
"sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+      "version": "3.3.5",
+      "resolved": 
"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz";,
+      "integrity": 
"sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "ajv": "^6.12.4",
+        "ajv": "^6.14.0",
         "debug": "^4.3.2",
-        "espree": "^9.6.0",
-        "globals": "^13.19.0",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^3.1.2",
+        "js-yaml": "^4.1.1",
+        "minimatch": "^3.1.5",
         "strip-json-comments": "^3.1.1"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint";
@@ -4318,13 +4390,40 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.57.1",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz";,
-      "integrity": 
"sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+      "version": "9.39.4",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz";,
+      "integrity": 
"sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate";
+      }
+    },
+    "node_modules/@eslint/object-schema": {
+      "version": "2.1.7",
+      "resolved": 
"https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz";,
+      "integrity": 
"sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/plugin-kit": {
+      "version": "0.4.1",
+      "resolved": 
"https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz";,
+      "integrity": 
"sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.17.0",
+        "levn": "^0.4.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
     "node_modules/@gar/promise-retry": {
@@ -4358,51 +4457,42 @@
         "hono": "^4"
       }
     },
-    "node_modules/@humanwhocodes/config-array": {
-      "version": "0.13.0",
-      "resolved": 
"https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz";,
-      "integrity": 
"sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
-      "deprecated": "Use @eslint/config-array instead",
+    "node_modules/@humanfs/core": {
+      "version": "0.19.2",
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz";,
+      "integrity": 
"sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@humanwhocodes/object-schema": "^2.0.3",
-        "debug": "^4.3.1",
-        "minimatch": "^3.0.5"
+        "@humanfs/types": "^0.15.0"
       },
       "engines": {
-        "node": ">=10.10.0"
+        "node": ">=18.18.0"
       }
     },
-    "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": 
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz";,
-      "integrity": 
"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+    "node_modules/@humanfs/node": {
+      "version": "0.16.8",
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz";,
+      "integrity": 
"sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
       "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
-      "version": "1.1.15",
-      "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz";,
-      "integrity": 
"sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
-      "dev": true,
-      "license": "MIT",
+      "license": "Apache-2.0",
       "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+        "@humanfs/core": "^0.19.2",
+        "@humanfs/types": "^0.15.0",
+        "@humanwhocodes/retry": "^0.4.0"
+      },
+      "engines": {
+        "node": ">=18.18.0"
       }
     },
-    "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz";,
-      "integrity": 
"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+    "node_modules/@humanfs/types": {
+      "version": "0.15.0",
+      "resolved": 
"https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz";,
+      "integrity": 
"sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
       "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
+      "license": "Apache-2.0",
       "engines": {
-        "node": "*"
+        "node": ">=18.18.0"
       }
     },
     "node_modules/@humanwhocodes/module-importer": {
@@ -4419,13 +4509,19 @@
         "url": "https://github.com/sponsors/nzakas";
       }
     },
-    "node_modules/@humanwhocodes/object-schema": {
-      "version": "2.0.3",
-      "resolved": 
"https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz";,
-      "integrity": 
"sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
-      "deprecated": "Use @eslint/object-schema instead",
+    "node_modules/@humanwhocodes/retry": {
+      "version": "0.4.3",
+      "resolved": 
"https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz";,
+      "integrity": 
"sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
       "dev": true,
-      "license": "BSD-3-Clause"
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas";
+      }
     },
     "node_modules/@inquirer/ansi": {
       "version": "1.0.2",
@@ -8193,13 +8289,6 @@
         "url": "https://opencollective.com/eslint";
       }
     },
-    "node_modules/@ungap/structured-clone": {
-      "version": "1.3.2",
-      "resolved": 
"https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz";,
-      "integrity": 
"sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.14.1",
       "resolved": 
"https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz";,
@@ -8568,6 +8657,30 @@
         "node": ">= 14.0.0"
       }
     },
+    "node_modules/angular-eslint": {
+      "version": "21.4.0",
+      "resolved": 
"https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.4.0.tgz";,
+      "integrity": 
"sha512-LH7bWmtJvsubzwPoztnl1pWgI5X0VrfGTUITGSYcwn2J+SXuN/avzrKrxJmhUiIrNvLtfV+18GG6xZS1IGZdKg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@angular-devkit/core": ">= 21.0.0 < 22.0.0",
+        "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0",
+        "@angular-eslint/builder": "21.4.0",
+        "@angular-eslint/eslint-plugin": "21.4.0",
+        "@angular-eslint/eslint-plugin-template": "21.4.0",
+        "@angular-eslint/schematics": "21.4.0",
+        "@angular-eslint/template-parser": "21.4.0",
+        "@typescript-eslint/types": "^8.0.0",
+        "@typescript-eslint/utils": "^8.0.0"
+      },
+      "peerDependencies": {
+        "@angular/cli": ">= 21.0.0 < 22.0.0",
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": "*",
+        "typescript-eslint": "^8.0.0"
+      }
+    },
     "node_modules/ansi-colors": {
       "version": "4.1.3",
       "resolved": 
"https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz";,
@@ -10801,19 +10914,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz";,
-      "integrity": 
"sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
     "node_modules/dom-serializer": {
       "version": "2.0.0",
       "resolved": 
"https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz";,
@@ -11272,71 +11372,77 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.57.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz";,
-      "integrity": 
"sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
-      "deprecated": "This version is no longer supported. Please see 
https://eslint.org/version-support for other options.",
+      "version": "9.39.4",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz";,
+      "integrity": 
"sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.6.1",
-        "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.57.1",
-        "@humanwhocodes/config-array": "^0.13.0",
+        "@eslint-community/eslint-utils": "^4.8.0",
+        "@eslint-community/regexpp": "^4.12.1",
+        "@eslint/config-array": "^0.21.2",
+        "@eslint/config-helpers": "^0.4.2",
+        "@eslint/core": "^0.17.0",
+        "@eslint/eslintrc": "^3.3.5",
+        "@eslint/js": "9.39.4",
+        "@eslint/plugin-kit": "^0.4.1",
+        "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@nodelib/fs.walk": "^1.2.8",
-        "@ungap/structured-clone": "^1.2.0",
-        "ajv": "^6.12.4",
+        "@humanwhocodes/retry": "^0.4.2",
+        "@types/estree": "^1.0.6",
+        "ajv": "^6.14.0",
         "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
+        "cross-spawn": "^7.0.6",
         "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.2.2",
-        "eslint-visitor-keys": "^3.4.3",
-        "espree": "^9.6.1",
-        "esquery": "^1.4.2",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
+        "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
+        "file-entry-cache": "^8.0.0",
         "find-up": "^5.0.0",
         "glob-parent": "^6.0.2",
-        "globals": "^13.19.0",
-        "graphemer": "^1.4.0",
         "ignore": "^5.2.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
-        "is-path-inside": "^3.0.3",
-        "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
-        "minimatch": "^3.1.2",
+        "minimatch": "^3.1.5",
         "natural-compare": "^1.4.0",
-        "optionator": "^0.9.3",
-        "strip-ansi": "^6.0.1",
-        "text-table": "^0.2.0"
+        "optionator": "^0.9.3"
       },
       "bin": {
         "eslint": "bin/eslint.js"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
-        "url": "https://opencollective.com/eslint";
+        "url": "https://eslint.org/donate";
+      },
+      "peerDependencies": {
+        "jiti": "*"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        }
       }
     },
     "node_modules/eslint-config-prettier": {
-      "version": "8.10.2",
-      "resolved": 
"https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz";,
-      "integrity": 
"sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==",
+      "version": "10.1.8",
+      "resolved": 
"https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz";,
+      "integrity": 
"sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
       "dev": true,
       "license": "MIT",
       "bin": {
         "eslint-config-prettier": "bin/cli.js"
       },
+      "funding": {
+        "url": "https://opencollective.com/eslint-config-prettier";
+      },
       "peerDependencies": {
         "eslint": ">=7.0.0"
       }
@@ -11538,37 +11644,6 @@
         "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
       }
     },
-    "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
-      "version": "4.2.1",
-      "resolved": 
"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz";,
-      "integrity": 
"sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint";
-      }
-    },
-    "node_modules/eslint-plugin-jsdoc/node_modules/espree": {
-      "version": "10.4.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz";,
-      "integrity": 
"sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "acorn": "^8.15.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint";
-      }
-    },
     "node_modules/eslint-plugin-prefer-arrow": {
       "version": "1.2.3",
       "resolved": 
"https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz";,
@@ -11685,9 +11760,9 @@
       }
     },
     "node_modules/eslint/node_modules/eslint-scope": {
-      "version": "7.2.2",
-      "resolved": 
"https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz";,
-      "integrity": 
"sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+      "version": "8.4.0",
+      "resolved": 
"https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz";,
+      "integrity": 
"sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -11695,12 +11770,52 @@
         "estraverse": "^5.2.0"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint";
+      }
+    },
+    "node_modules/eslint/node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": 
"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz";,
+      "integrity": 
"sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint";
       }
     },
+    "node_modules/eslint/node_modules/file-entry-cache": {
+      "version": "8.0.0",
+      "resolved": 
"https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz";,
+      "integrity": 
"sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/eslint/node_modules/flat-cache": {
+      "version": "4.0.1",
+      "resolved": 
"https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz";,
+      "integrity": 
"sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.4"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
     "node_modules/eslint/node_modules/ignore": {
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz";,
@@ -11732,18 +11847,31 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz";,
-      "integrity": 
"sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz";,
+      "integrity": 
"sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "acorn": "^8.9.0",
+        "acorn": "^8.15.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.1"
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint";
+      }
+    },
+    "node_modules/espree/node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": 
"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz";,
+      "integrity": 
"sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint";
@@ -12504,16 +12632,13 @@
       }
     },
     "node_modules/globals": {
-      "version": "13.24.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz";,
-      "integrity": 
"sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz";,
+      "integrity": 
"sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
       "dev": true,
       "license": "MIT",
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus";
@@ -12594,13 +12719,6 @@
       "dev": true,
       "license": "ISC"
     },
-    "node_modules/graphemer": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz";,
-      "integrity": 
"sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/handle-thing": {
       "version": "2.0.1",
       "resolved": 
"https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz";,
@@ -13508,16 +13626,6 @@
         "url": "https://github.com/sponsors/ljharb";
       }
     },
-    "node_modules/is-path-inside": {
-      "version": "3.0.3",
-      "resolved": 
"https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz";,
-      "integrity": 
"sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/is-plain-obj": {
       "version": "1.1.0",
       "resolved": 
"https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz";,
@@ -18845,13 +18953,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "resolved": 
"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz";,
-      "integrity": 
"sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/thingies": {
       "version": "2.6.0",
       "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz";,
@@ -19090,19 +19191,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/type-fest": {
-      "version": "0.20.2",
-      "resolved": 
"https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz";,
-      "integrity": 
"sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus";
-      }
-    },
     "node_modules/type-is": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz";,
@@ -19235,6 +19323,30 @@
         "node": ">=14.17"
       }
     },
+    "node_modules/typescript-eslint": {
+      "version": "8.62.1",
+      "resolved": 
"https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.62.1.tgz";,
+      "integrity": 
"sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/eslint-plugin": "8.62.1",
+        "@typescript-eslint/parser": "8.62.1",
+        "@typescript-eslint/typescript-estree": "8.62.1",
+        "@typescript-eslint/utils": "8.62.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint";
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+        "typescript": ">=4.8.4 <6.1.0"
+      }
+    },
     "node_modules/unbox-primitive": {
       "version": "1.1.0",
       "resolved": 
"https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz";,
diff --git a/flink-runtime-web/web-dashboard/package.json 
b/flink-runtime-web/web-dashboard/package.json
index 86ede5adaa7..01eda021d79 100644
--- a/flink-runtime-web/web-dashboard/package.json
+++ b/flink-runtime-web/web-dashboard/package.json
@@ -4,8 +4,8 @@
   "scripts": {
     "start": "ng serve",
     "build": "ng build --configuration production --base-href ./",
-    "lint": "eslint --cache src --ext .ts,.html && stylelint \"**/*.less\"",
-    "lint:fix": "eslint --fix --cache src --ext .ts,.html && stylelint 
\"**/*.less\" --fix",
+    "lint": "eslint --cache \"src/**/*.{ts,html}\" && stylelint \"**/*.less\"",
+    "lint:fix": "eslint --fix --cache \"src/**/*.{ts,html}\" && stylelint 
\"**/*.less\" --fix",
     "ci-check": "npm run lint && npm run build",
     "proxy": "ng serve --proxy-config proxy.conf.json"
   },
@@ -44,10 +44,9 @@
     "@types/jasmine": "~3.10.19",
     "@types/jasminewd2": "~2.0.13",
     "@types/node": "^22.16.0",
-    "@typescript-eslint/eslint-plugin": "^8.62.1",
-    "@typescript-eslint/parser": "^8.62.1",
-    "eslint": "^8.57.1",
-    "eslint-config-prettier": "^8.10.2",
+    "angular-eslint": "21.4.0",
+    "eslint": "^9.39.4",
+    "eslint-config-prettier": "^10.1.8",
     "eslint-plugin-import": "^2.32.0",
     "eslint-plugin-jsdoc": "^50.8.0",
     "eslint-plugin-prefer-arrow": "^1.2.3",
@@ -62,6 +61,7 @@
     "stylelint-order": "^5.0.0",
     "stylelint-prettier": "^2.0.0",
     "ts-node": "^10.9.2",
-    "typescript": "~5.9.3"
+    "typescript": "~5.9.3",
+    "typescript-eslint": "^8.62.1"
   }
 }


Reply via email to