Upgrade eslint (#3175)

* chore: 🤖 Upgrade eslint config for admin ui

* chore: 🤖 Fix eslint issues for admin

* chore: 🤖 Upgrade eslint config for desktop

* chore: 🤖 Fix linting errors in desktop

* chore: 🤖 Upgrade eslint for api addon

* chore: 🤖 Fix eslint issues in api addon

* chore: 🤖 Upgrade eslint for auth addon

* chore: 🤖 Fix eslint issues in auth addon

* chore: 🤖 Upgrade core eslint config

* chore: 🤖 Fix eslint issue for core addon

* chore: 🤖 Upgrade eslint config for rose addon

* chore: 🤖 Fix eslint issue for rose addon

* chore: 🤖 Upgrade e2e eslint config

* chore: 🤖 Fix eslint issues in e2e

* chore: 🤖 Fix CI linting issues

* chore: 🤖 Add back linting server files for the future

* chore: 🤖 Update qunit rules to use extends
This commit is contained in:
Zhihe Li authored and GitHub committed 2026-02-27 13:32:27 -05:00
1 parent d6e8e58ca1
commit 999c21c66a
73 files changed
+1081 -922

No files matched your search

-14
View File
@@ -1,14 +0,0 @@
# unconventional js
/blueprints/*/files/
# compiled output
/declarations/
/dist/
# misc
/coverage/
!.*
.*/
# ember-try
/.node_modules.ember-try/
-69
View File
@@ -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'],
},
},
],
};
+1 -1
View File
@@ -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
}
}
@@ -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') {
+1 -1
View File
@@ -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) {
-2
View File
@@ -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';
-1
View File
@@ -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',
+91
View File
@@ -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/',
]),
]);
+7 -5
View File
@@ -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",
@@ -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');
@@ -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,
@@ -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,
-14
View File
@@ -1,14 +0,0 @@
# unconventional js
/blueprints/*/files/
# compiled output
/declarations/
/dist/
# misc
/coverage/
!.*
.*/
# ember-try
/.node_modules.ember-try/
-69
View File
@@ -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'],
},
},
],
};
+91
View File
@@ -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/',
]),
]);
+7 -5
View File
@@ -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",
@@ -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');
}
});
@@ -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);
}
});
-14
View File
@@ -1,14 +0,0 @@
# unconventional js
/blueprints/*/files/
# compiled output
/declarations/
/dist/
# misc
/coverage/
!.*
.*/
# ember-try
/.node_modules.ember-try/
-68
View File
@@ -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'],
},
},
],
};
-1
View File
@@ -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();
+90
View File
@@ -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/',
]),
]);
+8 -6
View File
@@ -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"
}
}
}
-14
View File
@@ -1,14 +0,0 @@
# unconventional js
/blueprints/*/files/
# compiled output
/declarations/
/dist/
# misc
/coverage/
!.*
.*/
# ember-try
/.node_modules.ember-try/
-71
View File
@@ -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'],
},
},
],
};
+93
View File
@@ -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/',
]),
]);
+7 -5
View File
@@ -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",
@@ -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*/) {}
}
-4
View File
@@ -1,4 +0,0 @@
# e2e test output
admin/artifacts
desktop/artifacts
playwright-report
-32
View File
@@ -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"
}
]
};
+46
View File
@@ -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']),
]);
+1 -1
View File
@@ -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');
}
}
+1 -1
View File
@@ -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');
}
}
+4 -3
View File
@@ -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"
+376 -279
View File
File diff suppressed because it is too large. Load diff
-14
View File
@@ -1,14 +0,0 @@
# unconventional js
/blueprints/*/files/
# compiled output
/declarations/
/dist/
# misc
/coverage/
!.*
.*/
# ember-try
/.node_modules.ember-try/
-69
View File
@@ -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'],
},
},
],
};
@@ -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;
}
@@ -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
}
}
-1
View File
@@ -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'),
);
}
@@ -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
}
+1 -1
View File
@@ -53,7 +53,7 @@ export default class ApplicationRoute extends Route {
});
maybeModel?.rollbackAttributes();
transition.retry();
} catch (e) {
} catch {
// if user denies, do nothing
}
}
@@ -195,7 +195,7 @@ export default class ScopesScopeSessionRecordingsIndexRoute extends Route {
recursive: true,
});
return Boolean(storageBuckets.length);
} catch (e) {
} catch {
// no op
return false;
}
@@ -39,7 +39,7 @@ export default class ScopesScopeSessionRecordingsSessionRecordingChannelsByConne
storage_bucket_id,
);
}
} catch (e) {
} catch {
// no op
}
@@ -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
}
}
+88
View File
@@ -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/',
]),
]);
+7 -5
View File
@@ -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",
@@ -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);
@@ -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');
@@ -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);
@@ -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);
@@ -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);
-17
View File
@@ -1,17 +0,0 @@
# unconventional js
/blueprints/*/files/
# compiled output
/declarations/
/dist/
# misc
/coverage/
!.*
.*/
# ember-electron
/electron-app/
# ember-try
/.node_modules.ember-try/
-71
View File
@@ -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'],
},
},
],
};
@@ -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
+2 -2
View File
@@ -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;
@@ -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
}
@@ -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
}
}
@@ -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
}
}
-2
View File
@@ -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';
+1
View File
@@ -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 {
@@ -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)) {
@@ -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);
-5
View File
@@ -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,
+2 -2
View File
@@ -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;
}
@@ -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.`);
}
}
@@ -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()) {
@@ -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) => {
+1 -3
View File
@@ -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
}
};
@@ -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.`);
}
+4
View File
@@ -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');
+107
View File
@@ -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/',
]),
]);
+7 -5
View File
@@ -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",