diff --git a/.eslintignore b/.archive/.eslintignore similarity index 100% rename from .eslintignore rename to .archive/.eslintignore diff --git a/.eslintrc.json b/.archive/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to .archive/.eslintrc.json diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..6702793 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,206 @@ +import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import formatjs from "eslint-plugin-formatjs"; +import patternflyReact from "eslint-plugin-patternfly-react"; +import react from "eslint-plugin-react"; +import simpleImportSort from "eslint-plugin-simple-import-sort"; +import sortKeysFix from "eslint-plugin-sort-keys-fix"; +import testingLibrary from "eslint-plugin-testing-library"; +import globals from "globals"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; +// import prettier from "eslint-plugin-prettier"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [{ + ignores: [ + '**/node_modules', + '**/public', + '**/dist', + '**/.DS_Store', + '**/coverage', + '**/npm-debug.log', + '**/yarn-debug.log', + '**/yarn-error.log', + '**/.idea', + '**/.project', + '**/.classpath', + '**/.c9', + '**/*.launch', + '**/.settings', + '**/*.sublime-workspace', + '**/.history', + '**/.vscode', + '**/.vscode', + '**/*.swp', + '**/*.test.ts', + '**/*.test.tsx', + ], +}, ...fixupConfigRules(compat.extends( + '@redhat-cloud-services/eslint-config-redhat-cloud-services', + 'eslint:recommended', // Extended by eslint-config-redhat-cloud-services + 'plugin:@typescript-eslint/recommended', + 'plugin:react/recommended', // Extended by eslint-config-redhat-cloud-services + 'plugin:react-hooks/recommended', +)), { + plugins: { + '@typescript-eslint': fixupPluginRules(typescriptEslint), + formatjs, + 'patternfly-react': patternflyReact, + // prettier, // Plugin defined by eslint-config-redhat-cloud-services + react: fixupPluginRules(react), + 'simple-import-sort': simpleImportSort, + 'sort-keys-fix': sortKeysFix, + 'testing-library': testingLibrary, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + afterEach: 'readonly', + beforeEach: 'readonly', + describe: 'readonly', + expect: 'readonly', + global: 'writable', + insights: 'readonly', + it: 'readonly', + jest: 'readonly', + mount: 'readonly', + render: 'readonly', + require: 'readonly', + test: 'readonly', + shallow: 'readonly', + }, + + ecmaVersion: 5, + sourceType: 'module', + + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + + settings: { + react: { + version: 'detect', + }, + }, + + rules: { + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/ban-types': 'error', + '@typescript-eslint/camelcase': 'off', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/consistent-type-definitions': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/explicit-member-accessibility': 'off', + '@typescript-eslint/indent': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/prefer-for-of': 'error', + '@typescript-eslint/prefer-function-type': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/triple-slash-reference': 'error', + '@typescript-eslint/unified-signatures': 'error', + + 'arrow-parens': [2, 'as-needed', { + requireForBlockBody: false, + }], + + 'constructor-super': 'error', + curly: 'error', + 'dot-notation': 'error', + eqeqeq: ['error', 'smart'], + // 'formatjs/enforce-default-message': 'error', // Not working -- see https://github.com/formatjs/formatjs/issues/4388 + // 'formatjs/enforce-description': 'error', + // 'formatjs/enforce-id': 'error', + 'guard-for-in': 'error', + 'max-classes-per-file': ['error', 1], + 'max-len': 'off', + 'no-bitwise': 'error', + 'no-caller': 'error', + 'no-cond-assign': 'error', + 'no-console': 'error', + 'no-debugger': 'error', + 'no-empty': 'error', + 'no-eval': 'error', + 'no-new-wrappers': 'error', + 'no-prototype-builtins': 'off', + + 'no-restricted-imports': ['error', { + patterns: ['../*/**'], + }], + + 'no-shadow': 'error', + 'no-throw-literal': 'error', + 'no-trailing-spaces': 'off', + 'no-undef': 'off', + 'no-undef-init': 'error', + 'no-unsafe-finally': 'error', + + 'no-unused-expressions': ['error', { + allowTernary: true, + allowShortCircuit: true, + }], + + 'no-unused-labels': 'error', + 'no-var': 'error', + 'object-shorthand': 'error', + 'one-var': ['error', 'never'], + 'patternfly-react/no-anonymous-functions': 0, + 'prefer-const': 'error', + 'prettier/prettier': 'error', + radix: ['error', 'as-needed'], + 'react-hooks/exhaustive-deps': 0, + 'react/display-name': 0, + + 'react/no-unescaped-entities': ['error', { + forbid: ['>', '}'], + }], + + 'react/no-unknown-property': ['error', { + ignore: ['key'], + }], + + 'react/prop-types': 0, + 'simple-import-sort/imports': 'error', + 'spaced-comment': 'error', + 'rulesdir/disallow-pf-migrated-components': 'off', + 'rulesdir/forbid-pf-relative-imports': 'off', + 'testing-library/await-async-queries': 'error', + 'testing-library/no-await-sync-queries': 'error', + // 'testing-library/no-debugging-utils': 'warn', // Not working -- see https://eslint.org/docs/latest/use/troubleshooting/v9-rule-api-changes + 'testing-library/no-dom-import': 'off', + 'use-isnan': 'error', + }, +}, { + files: ['src/locales/messages.ts'], + + rules: { + 'sort-keys-fix/sort-keys-fix': 'error', + }, +}, ...compat.extends('plugin:testing-library/react').map(config => ({ + ...config, + files: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)'], +}))]; diff --git a/locales/data.json b/locales/data.json index df36e58..0dff0e7 100644 --- a/locales/data.json +++ b/locales/data.json @@ -1257,7 +1257,7 @@ "notConfiguredTitle": [ { "type": 0, - "value": "Optimizations not configured yet" + "value": "Optimizations may not be configured" } ], "notificationsAlertTitle": [ @@ -1326,12 +1326,6 @@ "value": "count" } ], - "optimizationsInfo": [ - { - "type": 0, - "value": "Assess and monitor your usage so you can optimize your OpenShift resources." - } - ], "optimizationsInfoArialLabel": [ { "type": 0, @@ -1344,6 +1338,22 @@ "value": "A dialog with a description of optimizations" } ], + "optimizationsInfoDesc": [ + { + "type": 0, + "value": "To receive these recommendations, you must first enable your namespaces. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "optimizationsInfoTitle": [ + { + "type": 0, + "value": "Assess and monitor usage from all of your clusters and provides optimization recommendations." + } + ], "optimizationsLoadingStateDesc": [ { "type": 0, diff --git a/locales/translations.json b/locales/translations.json index b330a87..0d3284e 100644 --- a/locales/translations.json +++ b/locales/translations.json @@ -49,15 +49,16 @@ "notConfiguredCli": "In the CLI, run {clipboard}", "notConfiguredDesc": "To receive resource optimization recommendations for your namespaces, you must first enable each namespace.", "notConfiguredNamespace": "To enable a namespace, label it with {clipboard}", - "notConfiguredTitle": "Optimizations not configured yet", + "notConfiguredTitle": "Optimizations may not be configured", "notificationsAlertTitle": "Duration based notifications", "openShift": "OpenShift", "optimizations": "Optimizations", "optimizationsCost": "Cost optimizations", "optimizationsDetails": "{count, plural, =0 {No optimizations} =1 {{count} optimization} other {{count} optimizations}}", - "optimizationsInfo": "Assess and monitor your usage so you can optimize your OpenShift resources.", "optimizationsInfoArialLabel": "A description of optimizations", "optimizationsInfoButtonArialLabel": "A dialog with a description of optimizations", + "optimizationsInfoDesc": "To receive these recommendations, you must first enable your namespaces. {learnMore}", + "optimizationsInfoTitle": "Assess and monitor usage from all of your clusters and provides optimization recommendations.", "optimizationsLoadingStateDesc": "Searching for your optimizations. Do not refresh the browser", "optimizationsLoadingStateTitle": "Looking for optimizations...", "optimizationsLongTerm": "Last 15 days", diff --git a/package-lock.json b/package-lock.json index 7cce279..eae7f87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,11 +42,14 @@ "yaml": "^2.4.5" }, "devDependencies": { + "@eslint/compat": "^1.1.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.4.0", "@formatjs/cli": "^6.2.12", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.0.15", + "@redhat-cloud-services/frontend-components-config": "^6.0.16", "@redhat-cloud-services/tsc-transform-imports": "^1.0.11", - "@swc/core": "^1.5.28", + "@swc/core": "^1.5.29", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", @@ -62,10 +65,10 @@ "@xstate/test": "^0.5.1", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^8.57.0", + "eslint": "^9.4.0", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^48.2.9", + "eslint-plugin-jsdoc": "^48.2.12", "eslint-plugin-markdown": "^5.0.0", "eslint-plugin-patternfly-react": "^5.3.0", "eslint-plugin-prettier": "^5.1.3", @@ -74,6 +77,7 @@ "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-testing-library": "^6.2.2", "git-revision-webpack-plugin": "^5.0.0", + "globals": "^15.4.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -611,6 +615,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", @@ -798,16 +811,61 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/compat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.1.0.tgz", + "integrity": "sha512-s9Wi/p25+KbzxKlDm3VshQdImhWk+cbdblhwGNnyCU5lpSwtWa4v7VQCxSki0FAUrGA3s8nCWgYzAH41mwQVKQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", + "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -815,7 +873,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -832,15 +890,12 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -858,25 +913,22 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/js": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", + "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@formatjs/cli": { @@ -1112,42 +1164,6 @@ "node": ">=8" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1161,11 +1177,18 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -2547,9 +2570,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-config": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.0.15.tgz", - "integrity": "sha512-j3BZAc8M+8R53fPqj9MYHI2lLgvwzLUNvPp4g0DXMViKXEWkP3/Vnguvt3tTlqIQ139KUL43MNEli+T4NSdZlA==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.0.16.tgz", + "integrity": "sha512-yjKC6Duredwck/Jx4imbznIkZg+HC5PzMXhSveWvc1A7LBlB7aPh5Y3hXBh+umRng7/1HScEB1xGYe97+FomZQ==", "dev": true, "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.8", @@ -3345,9 +3368,9 @@ } }, "node_modules/@swc/core": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.28.tgz", - "integrity": "sha512-muCdNIqOTURUgYeyyOLYE3ShL8SZO6dw6bhRm6dCvxWzCZOncPc5fB0kjcPXTML+9KJoHL7ks5xg+vsQK+v6ig==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.29.tgz", + "integrity": "sha512-nvTtHJI43DUSOAf3h9XsqYg8YXKc0/N4il9y4j0xAkO0ekgDNo+3+jbw6MInawjKJF9uulyr+f5bAutTsOKVlw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3362,16 +3385,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.28", - "@swc/core-darwin-x64": "1.5.28", - "@swc/core-linux-arm-gnueabihf": "1.5.28", - "@swc/core-linux-arm64-gnu": "1.5.28", - "@swc/core-linux-arm64-musl": "1.5.28", - "@swc/core-linux-x64-gnu": "1.5.28", - "@swc/core-linux-x64-musl": "1.5.28", - "@swc/core-win32-arm64-msvc": "1.5.28", - "@swc/core-win32-ia32-msvc": "1.5.28", - "@swc/core-win32-x64-msvc": "1.5.28" + "@swc/core-darwin-arm64": "1.5.29", + "@swc/core-darwin-x64": "1.5.29", + "@swc/core-linux-arm-gnueabihf": "1.5.29", + "@swc/core-linux-arm64-gnu": "1.5.29", + "@swc/core-linux-arm64-musl": "1.5.29", + "@swc/core-linux-x64-gnu": "1.5.29", + "@swc/core-linux-x64-musl": "1.5.29", + "@swc/core-win32-arm64-msvc": "1.5.29", + "@swc/core-win32-ia32-msvc": "1.5.29", + "@swc/core-win32-x64-msvc": "1.5.29" }, "peerDependencies": { "@swc/helpers": "*" @@ -3383,9 +3406,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.28.tgz", - "integrity": "sha512-sP6g63ybzIdOWNDbn51tyHN8EMt7Mb4RMeHQEsXB7wQfDvzhpWB+AbfK6Gs3Q8fwP/pmWIrWW9csKOc1K2Mmkg==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.29.tgz", + "integrity": "sha512-6F/sSxpHaq3nzg2ADv9FHLi4Fu2A8w8vP8Ich8gIl16D2htStlwnaPmCLjRswO+cFkzgVqy/l01gzNGWd4DFqA==", "cpu": [ "arm64" ], @@ -3399,9 +3422,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.28.tgz", - "integrity": "sha512-Bd/agp/g7QocQG5AuorOzSC78t8OzeN+pCN/QvJj1CvPhvppjJw6e1vAbOR8vO2vvGi2pvtf3polrYQStJtSiA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.29.tgz", + "integrity": "sha512-rF/rXkvUOTdTIfoYbmszbSUGsCyvqACqy1VeP3nXONS+LxFl4bRmRcUTRrblL7IE5RTMCKUuPbqbQSE2hK7bqg==", "cpu": [ "x64" ], @@ -3415,9 +3438,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.28.tgz", - "integrity": "sha512-Wr3TwPGIveS9/OBWm0r9VAL8wkCR0zQn46J8K01uYCmVhUNK3Muxjs0vQBZaOrGu94mqbj9OXY+gB3W7aDvGdA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.29.tgz", + "integrity": "sha512-2OAPL8iWBsmmwkjGXqvuUhbmmoLxS1xNXiMq87EsnCNMAKohGc7wJkdAOUL6J/YFpean/vwMWg64rJD4pycBeg==", "cpu": [ "arm" ], @@ -3431,9 +3454,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.28.tgz", - "integrity": "sha512-8G1ZwVTuLgTAVTMPD+M97eU6WeiRIlGHwKZ5fiJHPBcz1xqIC7jQcEh7XBkobkYoU5OILotls3gzjRt8CMNyDQ==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.29.tgz", + "integrity": "sha512-eH/Q9+8O5qhSxMestZnhuS1xqQMr6M7SolZYxiXJqxArXYILLCF+nq2R9SxuMl0CfjHSpb6+hHPk/HXy54eIRA==", "cpu": [ "arm64" ], @@ -3447,9 +3470,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.28.tgz", - "integrity": "sha512-0Ajdzb5Fzvz+XUbN5ESeHAz9aHHSYiQcm+vmsDi0TtPHmsalfnqEPZmnK0zPALPJPLQP2dDo4hELeDg3/c3xgA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.29.tgz", + "integrity": "sha512-TERh2OICAJz+SdDIK9+0GyTUwF6r4xDlFmpoiHKHrrD/Hh3u+6Zue0d7jQ/he/i80GDn4tJQkHlZys+RZL5UZg==", "cpu": [ "arm64" ], @@ -3463,9 +3486,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.28.tgz", - "integrity": "sha512-ueQ9VejnQUM2Pt+vT0IAKoF4vYBWUP6n1KHGdILpoGe3LuafQrqu7RoyQ15C7/AYii7hAeNhTFdf6gLbg8cjFg==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.29.tgz", + "integrity": "sha512-WMDPqU7Ji9dJpA+Llek2p9t7pcy7Bob8ggPUvgsIlv3R/eesF9DIzSbrgl6j3EAEPB9LFdSafsgf6kT/qnvqFg==", "cpu": [ "x64" ], @@ -3479,9 +3502,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.28.tgz", - "integrity": "sha512-G5th8Mg0az8CbY4GQt9/m5hg2Y0kGIwvQBeVACuLQB6q2Y4txzdiTpjmFqUUhEvvl7Klyx1IHvNhfXs3zpt7PA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.29.tgz", + "integrity": "sha512-DO14glwpdKY4POSN0201OnGg1+ziaSVr6/RFzuSLggshwXeeyVORiHv3baj7NENhJhWhUy3NZlDsXLnRFkmhHQ==", "cpu": [ "x64" ], @@ -3495,9 +3518,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.28.tgz", - "integrity": "sha512-JezwCGavZ7CkNXx4yInI4kpb71L0zxzxA9BFlmnsGKEEjVQcKc3hFpmIzfFVs+eotlBUwDNb0+Yo9m6Cb7lllA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.29.tgz", + "integrity": "sha512-V3Y1+a1zG1zpYXUMqPIHEMEOd+rHoVnIpO/KTyFwAmKVu8v+/xPEVx/AGoYE67x4vDAAvPQrKI3Aokilqa5yVg==", "cpu": [ "arm64" ], @@ -3511,9 +3534,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.28.tgz", - "integrity": "sha512-q8tW5J4RkOkl7vYShnWS//VAb2Ngolfm9WOMaF2GRJUr2Y/Xeb/+cNjdsNOqea2BzW049D5vdP7XPmir3/zUZw==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.29.tgz", + "integrity": "sha512-OrM6yfXw4wXhnVFosOJzarw0Fdz5Y0okgHfn9oFbTPJhoqxV5Rdmd6kXxWu2RiVKs6kGSJFZXHDeUq2w5rTIMg==", "cpu": [ "ia32" ], @@ -3527,9 +3550,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.28.tgz", - "integrity": "sha512-jap6EiB3wG1YE1hyhNr9KLPpH4PGm+5tVMfN0l7fgKtV0ikgpcEN/YF94tru+z5m2HovqYW009+Evq9dcVGmpg==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.29.tgz", + "integrity": "sha512-eD/gnxqKyZQQR0hR7TMkIlJ+nCF9dzYmVVNbYZWuA1Xy94aBPUsEk3Uw3oG7q6R3ErrEUPP0FNf2ztEnv+I+dw==", "cpu": [ "x64" ], @@ -4737,12 +4760,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@unleash/proxy-client-react": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/@unleash/proxy-client-react/-/proxy-client-react-4.2.4.tgz", @@ -8215,18 +8232,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -8720,41 +8725,37 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", + "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/config-array": "^0.15.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.4.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -8768,7 +8769,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -9439,9 +9440,9 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.9.tgz", - "integrity": "sha512-ErpKyr2mEUEkcdZ4nwW/cvDjClvAcvJMEXkGGll0wf8sro8h6qeQ3qlZyp1vM1dRk8Ap6rMdke8FnP94QBIaVQ==", + "version": "48.2.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.12.tgz", + "integrity": "sha512-sO9sKkJx5ovWoRk9hV0YiNzXQ4Z6j27CqE/po2E3wddZVuy9wvKPSTiIhpxMTrP/qURvKayJIDB2+o9kyCW1Fw==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.43.1", @@ -10272,48 +10273,33 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10347,42 +10333,30 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10799,15 +10773,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-selector": { @@ -10892,32 +10866,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -11513,12 +11471,15 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.4.0.tgz", + "integrity": "sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { diff --git a/package.json b/package.json index 02bd533..95c8137 100644 --- a/package.json +++ b/package.json @@ -80,11 +80,14 @@ "yaml": "^2.4.5" }, "devDependencies": { + "@eslint/compat": "^1.1.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.4.0", "@formatjs/cli": "^6.2.12", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.0.15", + "@redhat-cloud-services/frontend-components-config": "^6.0.16", "@redhat-cloud-services/tsc-transform-imports": "^1.0.11", - "@swc/core": "^1.5.28", + "@swc/core": "^1.5.29", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", @@ -100,10 +103,10 @@ "@xstate/test": "^0.5.1", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^8.57.0", + "eslint": "^9.4.0", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^48.2.9", + "eslint-plugin-jsdoc": "^48.2.12", "eslint-plugin-markdown": "^5.0.0", "eslint-plugin-patternfly-react": "^5.3.0", "eslint-plugin-prettier": "^5.1.3", @@ -112,6 +115,7 @@ "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-testing-library": "^6.2.2", "git-revision-webpack-plugin": "^5.0.0", + "globals": "^15.4.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -128,6 +132,7 @@ "webpack-bundle-analyzer": "^4.10.2" }, "overrides": { + "eslint": "^9.4.0", "redux": "^5.0.1" }, "insights": { diff --git a/src/locales/messages.ts b/src/locales/messages.ts index 21d5867..6272e0d 100644 --- a/src/locales/messages.ts +++ b/src/locales/messages.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { defineMessages } from 'react-intl'; export default defineMessages({ @@ -337,6 +336,11 @@ export default defineMessages({ description: 'No results found', id: 'noResultsFound', }, + notConfiguredChanges: { + defaultMessage: 'Changes will be reflected within 24 hours. {learnMore}', + description: 'Changes will be reflected within 24 hours. {learnMore}', + id: 'notConfiguredChanges', + }, notConfiguredCli: { defaultMessage: 'In the CLI, run {clipboard}', description: 'In the CLI, run {clipboard}', @@ -355,8 +359,8 @@ export default defineMessages({ id: 'notConfiguredNamespace', }, notConfiguredTitle: { - defaultMessage: 'Optimizations not configured yet', - description: 'Optimizations not configured yet', + defaultMessage: 'Optimizations may not be configured', + description: 'Optimizations may not be configured', id: 'notConfiguredTitle', }, notificationsAlertTitle: { @@ -395,8 +399,8 @@ export default defineMessages({ id: 'optimizationsInfoButtonArialLabel', }, optimizationsInfoDesc: { - defaultMessage: 'To receive these recommendations, you must first enable your namespaces.', - description: 'To receive these recommendations, you must first enable your namespaces.', + defaultMessage: 'To receive these recommendations, you must first enable your namespaces. {learnMore}', + description: 'To receive these recommendations, you must first enable your namespaces. {learnMore}', id: 'optimizationsInfoDesc', }, optimizationsInfoTitle: { diff --git a/src/routes/components/page/notConfigured/notConfiguredState.tsx b/src/routes/components/page/notConfigured/notConfiguredState.tsx index b07c079..e994953 100644 --- a/src/routes/components/page/notConfigured/notConfiguredState.tsx +++ b/src/routes/components/page/notConfigured/notConfiguredState.tsx @@ -59,9 +59,13 @@ const NotConfiguredState: React.FC = () => { {intl.formatMessage(messages.notConfiguredCli, { clipboard: getCliClipboard() })} - - {intl.formatMessage(messages.learnMore)} - + {intl.formatMessage(messages.notConfiguredChanges, { + learnMore: ( + + {intl.formatMessage(messages.learnMore)} + + ), + })} ); diff --git a/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdownChart.tsx b/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdownChart.tsx index 8b4b569..e87a736 100644 --- a/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdownChart.tsx +++ b/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdownChart.tsx @@ -195,10 +195,24 @@ const OptimizationsBreakdownChart: React.FC = // With box plot, datum.y will be an array const yVal = Array.isArray(datum.y) ? datum.y[0] : datum.y; + let units = datum.units; + + /** + * The recommendations API intentionally omits CPU request and limit units when "cores". + * + * The yaml format for the resource units needs to adhere to the Kubernetes standard that is outlined here + * https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + * + * Example. "45 millicores" is represented as "45m", 64 MiB is represented as "64Mi", + * 2.3 cores is represented as "2.3" (Note cores is not specified) + */ + if ((datum.childName === 'limit' || datum.childName === 'request') && datum.units === '') { + units = unitsLookupKey('cores'); + } return yVal !== null ? intl.formatMessage(messages.valueUnits, { value: yVal, - units: intl.formatMessage(messages.units, { units: unitsLookupKey(datum.units) }), + units: intl.formatMessage(messages.units, { units: unitsLookupKey(units) }), }) : intl.formatMessage(messages.chartNoData); }; diff --git a/src/routes/optimizations/optimizationsDetails/optimizationsDetailsHeader.tsx b/src/routes/optimizations/optimizationsDetails/optimizationsDetailsHeader.tsx index cbdb173..6b13f78 100644 --- a/src/routes/optimizations/optimizationsDetails/optimizationsDetailsHeader.tsx +++ b/src/routes/optimizations/optimizationsDetails/optimizationsDetailsHeader.tsx @@ -29,10 +29,13 @@ const OptimizationsDetailsHeader: React.FC = ()

{intl.formatMessage(messages.optimizationsInfoTitle)}


- {intl.formatMessage(messages.optimizationsInfoDesc)}  - - {intl.formatMessage(messages.learnMore)} - + {intl.formatMessage(messages.optimizationsInfoDesc, { + learnMore: ( + + {intl.formatMessage(messages.learnMore)} + + ), + })}

} diff --git a/src/routes/optimizations/optimizationsSummary/optimizationsSummary.tsx b/src/routes/optimizations/optimizationsSummary/optimizationsSummary.tsx index 97456d2..e8405f3 100644 --- a/src/routes/optimizations/optimizationsSummary/optimizationsSummary.tsx +++ b/src/routes/optimizations/optimizationsSummary/optimizationsSummary.tsx @@ -69,10 +69,13 @@ const OptimizationsSummary: React.FC = ({

{intl.formatMessage(messages.optimizationsInfoTitle)}


- {intl.formatMessage(messages.optimizationsInfoDesc)}  - - {intl.formatMessage(messages.learnMore)} - + {intl.formatMessage(messages.optimizationsInfoDesc, { + learnMore: ( + + {intl.formatMessage(messages.learnMore)} + + ), + })}

} diff --git a/src/routes/optimizations/optimizationsTable/optimizationsTable.tsx b/src/routes/optimizations/optimizationsTable/optimizationsTable.tsx index f6b6972..2cdd192 100644 --- a/src/routes/optimizations/optimizationsTable/optimizationsTable.tsx +++ b/src/routes/optimizations/optimizationsTable/optimizationsTable.tsx @@ -12,7 +12,6 @@ import { useLocation } from 'react-router-dom'; import type { AnyAction } from 'redux'; import type { ThunkDispatch } from 'redux-thunk'; import { Loading } from 'routes/components/page/loading'; -import { NoOptimizations } from 'routes/components/page/noOptimizations'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { NotConfigured } from 'routes/components/page/notConfigured'; import { styles } from 'routes/optimizations/optimizationsBreakdown/optimizationsBreakdown.styles'; @@ -187,10 +186,6 @@ const OptimizationsTable: React.FC = ({ return ; } if (!query.filter_by && !hasOptimizations && reportFetchStatus === FetchStatus.complete) { - return ; - } - const test = false; - if (test) { return ; } return ( @@ -211,7 +206,6 @@ const OptimizationsTable: React.FC = ({ ); }; -// eslint-disable-next-line no-empty-pattern const useMapToProps = ({ cluster, project, query }: OptimizationsTableMapProps): OptimizationsTableStateProps => { const dispatch: ThunkDispatch = useDispatch();