diff --git a/addons/api/.eslintignore b/addons/api/.eslintignore deleted file mode 100644 index 768fab33b..000000000 --- a/addons/api/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/declarations/ -/dist/ - -# misc -/coverage/ -!.* -.*/ - -# ember-try -/.node_modules.ember-try/ diff --git a/addons/api/.eslintrc.js b/addons/api/.eslintrc.js deleted file mode 100644 index d68f86fc2..000000000 --- a/addons/api/.eslintrc.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, - // end of babel-config - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'], - env: { - browser: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'ember/no-get': 'off', - 'ember/no-get-with-default': 'off', - 'ember/no-computed-properties-in-native-classes': 'off', - 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': - 'off', - }, - overrides: [ - // node files - { - files: [ - './.eslintrc.js', - './.prettierrc.js', - './.template-lintrc.js', - './ember-cli-build.js', - './index.js', - './testem.js', - './blueprints/*/index.js', - './config/**/*.js', - './tests/dummy/config/**/*.js', - './broccoli-plugins/**/*.js', - ], - parserOptions: { - sourceType: 'script', - }, - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - // test files - files: ['tests/**/*-test.{js,ts}'], - extends: ['plugin:qunit/recommended'], - rules: { - 'qunit/require-expect': [2, 'except-simple'], - }, - }, - ], -}; diff --git a/addons/api/addon/adapters/host-catalog.js b/addons/api/addon/adapters/host-catalog.js index a561dd321..49671d5f7 100644 --- a/addons/api/addon/adapters/host-catalog.js +++ b/addons/api/addon/adapters/host-catalog.js @@ -23,7 +23,7 @@ export default class HostCatalogAdapter extends ApplicationAdapter { try { const pluginName = snapshot.attr('plugin')?.name; if (pluginName) url = `${url}?plugin_name=${pluginName}`; - } catch (e) { + } catch { // Ignore any adapter errors here } } diff --git a/addons/api/addon/adapters/session-recording.js b/addons/api/addon/adapters/session-recording.js index 0c8488c4d..fbee219ed 100644 --- a/addons/api/addon/adapters/session-recording.js +++ b/addons/api/addon/adapters/session-recording.js @@ -23,7 +23,7 @@ export default class SessionRecordingAdapter extends ApplicationAdapter { let method; try { method = snapshot?.adapterOptions?.method; - } catch (e) { + } catch { // Ignore any adapter errors here } if (method === 'download') { diff --git a/addons/api/addon/adapters/storage-bucket.js b/addons/api/addon/adapters/storage-bucket.js index c6f5d55eb..17e805468 100644 --- a/addons/api/addon/adapters/storage-bucket.js +++ b/addons/api/addon/adapters/storage-bucket.js @@ -22,7 +22,7 @@ export default class StorageBucketAdapter extends ApplicationAdapter { let pluginName; try { pluginName = snapshot?.attr('plugin')?.name; - } catch (e) { + } catch { // Ignore any adapter errors here } if (requestType === 'createRecord' && pluginName) { diff --git a/addons/api/addon/services/store.js b/addons/api/addon/services/store.js index 68db8b3a4..cec8bb981 100644 --- a/addons/api/addon/services/store.js +++ b/addons/api/addon/services/store.js @@ -4,8 +4,6 @@ */ // Importing 'Store' from 'ember-data/store' to get default configuration automatically. -// TODO: Remove eslint-disable after upgrading to eslint-plugin-ember >= v12.2.1 -// eslint-disable-next-line ember/use-ember-data-rfc-395-imports import Store from 'ember-data/store'; import { CacheHandler } from '@ember-data/store'; import RequestManager from '@ember-data/request'; diff --git a/addons/api/app/mirage/factories/role.js b/addons/api/app/mirage/factories/role.js index 9d9491f7b..dbfded391 100644 --- a/addons/api/app/mirage/factories/role.js +++ b/addons/api/app/mirage/factories/role.js @@ -25,7 +25,6 @@ export default factory.extend({ 'remove-principals', 'set-grant-scopes', ], - // eslint-disable-next-line ember/avoid-leaking-state-in-ember-objects grant_strings: () => [ 'ids=*;action=*', 'ids=*;type=host-catalog;actions=create,read', diff --git a/addons/api/eslint.config.js b/addons/api/eslint.config.js new file mode 100644 index 000000000..61da4dd9f --- /dev/null +++ b/addons/api/eslint.config.js @@ -0,0 +1,91 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +'use strict'; + +/* eslint-disable n/no-unpublished-require */ +const { defineConfig, globalIgnores } = require('eslint/config'); +const babelParser = require('@babel/eslint-parser'); +const js = require('@eslint/js'); +const eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended'); +const nPlugin = require('eslint-plugin-n'); +const qunitPlugin = require('eslint-plugin-qunit'); +const eslintConfigPrettier = require('eslint-config-prettier/flat'); +const globals = require('globals'); + +module.exports = defineConfig([ + js.configs.recommended, + ...eslintPluginEmberRecommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + // This is specific babel-config. If it grows consider creating a babel config file + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { decoratorsBeforeExport: true }, + ], + ], + }, + // end of babel-config + }, + globals: { + ...globals.browser, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'ember/no-get': 'off', + 'ember/no-get-with-default': 'off', + 'ember/no-computed-properties-in-native-classes': 'off', + 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': + 'off', + }, + }, + + // Node files configuration + { + files: [ + 'eslint.config.js', + '.prettierrc.js', + '.template-lintrc.js', + 'ember-cli-build.js', + 'index.js', + 'testem.js', + 'blueprints/*/index.js', + 'config/**/*.js', + 'tests/dummy/config/**/*.js', + 'broccoli-plugins/**/*.js', + ], + plugins: { n: nPlugin }, + extends: [nPlugin.configs['flat/recommended-script']], + }, + + // Test files configuration + { + files: ['tests/**/*-test.{js,ts}'], + extends: [ + { ...qunitPlugin.configs.recommended, plugins: { qunit: qunitPlugin } }, + ], + rules: { + 'qunit/require-expect': [2, 'except-simple'], + }, + }, + // Prettier should be last + eslintConfigPrettier, + globalIgnores([ + 'blueprints/*/files/', + 'declarations/', + 'dist/', + 'coverage/', + '**/.*/', + '.node_modules.ember-try/', + ]), +]); diff --git a/addons/api/package.json b/addons/api/package.json index b65581f89..51f181564 100644 --- a/addons/api/package.json +++ b/addons/api/package.json @@ -72,11 +72,13 @@ "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^6.0.0", "ember-try": "^3.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-ember": "^12.2.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-qunit": "^8.1.2", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-ember": "^12.7.5", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-qunit": "^8.2.6", + "@eslint/js": "^9.18.0", + "globals": "^15.14.0", "loader.js": "^4.7.0", "prettier": "^3.3.3", "qunit": "^2.22.0", diff --git a/addons/api/tests/unit/mixins/adapter-build-url-test.js b/addons/api/tests/unit/mixins/adapter-build-url-test.js index 7cde77201..1f2f1fa89 100644 --- a/addons/api/tests/unit/mixins/adapter-build-url-test.js +++ b/addons/api/tests/unit/mixins/adapter-build-url-test.js @@ -13,7 +13,7 @@ module('Unit | Mixin | build-url', function (hooks) { setupTest(hooks); test('it does not interfere with basic URLs', function (assert) { - /* eslint-disable-next-line ember/no-new-mixins, ember/no-classic-classes */ + /* eslint-disable-next-line ember/no-new-mixins */ const Adapter = RESTAdapter.extend(AdapterBuildURLMixin); this.owner.register('adapter:adapter', Adapter); const adapter = this.owner.lookup('adapter:adapter'); diff --git a/addons/api/tests/unit/models/group-test.js b/addons/api/tests/unit/models/group-test.js index 19b7b3cab..4e5dccb52 100644 --- a/addons/api/tests/unit/models/group-test.js +++ b/addons/api/tests/unit/models/group-test.js @@ -47,7 +47,6 @@ module('Unit | Model | group', function (hooks) { attributes: {}, }, }); - // eslint-disable-next-line no-self-assign group.member_ids = [...group.member_ids]; assert.strictEqual( group.member_ids.length, diff --git a/addons/api/tests/unit/models/target-test.js b/addons/api/tests/unit/models/target-test.js index efe072caf..b3af94407 100644 --- a/addons/api/tests/unit/models/target-test.js +++ b/addons/api/tests/unit/models/target-test.js @@ -268,7 +268,6 @@ module('Unit | Model | target', function (hooks) { attributes: {}, }, }); - /* eslint-enable no-self-assign */ assert.strictEqual( target.brokered_credential_source_ids.length, 2, diff --git a/addons/auth/.eslintignore b/addons/auth/.eslintignore deleted file mode 100644 index 768fab33b..000000000 --- a/addons/auth/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/declarations/ -/dist/ - -# misc -/coverage/ -!.* -.*/ - -# ember-try -/.node_modules.ember-try/ diff --git a/addons/auth/.eslintrc.js b/addons/auth/.eslintrc.js deleted file mode 100644 index 800217034..000000000 --- a/addons/auth/.eslintrc.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, - // end of babel-config - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'], - env: { - browser: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'ember/no-get': 'off', - 'ember/no-get-with-default': 'off', - 'ember/no-computed-properties-in-native-classes': 'off', - 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': - 'off', - }, - overrides: [ - // node files - { - files: [ - './.eslintrc.js', - './.prettierrc.js', - './.stylelintrc.js', - './.template-lintrc.js', - './ember-cli-build.js', - './index.js', - './testem.js', - './blueprints/*/index.js', - './config/**/*.js', - './tests/dummy/config/**/*.js', - ], - parserOptions: { - sourceType: 'script', - }, - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - // test files - files: ['tests/**/*-test.{js,ts}'], - extends: ['plugin:qunit/recommended'], - rules: { - 'qunit/require-expect': [2, 'except-simple'], - }, - }, - ], -}; diff --git a/addons/auth/eslint.config.js b/addons/auth/eslint.config.js new file mode 100644 index 000000000..e7b309361 --- /dev/null +++ b/addons/auth/eslint.config.js @@ -0,0 +1,91 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +'use strict'; + +/* eslint-disable n/no-unpublished-require */ +const { defineConfig, globalIgnores } = require('eslint/config'); +const babelParser = require('@babel/eslint-parser'); +const js = require('@eslint/js'); +const eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended'); +const nPlugin = require('eslint-plugin-n'); +const qunitPlugin = require('eslint-plugin-qunit'); +const eslintConfigPrettier = require('eslint-config-prettier/flat'); +const globals = require('globals'); + +module.exports = defineConfig([ + js.configs.recommended, + ...eslintPluginEmberRecommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + // This is specific babel-config. If it grows consider creating a babel config file + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { decoratorsBeforeExport: true }, + ], + ], + }, + // end of babel-config + }, + globals: { + ...globals.browser, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'ember/no-get': 'off', + 'ember/no-get-with-default': 'off', + 'ember/no-computed-properties-in-native-classes': 'off', + 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': + 'off', + }, + }, + + // Node files configuration + { + files: [ + 'eslint.config.js', + '.prettierrc.js', + '.stylelintrc.js', + '.template-lintrc.js', + 'ember-cli-build.js', + 'index.js', + 'testem.js', + 'blueprints/*/index.js', + 'config/**/*.js', + 'tests/dummy/config/**/*.js', + ], + plugins: { n: nPlugin }, + extends: [nPlugin.configs['flat/recommended-script']], + }, + + // Test files configuration + { + files: ['tests/**/*-test.{js,ts}'], + extends: [ + { ...qunitPlugin.configs.recommended, plugins: { qunit: qunitPlugin } }, + ], + rules: { + 'qunit/require-expect': [2, 'except-simple'], + }, + }, + // Prettier should be last + eslintConfigPrettier, + globalIgnores([ + 'blueprints/*/files/', + 'declarations/', + 'dist/', + 'coverage/', + '**/.*/', + '.node_modules.ember-try/', + ]), +]); diff --git a/addons/auth/package.json b/addons/auth/package.json index 6341e74d3..23dc1f80e 100644 --- a/addons/auth/package.json +++ b/addons/auth/package.json @@ -58,11 +58,13 @@ "ember-source-channel-url": "^3.0.0", "ember-template-lint": "^6.0.0", "ember-try": "^3.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-ember": "^12.2.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-qunit": "^8.1.2", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-ember": "^12.7.5", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-qunit": "^8.2.6", + "@eslint/js": "^9.18.0", + "globals": "^15.14.0", "loader.js": "^4.7.0", "pretender": "^3.4.3", "prettier": "^3.3.3", diff --git a/addons/auth/tests/unit/authenticators/base-test.js b/addons/auth/tests/unit/authenticators/base-test.js index 0358cd3e6..c45e4813b 100644 --- a/addons/auth/tests/unit/authenticators/base-test.js +++ b/addons/auth/tests/unit/authenticators/base-test.js @@ -68,7 +68,7 @@ module('Unit | Authenticator | base', function (hooks) { }); try { await authenticator.restore(mockData); - } catch (e) { + } catch { assert.ok(true, 'restoration failed'); } }); @@ -84,7 +84,7 @@ module('Unit | Authenticator | base', function (hooks) { }); try { await authenticator.restore(mockData); - } catch (e) { + } catch { assert.ok(true, 'restoration failed'); } }); diff --git a/addons/auth/tests/unit/authenticators/oidc-test.js b/addons/auth/tests/unit/authenticators/oidc-test.js index 1e6a974c1..8c5c0abf5 100644 --- a/addons/auth/tests/unit/authenticators/oidc-test.js +++ b/addons/auth/tests/unit/authenticators/oidc-test.js @@ -39,7 +39,7 @@ module('Unit | Authenticator | OIDC', function (hooks) { // Because assert.throws doesn't work with async errors/promise rejections try { await authenticator.startAuthentication(); - } catch (e) { + } catch { assert.ok(true); } }); diff --git a/addons/core/.eslintignore b/addons/core/.eslintignore deleted file mode 100644 index 768fab33b..000000000 --- a/addons/core/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/declarations/ -/dist/ - -# misc -/coverage/ -!.* -.*/ - -# ember-try -/.node_modules.ember-try/ diff --git a/addons/core/.eslintrc.js b/addons/core/.eslintrc.js deleted file mode 100644 index 818e0fe51..000000000 --- a/addons/core/.eslintrc.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, - // end of babel-config - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'], - env: { - browser: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'ember/no-get': 'off', - 'ember/no-get-with-default': 'off', - 'ember/no-computed-properties-in-native-classes': 'off', - 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': - 'off', - }, - overrides: [ - // node files - { - files: [ - './.eslintrc.js', - './.prettierrc.js', - './.template-lintrc.js', - './ember-cli-build.js', - './index.js', - './testem.js', - './blueprints/*/index.js', - './config/**/*.js', - './tests/dummy/config/**/*.js', - ], - parserOptions: { - sourceType: 'script', - }, - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - // Test files: - files: ['tests/**/*-test.{js,ts}'], - extends: ['plugin:qunit/recommended'], - rules: { - 'qunit/require-expect': [2, 'except-simple'], - }, - }, - ], -}; diff --git a/addons/core/addon/services/clock-tick.js b/addons/core/addon/services/clock-tick.js index dc4f1bf0a..3cea6f99b 100644 --- a/addons/core/addon/services/clock-tick.js +++ b/addons/core/addon/services/clock-tick.js @@ -28,7 +28,6 @@ export default class ClockTickService extends Service { * Updates the value of `now` every `frequency` milliseconds. */ _tick = task(async () => { - // eslint-disable-next-line no-constant-condition while (true) { await timeout(this.frequency); this.now = Date.now(); diff --git a/addons/core/eslint.config.js b/addons/core/eslint.config.js new file mode 100644 index 000000000..42371c47c --- /dev/null +++ b/addons/core/eslint.config.js @@ -0,0 +1,90 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +'use strict'; + +/* eslint-disable n/no-unpublished-require */ +const { defineConfig, globalIgnores } = require('eslint/config'); +const babelParser = require('@babel/eslint-parser'); +const js = require('@eslint/js'); +const eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended'); +const nPlugin = require('eslint-plugin-n'); +const qunitPlugin = require('eslint-plugin-qunit'); +const eslintConfigPrettier = require('eslint-config-prettier/flat'); +const globals = require('globals'); + +module.exports = defineConfig([ + js.configs.recommended, + ...eslintPluginEmberRecommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + // This is specific babel-config. If it grows consider creating a babel config file + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { decoratorsBeforeExport: true }, + ], + ], + }, + // end of babel-config + }, + globals: { + ...globals.browser, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'ember/no-get': 'off', + 'ember/no-get-with-default': 'off', + 'ember/no-computed-properties-in-native-classes': 'off', + 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': + 'off', + }, + }, + + // Node files configuration + { + files: [ + 'eslint.config.js', + '.prettierrc.js', + '.template-lintrc.js', + 'ember-cli-build.js', + 'index.js', + 'testem.js', + 'blueprints/*/index.js', + 'config/**/*.js', + 'tests/dummy/config/**/*.js', + ], + plugins: { n: nPlugin }, + extends: [nPlugin.configs['flat/recommended-script']], + }, + + // Test files configuration + { + files: ['tests/**/*-test.{js,ts}'], + extends: [ + { ...qunitPlugin.configs.recommended, plugins: { qunit: qunitPlugin } }, + ], + rules: { + 'qunit/require-expect': [2, 'except-simple'], + }, + }, + // Prettier should be last + eslintConfigPrettier, + globalIgnores([ + 'blueprints/*/files/', + 'declarations/', + 'dist/', + 'coverage/', + '**/.*/', + '.node_modules.ember-try/', + ]), +]); diff --git a/addons/core/package.json b/addons/core/package.json index 5957fabcd..777377aec 100644 --- a/addons/core/package.json +++ b/addons/core/package.json @@ -77,11 +77,13 @@ "ember-template-lint": "^6.0.0", "ember-template-lint-plugin-prettier": "^5.0.0", "ember-try": "^3.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-ember": "^12.2.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-qunit": "^8.1.2", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-ember": "^12.7.5", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-qunit": "^8.2.6", + "@eslint/js": "^9.18.0", + "globals": "^15.14.0", "js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1", "loader.js": "^4.7.0", "miragejs": "^0.1.48", @@ -109,4 +111,4 @@ "*.hbs": "ember-template-lint --fix", "*.{scss,yaml}": "prettier --write" } -} \ No newline at end of file +} diff --git a/addons/rose/.eslintignore b/addons/rose/.eslintignore deleted file mode 100644 index 768fab33b..000000000 --- a/addons/rose/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/declarations/ -/dist/ - -# misc -/coverage/ -!.* -.*/ - -# ember-try -/.node_modules.ember-try/ diff --git a/addons/rose/.eslintrc.js b/addons/rose/.eslintrc.js deleted file mode 100644 index d5c1cb514..000000000 --- a/addons/rose/.eslintrc.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, - // end of babel-config - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'], - env: { - browser: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'ember/no-jquery': 'error', - 'ember/no-new-mixins': 0, - 'ember/no-get': 'off', - 'ember/no-get-with-default': 'off', - 'ember/no-computed-properties-in-native-classes': 'off', - 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': - 'off', - }, - overrides: [ - // node files - { - files: [ - './.eslintrc.js', - './.prettierrc.js', - './.stylelintrc.js', - './.template-lintrc.js', - './ember-cli-build.js', - './index.js', - './testem.js', - './blueprints/*/index.js', - './config/**/*.js', - './tests/dummy/config/**/*.js', - ], - parserOptions: { - sourceType: 'script', - }, - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - // test files - files: ['tests/**/*-test.{js,ts}'], - extends: ['plugin:qunit/recommended'], - rules: { - 'qunit/require-expect': [2, 'except-simple'], - }, - }, - ], -}; diff --git a/addons/rose/eslint.config.js b/addons/rose/eslint.config.js new file mode 100644 index 000000000..2d9580560 --- /dev/null +++ b/addons/rose/eslint.config.js @@ -0,0 +1,93 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +'use strict'; + +/* eslint-disable n/no-unpublished-require */ +const { defineConfig, globalIgnores } = require('eslint/config'); +const babelParser = require('@babel/eslint-parser'); +const js = require('@eslint/js'); +const eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended'); +const nPlugin = require('eslint-plugin-n'); +const qunitPlugin = require('eslint-plugin-qunit'); +const eslintConfigPrettier = require('eslint-config-prettier/flat'); +const globals = require('globals'); + +module.exports = defineConfig([ + js.configs.recommended, + ...eslintPluginEmberRecommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + // This is specific babel-config. If it grows consider creating a babel config file + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { decoratorsBeforeExport: true }, + ], + ], + }, + // end of babel-config + }, + globals: { + ...globals.browser, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'ember/no-jquery': 'error', + 'ember/no-new-mixins': 0, + 'ember/no-get': 'off', + 'ember/no-get-with-default': 'off', + 'ember/no-computed-properties-in-native-classes': 'off', + 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': + 'off', + }, + }, + + // Node files configuration + { + files: [ + 'eslint.config.js', + '.prettierrc.js', + '.stylelintrc.js', + '.template-lintrc.js', + 'ember-cli-build.js', + 'index.js', + 'testem.js', + 'blueprints/*/index.js', + 'config/**/*.js', + 'tests/dummy/config/**/*.js', + ], + plugins: { n: nPlugin }, + extends: [nPlugin.configs['flat/recommended-script']], + }, + + // Test files configuration + { + files: ['tests/**/*-test.{js,ts}'], + extends: [ + { ...qunitPlugin.configs.recommended, plugins: { qunit: qunitPlugin } }, + ], + rules: { + 'qunit/require-expect': [2, 'except-simple'], + }, + }, + // Prettier should be last + eslintConfigPrettier, + globalIgnores([ + 'blueprints/*/files/', + 'declarations/', + 'dist/', + 'coverage/', + '**/.*/', + '.node_modules.ember-try/', + ]), +]); diff --git a/addons/rose/package.json b/addons/rose/package.json index 3373e302e..99608a54b 100644 --- a/addons/rose/package.json +++ b/addons/rose/package.json @@ -76,11 +76,13 @@ "ember-template-lint": "^6.0.0", "ember-template-lint-plugin-prettier": "^5.0.0", "ember-try": "^3.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-ember": "^12.2.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-qunit": "^8.1.2", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-ember": "^12.7.5", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-qunit": "^8.2.6", + "@eslint/js": "^9.18.0", + "globals": "^15.14.0", "loader.js": "^4.7.0", "postcss": "^8.4.31", "prettier": "^3.3.3", diff --git a/addons/rose/tests/dummy/app/controllers/playground.js b/addons/rose/tests/dummy/app/controllers/playground.js index ec9c5cc51..b8f5905c8 100644 --- a/addons/rose/tests/dummy/app/controllers/playground.js +++ b/addons/rose/tests/dummy/app/controllers/playground.js @@ -10,8 +10,5 @@ export default class PlaygroundController extends Controller { color = 'green'; @action - actionHandler(/*value*/) { - // eslint-disable-next-line no-console - //console.log('action handled'); - } + actionHandler(/*value*/) {} } diff --git a/e2e-tests/.eslintignore b/e2e-tests/.eslintignore deleted file mode 100644 index 72f0a8515..000000000 --- a/e2e-tests/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -# e2e test output -admin/artifacts -desktop/artifacts -playwright-report diff --git a/e2e-tests/.eslintrc.cjs b/e2e-tests/.eslintrc.cjs deleted file mode 100644 index 3b8a6584c..000000000 --- a/e2e-tests/.eslintrc.cjs +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - // end of babel-config - }, - extends: ['eslint:recommended', 'prettier'], - env: { - browser: true, - node: true, - es2021: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'no-empty-pattern': ['error', { allowObjectPatternsAsParameters: true }], - }, - overrides: [ - { - "files": ["admin/tests/**", "desktop/tests/**"], - "extends": "plugin:playwright/recommended" - } - ] -}; diff --git a/e2e-tests/eslint.config.js b/e2e-tests/eslint.config.js new file mode 100644 index 000000000..db1445e42 --- /dev/null +++ b/e2e-tests/eslint.config.js @@ -0,0 +1,46 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +import { defineConfig, globalIgnores } from 'eslint/config'; +import babelParser from '@babel/eslint-parser'; +import js from '@eslint/js'; +import playwright from 'eslint-plugin-playwright'; +import eslintConfigPrettier from 'eslint-config-prettier/flat'; +import globals from 'globals'; + +export default defineConfig([ + js.configs.recommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + // This is specific babel-config. If grows consider creating a babel config file + requireConfigFile: false, + // end of babel-config + }, + globals: { + ...globals.browser, + ...globals.node, + ...globals.es2021, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'no-empty-pattern': ['error', { allowObjectPatternsAsParameters: true }], + }, + }, + + // Playwright test files + { + files: ['admin/tests/**', 'desktop/tests/**'], + extends: [playwright.configs['flat/recommended']], + }, + + // Prettier should be last + eslintConfigPrettier, + globalIgnores(['admin/artifacts', 'desktop/artifacts', 'playwright-report']), +]); diff --git a/e2e-tests/helpers/boundary-cli.js b/e2e-tests/helpers/boundary-cli.js index b4bd27a30..f10d81b69 100644 --- a/e2e-tests/helpers/boundary-cli.js +++ b/e2e-tests/helpers/boundary-cli.js @@ -31,7 +31,7 @@ export * from './boundary-cli/workers.js'; export async function checkBoundaryCli() { try { execSync('which boundary'); - } catch (e) { + } catch { throw new Error('boundary does not exist on the path'); } } diff --git a/e2e-tests/helpers/vault-cli.js b/e2e-tests/helpers/vault-cli.js index c74aec95d..19b233ad0 100644 --- a/e2e-tests/helpers/vault-cli.js +++ b/e2e-tests/helpers/vault-cli.js @@ -11,7 +11,7 @@ import { execSync } from 'node:child_process'; export async function checkVaultCli() { try { execSync('which vault'); - } catch (e) { + } catch { throw new Error('vault does not exist on the path'); } } diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 7dd388989..1092d4532 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -30,14 +30,15 @@ "devDependencies": { "@babel/core": "^7.26.10", "@babel/eslint-parser": "^7.21.3", + "@eslint/js": "^9.18.0", "@openapitools/openapi-generator-cli": "^2.25.2", "@playwright/test": "^1.56.1", "concurrently": "^9.1.0", "dotenv": "^16.4.5", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-n": "^16.3.1", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-playwright": "^2.2.0", + "globals": "^15.14.0", "nanoid": "^5.0.9", "prettier": "^3.0.0", "tesseract.js": "^5.1.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66876c77e..9bfe76fad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,7 +119,7 @@ importers: devDependencies: '@babel/eslint-parser': specifier: ^7.25.1 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@babel/plugin-proposal-decorators': specifier: ^7.24.7 version: 7.27.1(@babel/core@7.27.1) @@ -135,6 +135,9 @@ importers: '@embroider/test-setup': specifier: ^4.0.0 version: 4.0.0 + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@glimmer/component': specifier: ^2.0.0 version: 2.0.0 @@ -196,20 +199,23 @@ importers: specifier: ^3.0.0 version: 3.0.0(encoding@0.1.13) eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-ember: - specifier: ^12.2.1 - version: 12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + specifier: ^12.7.5 + version: 12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.1) + specifier: ^17.24.0 + version: 17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-qunit: - specifier: ^8.1.2 - version: 8.1.2(eslint@8.57.1) + specifier: ^8.2.6 + version: 8.2.6(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^15.14.0 + version: 15.15.0 loader.js: specifier: ^4.7.0 version: 4.7.0 @@ -245,11 +251,11 @@ importers: version: 6.3.0 ember-simple-auth: specifier: ^6.1.0 - version: 6.1.0(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.104.1(esbuild@0.25.9)))(eslint@8.57.1) + version: 6.1.0(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.104.1(esbuild@0.25.9)))(eslint@9.39.2(jiti@2.4.2)) devDependencies: '@babel/eslint-parser': specifier: ^7.25.1 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@babel/plugin-proposal-decorators': specifier: ^7.24.7 version: 7.27.1(@babel/core@7.27.1) @@ -262,6 +268,9 @@ importers: '@embroider/test-setup': specifier: ^4.0.0 version: 4.0.0 + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@glimmer/component': specifier: ^2.0.0 version: 2.0.0 @@ -323,20 +332,23 @@ importers: specifier: ^3.0.0 version: 3.0.0(encoding@0.1.13) eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-ember: - specifier: ^12.2.1 - version: 12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + specifier: ^12.7.5 + version: 12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.1) + specifier: ^17.24.0 + version: 17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-qunit: - specifier: ^8.1.2 - version: 8.1.2(eslint@8.57.1) + specifier: ^8.2.6 + version: 8.2.6(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^15.14.0 + version: 15.15.0 loader.js: specifier: ^4.7.0 version: 4.7.0 @@ -421,7 +433,7 @@ importers: devDependencies: '@babel/eslint-parser': specifier: ^7.25.1 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@babel/plugin-proposal-decorators': specifier: ^7.24.7 version: 7.27.1(@babel/core@7.27.1) @@ -434,6 +446,9 @@ importers: '@embroider/test-setup': specifier: ^4.0.0 version: 4.0.0 + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@faker-js/faker': specifier: ^8.0.2 version: 8.4.1 @@ -501,20 +516,23 @@ importers: specifier: ^3.0.0 version: 3.0.0(encoding@0.1.13) eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-ember: - specifier: ^12.2.1 - version: 12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + specifier: ^12.7.5 + version: 12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.1) + specifier: ^17.24.0 + version: 17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-qunit: - specifier: ^8.1.2 - version: 8.1.2(eslint@8.57.1) + specifier: ^8.2.6 + version: 8.2.6(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^15.14.0 + version: 15.15.0 js-bexpr: specifier: hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1 version: https://codeload.github.com/hashicorp/js-bexpr/tar.gz/9b4a4b54d85eba67fdfc0990133d1518d890b1e1 @@ -593,7 +611,7 @@ importers: devDependencies: '@babel/eslint-parser': specifier: ^7.25.1 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@babel/plugin-proposal-decorators': specifier: ^7.24.7 version: 7.27.1(@babel/core@7.27.1) @@ -606,6 +624,9 @@ importers: '@embroider/test-setup': specifier: ^4.0.0 version: 4.0.0 + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@glimmer/component': specifier: ^2.0.0 version: 2.0.0 @@ -682,20 +703,23 @@ importers: specifier: ^3.0.0 version: 3.0.0(encoding@0.1.13) eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-ember: - specifier: ^12.2.1 - version: 12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + specifier: ^12.7.5 + version: 12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.1) + specifier: ^17.24.0 + version: 17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-qunit: - specifier: ^8.1.2 - version: 8.1.2(eslint@8.57.1) + specifier: ^8.2.6 + version: 8.2.6(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^15.14.0 + version: 15.15.0 loader.js: specifier: ^4.7.0 version: 4.7.0 @@ -734,7 +758,10 @@ importers: version: 7.27.1 '@babel/eslint-parser': specifier: ^7.21.3 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@openapitools/openapi-generator-cli': specifier: ^2.25.2 version: 2.25.2(@types/node@25.2.3)(encoding@0.1.13) @@ -748,17 +775,17 @@ importers: specifier: ^16.4.5 version: 16.5.0 eslint: - specifier: ^8.54.0 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.0.0 - version: 9.1.0(eslint@8.57.1) - eslint-plugin-n: - specifier: ^16.3.1 - version: 16.6.2(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-playwright: specifier: ^2.2.0 - version: 2.2.0(eslint@8.57.1) + version: 2.2.0(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^15.14.0 + version: 15.15.0 nanoid: specifier: ^5.0.9 version: 5.1.5 @@ -792,7 +819,7 @@ importers: version: 7.27.1 '@babel/eslint-parser': specifier: ^7.25.1 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@babel/plugin-proposal-decorators': specifier: ^7.24.7 version: 7.27.1(@babel/core@7.27.1) @@ -811,6 +838,9 @@ importers: '@embroider/macros': specifier: ^1.18.1 version: 1.19.3(@glint/template@1.5.2) + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@faker-js/faker': specifier: ^8.0.2 version: 8.4.1 @@ -917,20 +947,23 @@ importers: specifier: ^5.0.0 version: 5.0.0(ember-template-lint@6.1.0)(prettier@3.6.2) eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-ember: - specifier: ^12.2.1 - version: 12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + specifier: ^12.7.5 + version: 12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.1) + specifier: ^17.24.0 + version: 17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-qunit: - specifier: ^8.1.2 - version: 8.1.2(eslint@8.57.1) + specifier: ^8.2.6 + version: 8.2.6(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^17.3.0 + version: 17.3.0 js-bexpr: specifier: hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1 version: https://codeload.github.com/hashicorp/js-bexpr/tar.gz/9b4a4b54d85eba67fdfc0990133d1518d890b1e1 @@ -1012,7 +1045,7 @@ importers: version: 7.27.1 '@babel/eslint-parser': specifier: ^7.25.1 - version: 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + version: 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@babel/plugin-proposal-decorators': specifier: ^7.24.7 version: 7.27.1(@babel/core@7.27.1) @@ -1028,6 +1061,9 @@ importers: '@embroider/macros': specifier: ^1.18.1 version: 1.19.3(@glint/template@1.5.2) + '@eslint/js': + specifier: ^9.18.0 + version: 9.39.2 '@faker-js/faker': specifier: ^8.0.2 version: 8.4.1 @@ -1134,20 +1170,23 @@ importers: specifier: ^0.6.0 version: 0.6.0 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.18.0 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-ember: - specifier: ^12.2.1 - version: 12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + specifier: ^12.7.5 + version: 12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.1) + specifier: ^17.24.0 + version: 17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-qunit: - specifier: ^8.1.2 - version: 8.1.2(eslint@8.57.1) + specifier: ^8.2.6 + version: 8.2.6(eslint@9.39.2(jiti@2.4.2)) + globals: + specifier: ^17.3.0 + version: 17.3.0 js-bexpr: specifier: hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1 version: https://codeload.github.com/hashicorp/js-bexpr/tar.gz/9b4a4b54d85eba67fdfc0990133d1518d890b1e1 @@ -2324,17 +2363,43 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@faker-js/faker@8.4.1': resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} @@ -2518,18 +2583,21 @@ packages: '@hashicorp/flight-icons@4.1.1': resolution: {integrity: sha512-ZgHlAC1bBLyz5uaOtGEp9hoDSL7Mvg9ZV9m8Jkc/BXCd4M7f9ZDwJR5f/ypVXYiOP/yVqfGUhdYRf/8vfBkiiw==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@inquirer/external-editor@1.0.2': resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} @@ -3054,9 +3122,6 @@ packages: resolution: {integrity: sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@warp-drive/build-config@0.0.2': resolution: {integrity: sha512-sPnLFRkN5a0sjr3wlEUysi3G0Gj9Si0HwYksva86hvtypGHY0tDd6rfLQFu9j4RxKAN/APDR0qa8EN2BsfdPeA==} engines: {node: '>= 18.20.7'} @@ -3734,13 +3799,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - bytes@1.0.0: resolution: {integrity: sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==} @@ -4584,10 +4642,6 @@ packages: resolution: {integrity: sha512-PtiyaS+S3kcMbpx6x2V0S+PeDKisxmjEFnZsuYkkj4Lh3ObozJuuYh9dM4+sX02Ouuty8RF2LOCnIbpu/hWy/A==} hasBin: true - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-element-descriptors@0.5.1: resolution: {integrity: sha512-DLayMRQ+yJaziF4JJX1FMjwjdr7wdTr1y9XvZ+NfHELfOMcYDnCHneAYXAS4FT1gLILh4V0juMZohhH1N5FsoQ==} @@ -5244,8 +5298,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -5253,8 +5307,8 @@ packages: eslint-formatter-kakoune@1.0.0: resolution: {integrity: sha512-Uk/TVLt6Nf6Xoz7C1iYuZjOSdJxe5aaauGRke8JhKeJwD66Y61/pY2FjtLP04Ooq9PwV34bzrkKkU2UZ5FtDRA==} - eslint-plugin-ember@12.5.0: - resolution: {integrity: sha512-DBUzsaKWDVXsujAZPpRir0O7owdlCoVzZmtaJm7g7iQeSrNtcRWI7AItsTqKSsws1XeAySH0sPsQItMdDCb9Fg==} + eslint-plugin-ember@12.7.5: + resolution: {integrity: sha512-2zLEpu3xcKjykgsKkj8sU2GwdxADFTH5XPBvuIrNBP253JxHSz2P21isUuRB50kGoR2KL+eUHNgV0j7IPCav1w==} engines: {node: 18.* || 20.* || >= 21} peerDependencies: '@typescript-eslint/parser': '*' @@ -5269,11 +5323,11 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-n@16.6.2: - resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} - engines: {node: '>=16.0.0'} + eslint-plugin-n@17.24.0: + resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=7.0.0' + eslint: '>=8.23.0' eslint-plugin-playwright@2.2.0: resolution: {integrity: sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg==} @@ -5281,9 +5335,11 @@ packages: peerDependencies: eslint: '>=8.40.0' - eslint-plugin-qunit@8.1.2: - resolution: {integrity: sha512-2gDQdHlQW8GVXD7YYkO8vbm9Ldc60JeGMuQN5QlD48OeZ8znBvvoHWZZMeXjvoDPReGaLEvyuWrDtrI8bDbcqw==} + eslint-plugin-qunit@8.2.6: + resolution: {integrity: sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==} engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + peerDependencies: + eslint: '>=8.38.0' eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -5293,6 +5349,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-utils@3.0.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -5311,19 +5371,23 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@3.0.0: resolution: {integrity: sha512-xoBq/MIShSydNZOkjkoCEjqod963yHNXTLC40ypBhop6yPqflPz/vTinmCfSrGcywVLnSftRf6a0kJLdFdzemw==} @@ -5485,14 +5549,14 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@7.0.2: resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} engines: {node: '>=12.0.0'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-type@21.1.0: resolution: {integrity: sha512-boU4EHmP3JXkwDo4uhyBhTt5pPstxB6eEXKJBu2yu2l7aAMMm7QQYQEzssJmKReZYrFdFOJS8koVo6bXIBGDqA==} engines: {node: '>=20'} @@ -5584,6 +5648,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -5846,6 +5914,18 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@17.3.0: + resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -5888,9 +5968,6 @@ packages: grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - growly@1.3.0: resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} @@ -6216,10 +6293,6 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6312,10 +6385,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -7536,6 +7605,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -8728,9 +8801,6 @@ packages: engines: {node: '>= 7.*'} hasBin: true - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - textextensions@2.6.0: resolution: {integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==} engines: {node: '>=0.8'} @@ -8810,6 +8880,11 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -9296,11 +9371,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@8.57.1)': + '@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2))': dependencies: '@babel/core': 7.27.1 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -9349,7 +9424,7 @@ snapshots: '@babel/core': 7.27.1 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: @@ -10141,11 +10216,11 @@ snapshots: '@electron/rebuild': 3.7.2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1 + debug: 4.4.3 find-up: 5.0.0 fs-extra: 10.1.0 log-symbols: 4.1.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - bluebird - supports-color @@ -10229,7 +10304,7 @@ snapshots: '@electron-forge/core-utils': 7.8.1 '@electron-forge/shared-types': 7.8.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1 + debug: 4.4.3 fs-extra: 10.1.0 username: 5.1.0 transitivePeerDependencies: @@ -10284,7 +10359,7 @@ snapshots: '@electron/get@3.1.0': dependencies: - debug: 4.4.1 + debug: 4.4.3 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -10305,7 +10380,7 @@ snapshots: make-fetch-happen: 10.2.1 nopt: 6.0.0 proc-log: 2.0.1 - semver: 7.7.3 + semver: 7.7.4 tar: 7.5.9 which: 2.0.2 transitivePeerDependencies: @@ -10339,7 +10414,7 @@ snapshots: '@electron/osx-sign': 1.3.3 '@electron/universal': 2.0.3 '@electron/windows-sign': 1.2.2 - debug: 4.4.1 + debug: 4.4.3 extract-zip: 2.0.1 filenamify: 4.3.0 fs-extra: 11.3.0 @@ -10350,7 +10425,7 @@ snapshots: plist: 3.1.0 resedit: 2.0.3 resolve: 1.22.10 - semver: 7.7.3 + semver: 7.7.4 yargs-parser: 21.1.1 transitivePeerDependencies: - supports-color @@ -10360,7 +10435,7 @@ snapshots: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1 + debug: 4.4.3 detect-libc: 2.0.4 fs-extra: 10.1.0 got: 11.8.6 @@ -10368,7 +10443,7 @@ snapshots: node-api-version: 0.2.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.3 + semver: 7.7.4 tar: 7.5.9 yargs: 17.7.2 transitivePeerDependencies: @@ -10693,7 +10768,7 @@ snapshots: '@embroider/shared-internals@3.0.0': dependencies: babel-import-util: 3.0.1 - debug: 4.4.1 + debug: 4.4.3 ember-rfc176-data: 0.3.18 fs-extra: 9.1.0 is-subdir: 1.2.0 @@ -10820,19 +10895,40 @@ snapshots: '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.39.2(jiti@2.4.2))': dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.4.2))': + dependencies: + eslint: 9.39.2(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 - debug: 4.4.1 - espree: 9.6.1 - globals: 13.24.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 @@ -10841,7 +10937,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 '@faker-js/faker@8.4.1': {} @@ -11182,17 +11285,16 @@ snapshots: '@hashicorp/flight-icons@4.1.1': {} - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@inquirer/external-editor@1.0.2(@types/node@25.2.3)': dependencies: @@ -11376,7 +11478,7 @@ snapshots: '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.3 + semver: 7.7.4 '@npmcli/move-file@2.0.1': dependencies: @@ -11597,7 +11699,7 @@ snapshots: '@tokenizer/inflate@0.3.1': dependencies: - debug: 4.4.1 + debug: 4.4.3 fflate: 0.8.2 token-types: 6.0.0 transitivePeerDependencies: @@ -11755,14 +11857,14 @@ snapshots: '@types/node': 25.2.3 optional: true - '@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.34.0 '@typescript-eslint/types': 8.34.0 '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.0 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -11815,8 +11917,6 @@ snapshots: eslint-visitor-keys: 4.2.1 optional: true - '@ungap/structured-clone@1.3.0': {} - '@warp-drive/build-config@0.0.2(@glint/template@1.5.2)': dependencies: '@embroider/addon-shim': 1.10.0 @@ -11959,7 +12059,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -12146,7 +12246,7 @@ snapshots: async-disk-cache@2.1.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 heimdalljs: 0.2.6 istextorbinary: 2.6.0 mkdirp: 0.5.6 @@ -12824,12 +12924,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@3.3.0: {} - - builtins@5.1.0: - dependencies: - semver: 7.7.2 - bytes@1.0.0: {} bytes@3.1.2: {} @@ -13479,10 +13573,6 @@ snapshots: transitivePeerDependencies: - supports-color - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-element-descriptors@0.5.1: {} dom-serializer@0.2.2: @@ -14249,10 +14339,10 @@ snapshots: transitivePeerDependencies: - supports-color - ember-eslint-parser@0.5.9(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + ember-eslint-parser@0.5.9(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)): dependencies: '@babel/core': 7.27.1 - '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@glimmer/syntax': 0.92.3 content-tag: 2.0.3 eslint-scope: 7.2.2 @@ -14260,7 +14350,7 @@ snapshots: mathml-tag-names: 2.1.3 svg-tags: 1.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.34.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint @@ -14508,9 +14598,9 @@ snapshots: transitivePeerDependencies: - supports-color - ember-simple-auth@6.1.0(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.104.1(esbuild@0.25.9)))(eslint@8.57.1): + ember-simple-auth@6.1.0(@babel/core@7.27.1)(@ember/test-helpers@5.2.2(@babel/core@7.27.1)(@glint/template@1.5.2))(@glint/template@1.5.2)(ember-source@5.12.0(@glimmer/component@2.0.0)(@glint/template@1.5.2)(rsvp@4.8.5)(webpack@5.104.1(esbuild@0.25.9)))(eslint@9.39.2(jiti@2.4.2)): dependencies: - '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@8.57.1) + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@9.39.2(jiti@2.4.2)) '@ember/test-waiters': 3.1.0 '@embroider/addon-shim': 1.10.0 '@embroider/macros': 1.18.0(@glint/template@1.5.2) @@ -14930,68 +15020,67 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@8.57.1): + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.4.2)): dependencies: - eslint: 8.57.1 - semver: 7.7.3 + eslint: 9.39.2(jiti@2.4.2) + semver: 7.7.4 - eslint-config-prettier@9.1.0(eslint@8.57.1): + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.4.2)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) eslint-formatter-kakoune@1.0.0: {} - eslint-plugin-ember@12.5.0(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-ember@12.7.5(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)): dependencies: '@ember-data/rfc395-data': 0.0.4 css-tree: 3.1.0 - ember-eslint-parser: 0.5.9(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + ember-eslint-parser: 0.5.9(@babel/core@7.27.1)(@typescript-eslint/parser@8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3))(eslint@9.39.2(jiti@2.4.2)) ember-rfc176-data: 0.3.18 - eslint: 8.57.1 - eslint-utils: 3.0.0(eslint@8.57.1) + eslint: 9.39.2(jiti@2.4.2) + eslint-utils: 3.0.0(eslint@9.39.2(jiti@2.4.2)) estraverse: 5.3.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 requireindex: 1.2.0 snake-case: 3.0.4 optionalDependencies: - '@typescript-eslint/parser': 8.34.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - '@babel/core' - eslint-plugin-es-x@7.8.0(eslint@8.57.1): + eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.39.2(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) + eslint: 9.39.2(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.4.2)) - eslint-plugin-n@16.6.2(eslint@8.57.1): + eslint-plugin-n@17.24.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - builtins: 5.1.0 - eslint: 8.57.1 - eslint-plugin-es-x: 7.8.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.4.2)) + enhanced-resolve: 5.19.0 + eslint: 9.39.2(jiti@2.4.2) + eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.4.2)) get-tsconfig: 4.10.0 - globals: 13.24.0 + globals: 15.15.0 + globrex: 0.1.2 ignore: 5.3.2 - is-builtin-module: 3.2.1 - is-core-module: 2.16.1 - minimatch: 3.1.5 - resolve: 1.22.10 - semver: 7.7.2 + semver: 7.7.4 + ts-declaration-location: 1.0.7(typescript@5.8.3) + transitivePeerDependencies: + - typescript - eslint-plugin-playwright@2.2.0(eslint@8.57.1): + eslint-plugin-playwright@2.2.0(eslint@9.39.2(jiti@2.4.2)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) globals: 13.24.0 - eslint-plugin-qunit@8.1.2(eslint@8.57.1): + eslint-plugin-qunit@8.2.6(eslint@9.39.2(jiti@2.4.2)): dependencies: - eslint-utils: 3.0.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.4.2)) + eslint: 9.39.2(jiti@2.4.2) requireindex: 1.2.0 - transitivePeerDependencies: - - eslint eslint-scope@5.1.1: dependencies: @@ -15003,68 +15092,70 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@8.57.1): + eslint-scope@8.4.0: dependencies: - eslint: 8.57.1 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@9.39.2(jiti@2.4.2)): + dependencies: + eslint: 9.39.2(jiti@2.4.2) eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: - optional: true + eslint-visitor-keys@4.2.1: {} - eslint@8.57.1: + eslint@9.39.2(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 - doctrine: 3.0.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 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.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color esm@3.2.25: {} - espree@9.6.1: + espree@10.4.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 4.2.1 esprima@3.0.0: {} @@ -15276,14 +15367,14 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@7.0.2: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-type@21.1.0: dependencies: '@tokenizer/inflate': 0.3.1 @@ -15425,6 +15516,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + flatted@3.3.3: {} flora-colossus@2.0.0: @@ -15667,7 +15763,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15731,7 +15827,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.3 + semver: 7.7.4 serialize-error: 7.0.1 optional: true @@ -15769,6 +15865,12 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@15.15.0: {} + + globals@17.3.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -15831,8 +15933,6 @@ snapshots: grapheme-splitter@1.0.4: {} - graphemer@1.4.0: {} - growly@1.3.0: {} handlebars@4.7.8: @@ -15968,14 +16068,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15995,14 +16095,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -16212,10 +16312,6 @@ snapshots: is-buffer@2.0.5: {} - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-callable@1.2.7: {} is-core-module@2.16.1: @@ -16289,8 +16385,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} is-plain-obj@2.1.0: {} @@ -16737,7 +16831,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 make-fetch-happen@10.2.1: dependencies: @@ -16987,7 +17081,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.4.1 + debug: 4.4.3 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -17177,14 +17271,14 @@ snapshots: node-abi@3.77.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 node-addon-api@7.1.1: optional: true node-api-version@0.2.1: dependencies: - semver: 7.7.3 + semver: 7.7.4 node-dir@0.1.17: dependencies: @@ -17458,7 +17552,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 get-uri: 6.0.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -17571,6 +17665,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.3: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -18226,8 +18322,7 @@ snapshots: semver@7.7.3: {} - semver@7.7.4: - optional: true + semver@7.7.4: {} send@0.19.0: dependencies: @@ -18439,7 +18534,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -18447,7 +18542,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.6 transitivePeerDependencies: - supports-color @@ -18542,7 +18637,7 @@ snapshots: stagehand@1.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -18836,7 +18931,7 @@ snapshots: sync-disk-cache@2.1.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 heimdalljs: 0.2.6 mkdirp: 0.5.6 rimraf: 3.0.2 @@ -19009,8 +19104,6 @@ snapshots: - walrus - whiskers - text-table@0.2.0: {} - textextensions@2.6.0: {} through2@3.0.2: @@ -19105,6 +19198,11 @@ snapshots: typescript: 5.8.3 optional: true + ts-declaration-location@1.0.7(typescript@5.8.3): + dependencies: + picomatch: 4.0.3 + typescript: 5.8.3 + tslib@1.14.1: {} tslib@2.8.1: {} @@ -19174,8 +19272,7 @@ snapshots: typescript-memoize@1.1.1: {} - typescript@5.8.3: - optional: true + typescript@5.8.3: {} uc.micro@1.0.6: {} @@ -19312,7 +19409,7 @@ snapshots: validate-peer-dependencies@1.2.0: dependencies: resolve-package-path: 3.1.0 - semver: 7.7.3 + semver: 7.7.4 validate-peer-dependencies@2.2.0: dependencies: diff --git a/ui/admin/.eslintignore b/ui/admin/.eslintignore deleted file mode 100644 index 768fab33b..000000000 --- a/ui/admin/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/declarations/ -/dist/ - -# misc -/coverage/ -!.* -.*/ - -# ember-try -/.node_modules.ember-try/ diff --git a/ui/admin/.eslintrc.js b/ui/admin/.eslintrc.js deleted file mode 100644 index aa185bd3d..000000000 --- a/ui/admin/.eslintrc.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, - // end of babel-config - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'], - env: { - browser: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'ember/no-get': 'off', - 'ember/no-get-with-default': 'off', - 'ember/no-computed-properties-in-native-classes': 'off', - 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': - 'off', - }, - overrides: [ - // node files - { - files: [ - './.eslintrc.js', - './.prettierrc.js', - './.stylelintrc.js', - './.template-lintrc.js', - './ember-cli-build.js', - './testem.js', - './blueprints/*/index.js', - './config/**/*.js', - './lib/*/index.js', - './server/**/*.js', - ], - parserOptions: { - sourceType: 'script', - }, - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - // test files - files: ['tests/**/*-test.{js,ts}'], - extends: ['plugin:qunit/recommended'], - rules: { - 'qunit/require-expect': [2, 'except-simple'], - }, - }, - ], -}; diff --git a/ui/admin/app/components/form/target/add-host-sets/index.js b/ui/admin/app/components/form/target/add-host-sets/index.js index db4e9bbd3..4830a7ded 100644 --- a/ui/admin/app/components/form/target/add-host-sets/index.js +++ b/ui/admin/app/components/form/target/add-host-sets/index.js @@ -81,7 +81,7 @@ export default class FormTargetAddHostSetsComponent extends Component { confirm: 'resources.target.actions.remove-address', }, ); - } catch (e) { + } catch { // if the user denies, do nothing and return return; } diff --git a/ui/admin/app/controllers/account/change-password.js b/ui/admin/app/controllers/account/change-password.js index bf8a286bb..03ac431cc 100644 --- a/ui/admin/app/controllers/account/change-password.js +++ b/ui/admin/app/controllers/account/change-password.js @@ -34,7 +34,7 @@ export default class AccountChangePasswordController extends Controller { // TransitionAborted error, which we do not want to show to the user. try { await this.router.replaceWith('index'); - } catch (e) { + } catch { // no-op } } diff --git a/ui/admin/app/helpers/can.js b/ui/admin/app/helpers/can.js index ed186c0e5..1f54da577 100644 --- a/ui/admin/app/helpers/can.js +++ b/ui/admin/app/helpers/can.js @@ -43,7 +43,6 @@ class DevelopmentCanHelper extends CanHelper { removeAllFlags() { this.features.flags.forEach((flag) => - /* eslint-disable-next-line ember/no-observers */ this.features.removeObserver(flag, this, 'recompute'), ); } diff --git a/ui/admin/app/instance-initializers/feature-edition.js b/ui/admin/app/instance-initializers/feature-edition.js index 3d9666e23..40cd105cb 100644 --- a/ui/admin/app/instance-initializers/feature-edition.js +++ b/ui/admin/app/instance-initializers/feature-edition.js @@ -20,7 +20,7 @@ async function autoInitializeFeatureEdition(owner) { edition = json?.license?.edition; features = json?.license?.features; - } catch (e) { + } catch { // if the request fails, the service will initialize the default edition // as specified in the config } diff --git a/ui/admin/app/routes/application.js b/ui/admin/app/routes/application.js index 17b997e9b..5879dbdc0 100644 --- a/ui/admin/app/routes/application.js +++ b/ui/admin/app/routes/application.js @@ -53,7 +53,7 @@ export default class ApplicationRoute extends Route { }); maybeModel?.rollbackAttributes(); transition.retry(); - } catch (e) { + } catch { // if user denies, do nothing } } diff --git a/ui/admin/app/routes/scopes/scope/session-recordings/index.js b/ui/admin/app/routes/scopes/scope/session-recordings/index.js index 476ffad29..d59bb5837 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings/index.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings/index.js @@ -195,7 +195,7 @@ export default class ScopesScopeSessionRecordingsIndexRoute extends Route { recursive: true, }); return Boolean(storageBuckets.length); - } catch (e) { + } catch { // no op return false; } diff --git a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js index 918b16650..53c72c59f 100644 --- a/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js +++ b/ui/admin/app/routes/scopes/scope/session-recordings/session-recording/channels-by-connection.js @@ -39,7 +39,7 @@ export default class ScopesScopeSessionRecordingsSessionRecordingChannelsByConne storage_bucket_id, ); } - } catch (e) { + } catch { // no op } diff --git a/ui/admin/app/routes/scopes/scope/workers/worker/create-tags.js b/ui/admin/app/routes/scopes/scope/workers/worker/create-tags.js index 09440fd0e..5a7a66cf7 100644 --- a/ui/admin/app/routes/scopes/scope/workers/worker/create-tags.js +++ b/ui/admin/app/routes/scopes/scope/workers/worker/create-tags.js @@ -27,7 +27,7 @@ export default class ScopesScopeWorkersWorkerCreateTagsRoute extends Route { }); controller.set('apiTags', new TrackedArray([])); transition.retry(); - } catch (e) { + } catch { // if user denies, do nothing } } diff --git a/ui/admin/eslint.config.js b/ui/admin/eslint.config.js new file mode 100644 index 000000000..6a94d13b9 --- /dev/null +++ b/ui/admin/eslint.config.js @@ -0,0 +1,88 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +'use strict'; + +const { defineConfig, globalIgnores } = require('eslint/config'); +const babelParser = require('@babel/eslint-parser'); +const js = require('@eslint/js'); +const eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended'); +const nPlugin = require('eslint-plugin-n'); +const qunitPlugin = require('eslint-plugin-qunit'); +const eslintConfigPrettier = require('eslint-config-prettier/flat'); +const globals = require('globals'); + +module.exports = defineConfig([ + js.configs.recommended, + ...eslintPluginEmberRecommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + // This is specific babel-config. If it grows consider creating a babel config file + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { decoratorsBeforeExport: true }, + ], + ], + }, + // end of babel-config + }, + globals: { + ...globals.browser, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'ember/no-get': 'off', + 'ember/no-get-with-default': 'off', + 'ember/no-computed-properties-in-native-classes': 'off', + 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': + 'off', + }, + }, + + // Node files configuration + { + files: [ + 'eslint.config.js', + '.prettierrc.js', + '.stylelintrc.js', + '.template-lintrc.js', + 'ember-cli-build.js', + 'testem.js', + 'config/**/*.js', + 'server/**/*.js', + ], + plugins: { n: nPlugin }, + extends: [nPlugin.configs['flat/recommended-script']], + }, + + // Test files configuration + { + files: ['tests/**/*-test.{js,ts}'], + extends: [ + { ...qunitPlugin.configs.recommended, plugins: { qunit: qunitPlugin } }, + ], + rules: { + 'qunit/require-expect': [2, 'except-simple'], + }, + }, + // Prettier should be last + eslintConfigPrettier, + globalIgnores([ + 'blueprints/*/files/', + 'declarations/', + 'dist/', + 'coverage/', + '**/.*/', + '.node_modules.ember-try/', + ]), +]); diff --git a/ui/admin/package.json b/ui/admin/package.json index 4a2c1f281..45fb73f84 100644 --- a/ui/admin/package.json +++ b/ui/admin/package.json @@ -88,11 +88,13 @@ "ember-source": "~5.12.0", "ember-template-lint": "^6.0.0", "ember-template-lint-plugin-prettier": "^5.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-ember": "^12.2.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-qunit": "^8.1.2", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-ember": "^12.7.5", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-qunit": "^8.2.6", + "@eslint/js": "^9.18.0", + "globals": "^17.3.0", "js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1", "loader.js": "^4.7.0", "miragejs": "^0.1.48", diff --git a/ui/admin/tests/acceptance/credential-library/update-test.js b/ui/admin/tests/acceptance/credential-library/update-test.js index f53be50f6..4041b0528 100644 --- a/ui/admin/tests/acceptance/credential-library/update-test.js +++ b/ui/admin/tests/acceptance/credential-library/update-test.js @@ -251,7 +251,7 @@ module('Acceptance | credential-libraries | update', function (hooks) { try { await visit(urls.credentialLibraries); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN); diff --git a/ui/admin/tests/acceptance/credential-store/credentials/update-test.js b/ui/admin/tests/acceptance/credential-store/credentials/update-test.js index 5c728bd03..9945b369a 100644 --- a/ui/admin/tests/acceptance/credential-store/credentials/update-test.js +++ b/ui/admin/tests/acceptance/credential-store/credentials/update-test.js @@ -552,7 +552,7 @@ module( assert.strictEqual(currentURL(), urls.usernamePasswordCredential); try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN, 'Click Discard'); @@ -595,7 +595,7 @@ module( try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN, 'Click Discard'); @@ -637,7 +637,7 @@ module( try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN, 'Click Discard'); @@ -677,7 +677,7 @@ module( assert.strictEqual(currentURL(), urls.passwordCredential); try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN, 'Click Discard'); @@ -722,7 +722,7 @@ module( try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN, 'Click Cancel'); @@ -769,7 +769,7 @@ module( try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN, 'Click Cancel'); @@ -827,7 +827,7 @@ module( assert.strictEqual(currentURL(), urls.jsonCredential); try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN, 'Click Cancel'); assert.strictEqual(currentURL(), urls.jsonCredential); @@ -871,7 +871,7 @@ module( try { await visit(urls.credentials); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN, 'Click Cancel'); diff --git a/ui/admin/tests/acceptance/credential-store/update-test.js b/ui/admin/tests/acceptance/credential-store/update-test.js index 02629299d..695df3c10 100644 --- a/ui/admin/tests/acceptance/credential-store/update-test.js +++ b/ui/admin/tests/acceptance/credential-store/update-test.js @@ -259,7 +259,7 @@ module('Acceptance | credential-stores | update', function (hooks) { try { await visit(urls.credentialStores); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN, 'Click Discard'); @@ -297,7 +297,7 @@ module('Acceptance | credential-stores | update', function (hooks) { try { await visit(urls.credentialStores); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN, 'Click Discard'); @@ -327,7 +327,7 @@ module('Acceptance | credential-stores | update', function (hooks) { try { await visit(urls.credentialStores); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN); @@ -366,7 +366,7 @@ module('Acceptance | credential-stores | update', function (hooks) { try { await visit(urls.credentialStores); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).isVisible(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN); diff --git a/ui/admin/tests/acceptance/host-catalogs/host-sets/update-test.js b/ui/admin/tests/acceptance/host-catalogs/host-sets/update-test.js index 16878ced5..91e9febf2 100644 --- a/ui/admin/tests/acceptance/host-catalogs/host-sets/update-test.js +++ b/ui/admin/tests/acceptance/host-catalogs/host-sets/update-test.js @@ -346,7 +346,7 @@ module('Acceptance | host-catalogs | host sets | update', function (hooks) { assert.strictEqual(currentURL(), urls.hostSet); try { await visit(urls.hostSets); - } catch (e) { + } catch { assert.ok(find(commonSelectors.MODAL_WARNING)); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN); assert.strictEqual(currentURL(), urls.hostSets); diff --git a/ui/admin/tests/acceptance/host-catalogs/hosts/update-test.js b/ui/admin/tests/acceptance/host-catalogs/hosts/update-test.js index 5c4bc0778..10bb8b4cf 100644 --- a/ui/admin/tests/acceptance/host-catalogs/hosts/update-test.js +++ b/ui/admin/tests/acceptance/host-catalogs/hosts/update-test.js @@ -197,7 +197,7 @@ module('Acceptance | host-catalogs | hosts | update', function (hooks) { // Wrap on a try/catch because transitioning while editing returns error try { await visit(urls.hosts); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).exists(); await click(commonSelectors.MODAL_WARNING_CONFIRM_BTN); assert.strictEqual(currentURL(), urls.hosts); @@ -235,7 +235,7 @@ module('Acceptance | host-catalogs | hosts | update', function (hooks) { // Wrap on a try/catch because transitioning while editing returns error try { await visit(urls.hosts); - } catch (e) { + } catch { assert.dom(commonSelectors.MODAL_WARNING).exists(); await click(commonSelectors.MODAL_WARNING_CANCEL_BTN); diff --git a/ui/desktop/.eslintignore b/ui/desktop/.eslintignore deleted file mode 100644 index ffab5c053..000000000 --- a/ui/desktop/.eslintignore +++ /dev/null @@ -1,17 +0,0 @@ -# unconventional js -/blueprints/*/files/ - -# compiled output -/declarations/ -/dist/ - -# misc -/coverage/ -!.* -.*/ - -# ember-electron -/electron-app/ - -# ember-try -/.node_modules.ember-try/ diff --git a/ui/desktop/.eslintrc.js b/ui/desktop/.eslintrc.js deleted file mode 100644 index 15edd2003..000000000 --- a/ui/desktop/.eslintrc.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright IBM Corp. 2021, 2026 - * SPDX-License-Identifier: BUSL-1.1 - */ - -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - // This is specific babel-config. If grows consider creating a babel config file - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, - // end of babel-config - }, - plugins: ['ember'], - extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'], - env: { - browser: true, - }, - rules: { - curly: ['error', 'multi-line', 'consistent'], - 'ember/no-get': 'off', - 'ember/no-get-with-default': 'off', - 'ember/no-computed-properties-in-native-classes': 'off', - 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': - 'off', - }, - overrides: [ - // node files - { - files: [ - './.eslintrc.js', - './.prettierrc.js', - './.stylelintrc.js', - './.template-lintrc.js', - './ember-cli-build.js', - './testem.js', - './testem-electron.js', - './playwright.config.js', - './blueprints/*/index.js', - './config/**/*.js', - './lib/*/index.js', - './server/**/*.js', - ], - parserOptions: { - sourceType: 'script', - }, - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - // test files - files: ['tests/**/*-test.{js,ts}'], - extends: ['plugin:qunit/recommended'], - rules: { - 'qunit/require-expect': [2, 'except-simple'], - }, - }, - ], -}; diff --git a/ui/desktop/app/controllers/scopes/scope/projects/targets/index.js b/ui/desktop/app/controllers/scopes/scope/projects/targets/index.js index 36c74ef0c..3cc19b0ee 100644 --- a/ui/desktop/app/controllers/scopes/scope/projects/targets/index.js +++ b/ui/desktop/app/controllers/scopes/scope/projects/targets/index.js @@ -211,7 +211,7 @@ export default class ScopesScopeProjectsTargetsIndexController extends Controlle session = await this.store.findRecord('session', session_id, { reload: true, }); - } catch (error) { + } catch { /** * if the user cannot read or fetch the session we add the important * information returned from the connect command to allow the user diff --git a/ui/desktop/app/routes/scopes.js b/ui/desktop/app/routes/scopes.js index 8c88a8af3..8692c868f 100644 --- a/ui/desktop/app/routes/scopes.js +++ b/ui/desktop/app/routes/scopes.js @@ -29,7 +29,7 @@ export default class ScopesRoute extends Route { if (scopesCheck.response_type) { this.isPaginationSupported = true; } - } catch (e) { + } catch { // no op } } @@ -80,7 +80,7 @@ export default class ScopesRoute extends Route { } if (!downloadLink) throw new Error('No build found'); - } catch (e) { + } catch { // this is a catch for any errors that may occur and shows the user // an error alert directing them to the releases page downloadError = true; diff --git a/ui/desktop/app/routes/scopes/scope/projects.js b/ui/desktop/app/routes/scopes/scope/projects.js index fdbf225e5..455b9110d 100644 --- a/ui/desktop/app/routes/scopes/scope/projects.js +++ b/ui/desktop/app/routes/scopes/scope/projects.js @@ -83,7 +83,6 @@ export default class ScopesScopeProjectsRoute extends Route { let sessions; // We use a while loop to poll for new sessions from the client agent. - // eslint-disable-next-line no-constant-condition while (true) { try { sessions = @@ -152,7 +151,7 @@ export default class ScopesScopeProjectsRoute extends Route { alias.destination_id, ); orgScope = target.scope.parent_scope_id; - } catch (e) { + } catch { // Do nothing and default scope to global if an error occurs } diff --git a/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js b/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js index 63283e6dc..35ebcda74 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js +++ b/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js @@ -91,7 +91,7 @@ export default class ScopesScopeProjectsSessionsSessionRoute extends Route { try { const host = await this.store.findRecord('host', session.host_id); session.addHost(host); - } catch (error) { + } catch { // no operation } } diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js index b00bcc644..95b68be6b 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/target.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/target.js @@ -61,7 +61,7 @@ export default class ScopesScopeProjectsTargetsTargetRoute extends Route { hosts = Array.from( new Map(allFilteredHosts.map((host) => [host.id, host])).values(), ); - } catch (error) { + } catch { // no operation } } diff --git a/ui/desktop/app/services/store.js b/ui/desktop/app/services/store.js index 9434fc4e8..6edd48dec 100644 --- a/ui/desktop/app/services/store.js +++ b/ui/desktop/app/services/store.js @@ -4,8 +4,6 @@ */ // Importing 'Store' from 'ember-data/store' to get default configuration automatically. -// TODO: Remove eslint-disable after upgrading to eslint-plugin-ember >= v12.2.1 -// eslint-disable-next-line ember/use-ember-data-rfc-395-imports import Store from 'ember-data/store'; import { CacheHandler } from '@ember-data/store'; import RequestManager from '@ember-data/request'; diff --git a/ui/desktop/electron-app/config/cli.js b/ui/desktop/electron-app/config/cli.js index 669c1992d..29ad0577d 100644 --- a/ui/desktop/electron-app/config/cli.js +++ b/ui/desktop/electron-app/config/cli.js @@ -99,6 +99,7 @@ module.exports = { await extract(artifactPath, artifactDestination); } catch (e) { console.error('ERROR: Failed setting up CLI.', e); + // eslint-disable-next-line n/no-process-exit process.exit(1); } } else { diff --git a/ui/desktop/electron-app/src/helpers/app-updater.js b/ui/desktop/electron-app/src/helpers/app-updater.js index 2095c4336..a195250bb 100644 --- a/ui/desktop/electron-app/src/helpers/app-updater.js +++ b/ui/desktop/electron-app/src/helpers/app-updater.js @@ -173,7 +173,7 @@ module.exports = { */ if (!boundaryCli.isBuiltInCli) return; - const latestVersion = await findLatestVersion(releasesUrl); + let latestVersion = await findLatestVersion(releasesUrl); // Ensure version is in proper format if (!semver.valid(latestVersion)) { diff --git a/ui/desktop/electron-app/src/helpers/request-promise.js b/ui/desktop/electron-app/src/helpers/request-promise.js index 04ae304fb..2b95466cd 100644 --- a/ui/desktop/electron-app/src/helpers/request-promise.js +++ b/ui/desktop/electron-app/src/helpers/request-promise.js @@ -18,7 +18,7 @@ const netRequest = (url) => // request ends because: request.abort() has no effect after a request // ends and the promise will already have been completed, so a rejection // has no effect either. - const requestTimeout = setTimeout(() => { + setTimeout(() => { request.abort(); reject(new Error('Request timeout')); }, requestTimeoutSeconds * 1000); diff --git a/ui/desktop/electron-app/src/index.js b/ui/desktop/electron-app/src/index.js index b890fcd76..9b247d8ef 100644 --- a/ui/desktop/electron-app/src/index.js +++ b/ui/desktop/electron-app/src/index.js @@ -3,13 +3,8 @@ * SPDX-License-Identifier: BUSL-1.1 */ -/* eslint-disable no-console */ const path = require('path'); const { net } = require('electron'); -const { - default: installExtension, - EMBER_INSPECTOR, -} = require('electron-devtools-installer'); const { session, app, diff --git a/ui/desktop/electron-app/src/ipc/handlers.js b/ui/desktop/electron-app/src/ipc/handlers.js index c47b1b895..3acc5bc83 100644 --- a/ui/desktop/electron-app/src/ipc/handlers.js +++ b/ui/desktop/electron-app/src/ipc/handlers.js @@ -178,7 +178,7 @@ handle('searchCacheDaemon', async (request) => handle('isCacheDaemonRunning', async () => { try { await cacheDaemonManager.status(); - } catch (e) { + } catch { // There was likely an error connecting to the cache daemon. return false; } @@ -208,7 +208,7 @@ handle('isClientAgentRunning', async () => { } return status.status === 'running'; - } catch (e) { + } catch { // There was likely an error connecting to client agent. return false; } diff --git a/ui/desktop/electron-app/src/models/runtime-settings.js b/ui/desktop/electron-app/src/models/runtime-settings.js index 217d28939..0dfa45249 100644 --- a/ui/desktop/electron-app/src/models/runtime-settings.js +++ b/ui/desktop/electron-app/src/models/runtime-settings.js @@ -43,7 +43,7 @@ class RuntimeSettings { if (result.statusCode >= 400) { throw new Error(); } - } catch (e) { + } catch { throw new Error(`Cluster URL ${clusterUrl} could not be validated.`); } } diff --git a/ui/desktop/electron-app/src/services/cache-daemon-manager.js b/ui/desktop/electron-app/src/services/cache-daemon-manager.js index 30c65efe9..e7c547408 100644 --- a/ui/desktop/electron-app/src/services/cache-daemon-manager.js +++ b/ui/desktop/electron-app/src/services/cache-daemon-manager.js @@ -120,6 +120,7 @@ class CacheDaemonManager { async search(requestData) { const start = Date.now(); // Log request data, but clean up token from log + // eslint-disable-next-line no-unused-vars const { auth_token_id, token, ...logRequestData } = requestData; if (isWindows()) { diff --git a/ui/desktop/electron-app/src/utils/generateErrorPromise.js b/ui/desktop/electron-app/src/utils/generateErrorPromise.js index d82292212..3fa16c582 100644 --- a/ui/desktop/electron-app/src/utils/generateErrorPromise.js +++ b/ui/desktop/electron-app/src/utils/generateErrorPromise.js @@ -3,7 +3,6 @@ * SPDX-License-Identifier: MPL-2.0 */ const jsonify = require('./jsonify'); -const log = require('electron-log/main'); // Convert to json const generateErrorPromise = async (stderr) => { diff --git a/ui/desktop/electron-app/src/utils/jsonify.js b/ui/desktop/electron-app/src/utils/jsonify.js index c7a5fca5f..bdd9ce46c 100644 --- a/ui/desktop/electron-app/src/utils/jsonify.js +++ b/ui/desktop/electron-app/src/utils/jsonify.js @@ -3,14 +3,12 @@ * SPDX-License-Identifier: BUSL-1.1 */ -const log = require('electron-log/main'); - // Convert to json const jsonify = (data) => { if (typeof data !== 'string') data = JSON.stringify(data); try { return JSON.parse(data); - } catch (e) { + } catch { // Ignore parse errors } }; diff --git a/ui/desktop/electron-app/src/utils/sanitizer.js b/ui/desktop/electron-app/src/utils/sanitizer.js index 6e0ef756b..ac9ea1a17 100644 --- a/ui/desktop/electron-app/src/utils/sanitizer.js +++ b/ui/desktop/electron-app/src/utils/sanitizer.js @@ -3,8 +3,6 @@ * SPDX-License-Identifier: BUSL-1.1 */ -const { URL } = require('url'); - module.exports = { /** * Super paranoid shell quote/escape and validation. Input must be base62. @@ -27,7 +25,7 @@ module.exports = { try { const url = new URL(str); return `${url.protocol}//${url.host}`; - } catch (e) { + } catch { // Parse error throw new Error(`URL ${str} could not be validated.`); } diff --git a/ui/desktop/electron-app/tests/index.js b/ui/desktop/electron-app/tests/index.js index d91ed6976..8c4de395a 100644 --- a/ui/desktop/electron-app/tests/index.js +++ b/ui/desktop/electron-app/tests/index.js @@ -3,16 +3,20 @@ * SPDX-License-Identifier: BUSL-1.1 */ +// TODO: Is this file still needed? + const { default: installExtension, EMBER_INSPECTOR, } = require('electron-devtools-installer'); const path = require('path'); const { app } = require('electron'); +// eslint-disable-next-line n/no-missing-require const handleFileUrls = require('../src/handle-file-urls'); const { setupTestem, openTestWindow, + // eslint-disable-next-line n/no-extraneous-require } = require('ember-electron/lib/test-support'); const emberAppDir = path.resolve(__dirname, '..', 'ember-test'); diff --git a/ui/desktop/eslint.config.js b/ui/desktop/eslint.config.js new file mode 100644 index 000000000..3b70a83d6 --- /dev/null +++ b/ui/desktop/eslint.config.js @@ -0,0 +1,107 @@ +/** + * Copyright IBM Corp. 2021, 2026 + * SPDX-License-Identifier: BUSL-1.1 + */ + +'use strict'; + +const { defineConfig, globalIgnores } = require('eslint/config'); +const babelParser = require('@babel/eslint-parser'); +const js = require('@eslint/js'); +const eslintPluginEmberRecommended = require('eslint-plugin-ember/configs/recommended'); +const nPlugin = require('eslint-plugin-n'); +const qunitPlugin = require('eslint-plugin-qunit'); +const eslintConfigPrettier = require('eslint-config-prettier/flat'); +const globals = require('globals'); + +module.exports = defineConfig([ + js.configs.recommended, + ...eslintPluginEmberRecommended, + { + languageOptions: { + parser: babelParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + // This is specific babel-config. If it grows consider creating a babel config file + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { decoratorsBeforeExport: true }, + ], + ], + }, + // end of babel-config + }, + globals: { + ...globals.browser, + }, + }, + rules: { + curly: ['error', 'multi-line', 'consistent'], + 'ember/no-get': 'off', + 'ember/no-get-with-default': 'off', + 'ember/no-computed-properties-in-native-classes': 'off', + 'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts': + 'off', + }, + }, + + // Node files configuration + { + files: [ + 'eslint.config.js', + '.prettierrc.js', + '.stylelintrc.js', + '.template-lintrc.js', + 'ember-cli-build.js', + 'testem.js', + 'testem-electron.js', + 'playwright.config.js', + 'config/**/*.js', + 'server/**/*.js', + 'electron-app/**/*.js', + ], + plugins: { n: nPlugin }, + extends: [nPlugin.configs['flat/recommended-script']], + }, + + // These files reference config/config.js which is generated at build time + // and listed in .gitignore, so it won't exist when linting in CI unless we build first. + { + files: [ + 'electron-app/config/forge.config.js', + 'electron-app/src/index.js', + 'electron-app/src/config/menu.js', + 'electron-app/src/ipc/handlers.js', + 'electron-app/src/helpers/app-updater.js', + ], + rules: { + 'n/no-missing-require': 'off', + }, + }, + + // Test files configuration + { + files: ['tests/**/*-test.{js,ts}'], + extends: [ + { ...qunitPlugin.configs.recommended, plugins: { qunit: qunitPlugin } }, + ], + rules: { + 'qunit/require-expect': [2, 'except-simple'], + }, + }, + // Prettier should be last + eslintConfigPrettier, + globalIgnores([ + 'declarations/', + 'dist/', + 'coverage/', + '**/.*/', + '.node_modules.ember-try/', + 'electron-app/out/', + 'electron-app/ember-dist/', + ]), +]); diff --git a/ui/desktop/package.json b/ui/desktop/package.json index d6925bd9c..fdab5b929 100644 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -95,11 +95,13 @@ "ember-template-lint": "^6.0.0", "ember-template-lint-plugin-prettier": "^5.0.0", "ember-wormhole": "^0.6.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-ember": "^12.2.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-qunit": "^8.1.2", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-ember": "^12.7.5", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-qunit": "^8.2.6", + "@eslint/js": "^9.18.0", + "globals": "^17.3.0", "js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1", "loader.js": "^4.7.0", "miragejs": "^0.1.48",