diff --git a/.github/workflows/eslint_review.yml b/.github/workflows/eslint_review.yml new file mode 100644 index 00000000000..5fc14caf77e --- /dev/null +++ b/.github/workflows/eslint_review.yml @@ -0,0 +1,30 @@ +name: ESLint Review +on: [pull_request] +jobs: + eslint: + name: ESLint Review + runs-on: ubuntu-latest + permissions: + contents: read + checks: write + strategy: + matrix: + package: [manager, api-v4, queries, shared, ui, utilities, validation] + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v2 + with: + run_install: false + version: 10 + - uses: actions/setup-node@v4 + with: + node-version: "20.17" + cache: "pnpm" + - run: pnpm install + - uses: abailly-akamai/action-eslint@8ad68ba04fa60924ef7607b07deb5989f38f5ed6 # v1.0.2 + with: + workdir: packages/${{ matrix.package }} + github_token: ${{ secrets.GITHUB_TOKEN }} + reporter: github-pr-check + level: warning # This will report both warnings and errors + filter_mode: added # Only comment on new/modified lines \ No newline at end of file diff --git a/package.json b/package.json index fdc18b3a98c..29a279af2a1 100644 --- a/package.json +++ b/package.json @@ -2,16 +2,35 @@ "name": "root", "private": true, "license": "Apache-2.0", + "type": "module", "devDependencies": { + "@eslint/js": "^9.23.0", "concurrently": "9.1.0", "husky": "^9.1.6", "typescript": "^5.7.3", "vitest": "^3.0.7", "@vitest/ui": "^3.0.7", - "lint-staged": "^15.4.3" + "lint-staged": "^15.4.3", + "eslint": "^9.23.0", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-cypress": "^4.2.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-perfectionist": "^4.10.1", + "eslint-plugin-prettier": "~5.2.6", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-sonarjs": "^3.0.2", + "eslint-plugin-testing-library": "^7.1.1", + "eslint-plugin-xss": "^0.1.12", + "prettier": "~3.5.3", + "typescript-eslint": "^8.29.0", + "@typescript-eslint/eslint-plugin": "^8.29.0", + "@typescript-eslint/parser": "^8.29.0", + "@linode/eslint-plugin-cloud-manager": "^0.0.10", + "jiti": "^2.4.2" }, "scripts": { - "lint": "eslint . --quiet --ext .js,.ts,.tsx", + "lint:all": "pnpm -r --parallel lint", "install:all": "pnpm install --frozen-lockfile", "build:sdk": "pnpm run --filter @linode/api-v4 build", "build:validation": "pnpm run --filter @linode/validation build", diff --git a/packages/api-v4/.changeset/pr-11941-tech-stories-1743701271429.md b/packages/api-v4/.changeset/pr-11941-tech-stories-1743701271429.md new file mode 100644 index 00000000000..e4690c79a77 --- /dev/null +++ b/packages/api-v4/.changeset/pr-11941-tech-stories-1743701271429.md @@ -0,0 +1,5 @@ +--- +"@linode/api-v4": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/api-v4/.eslintrc.json b/packages/api-v4/.eslintrc.json deleted file mode 100644 index f551347ff3f..00000000000 --- a/packages/api-v4/.eslintrc.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "ignorePatterns": ["node_modules", "lib", "index.js", "!.eslintrc.js"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2020, - "warnOnUnsupportedTypeScriptVersion": true - }, - "plugins": ["@typescript-eslint", "sonarjs", "prettier"], - "extends": [ - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:sonarjs/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "@typescript-eslint/naming-convention": [ - "warn", - { - "format": ["camelCase", "UPPER_CASE", "PascalCase"], - "leadingUnderscore": "allow", - "selector": "variable", - "trailingUnderscore": "allow" - }, - { - "format": null, - "modifiers": ["destructured"], - "selector": "variable" - }, - { - "format": ["camelCase", "PascalCase"], - "selector": "function" - }, - { - "format": ["camelCase"], - "leadingUnderscore": "allow", - "selector": "parameter" - }, - { - "format": ["PascalCase"], - "selector": "typeLike" - } - ], - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-namespace": "warn", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-empty-interface": "warn", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/interface-name-prefix": "off", - "no-unused-vars": [ - "warn", - { - "argsIgnorePattern": "^_" - } - ], - "no-unused-expressions": "warn", - "no-bitwise": "error", - "no-caller": "error", - "no-eval": "error", - "no-throw-literal": "warn", - "no-loop-func": "error", - "no-await-in-loop": "error", - "array-callback-return": "error", - "no-invalid-this": "off", - "no-new-wrappers": "error", - "no-restricted-imports": ["error", "rxjs"], - "no-console": "error", - "no-undef-init": "off", - "radix": "error", - "sonarjs/cognitive-complexity": "warn", - "sonarjs/no-duplicate-string": "warn", - "sonarjs/prefer-immediate-return": "warn", - "sonarjs/no-identical-functions": "warn", - "sonarjs/no-redundant-jump": "warn", - "sonarjs/no-small-switch": "warn", - "no-multiple-empty-lines": "error", - "curly": "warn", - "sort-keys": "off", - "comma-dangle": "off", - "no-trailing-spaces": "warn", - "no-mixed-requires": "warn", - "spaced-comment": "warn", - "object-shorthand": "warn", - "prettier/prettier": "warn", - "@typescript-eslint/explicit-module-boundary-types": "off" - }, - "overrides": [ - { - "files": ["*ts"], - "rules": { - "@typescript-eslint/ban-types": [ - "warn", - { - "types": { - "String": true, - "Boolean": true, - "Number": true, - "Symbol": true, - "{}": false, - "Object": false, - "object": false, - "Function": false - }, - "extendDefaults": true - } - ] - } - } - ] -} diff --git a/packages/api-v4/eslint.config.js b/packages/api-v4/eslint.config.js new file mode 100644 index 00000000000..8818da48db2 --- /dev/null +++ b/packages/api-v4/eslint.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { baseConfig } from '../manager/eslint.config.js'; + +export default defineConfig({ + extends: baseConfig, +}); diff --git a/packages/api-v4/package.json b/packages/api-v4/package.json index 839ef589f3a..e497a194fcc 100644 --- a/packages/api-v4/package.json +++ b/packages/api-v4/package.json @@ -58,9 +58,6 @@ "devDependencies": { "axios-mock-adapter": "^1.22.0", "concurrently": "^9.0.1", - "eslint": "^6.8.0", - "eslint-plugin-sonarjs": "^0.5.0", - "prettier": "~2.2.1", "tsup": "^8.4.0" }, "lint-staged": { diff --git a/packages/api-v4/src/request.ts b/packages/api-v4/src/request.ts index 926e6a5bd57..c63a5198048 100644 --- a/packages/api-v4/src/request.ts +++ b/packages/api-v4/src/request.ts @@ -11,6 +11,8 @@ interface RequestConfig extends AxiosRequestConfig { validationErrors?: APIError[]; } +type RequestConfigFn = (config: RequestConfig) => RequestConfig; + type ConfigField = 'headers' | 'data' | 'params' | 'method' | 'url'; export const baseRequest = Axios.create({ @@ -71,11 +73,13 @@ export const setMethod = (method: 'GET' | 'POST' | 'PUT' | 'DELETE') => /** Param */ export const setParams = (params: Params | undefined) => set('params', params); -export const setHeaders = (newHeaders: any = {}) => (object: any) => { - return !isEmpty(newHeaders) - ? { ...object, headers: { ...object.headers, ...newHeaders } } - : object; -}; +export const setHeaders = + (newHeaders: any = {}) => + (object: any) => { + return !isEmpty(newHeaders) + ? { ...object, headers: { ...object.headers, ...newHeaders } } + : object; + }; /** * Validate and set data in the request configuration object. @@ -93,7 +97,7 @@ export const setData = ( * object, after the validation has happened. Use with caution: It was created as a trap door for * merging IPv4 addresses and ports in the NodeBalancer creation flow. */ - postValidationTransform?: (_: any) => any + postValidationTransform?: (_: any) => any, ): any => { if (!schema) { return set('data', data); @@ -121,7 +125,7 @@ export const setData = ( * to itself since we have nested structures (think NodeBalancers). */ export const convertYupToLinodeErrors = ( - validationError: ValidationError + validationError: ValidationError, ): APIError[] => { const { inner } = validationError; @@ -169,18 +173,18 @@ export const setXFilter = (xFilter: Filter | undefined) => { * is an error. * @param fns An array of functions to be applied to the config object. */ -const reduceRequestConfig = (...fns: Function[]): RequestConfig => - fns.reduceRight((result, fn) => fn(result), { +const reduceRequestConfig = (...fns: RequestConfigFn[]): RequestConfig => + fns.reduceRight((result, fn) => fn(result), { url: 'https://api.linode.com/v4', headers: {}, }); /** Generator */ -export const requestGenerator = (...fns: Function[]): Promise => { +export const requestGenerator = (...fns: RequestConfigFn[]): Promise => { const config = reduceRequestConfig(...fns); if (config.validationErrors) { return Promise.reject( - config.validationErrors // All failed requests, client or server errors, should be APIError[] + config.validationErrors, // All failed requests, client or server errors, should be APIError[] ); } return baseRequest(config).then((response) => response.data); @@ -199,7 +203,7 @@ export const requestGenerator = (...fns: Function[]): Promise => { export const mockAPIError = ( status: number = 400, statusText: string = 'Internal Server Error', - data: any = {} + data: any = {}, ): Promise => new Promise((resolve, reject) => setTimeout( @@ -213,10 +217,10 @@ export const mockAPIError = ( config: { headers: new AxiosHeaders(), }, - }) + }), ), - process.env.NODE_ENV === 'test' ? 0 : 250 - ) + process.env.NODE_ENV === 'test' ? 0 : 250, + ), ); const createError = (message: string, response: AxiosResponse) => { @@ -231,7 +235,7 @@ export interface CancellableRequest { } export const CancellableRequest = ( - ...fns: Function[] + ...fns: RequestConfigFn[] ): CancellableRequest => { const config = reduceRequestConfig(...fns); const source = Axios.CancelToken.source(); @@ -251,7 +255,7 @@ export const CancellableRequest = ( cancel: source.cancel, request: () => baseRequest({ ...config, cancelToken: source.token }).then( - (response) => response.data + (response) => response.data, ), }; }; diff --git a/packages/manager/.changeset/pr-11941-tech-stories-1743701285887.md b/packages/manager/.changeset/pr-11941-tech-stories-1743701285887.md new file mode 100644 index 00000000000..7beac16a8d3 --- /dev/null +++ b/packages/manager/.changeset/pr-11941-tech-stories-1743701285887.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/manager/.eslintrc.cjs b/packages/manager/.eslintrc.cjs deleted file mode 100644 index 8c743b2bb8e..00000000000 --- a/packages/manager/.eslintrc.cjs +++ /dev/null @@ -1,462 +0,0 @@ -/* eslint-disable sonarjs/no-duplicate-string */ -module.exports = { - env: { - browser: true, - }, - extends: [ - // disables a few of the recommended rules from the previous set that we know are already covered by TypeScript's typechecker - 'plugin:@typescript-eslint/eslint-recommended', - // like eslint:recommended, except it only turns on rules from our TypeScript-specific plugin. - 'plugin:@typescript-eslint/recommended', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended', - 'plugin:sonarjs/recommended', - 'plugin:ramda/recommended', - 'plugin:cypress/recommended', - 'plugin:prettier/recommended', // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. - 'plugin:testing-library/react', - 'plugin:perfectionist/recommended-natural', - ], - ignorePatterns: [ - 'node_modules', - 'build', - 'storybook-static', - '.storybook', - 'public', - '!.eslintrc.js', - ], - overrides: [ - { - files: ['*.ts', '*.tsx'], - rules: { - '@typescript-eslint/ban-types': [ - 'error', - { - extendDefaults: true, - types: { - '{}': false, - }, - }, - ], - '@typescript-eslint/no-unused-vars': [ - 'warn', - { argsIgnorePattern: '^_' }, - ], - // eslint not typescript does a bad job with type aliases, we let typescript eslint do it - 'no-unused-vars': 'off', - }, - }, - { - files: ['*js'], - rules: { - '@typescript-eslint/explicit-function-return-type': 'off', - }, - }, - { - env: { node: true }, - // node files - files: [ - '**/*.test.*', - '**/*.spec.js', - '**/*.stories.js', - 'scripts/**', - 'config/**', - 'cypress/**', - ], - rules: { - '@typescript-eslint/no-empty-function': 'warn', // possible for tests - '@typescript-eslint/no-var-requires': 'off', - 'array-callback-return': 'off', - 'no-unused-expressions': 'off', - }, - }, - { - env: { - 'cypress/globals': true, - node: true, - }, - // scrips, config and cypress files can use console - files: ['scripts/**', 'config/**', 'cypress/**'], - rules: { - 'no-console': 'off', - // here we get false positives as cypress self handles async/await - 'testing-library/await-async-query': 'off', - }, - }, - { - env: { - 'cypress/globals': true, - node: true, - }, - // cypress/e2e/core files have had --fix applied, so enforce error level to maintain code quality - files: ['cypress/e2e/core/**'], - rules: { - '@typescript-eslint/consistent-type-imports': 'error', - 'perfectionist/sort-array-includes': 'error', - 'perfectionist/sort-classes': 'error', - 'perfectionist/sort-enums': 'error', - 'perfectionist/sort-exports': 'error', - 'perfectionist/sort-imports': [ - 'error', - { - 'custom-groups': { - type: { - react: ['react', 'react-*'], - src: ['src*'], - }, - value: { - src: ['src/**/*'], - }, - }, - groups: [ - ['builtin', 'libraries', 'external'], - ['src', 'internal'], - ['parent', 'sibling', 'index'], - 'object', - 'unknown', - [ - 'type', - 'internal-type', - 'parent-type', - 'sibling-type', - 'index-type', - ], - ], - 'newlines-between': 'always', - }, - ], - 'perfectionist/sort-interfaces': 'error', - 'perfectionist/sort-jsx-props': 'error', - 'perfectionist/sort-map-elements': 'error', - 'perfectionist/sort-named-exports': 'error', - 'perfectionist/sort-named-imports': 'error', - 'perfectionist/sort-object-types': 'error', - 'perfectionist/sort-objects': 'error', - 'perfectionist/sort-union-types': 'error', - }, - }, - // restrict usage of react-router-dom during migration to tanstack/react-router - // TODO: TanStack Router - remove this override when migration is complete - { - files: [ - // for each new features added to the migration router, add its directory here - 'src/features/Betas/**/*', - 'src/features/Domains/**/*', - 'src/features/Firewalls/**/*', - 'src/features/Images/**/*', - 'src/features/Longview/**/*', - 'src/features/NodeBalancers/**/*', - 'src/features/ObjectStorage/**/*', - 'src/features/PlacementGroups/**/*', - 'src/features/StackScripts/**/*', - 'src/features/Volumes/**/*', - 'src/features/VPCs/**/*', - ], - rules: { - 'no-restricted-imports': [ - // This needs to remain an error however trying to link to a feature that is not yet migrated will break the router - // For those cases react-router-dom history.push is still needed - // using `eslint-disable-next-line no-restricted-imports` can help bypass those imports - 'error', - { - paths: [ - { - importNames: [ - // intentionally not including in this list as this will be updated last globally - 'useNavigate', - 'useParams', - 'useLocation', - 'useHistory', - 'useRouteMatch', - 'matchPath', - 'MemoryRouter', - 'Route', - 'RouteProps', - 'Switch', - 'Redirect', - 'RouteComponentProps', - 'withRouter', - ], - message: - 'Please use routing utilities intended for @tanstack/react-router.', - name: 'react-router-dom', - }, - { - importNames: ['TabLinkList'], - message: - 'Please use the TanStackTabLinkList component for components being migrated to TanStack Router.', - name: 'src/components/Tabs/TabLinkList', - }, - { - importNames: ['OrderBy', 'default'], - message: - 'Please use useOrderV2 hook for components being migrated to TanStack Router.', - name: 'src/components/OrderBy', - }, - { - importNames: ['Prompt'], - message: - 'Please use the TanStack useBlocker hook for components/features being migrated to TanStack Router.', - name: 'src/components/Prompt/Prompt', - }, - ], - }, - ], - }, - }, - // Apply `no-createLinode` rule to `cypress` related files only. - { - files: ['cypress/**'], - rules: { - '@linode/cloud-manager/no-createLinode': 'error', - }, - }, - ], - parser: '@typescript-eslint/parser', // Specifies the ESLint parser - parserOptions: { - // Warning if you want to set tsconfig.json, you ll need laso to set `tsconfigRootDir:__dirname` - // BUT we decided not to use this feature due to a very important performance impact - // project: 'tsconfig.json', - ecmaFeatures: { - jsx: true, - }, - // Only ESLint 6.2.0 and later support ES2020. - ecmaVersion: 2020, - warnOnUnsupportedTypeScriptVersion: true, - }, - plugins: [ - '@typescript-eslint', - 'react', - 'react-hooks', - 'jsx-a11y', - 'sonarjs', - 'ramda', - 'cypress', - 'prettier', - 'testing-library', - 'scanjs-rules', - 'xss', - 'perfectionist', - '@linode/eslint-plugin-cloud-manager', - 'react-refresh', - ], - rules: { - '@linode/cloud-manager/deprecate-formik': 'warn', - '@linode/cloud-manager/no-createLinode': 'off', - '@linode/cloud-manager/no-mui-theme-spacing': 'warn', - '@typescript-eslint/consistent-type-imports': 'warn', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/naming-convention': [ - 'warn', - { - format: ['camelCase', 'UPPER_CASE', 'PascalCase'], - leadingUnderscore: 'allow', - selector: 'variable', - trailingUnderscore: 'allow', - }, - { - format: null, - modifiers: ['destructured'], - selector: 'variable', - }, - { - format: ['camelCase', 'PascalCase'], - selector: 'function', - }, - { - format: ['camelCase'], - leadingUnderscore: 'allow', - selector: 'parameter', - }, - { - format: ['PascalCase'], - selector: 'typeLike', - }, - ], - '@typescript-eslint/no-empty-interface': 'warn', - '@typescript-eslint/no-explicit-any': 'warn', - '@typescript-eslint/no-inferrable-types': 'off', - '@typescript-eslint/no-namespace': 'warn', - // this would disallow usage of ! postfix operator on non null types - '@typescript-eslint/no-non-null-assertion': 'off', - // This rules is disabled to avoid duplicates errors as no-unused-vars is set - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-use-before-define': 'off', - 'array-callback-return': 'error', - 'comma-dangle': 'off', // Prettier and TS both handle and check for this one - // radix: Codacy considers it as an error, i put it here to fix it before push - curly: 'warn', - eqeqeq: 'warn', - // See: https://www.w3.org/TR/graphics-aria-1.0/ - 'jsx-a11y/aria-role': [ - 'error', - { - allowedInvalidRoles: [ - 'graphics-document', - 'graphics-object', - 'graphics-symbol', - ], - }, - ], - // typescript-eslint specific rules - 'no-await-in-loop': 'error', - 'no-bitwise': 'error', - 'no-caller': 'error', - 'no-console': 'error', - 'no-eval': 'error', - // turned off to allow arrow functions in React Class Component - 'no-invalid-this': 'off', - // loop rules - 'no-loop-func': 'error', - 'no-mixed-requires': 'warn', - // style errors - 'no-multiple-empty-lines': 'error', - 'no-new-wrappers': 'error', - 'no-restricted-imports': [ - 'error', - 'rxjs', - '@mui/core', - '@mui/system', - '@mui/icons-material', - { - importNames: ['Typography'], - message: - 'Please use Typography component from @linode/ui instead of @mui/material', - name: '@mui/material', - }, - { - importNames: ['Link'], - message: - 'Please use the Link component from src/components/Link instead of react-router-dom', - name: 'react-router-dom', - }, - ], - 'no-restricted-syntax': [ - 'error', - { - message: - "The 'data-test-id' attribute is not allowed; use 'data-testid' instead.", - selector: "JSXAttribute[name.name='data-test-id']", - }, - ], - 'no-throw-literal': 'warn', - 'no-trailing-spaces': 'warn', - // allowing to init vars to undefined - 'no-undef-init': 'off', - 'no-unused-expressions': 'warn', - // prepend `_` to an arg you accept to ignore - 'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], - 'object-shorthand': 'warn', - // Perfectionist - 'perfectionist/sort-array-includes': 'warn', - 'perfectionist/sort-classes': 'warn', - 'perfectionist/sort-enums': 'warn', - 'perfectionist/sort-exports': 'warn', - 'perfectionist/sort-imports': [ - 'warn', - { - 'custom-groups': { - type: { - react: ['react', 'react-*'], - src: ['src*'], - }, - value: { - src: ['src/**/*'], - }, - }, - groups: [ - ['builtin', 'libraries', 'external'], - ['src', 'internal'], - ['parent', 'sibling', 'index'], - 'object', - 'unknown', - [ - 'type', - 'internal-type', - 'parent-type', - 'sibling-type', - 'index-type', - ], - ], - 'newlines-between': 'always', - }, - ], - 'perfectionist/sort-interfaces': 'warn', - 'perfectionist/sort-jsx-props': 'warn', - 'perfectionist/sort-map-elements': 'warn', - 'perfectionist/sort-named-exports': 'warn', - 'perfectionist/sort-named-imports': 'warn', - 'perfectionist/sort-object-types': 'warn', - 'perfectionist/sort-objects': 'warn', - 'perfectionist/sort-union-types': 'warn', - // make prettier issues warnings - 'prettier/prettier': 'warn', - // radix requires to give the base in parseInt https://eslint.org/docs/rules/radix - radix: 'error', - // ramda - 'ramda/prefer-ramda-boolean': 'off', - // react and jsx specific rules - 'react/display-name': 'off', - 'react/jsx-no-bind': 'off', - 'react/jsx-no-script-url': 'error', - 'react/jsx-no-useless-fragment': 'warn', - 'react/no-unescaped-entities': 'warn', - // requires the definition of proptypes for react components - 'react/prop-types': 'off', - 'react/self-closing-comp': 'warn', - 'react-hooks/exhaustive-deps': 'warn', - 'react-hooks/rules-of-hooks': 'error', - 'react-refresh/only-export-components': 'warn', - 'scanjs-rules/assign_to_hostname': 'warn', - 'scanjs-rules/assign_to_href': 'warn', - 'scanjs-rules/assign_to_location': 'warn', - 'scanjs-rules/assign_to_onmessage': 'warn', - 'scanjs-rules/assign_to_pathname': 'warn', - 'scanjs-rules/assign_to_protocol': 'error', - 'scanjs-rules/assign_to_search': 'warn', - 'scanjs-rules/assign_to_src': 'warn', - // Allow roles from WAI-ARIA graphics module proposal. - 'scanjs-rules/call_Function': 'error', - // Prevent patterns susceptible to XSS, like '
' + userInput + '
'. - 'scanjs-rules/call_addEventListener': 'warn', - 'scanjs-rules/call_parseFromString': 'error', - 'scanjs-rules/new_Function': 'error', - 'scanjs-rules/property_geolocation': 'error', - // sonar - 'sonarjs/cognitive-complexity': 'off', - 'sonarjs/no-duplicate-string': 'warn', - 'sonarjs/no-identical-functions': 'warn', - 'sonarjs/no-redundant-jump': 'warn', - 'sonarjs/no-small-switch': 'warn', - 'sonarjs/prefer-immediate-return': 'warn', - 'sort-keys': 'off', - 'spaced-comment': 'warn', - // https://github.com/Rantanen/eslint-plugin-xss/blob/master/docs/rules/no-mixed-html.md - 'xss/no-mixed-html': [ - 'error', - { - // It's only valid to assign HTML to variables/attributes named "_html" (for React's - functions: { - // Declare "sanitizeHTML" as a function that accepts HTML as input and output, and that - // it's "safe", meaning callers can trust the output (but the output still can only be - // assigned to a variable with the naming convention above). - sanitizeHTML: { - htmlInput: true, - htmlOutput: true, - safe: true, - }, - }, - // dangerouslySetInnerHTML) and /sanitize/i (regex matching). - htmlVariableRules: ['__html', 'sanitize/i'], - }, - ], - }, - settings: { - react: { - version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use - }, - }, -}; diff --git a/packages/manager/cypress/e2e/core/account/account-linode-managed.spec.ts b/packages/manager/cypress/e2e/core/account/account-linode-managed.spec.ts index 8115f263497..163164c7ee3 100644 --- a/packages/manager/cypress/e2e/core/account/account-linode-managed.spec.ts +++ b/packages/manager/cypress/e2e/core/account/account-linode-managed.spec.ts @@ -37,14 +37,14 @@ describe('Account Linode Managed', () => { restricted: false, username: 'mock-user', }); - const mockLinodes = new Array(5).fill(null).map( - (item: null, index: number): Linode => { + const mockLinodes = new Array(5) + .fill(null) + .map((item: null, index: number): Linode => { return linodeFactory.build({ label: `Linode ${index}`, region: chooseRegion().id, }); - } - ); + }); mockGetLinodes(mockLinodes).as('getLinodes'); mockGetAccount(mockAccount).as('getAccount'); diff --git a/packages/manager/cypress/e2e/core/account/user-permissions.spec.ts b/packages/manager/cypress/e2e/core/account/user-permissions.spec.ts index 098053018b4..6dcb0232917 100644 --- a/packages/manager/cypress/e2e/core/account/user-permissions.spec.ts +++ b/packages/manager/cypress/e2e/core/account/user-permissions.spec.ts @@ -581,7 +581,7 @@ describe('User permission management', () => { ); // Confirm that no "Profile" tab is present on the proxy user's User Permissions page. - expect(cy.findByText('User Profile').should('not.exist')); + cy.findByText('User Profile').should('not.exist'); cy.get('[data-qa-global-section]') .should('be.visible') diff --git a/packages/manager/cypress/e2e/core/account/users-landing-page.spec.ts b/packages/manager/cypress/e2e/core/account/users-landing-page.spec.ts index 762310df69f..ae8960a5f8a 100644 --- a/packages/manager/cypress/e2e/core/account/users-landing-page.spec.ts +++ b/packages/manager/cypress/e2e/core/account/users-landing-page.spec.ts @@ -31,13 +31,12 @@ import type { Profile } from '@linode/api-v4'; const initTestUsers = (profile: Profile, enableChildAccountAccess: boolean) => { const mockProfile = profile; - const mockRestrictedParentWithoutChildAccountAccess = accountUserFactory.build( - { + const mockRestrictedParentWithoutChildAccountAccess = + accountUserFactory.build({ restricted: true, user_type: 'parent', username: 'restricted-parent-user-without-child-account-access', - } - ); + }); const mockRestrictedParentWithChildAccountAccess = accountUserFactory.build({ restricted: true, diff --git a/packages/manager/cypress/e2e/core/billing/billing-invoices.spec.ts b/packages/manager/cypress/e2e/core/billing/billing-invoices.spec.ts index b00ce254e9e..1c419543396 100644 --- a/packages/manager/cypress/e2e/core/billing/billing-invoices.spec.ts +++ b/packages/manager/cypress/e2e/core/billing/billing-invoices.spec.ts @@ -168,14 +168,15 @@ describe('Account invoices', () => { // If the invoice item has a region, confirm that it is displayed // in the table row. Otherwise, confirm that the table cell which // would normally show the region is empty. - !!invoiceItem.region - ? cy - .findByText(getRegionLabel(invoiceItem.region)) - .should('be.visible') - : cy - .get('[data-qa-region]') - .should('be.visible') - .should('be.empty'); + if (invoiceItem.region) { + cy.findByText(getRegionLabel(invoiceItem.region)).should( + 'be.visible' + ); + } else { + cy.get('[data-qa-region]') + .should('be.visible') + .should('be.empty'); + } }); } ); @@ -198,11 +199,13 @@ describe('Account invoices', () => { // If the invoice item has a region, confirm that it is displayed // in the table row. Otherwise, confirm that "Global" is displayed // in the region column. - !!invoiceItem.region - ? cy - .findByText(getRegionLabel(invoiceItem.region)) - .should('be.visible') - : cy.findByText('Global').should('be.visible'); + if (invoiceItem.region) { + cy.findByText(getRegionLabel(invoiceItem.region)).should( + 'be.visible' + ); + } else { + cy.findByText('Global').should('be.visible'); + } }); } ); diff --git a/packages/manager/cypress/e2e/core/billing/smoke-billing-activity.spec.ts b/packages/manager/cypress/e2e/core/billing/smoke-billing-activity.spec.ts index ad32f3f778d..73fb4893f57 100644 --- a/packages/manager/cypress/e2e/core/billing/smoke-billing-activity.spec.ts +++ b/packages/manager/cypress/e2e/core/billing/smoke-billing-activity.spec.ts @@ -125,24 +125,21 @@ describe('Billing Activity Feed', () => { * - Confirms that clicking on an invoice's label directs the user to the invoice details page. */ it('lists invoices and payments', () => { - const invoiceMocks = buildArray( - 10, - (i: number): Invoice => { - const id = randomNumber(1, 999999); - const date = DateTime.now().minus({ days: 2, months: i }).toISO(); - const subtotal = randomNumber(25, 949); - const tax = randomNumber(5, 50); - - return invoiceFactory.build({ - date, - id, - label: `Invoice #${id}`, - subtotal, - tax, - total: subtotal + tax, - }); - } - ); + const invoiceMocks = buildArray(10, (i: number): Invoice => { + const id = randomNumber(1, 999999); + const date = DateTime.now().minus({ days: 2, months: i }).toISO(); + const subtotal = randomNumber(25, 949); + const tax = randomNumber(5, 50); + + return invoiceFactory.build({ + date, + id, + label: `Invoice #${id}`, + subtotal, + tax, + total: subtotal + tax, + }); + }); const paymentMocks = invoiceMocks.map( (invoice: Invoice, i: number): Payment => { diff --git a/packages/manager/cypress/e2e/core/databases/create-database.spec.ts b/packages/manager/cypress/e2e/core/databases/create-database.spec.ts index b2405d44b2d..3c8718fd66a 100644 --- a/packages/manager/cypress/e2e/core/databases/create-database.spec.ts +++ b/packages/manager/cypress/e2e/core/databases/create-database.spec.ts @@ -29,11 +29,11 @@ import { } from 'src/factories'; import type { Database } from '@linode/api-v4'; -import type { databaseClusterConfiguration } from 'support/constants/databases'; +import type { DatabaseClusterConfiguration } from 'support/constants/databases'; describe('create a database cluster, mocked data', () => { databaseConfigurations.forEach( - (configuration: databaseClusterConfiguration) => { + (configuration: DatabaseClusterConfiguration) => { // @TODO Add assertions for DBaaS pricing. it(`creates a ${configuration.linodeType} ${configuration.engine} v${configuration.version}.x ${configuration.clusterSize}-node cluster`, () => { // Database mock immediately after instance has been created. diff --git a/packages/manager/cypress/e2e/core/databases/delete-database.spec.ts b/packages/manager/cypress/e2e/core/databases/delete-database.spec.ts index 9d6565873c4..a80b2d93b4e 100644 --- a/packages/manager/cypress/e2e/core/databases/delete-database.spec.ts +++ b/packages/manager/cypress/e2e/core/databases/delete-database.spec.ts @@ -18,11 +18,11 @@ import { randomIp, randomNumber } from 'support/util/random'; import { accountFactory, databaseFactory } from 'src/factories'; -import type { databaseClusterConfiguration } from 'support/constants/databases'; +import type { DatabaseClusterConfiguration } from 'support/constants/databases'; describe('Delete database clusters', () => { databaseConfigurations.forEach( - (configuration: databaseClusterConfiguration) => { + (configuration: DatabaseClusterConfiguration) => { describe(`Deletes a ${configuration.linodeType} ${configuration.engine} v${configuration.version}.x ${configuration.clusterSize}-node cluster`, () => { /* * - Tests database deletion UI flow using mocked data. diff --git a/packages/manager/cypress/e2e/core/databases/resize-database.spec.ts b/packages/manager/cypress/e2e/core/databases/resize-database.spec.ts index d3222977fb0..2680ac03fa9 100644 --- a/packages/manager/cypress/e2e/core/databases/resize-database.spec.ts +++ b/packages/manager/cypress/e2e/core/databases/resize-database.spec.ts @@ -20,7 +20,7 @@ import { randomIp, randomNumber, randomString } from 'support/util/random'; import { databaseFactory, possibleStatuses } from 'src/factories/databases'; -import type { databaseClusterConfiguration } from 'support/constants/databases'; +import type { DatabaseClusterConfiguration } from 'support/constants/databases'; /** * Resizes a current database cluster to a larger plan size. @@ -52,7 +52,7 @@ const resizeDatabase = (initialLabel: string) => { describe('Resizing existing clusters', () => { databaseConfigurationsResize.forEach( - (configuration: databaseClusterConfiguration) => { + (configuration: DatabaseClusterConfiguration) => { describe(`Resizes a ${configuration.linodeType} ${configuration.engine} v${configuration.version}.x ${configuration.clusterSize}-node cluster (legacy DBaaS)`, () => { /* * - Tests active database resize UI flows using mocked data. diff --git a/packages/manager/cypress/e2e/core/databases/update-database.spec.ts b/packages/manager/cypress/e2e/core/databases/update-database.spec.ts index 1ed3176d81b..6a14ee4dc9d 100644 --- a/packages/manager/cypress/e2e/core/databases/update-database.spec.ts +++ b/packages/manager/cypress/e2e/core/databases/update-database.spec.ts @@ -27,7 +27,7 @@ import { import { databaseFactory } from 'src/factories/databases'; -import type { databaseClusterConfiguration } from 'support/constants/databases'; +import type { DatabaseClusterConfiguration } from 'support/constants/databases'; /** * Updates a database cluster's label. @@ -183,7 +183,7 @@ const modifyMaintenanceWindow = (label: string, windowValue: string) => { describe('Update database clusters', () => { databaseConfigurations.forEach( - (configuration: databaseClusterConfiguration) => { + (configuration: DatabaseClusterConfiguration) => { describe(`updates a ${configuration.linodeType} ${configuration.engine} v${configuration.version}.x ${configuration.clusterSize}-node cluster`, () => { /* * - Tests active database update UI flows using mocked data. @@ -332,7 +332,8 @@ describe('Update database clusters', () => { const errorMessage = 'Your database is provisioning; please wait until provisioning is complete to perform this operation.'; - const hostnameRegex = /your hostnames? will appear here once (it is|they are) available./i; + const hostnameRegex = + /your hostnames? will appear here once (it is|they are) available./i; mockGetAccount(accountFactory.build()).as('getAccount'); mockGetDatabase(database).as('getDatabase'); diff --git a/packages/manager/cypress/e2e/core/firewalls/create-firewall.spec.ts b/packages/manager/cypress/e2e/core/firewalls/create-firewall.spec.ts index 6e2956c4c98..43822b48fa3 100644 --- a/packages/manager/cypress/e2e/core/firewalls/create-firewall.spec.ts +++ b/packages/manager/cypress/e2e/core/firewalls/create-firewall.spec.ts @@ -7,6 +7,8 @@ import { createTestLinode } from 'support/util/linodes'; import { randomLabel, randomString } from 'support/util/random'; import { chooseRegion } from 'support/util/regions'; authenticate(); +// Firewall GET API request performance issues need to be addressed in order to unskip this test +// See M3-9619 describe.skip('create firewall', () => { before(() => { cleanUp(['lke-clusters', 'linodes', 'firewalls']); diff --git a/packages/manager/cypress/e2e/core/firewalls/delete-firewall.spec.ts b/packages/manager/cypress/e2e/core/firewalls/delete-firewall.spec.ts index ce59d0b311c..b8ede2742eb 100644 --- a/packages/manager/cypress/e2e/core/firewalls/delete-firewall.spec.ts +++ b/packages/manager/cypress/e2e/core/firewalls/delete-firewall.spec.ts @@ -9,6 +9,8 @@ import { firewallFactory } from 'src/factories/firewalls'; import type { Firewall } from '@linode/api-v4'; authenticate(); +// Firewall GET API request performance issues need to be addressed in order to unskip this test +// See M3-9619 describe.skip('delete firewall', () => { before(() => { cleanUp('firewalls'); diff --git a/packages/manager/cypress/e2e/core/firewalls/update-firewall.spec.ts b/packages/manager/cypress/e2e/core/firewalls/update-firewall.spec.ts index e574a469199..e90d64d3c02 100644 --- a/packages/manager/cypress/e2e/core/firewalls/update-firewall.spec.ts +++ b/packages/manager/cypress/e2e/core/firewalls/update-firewall.spec.ts @@ -167,6 +167,8 @@ const createLinodeAndFirewall = async ( }; authenticate(); +// Firewall GET API request performance issues need to be addressed in order to unskip this test +// See M3-9619 describe.skip('update firewall', () => { before(() => { cleanUp('firewalls'); diff --git a/packages/manager/cypress/e2e/core/general/smoke-deep-link.spec.ts b/packages/manager/cypress/e2e/core/general/smoke-deep-link.spec.ts index 8cbe786110b..821ea4a8103 100644 --- a/packages/manager/cypress/e2e/core/general/smoke-deep-link.spec.ts +++ b/packages/manager/cypress/e2e/core/general/smoke-deep-link.spec.ts @@ -15,7 +15,7 @@ describe('smoke - deep links', () => { cy.log(`Go to ${page.name}`); page.goWithUI?.forEach((uiPath) => { cy.log(`by ${uiPath.name}`); - expect(uiPath.name).not.to.be.empty; + cy.findByText(uiPath.name).should('not.be.empty'); uiPath.go(); cy.url().should('be.eq', `${Cypress.config('baseUrl')}${page.url}`); }); diff --git a/packages/manager/cypress/e2e/core/images/images-non-empty-landing-page.spec.ts b/packages/manager/cypress/e2e/core/images/images-non-empty-landing-page.spec.ts index b9a0274f22f..d8c0a835697 100644 --- a/packages/manager/cypress/e2e/core/images/images-non-empty-landing-page.spec.ts +++ b/packages/manager/cypress/e2e/core/images/images-non-empty-landing-page.spec.ts @@ -50,14 +50,14 @@ function checkActionMenu(tableAlias: string, mockImages: any[]) { describe('image landing checks for non-empty state with restricted user', () => { beforeEach(() => { - const mockImages: Image[] = new Array(3).fill(null).map( - (_item: null, index: number): Image => { + const mockImages: Image[] = new Array(3) + .fill(null) + .map((_item: null, index: number): Image => { return imageFactory.build({ label: `Image ${index}`, tags: [index % 2 == 0 ? 'even' : 'odd', 'nums'], }); - } - ); + }); // Mock setup to display the Image landing page in an non-empty state mockGetAllImages(mockImages).as('getImages'); diff --git a/packages/manager/cypress/e2e/core/images/search-images.spec.ts b/packages/manager/cypress/e2e/core/images/search-images.spec.ts index c0c60975113..ea6bda69636 100644 --- a/packages/manager/cypress/e2e/core/images/search-images.spec.ts +++ b/packages/manager/cypress/e2e/core/images/search-images.spec.ts @@ -59,8 +59,8 @@ describe('Search Images', () => { // Search for the first image by label, confirm it's the only one shown. cy.findByPlaceholderText('Search Images').type(image1.label); - expect(cy.contains(image1.label).should('be.visible')); - expect(cy.contains(image2.label).should('not.exist')); + cy.contains(image1.label).should('be.visible'); + cy.contains(image2.label).should('not.exist'); // Clear search, confirm both images are shown. cy.findByTestId('clear-images-search').click(); diff --git a/packages/manager/cypress/e2e/core/kubernetes/lke-create.spec.ts b/packages/manager/cypress/e2e/core/kubernetes/lke-create.spec.ts index ebe1e5a933a..3d3614114f7 100644 --- a/packages/manager/cypress/e2e/core/kubernetes/lke-create.spec.ts +++ b/packages/manager/cypress/e2e/core/kubernetes/lke-create.spec.ts @@ -582,6 +582,7 @@ describe('LKE Cluster Creation with DC-specific pricing', () => { cy.focused().type(`${dcSpecificPricingRegion.label}{enter}`); // Confirm that HA price updates dynamically once region selection is made. + // eslint-disable-next-line sonarjs/slow-regex cy.contains(/\$.*\/month/).should('be.visible'); cy.get('[data-testid="ha-radio-button-yes"]').should('be.visible').click(); diff --git a/packages/manager/cypress/e2e/core/kubernetes/lke-update.spec.ts b/packages/manager/cypress/e2e/core/kubernetes/lke-update.spec.ts index 4830646d369..7cbe9d211d9 100644 --- a/packages/manager/cypress/e2e/core/kubernetes/lke-update.spec.ts +++ b/packages/manager/cypress/e2e/core/kubernetes/lke-update.spec.ts @@ -2453,21 +2453,19 @@ describe('LKE ACL updates', () => { addresses: { ipv4: ['10.0.3.0/24'], ipv6: undefined }, enabled: false, }); - const mockUpdatedACLOptions1 = kubernetesControlPlaneACLOptionsFactory.build( - { + const mockUpdatedACLOptions1 = + kubernetesControlPlaneACLOptionsFactory.build({ addresses: { ipv4: ['10.0.0.0/24'], ipv6: undefined }, enabled: true, 'revision-id': mockRevisionId, - } - ); + }); const mockControlPaneACL = kubernetesControlPlaneACLFactory.build({ acl: mockACLOptions, }); - const mockUpdatedControlPlaneACL1 = kubernetesControlPlaneACLFactory.build( - { + const mockUpdatedControlPlaneACL1 = + kubernetesControlPlaneACLFactory.build({ acl: mockUpdatedACLOptions1, - } - ); + }); mockGetCluster(mockCluster).as('getCluster'); mockGetControlPlaneACL(mockCluster.id, mockControlPaneACL).as( @@ -2548,8 +2546,8 @@ describe('LKE ACL updates', () => { .click(); // update mocks - const mockUpdatedACLOptions2 = kubernetesControlPlaneACLOptionsFactory.build( - { + const mockUpdatedACLOptions2 = + kubernetesControlPlaneACLOptionsFactory.build({ addresses: { ipv4: ['10.0.0.0/24'], ipv6: [ @@ -2559,13 +2557,11 @@ describe('LKE ACL updates', () => { }, enabled: true, 'revision-id': mockRevisionId, - } - ); - const mockUpdatedControlPlaneACL2 = kubernetesControlPlaneACLFactory.build( - { + }); + const mockUpdatedControlPlaneACL2 = + kubernetesControlPlaneACLFactory.build({ acl: mockUpdatedACLOptions2, - } - ); + }); mockUpdateControlPlaneACL(mockCluster.id, mockUpdatedControlPlaneACL2).as( 'updateControlPlaneACL' ); @@ -2656,16 +2652,15 @@ describe('LKE ACL updates', () => { enabled: true, }); - const mockDisabledACLOptions = kubernetesControlPlaneACLOptionsFactory.build( - { + const mockDisabledACLOptions = + kubernetesControlPlaneACLOptionsFactory.build({ addresses: { ipv4: [''], ipv6: [''], }, enabled: false, 'revision-id': '', - } - ); + }); const mockControlPaneACL = kubernetesControlPlaneACLFactory.build({ acl: mockACLOptions, }); diff --git a/packages/manager/cypress/e2e/core/linodes/backup-linode.spec.ts b/packages/manager/cypress/e2e/core/linodes/backup-linode.spec.ts index ada334e759f..4a914e6eff8 100644 --- a/packages/manager/cypress/e2e/core/linodes/backup-linode.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/backup-linode.spec.ts @@ -98,6 +98,7 @@ describe('linode backups', () => { .should('be.visible') .within(() => { // Confirm that user is warned of additional backup charges. + // eslint-disable-next-line sonarjs/slow-regex cy.contains(/.* This will add .* to your monthly bill\./).should( 'be.visible' ); diff --git a/packages/manager/cypress/e2e/core/linodes/create-linode-region-select.spec.ts b/packages/manager/cypress/e2e/core/linodes/create-linode-region-select.spec.ts index aa4275e4f34..3f7d28c425c 100644 --- a/packages/manager/cypress/e2e/core/linodes/create-linode-region-select.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/create-linode-region-select.spec.ts @@ -86,6 +86,6 @@ describe('Linode Create Region Select', () => { cy.findByLabelText('Region').should('have.value', 'UK, London (eu-west)'); // Confirm that selecting a valid region updates the Plan Selection panel. - expect(cy.get('[data-testid="table-row-empty"]').should('not.exist')); + cy.get('[data-testid="table-row-empty"]').should('not.exist'); }); }); diff --git a/packages/manager/cypress/e2e/core/linodes/create-linode-with-disk-encryption.spec.ts b/packages/manager/cypress/e2e/core/linodes/create-linode-with-disk-encryption.spec.ts index 8f2e413fc3f..093b89bd120 100644 --- a/packages/manager/cypress/e2e/core/linodes/create-linode-with-disk-encryption.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/create-linode-with-disk-encryption.spec.ts @@ -209,7 +209,7 @@ describe('Create Linode with Disk Encryption', () => { const requestPayload = xhr.request.body; const regionId = requestPayload['region']; expect(regionId).to.equal(mockLinode.region); - expect(requestPayload['disk_encryption']).to.be.undefined; + expect(requestPayload['disk_encryption']).to.equal(undefined); }); }); }); diff --git a/packages/manager/cypress/e2e/core/linodes/create-linode-with-vpc.spec.ts b/packages/manager/cypress/e2e/core/linodes/create-linode-with-vpc.spec.ts index 09b916eaf10..21165a9d520 100644 --- a/packages/manager/cypress/e2e/core/linodes/create-linode-with-vpc.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/create-linode-with-vpc.spec.ts @@ -140,7 +140,7 @@ describe('Create Linode with VPCs', () => { // Confirm that request payload includes VPC interface. expect(expectedVpcInterface['vpc_id']).to.equal(mockVPC.id); - expect(expectedVpcInterface['ipv4']).to.be.an('object').that.is.empty; + expect(expectedVpcInterface['ipv4']).to.deep.equal({}); expect(expectedVpcInterface['subnet_id']).to.equal(mockSubnet.id); expect(expectedVpcInterface['purpose']).to.equal('vpc'); // Confirm that VPC interfaces are always marked as the primary interface diff --git a/packages/manager/cypress/e2e/core/linodes/linode-network.spec.ts b/packages/manager/cypress/e2e/core/linodes/linode-network.spec.ts index 74a9894178b..5d7d27f4e44 100644 --- a/packages/manager/cypress/e2e/core/linodes/linode-network.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/linode-network.spec.ts @@ -390,9 +390,9 @@ describe('Linode Interfaces', () => { const requestPayload = xhr.request.body; // Confirm that request payload includes VPC interface only - expect(requestPayload['public']).to.be.null; + expect(requestPayload['public']).to.equal(null); expect(requestPayload['vpc']['subnet_id']).to.equal(selectedSubnet.id); - expect(requestPayload['vlan']).to.null; + expect(requestPayload['vlan']).to.equal(null); }); ui.toast.assertMessage('Successfully added network interface.'); diff --git a/packages/manager/cypress/e2e/core/linodes/rebuild-linode.spec.ts b/packages/manager/cypress/e2e/core/linodes/rebuild-linode.spec.ts index 0841ebc23e4..fb20dcb2627 100644 --- a/packages/manager/cypress/e2e/core/linodes/rebuild-linode.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/rebuild-linode.spec.ts @@ -103,6 +103,7 @@ const submitRebuild = () => { }; // Error message that is displayed when desired password is not strong enough. +// eslint-disable-next-line sonarjs/no-hardcoded-passwords const passwordComplexityError = 'Password does not meet strength requirement.'; authenticate(); @@ -404,7 +405,7 @@ describe('rebuild linode', () => { cy.wait('@rebuildLinode').then((xhr) => { // Confirm that metadata is NOT in the payload. // If we omit metadata from the payload, the API will reuse previously provided userdata. - expect(xhr.request.body.metadata).to.be.undefined; + expect(xhr.request.body.metadata).to.equal(undefined); // Verify other expected values are in the request expect(xhr.request.body.image).to.equal(image.id); diff --git a/packages/manager/cypress/e2e/core/linodes/smoke-linode-landing-table.spec.ts b/packages/manager/cypress/e2e/core/linodes/smoke-linode-landing-table.spec.ts index 7c878913a8c..8dcfd160e40 100644 --- a/packages/manager/cypress/e2e/core/linodes/smoke-linode-landing-table.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/smoke-linode-landing-table.spec.ts @@ -31,15 +31,15 @@ import { chooseRegion, getRegionById } from 'support/util/regions'; import type { Linode } from '@linode/api-v4'; -const mockLinodes = new Array(5).fill(null).map( - (_item: null, index: number): Linode => { +const mockLinodes = new Array(5) + .fill(null) + .map((_item: null, index: number): Linode => { return linodeFactory.build({ label: `Linode ${index}`, region: chooseRegion().id, tags: [index % 2 == 0 ? 'even' : 'odd', 'nums'], }); - } -); + }); const mockLinodesData = makeResourcePage(mockLinodes); @@ -573,15 +573,15 @@ describe('linode landing checks for empty state', () => { describe('linode landing checks for non-empty state with restricted user', () => { beforeEach(() => { // Mock setup to display the Linode landing page in an non-empty state - const mockLinodes: Linode[] = new Array(1).fill(null).map( - (_item: null, index: number): Linode => { + const mockLinodes: Linode[] = new Array(1) + .fill(null) + .map((_item: null, index: number): Linode => { return linodeFactory.build({ label: `Linode ${index}`, region: chooseRegion().id, tags: [index % 2 == 0 ? 'even' : 'odd', 'nums'], }); - } - ); + }); mockGetLinodes(mockLinodes).as('getLinodes'); diff --git a/packages/manager/cypress/e2e/core/objectStorage/enable-object-storage.spec.ts b/packages/manager/cypress/e2e/core/objectStorage/enable-object-storage.spec.ts index fbf74587e72..5a4c4b4ace3 100644 --- a/packages/manager/cypress/e2e/core/objectStorage/enable-object-storage.spec.ts +++ b/packages/manager/cypress/e2e/core/objectStorage/enable-object-storage.spec.ts @@ -36,7 +36,8 @@ import type { // under different circumstances. const objNotes = { // Information regarding the Object Storage cancellation process. - cancellationExplanation: /To discontinue billing, you.*ll need to cancel Object Storage in your Account Settings./, + cancellationExplanation: + /To discontinue billing, you.*ll need to cancel Object Storage in your Account Settings./, // Link to further DC-specific pricing information. dcPricingLearnMoreNote: 'Learn more about pricing and specifications.', diff --git a/packages/manager/cypress/e2e/core/objectStorageGen2/bucket-access-keys-gen2.spec.ts b/packages/manager/cypress/e2e/core/objectStorageGen2/bucket-access-keys-gen2.spec.ts index b1b7be3ce68..e601bedd47a 100644 --- a/packages/manager/cypress/e2e/core/objectStorageGen2/bucket-access-keys-gen2.spec.ts +++ b/packages/manager/cypress/e2e/core/objectStorageGen2/bucket-access-keys-gen2.spec.ts @@ -48,8 +48,8 @@ describe('Object Storage gen2 access keys tests', () => { mockGetAccessKeys([mockAccessKey1, mockAccessKey2]).as( 'getObjectStorageAccessKeys' - ), - cy.visitWithLogin('/object-storage/access-keys'); + ); + cy.visitWithLogin('/object-storage/access-keys'); cy.wait(['@getFeatureFlags', '@getAccount', '@getObjectStorageAccessKeys']); diff --git a/packages/manager/cypress/e2e/core/objectStorageMulticluster/bucket-create-multicluster.spec.ts b/packages/manager/cypress/e2e/core/objectStorageMulticluster/bucket-create-multicluster.spec.ts index 8bfd54021dd..d28f24324a9 100644 --- a/packages/manager/cypress/e2e/core/objectStorageMulticluster/bucket-create-multicluster.spec.ts +++ b/packages/manager/cypress/e2e/core/objectStorageMulticluster/bucket-create-multicluster.spec.ts @@ -120,7 +120,7 @@ describe('Object Storage Multicluster Bucket create', () => { // property in its payload when creating a bucket. cy.wait('@createBucket').then((xhr) => { const body = xhr.request.body; - expect(body.cluster).to.be.undefined; + expect(body.cluster).to.eq(undefined); expect(body.region).to.eq(mockRegionWithObj.id); }); diff --git a/packages/manager/cypress/e2e/core/volumes/search-volumes.spec.ts b/packages/manager/cypress/e2e/core/volumes/search-volumes.spec.ts index 63887775207..34cfd8678b8 100644 --- a/packages/manager/cypress/e2e/core/volumes/search-volumes.spec.ts +++ b/packages/manager/cypress/e2e/core/volumes/search-volumes.spec.ts @@ -46,8 +46,8 @@ describe('Search Volumes', () => { // Search for the first volume by label, confirm it's the only one shown. cy.findByPlaceholderText('Search Volumes').type(volume1.label); - expect(cy.findByText(volume1.label).should('be.visible')); - expect(cy.findByText(volume2.label).should('not.exist')); + cy.findByText(volume1.label).should('be.visible'); + cy.findByText(volume2.label).should('not.exist'); // Clear search, confirm both volumes are shown. cy.findByTestId('clear-volumes-search').click(); diff --git a/packages/manager/cypress/support/api/common.ts b/packages/manager/cypress/support/api/common.ts index e9b88d819df..69e9fe4cb6c 100644 --- a/packages/manager/cypress/support/api/common.ts +++ b/packages/manager/cypress/support/api/common.ts @@ -12,12 +12,8 @@ export const apiCheckErrors = ( if (resp.body && resp.body.ERRORARRAY && resp.body.ERRORARRAY.length > 0) { errs = resp.body.ERRORARRAY; } - if (failOnError) { - if (errs) { - expect((errs[0] as any).ERRORMESSAGE).not.to.be.exist; - } else { - expect(!!errs).to.be.false; - } + if (failOnError && !!errs) { + throw new Error('API error!'); } return errs; }; diff --git a/packages/manager/cypress/support/constants/databases.ts b/packages/manager/cypress/support/constants/databases.ts index e34533ba34d..ca64379cf9c 100644 --- a/packages/manager/cypress/support/constants/databases.ts +++ b/packages/manager/cypress/support/constants/databases.ts @@ -9,7 +9,7 @@ import { randomLabel } from 'support/util/random'; import { chooseRegion } from 'support/util/regions'; import { databaseEngineFactory, databaseTypeFactory } from '@src/factories'; -export interface databaseClusterConfiguration { +export interface DatabaseClusterConfiguration { clusterSize: ClusterSize; dbType: Engine; engine: string; @@ -325,7 +325,7 @@ export const mockDatabaseNodeTypes: DatabaseType[] = [ ]; // Array of database cluster configurations for which to test creation. -export const databaseConfigurations: databaseClusterConfiguration[] = [ +export const databaseConfigurations: DatabaseClusterConfiguration[] = [ { clusterSize: 1, dbType: 'mysql', @@ -355,7 +355,7 @@ export const databaseConfigurations: databaseClusterConfiguration[] = [ }, ]; -export const databaseConfigurationsResize: databaseClusterConfiguration[] = [ +export const databaseConfigurationsResize: DatabaseClusterConfiguration[] = [ { clusterSize: 3, dbType: 'mysql', diff --git a/packages/manager/cypress/support/setup/test-tagging.ts b/packages/manager/cypress/support/setup/test-tagging.ts index 914ae3dcf36..0d3b0931943 100644 --- a/packages/manager/cypress/support/setup/test-tagging.ts +++ b/packages/manager/cypress/support/setup/test-tagging.ts @@ -36,6 +36,7 @@ Cypress.on('test:before:run', (_test: Test, _runnable: Runnable) => { } if (!evaluateQuery(query, tags)) { + // eslint-disable-next-line sonarjs/no-skipped-tests context.skip(); } diff --git a/packages/manager/cypress/support/ui/common.ts b/packages/manager/cypress/support/ui/common.ts index 2dc2ac382d1..77c2debe55c 100644 --- a/packages/manager/cypress/support/ui/common.ts +++ b/packages/manager/cypress/support/ui/common.ts @@ -15,7 +15,11 @@ export const waitForAppLoad = (path = '/', withLogin = true) => { 'getNotifications' ); - withLogin ? cy.visitWithLogin(path) : cy.visit(path); + if (withLogin) { + cy.visitWithLogin(path); + } else { + cy.visit(path); + } cy.wait([ '@getAccount', '@getAccountSettings', diff --git a/packages/manager/cypress/support/util/csv.ts b/packages/manager/cypress/support/util/csv.ts index 16c1388729b..c4cc6581f24 100644 --- a/packages/manager/cypress/support/util/csv.ts +++ b/packages/manager/cypress/support/util/csv.ts @@ -17,6 +17,7 @@ export function parseCsv(csvContent: string): any[] { // Extract the headers from the first line and remove any quotes const headers = lines[0] .split(',') + // eslint-disable-next-line sonarjs/anchor-precedence .map((header) => header.trim().replace(/^"|"$/g, '')); // Map the remaining lines to objects using the headers @@ -30,7 +31,9 @@ export function parseCsv(csvContent: string): any[] { // - Removes the enclosing double quotes from quoted values // - Replaces any escaped double quotes within quoted values with a single double quote const values = line + // eslint-disable-next-line sonarjs/slow-regex .match(/("([^"]|"")*"|[^",\s]+)(?=\s*,|\s*$)/g) + // eslint-disable-next-line sonarjs/anchor-precedence ?.map((value) => value.trim().replace(/^"|"$/g, '').replace(/""/g, '"')); // Create an object to represent the row diff --git a/packages/manager/cypress/support/util/linodes.ts b/packages/manager/cypress/support/util/linodes.ts index 55997e2ca6d..c5c64f68535 100644 --- a/packages/manager/cypress/support/util/linodes.ts +++ b/packages/manager/cypress/support/util/linodes.ts @@ -79,7 +79,7 @@ export const defaultCreateTestLinodeOptions = { * @returns Promise that resolves to the created Linode. */ export const createTestLinode = async ( - createRequestPayload?: Partial | null, + createRequestPayload?: null | Partial, options?: Partial ): Promise => { const resolvedOptions = { @@ -92,29 +92,32 @@ export const createTestLinode = async ( regionId = chooseRegion().id; } - const securityMethodPayload: Partial = await (async () => { - switch (resolvedOptions.securityMethod) { - case 'firewall': - default: - const firewall = await findOrCreateDependencyFirewall(); - return { - firewall_id: firewall.id, - }; - - case 'vlan_no_internet': - const vlanConfig = linodeVlanNoInternetConfig; - const vlanLabel = await findOrCreateDependencyVlan(regionId); - vlanConfig[0].label = vlanLabel; - return { - interfaces: vlanConfig, - }; - - case 'powered_off': - return { - booted: false, - }; - } - })(); + const securityMethodPayload: Partial = + await (async () => { + switch (resolvedOptions.securityMethod) { + case 'firewall': + const firewall = await findOrCreateDependencyFirewall(); + return { + firewall_id: firewall.id, + }; + + case 'powered_off': + return { + booted: false, + }; + + case 'vlan_no_internet': + const vlanConfig = linodeVlanNoInternetConfig; + const vlanLabel = await findOrCreateDependencyVlan(regionId); + vlanConfig[0].label = vlanLabel; + return { + interfaces: vlanConfig, + }; + + default: + return {}; + } + })(); const resolvedCreatePayload = { ...createLinodeRequestFactory.build({ @@ -149,7 +152,7 @@ export const createTestLinode = async ( ); } - // eslint-disable-next-line + // eslint-disable-next-line @linode/cloud-manager/no-createLinode const linode = await createLinode(resolvedCreatePayload); // Wait for disks to become available if `waitForDisks` option is set. diff --git a/packages/manager/eslint.config.js b/packages/manager/eslint.config.js new file mode 100644 index 00000000000..b40b8f71f66 --- /dev/null +++ b/packages/manager/eslint.config.js @@ -0,0 +1,449 @@ +import js from '@eslint/js'; +import eslint from '@eslint/js'; +import linodeRules from '@linode/eslint-plugin-cloud-manager/dist/index.js'; +import * as tsParser from '@typescript-eslint/parser'; +import eslintConfigPrettier from 'eslint-config-prettier'; +import pluginCypress from 'eslint-plugin-cypress/flat'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import perfectionist from 'eslint-plugin-perfectionist'; +import prettier from 'eslint-plugin-prettier'; +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import sonarjs from 'eslint-plugin-sonarjs'; +import testingLibrary from 'eslint-plugin-testing-library'; +import xss from 'eslint-plugin-xss'; +import { defineConfig } from 'eslint/config'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +export const baseConfig = [ + // 1. Ignores + { + ignores: [ + '**/node_modules/*', + '**/build/*', + '**/dist/*', + '**/lib/*', + '**/storybook-static/*', + '**/.storybook/*', + '**/public/*', + ], + }, + + // 2. TypeScript configuration + { + files: ['**/*.{js,ts,tsx}'], + languageOptions: { + globals: { + ...globals.browser, + }, + parser: tsParser, + parserOptions: { + ecmaFeatures: { jsx: true }, + ecmaVersion: 2020, + }, + }, + }, + + // 3. Recommended configs + eslint.configs.recommended, + js.configs.recommended, + jsxA11y.flatConfigs.recommended, + perfectionist.configs['recommended-natural'], + pluginCypress.configs.recommended, + react.configs.flat.recommended, + reactHooks.configs['recommended-latest'], + sonarjs.configs.recommended, + tseslint.configs.recommended, + + // 4. Base rules + { + files: ['**/*.{js,ts,tsx}'], + rules: { + 'array-callback-return': 'error', + 'comma-dangle': 'off', + curly: 'warn', + eqeqeq: 'warn', + 'no-await-in-loop': 'error', + 'no-bitwise': 'error', + 'no-caller': 'error', + 'no-case-declarations': 'warn', + 'no-console': 'error', + 'no-empty': 'warn', + 'no-eval': 'error', + 'no-extra-boolean-cast': 'warn', + 'no-invalid-this': 'off', + 'no-loop-func': 'error', + 'no-mixed-requires': 'warn', + 'no-multiple-empty-lines': 'error', + 'no-new-wrappers': 'error', + 'no-restricted-imports': [ + 'error', + 'rxjs', + '@mui/core', + '@mui/system', + '@mui/icons-material', + { + importNames: ['Typography'], + message: + 'Please use Typography component from @linode/ui instead of @mui/material', + name: '@mui/material', + }, + { + importNames: ['Link'], + message: + 'Please use the Link component from src/components/Link instead of react-router-dom', + name: 'react-router-dom', + }, + ], + 'no-restricted-syntax': [ + 'error', + { + message: + "The 'data-test-id' attribute is not allowed; use 'data-testid' instead.", + selector: "JSXAttribute[name.name='data-test-id']", + }, + ], + 'no-throw-literal': 'warn', + 'no-trailing-spaces': 'warn', + 'no-undef-init': 'off', + 'no-unused-expressions': 'warn', + 'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + 'no-useless-escape': 'warn', + 'object-shorthand': 'warn', + 'sort-keys': 'off', + 'spaced-comment': 'warn', + }, + }, + + // 5. React and React Hooks + { + files: ['**/*.{ts,tsx}'], + plugins: { + react, + }, + rules: { + 'react-hooks/exhaustive-deps': 'warn', + 'react-hooks/rules-of-hooks': 'error', + 'react/display-name': 'off', + 'react/jsx-no-bind': 'off', + 'react/jsx-no-script-url': 'error', + 'react/jsx-no-useless-fragment': 'warn', + 'react/no-unescaped-entities': 'warn', + 'react/prop-types': 'off', + 'react/self-closing-comp': 'warn', + }, + }, + + // 6. TypeScript-specific + { + files: ['**/*.{ts,tsx}'], + rules: { + '@typescript-eslint/consistent-type-imports': 'warn', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/naming-convention': [ + 'warn', + { + format: ['camelCase', 'UPPER_CASE', 'PascalCase'], + leadingUnderscore: 'allow', + selector: 'variable', + trailingUnderscore: 'allow', + }, + { + format: null, + modifiers: ['destructured'], + selector: 'variable', + }, + { + format: ['camelCase', 'PascalCase'], + selector: 'function', + }, + { + format: ['camelCase'], + leadingUnderscore: 'allow', + selector: 'parameter', + }, + { + format: ['PascalCase'], + selector: 'typeLike', + }, + ], + '@typescript-eslint/no-empty-interface': 'warn', + '@typescript-eslint/no-empty-object-type': 'warn', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-namespace': 'warn', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-use-before-define': 'off', + }, + }, + + // 7. XSS + { + files: ['**/*.{js,ts,tsx}'], + plugins: { + xss, + }, + }, + + // 8. SonarJS + { + files: ['**/*.{js,ts,tsx}'], + rules: { + 'sonarjs/arrow-function-convention': 'off', + 'sonarjs/cognitive-complexity': 'off', + 'sonarjs/duplicates-in-character-class': 'warn', + 'sonarjs/no-clear-text-protocols': 'off', + 'sonarjs/no-commented-code': 'warn', + 'sonarjs/no-duplicate-string': 'warn', + 'sonarjs/no-identical-functions': 'warn', + 'sonarjs/no-ignored-exceptions': 'warn', + 'sonarjs/no-nested-conditional': 'off', + 'sonarjs/no-nested-functions': 'warn', + 'sonarjs/no-redundant-jump': 'warn', + 'sonarjs/no-small-switch': 'warn', + 'sonarjs/prefer-immediate-return': 'warn', + 'sonarjs/prefer-single-boolean-return': 'off', + 'sonarjs/redundant-type-aliases': 'warn', + 'sonarjs/todo-tag': 'warn', + 'sonarjs/single-character-alternation': 'warn', + 'sonarjs/no-duplicate-in-composite': 'warn', + 'sonarjs/no-nested-template-literals': 'off', + 'sonarjs/public-static-readonly': 'warn', + 'sonarjs/concise-regex': 'warn', + 'sonarjs/use-type-alias': 'warn', + }, + }, + + // 9. JSX A11y + { + files: ['**/*.{jsx,tsx}'], + rules: { + 'jsx-a11y/aria-role': [ + 'error', + { + allowedInvalidRoles: [ + 'graphics-document', + 'graphics-object', + 'graphics-symbol', + ], + }, + ], + }, + }, + + // 10. Perfectionist + { + files: ['**/*.{js,ts,tsx}'], + rules: { + 'perfectionist/sort-array-includes': 'warn', + 'perfectionist/sort-classes': 'warn', + 'perfectionist/sort-enums': 'warn', + 'perfectionist/sort-exports': 'warn', + 'perfectionist/sort-heritage-clauses': 'off', + 'perfectionist/sort-imports': [ + 'warn', + { + customGroups: { + type: { + react: ['^react$', '^react-.+'], + src: ['^src$'], + }, + value: { + react: ['^react$', '^react-.+'], + src: ['^src$', '^src/.+'], + }, + }, + groups: [ + ['react', 'builtin', 'external'], + ['src', 'internal'], + ['parent', 'sibling', 'index'], + 'object', + 'unknown', + [ + 'type', + 'internal-type', + 'parent-type', + 'sibling-type', + 'index-type', + ], + ], + newlinesBetween: 'always', + }, + ], + 'perfectionist/sort-interfaces': 'warn', + 'perfectionist/sort-intersection-types': 'off', + 'perfectionist/sort-jsx-props': 'warn', + 'perfectionist/sort-modules': 'off', + 'perfectionist/sort-named-exports': 'warn', + 'perfectionist/sort-named-imports': 'warn', + 'perfectionist/sort-object-types': 'warn', + 'perfectionist/sort-objects': 'off', + 'perfectionist/sort-sets': 'off', + 'perfectionist/sort-switch-case': 'warn', + 'perfectionist/sort-union-types': 'warn', + }, + }, + + // 11. Cloud Manager + { + files: ['**/*.{js,ts,tsx}'], + plugins: { + '@linode/cloud-manager': linodeRules, + }, + rules: { + '@linode/cloud-manager/no-custom-fontWeight': 'warn', + '@linode/cloud-manager/deprecate-formik': 'warn', + '@linode/cloud-manager/no-createLinode': 'off', + '@linode/cloud-manager/no-mui-theme-spacing': 'warn', + }, + }, + + // 12. Unit tests, factories, mocks & stories + { + files: [ + '**/*.test.{js,ts,tsx}', + '**/*.stories.{js,ts,tsx}', + '**/factories/**/*.{js,ts,tsx}', + '**/__data__/**/*.{js,ts,tsx}', + '**/mocks/**/*.{js,ts,tsx}', + ], + plugins: { + 'testing-library': testingLibrary, + }, + rules: { + '@typescript-eslint/no-empty-object-type': 'off', + 'no-useless-escape': 'off', + 'no-empty-pattern': 'off', + ...Object.fromEntries( + Object.keys(testingLibrary.rules).map((rule) => { + // Special case for consistent-data-testid which needs config + if (rule === 'consistent-data-testid') { + return [ + `testing-library/${rule}`, + [ + 'warn', + { + testIdAttribute: 'data-testid', + testIdPattern: '^[a-z-]+$', + }, + ], + ]; + } + // All other rules just get set to warn + return [`testing-library/${rule}`, 'warn']; + }) + ), + // This will make all sonar rules warnings. + // It is a good idea to keep them as such so that we don't introduce new issues that could trigger dependabot or security scripts. + ...Object.fromEntries( + Object.keys(sonarjs.rules).map((rule) => [`sonarjs/${rule}`, 'warn']) + ), + 'sonarjs/arrow-function-convention': 'off', + 'sonarjs/enforce-trailing-comma': 'off', + 'sonarjs/file-header': 'off', + 'sonarjs/no-implicit-dependencies': 'off', + 'sonarjs/no-reference-error': 'off', + 'sonarjs/no-wildcard-import': 'off', + 'sonarjs/no-hardcoded-ip': 'off', + 'sonarjs/pseudo-random': 'off', + }, + }, + + // 13. Cypress + { + files: ['**/cypress/**/*.{js,ts,tsx}'], + rules: { + 'no-console': 'off', + 'sonarjs/pseudo-random': 'off', + 'sonarjs/no-hardcoded-ip': 'off', + '@linode/cloud-manager/no-createLinode': 'error', + }, + }, + + // 14. Tanstack Router (temporary) + { + files: [ + // for each new features added to the migration router, add its directory here + 'src/features/Betas/**/*', + 'src/features/Domains/**/*', + 'src/features/Firewalls/**/*', + 'src/features/Images/**/*', + 'src/features/Longview/**/*', + 'src/features/NodeBalancers/**/*', + 'src/features/ObjectStorage/**/*', + 'src/features/PlacementGroups/**/*', + 'src/features/StackScripts/**/*', + 'src/features/Volumes/**/*', + 'src/features/VPCs/**/*', + ], + rules: { + 'no-restricted-imports': [ + // This needs to remain an error however trying to link to a feature that is not yet migrated will break the router + // For those cases react-router-dom history.push is still needed + // using `eslint-disable-next-line no-restricted-imports` can help bypass those imports + 'error', + { + paths: [ + { + importNames: [ + // intentionally not including in this list as this will be updated last globally + 'useNavigate', + 'useParams', + 'useLocation', + 'useHistory', + 'useRouteMatch', + 'matchPath', + 'MemoryRouter', + 'Route', + 'RouteProps', + 'Switch', + 'Redirect', + 'RouteComponentProps', + 'withRouter', + ], + message: + 'Please use routing utilities intended for @tanstack/react-router.', + name: 'react-router-dom', + }, + { + importNames: ['TabLinkList'], + message: + 'Please use the TanStackTabLinkList component for components being migrated to TanStack Router.', + name: 'src/components/Tabs/TabLinkList', + }, + { + importNames: ['OrderBy', 'default'], + message: + 'Please use useOrderV2 hook for components being migrated to TanStack Router.', + name: 'src/components/OrderBy', + }, + { + importNames: ['Prompt'], + message: + 'Please use the TanStack useBlocker hook for components/features being migrated to TanStack Router.', + name: 'src/components/Prompt/Prompt', + }, + ], + }, + ], + }, + }, + + // 15. Prettier (coming last as recommended) + { + files: ['**/*.{js,ts,tsx}'], + plugins: { + prettier, + }, + rules: { + ...eslintConfigPrettier.rules, + 'prettier/prettier': 'warn', + }, + }, +]; + +export default defineConfig(baseConfig); diff --git a/packages/manager/package.json b/packages/manager/package.json index 918b5f7985c..388c67e8726 100644 --- a/packages/manager/package.json +++ b/packages/manager/package.json @@ -126,7 +126,6 @@ }, "devDependencies": { "@4tw/cypress-drag-drop": "^2.3.0", - "@linode/eslint-plugin-cloud-manager": "^0.0.10", "@storybook/addon-a11y": "^8.6.7", "@storybook/addon-actions": "^8.6.7", "@storybook/addon-controls": "^8.6.7", @@ -151,6 +150,7 @@ "@types/chai-string": "^1.4.5", "@types/chart.js": "^2.9.21", "@types/css-mediaquery": "^0.1.1", + "@types/eslint-plugin-jsx-a11y": "^6.10.0", "@types/he": "^1.1.0", "@types/history": "4", "@types/jspdf": "^1.3.3", @@ -172,8 +172,6 @@ "@types/throttle-debounce": "^1.0.0", "@types/uuid": "^3.4.3", "@types/zxcvbn": "^4.4.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react-swc": "^3.7.2", "@vitest/coverage-v8": "^3.0.7", "axe-core": "^4.10.2", @@ -189,28 +187,14 @@ "cypress-real-events": "^1.14.0", "cypress-vite": "^1.6.0", "dotenv": "^16.0.3", - "eslint": "^7.1.0", - "eslint-config-prettier": "~8.1.0", - "eslint-plugin-cypress": "^2.11.3", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-perfectionist": "^1.4.0", - "eslint-plugin-prettier": "~3.3.1", - "eslint-plugin-ramda": "^2.5.1", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-hooks": "^3.0.0", - "eslint-plugin-react-refresh": "0.4.13", - "eslint-plugin-scanjs-rules": "^0.2.1", - "eslint-plugin-sonarjs": "^0.5.0", - "eslint-plugin-testing-library": "^3.1.2", - "eslint-plugin-xss": "^0.1.10", "factory.ts": "^0.5.1", "glob": "^10.3.1", + "globals": "^16.0.0", "history": "4", "jsdom": "^24.1.1", "mocha-junit-reporter": "^2.2.1", "msw": "^2.2.3", "pdfreader": "^3.0.7", - "prettier": "~2.2.1", "redux-mock-store": "^1.5.3", "storybook": "^8.6.7", "storybook-dark-mode": "4.0.1", diff --git a/packages/manager/src/MainContent.tsx b/packages/manager/src/MainContent.tsx index 7f9a2bb6434..3f5644439cd 100644 --- a/packages/manager/src/MainContent.tsx +++ b/packages/manager/src/MainContent.tsx @@ -297,8 +297,8 @@ export const MainContent = () => { isNarrowViewport ? '100%' : isPageScrollable - ? '100vh' - : `calc(100vh - ${TOPMENU_HEIGHT}px)` + ? '100vh' + : `calc(100vh - ${TOPMENU_HEIGHT}px)` } position="sticky" top={0} @@ -319,9 +319,9 @@ export const MainContent = () => { marginLeft: isNarrowViewport ? 0 : desktopMenuIsOpen || - (desktopMenuIsOpen && desktopMenuIsOpen === true) - ? SIDEBAR_COLLAPSED_WIDTH - : SIDEBAR_WIDTH, + (desktopMenuIsOpen && desktopMenuIsOpen === true) + ? SIDEBAR_COLLAPSED_WIDTH + : SIDEBAR_WIDTH, }} > diff --git a/packages/manager/src/components/AreaChart/AreaChart.test.tsx b/packages/manager/src/components/AreaChart/AreaChart.test.tsx index fe8b4c28ab1..99184b881b0 100644 --- a/packages/manager/src/components/AreaChart/AreaChart.test.tsx +++ b/packages/manager/src/components/AreaChart/AreaChart.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ +import { waitFor } from '@testing-library/react'; import * as React from 'react'; import { renderWithTheme } from 'src/utilities/testHelpers'; @@ -32,10 +32,13 @@ class ResizeObserver { describe('AreaChart', () => { window.ResizeObserver = ResizeObserver; - it('renders an AreaChart', () => { + it('renders an AreaChart', async () => { const { container } = renderWithTheme(); - expect(container.querySelector('recharts-responsive-container')) - .toBeVisible; + await waitFor(() => { + expect( + container.querySelector('[class*="recharts-responsive-container"]') + ).toBeVisible(); + }); }); }); diff --git a/packages/manager/src/components/AreaChart/AreaChart.tsx b/packages/manager/src/components/AreaChart/AreaChart.tsx index 7eea892a55e..dd1ba65a1db 100644 --- a/packages/manager/src/components/AreaChart/AreaChart.tsx +++ b/packages/manager/src/components/AreaChart/AreaChart.tsx @@ -226,7 +226,7 @@ export const AreaChart = (props: AreaChartProps) => { {item.dataKey} - + {tooltipValueFormatter(item.value, unit)} @@ -267,7 +267,11 @@ export const AreaChart = (props: AreaChartProps) => { return ( <> - + <_AreaChart aria-label={ariaLabel} data={data} margin={margin}> { vertical={false} /> { scale="time" stroke={theme.color.label} tickFormatter={xAxisTickFormatter} + ticks={ + xAxisTickCount + ? generate12HourTicks(data, timezone, xAxisTickCount) + : [] + } type="number" /> } contentStyle={{ color: theme.tokens.color.Neutrals[70], }} @@ -303,7 +308,6 @@ export const AreaChart = (props: AreaChartProps) => { color: theme.tokens.color.Neutrals[70], font: theme.font.bold, }} - content={} /> {showLegend && !legendRows && ( { {value} )} + iconType="square" onClick={({ dataKey }) => { if (dataKey) { handleLegendClick(dataKey as string); } }} - iconType="square" wrapperStyle={legendStyles} /> )} @@ -333,7 +337,7 @@ export const AreaChart = (props: AreaChartProps) => { dataKey={dataKey} dot={{ r: showDot ? dotRadius : 0 }} fill={color} - fillOpacity={variant === 'line' ? 0 : fillOpacity ?? 1} + fillOpacity={variant === 'line' ? 0 : (fillOpacity ?? 1)} hide={activeSeries.includes(dataKey)} isAnimationActive={false} key={dataKey} diff --git a/packages/manager/src/components/ConfirmationDialog/ConfirmationDialog.stories.tsx b/packages/manager/src/components/ConfirmationDialog/ConfirmationDialog.stories.tsx index 302a93a8d1c..caa5772f732 100644 --- a/packages/manager/src/components/ConfirmationDialog/ConfirmationDialog.stories.tsx +++ b/packages/manager/src/components/ConfirmationDialog/ConfirmationDialog.stories.tsx @@ -63,7 +63,7 @@ export const Default: Story = { ), }; -export const Error: Story = { +export const ConfirmationDialogError: Story = { args: { error: 'There was an error somewhere in the process.', }, diff --git a/packages/manager/src/components/DeletionDialog/DeletionDialog.stories.tsx b/packages/manager/src/components/DeletionDialog/DeletionDialog.stories.tsx index 278748ecc43..016ea3debf3 100644 --- a/packages/manager/src/components/DeletionDialog/DeletionDialog.stories.tsx +++ b/packages/manager/src/components/DeletionDialog/DeletionDialog.stories.tsx @@ -62,14 +62,14 @@ export const Default: Story = { render: (args) => {args.children}, }; -export const Error: Story = { +export const DeletionDialogError: Story = { args: { error: 'There was an error deleting this Linode.', }, render: (args) => {args.children}, }; -export const Loading: Story = { +export const DeletionDialogLoading: Story = { args: { loading: true, }, diff --git a/packages/manager/src/components/EmptyLandingPageResources/ResourcesLinksTypes.ts b/packages/manager/src/components/EmptyLandingPageResources/ResourcesLinksTypes.ts index c94d2a6f6a1..2129b44b6e7 100644 --- a/packages/manager/src/components/EmptyLandingPageResources/ResourcesLinksTypes.ts +++ b/packages/manager/src/components/EmptyLandingPageResources/ResourcesLinksTypes.ts @@ -4,7 +4,7 @@ interface ResourcesLink { to: string; } -export interface linkAnalyticsEvent { +export interface LinkAnalyticsEvent { action: string; category: string; } @@ -17,7 +17,7 @@ export interface ResourcesHeaders { } export interface ResourcesLinks { - linkAnalyticsEvent: linkAnalyticsEvent; + linkAnalyticsEvent: LinkAnalyticsEvent; links: ResourcesLink[]; onClick?: () => void; } diff --git a/packages/manager/src/components/EmptyLandingPageResources/ResourcesSection.tsx b/packages/manager/src/components/EmptyLandingPageResources/ResourcesSection.tsx index 4c2107f9d54..f7d72ddad85 100644 --- a/packages/manager/src/components/EmptyLandingPageResources/ResourcesSection.tsx +++ b/packages/manager/src/components/EmptyLandingPageResources/ResourcesSection.tsx @@ -19,7 +19,7 @@ import { import type { ResourcesHeaders, ResourcesLinkSection, - linkAnalyticsEvent, + LinkAnalyticsEvent, } from 'src/components/EmptyLandingPageResources/ResourcesLinksTypes'; interface ButtonProps { @@ -62,7 +62,7 @@ interface ResourcesSectionProps { /** * The event data to be sent when the call to action is clicked */ - linkAnalyticsEvent: linkAnalyticsEvent; + linkAnalyticsEvent: LinkAnalyticsEvent; /** * If true, the transfer display will be shown at the bottom * */ @@ -82,14 +82,14 @@ interface ResourcesSectionProps { const GuideLinks = ( guides: ResourcesLinkSection, - linkAnalyticsEvent: linkAnalyticsEvent + linkAnalyticsEvent: LinkAnalyticsEvent ) => ( ); const YoutubeLinks = ( youtube: ResourcesLinkSection, - linkAnalyticsEvent: linkAnalyticsEvent + linkAnalyticsEvent: LinkAnalyticsEvent ) => ( { // we use a reference to access it. // https://dev.to/vcanales/using-chart-js-in-a-function-component-with-react-hooks-246l if (graphRef.current) { + // eslint-disable-next-line sonarjs/constructor-for-side-effects new Chart(graphRef.current.getContext('2d'), { data: { datasets: graphDatasets, diff --git a/packages/manager/src/components/Prompt/Prompt.tsx b/packages/manager/src/components/Prompt/Prompt.tsx index 1fe0dc739c0..05f1a631cdb 100644 --- a/packages/manager/src/components/Prompt/Prompt.tsx +++ b/packages/manager/src/components/Prompt/Prompt.tsx @@ -59,7 +59,6 @@ export const Prompt = React.memo((props: PromptProps) => { return; } - // eslint-disable-next-line scanjs-rules/call_addEventListener window.addEventListener('beforeunload', handleBeforeUnload); return () => window.removeEventListener('beforeunload', handleBeforeUnload); }, [props.when, props.confirmWhenLeaving]); diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.stories.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.stories.tsx index 3a66a2856ab..8b05ef83569 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.stories.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.stories.tsx @@ -11,7 +11,7 @@ import type { Meta, StoryObj } from '@storybook/react'; export const Default: StoryObj = { render: (args) => { const SelectWrapper = () => { - const [_, updateArgs] = useArgs(); + const [, updateArgs] = useArgs(); return ( { }); it('should return the error for a given quota usage query', () => { - const quotaUsageQueries = ([ + const quotaUsageQueries = [ { error: [{ reason: 'Error 1' }] }, { error: [{ reason: 'Error 2' }] }, - ] as unknown) as UseQueryResult[]; + ] as unknown as UseQueryResult[]; const index = 0; const error = getQuotaError(quotaUsageQueries, index); diff --git a/packages/manager/src/features/Account/Quotas/utils.ts b/packages/manager/src/features/Account/Quotas/utils.ts index 29c9c97d993..533880c9a43 100644 --- a/packages/manager/src/features/Account/Quotas/utils.ts +++ b/packages/manager/src/features/Account/Quotas/utils.ts @@ -45,10 +45,8 @@ export const useGetLocationsForQuotaService = ( const { data: regions, isFetching: isFetchingRegions } = useRegionsQuery(); // In order to get the s3 endpoints, we need to query the object storage service // It will only show quotas for assigned endpoints (endpoints relevant to a region a user ever created a resource in). - const { - data: s3Endpoints, - isFetching: isFetchingS3Endpoints, - } = useObjectStorageEndpoints(service === 'object-storage'); + const { data: s3Endpoints, isFetching: isFetchingS3Endpoints } = + useObjectStorageEndpoints(service === 'object-storage'); if (service === 'object-storage') { return { @@ -57,7 +55,7 @@ export const useGetLocationsForQuotaService = ( s3Endpoints: [ ...[{ label: GLOBAL_QUOTA_LABEL, value: GLOBAL_QUOTA_VALUE }], ...(s3Endpoints ?? []) - ?.map((s3Endpoint) => { + .map((s3Endpoint) => { if (!s3Endpoint.s3_endpoint) { return null; } @@ -82,7 +80,7 @@ export const useGetLocationsForQuotaService = ( }; interface GetQuotasFiltersProps { - location: SelectOption | null; + location: null | SelectOption; service: SelectOption; } diff --git a/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.tsx b/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.tsx index 0d204a50c2e..ba22e5b6356 100644 --- a/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.tsx +++ b/packages/manager/src/features/Account/SwitchAccounts/ChildAccountList.tsx @@ -86,7 +86,7 @@ export const ChildAccountList = React.memo( return ( There are no child accounts - {filter.hasOwnProperty('company') + {Object.prototype.hasOwnProperty.call(filter, 'company') ? ' that match this query' : undefined} . diff --git a/packages/manager/src/features/Backups/BackupDrawer.tsx b/packages/manager/src/features/Backups/BackupDrawer.tsx index fe4e2eb313c..44a932f9ec3 100644 --- a/packages/manager/src/features/Backups/BackupDrawer.tsx +++ b/packages/manager/src/features/Backups/BackupDrawer.tsx @@ -223,7 +223,7 @@ all new Linodes will automatically be backed up.` ); }; -const StyledPricingBox = styled(Box, { label: 'StyledPricingBox' })(({}) => ({ +const StyledPricingBox = styled(Box, { label: 'StyledPricingBox' })(() => ({ alignItems: 'center', display: 'flex', })); diff --git a/packages/manager/src/features/Billing/GooglePayProvider.ts b/packages/manager/src/features/Billing/GooglePayProvider.ts index 53ae78768eb..f798a135f99 100644 --- a/packages/manager/src/features/Billing/GooglePayProvider.ts +++ b/packages/manager/src/features/Billing/GooglePayProvider.ts @@ -24,9 +24,7 @@ let googlePaymentInstance: GooglePayment; const onPaymentAuthorized = ( paymentData: google.payments.api.PaymentData ): Promise => { - return new Promise((resolve, reject) => { - resolve({ transactionState: 'SUCCESS' }); - }); + return Promise.resolve({ transactionState: 'SUCCESS' }); }; export const initGooglePaymentInstance = async ( diff --git a/packages/manager/src/features/Billing/billingUtils.ts b/packages/manager/src/features/Billing/billingUtils.ts index ba1667ded99..4fb17e64d0e 100644 --- a/packages/manager/src/features/Billing/billingUtils.ts +++ b/packages/manager/src/features/Billing/billingUtils.ts @@ -11,6 +11,7 @@ import { parseAPIDate } from 'src/utilities/date'; export const cleanCVV = (input: string): string => { // All characters except numbers + // eslint-disable-next-line sonarjs/single-char-in-character-classes const regex = /(([\D]))/g; // Prevents more than 4 characters from being submitted diff --git a/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/AlertsResources.tsx b/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/AlertsResources.tsx index 005b9c16bf6..88a8d3e873f 100644 --- a/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/AlertsResources.tsx +++ b/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/AlertsResources.tsx @@ -112,9 +112,8 @@ export const AlertResources = React.memo((props: AlertResourcesProp) => { } = props; const [searchText, setSearchText] = React.useState(); const [filteredRegions, setFilteredRegions] = React.useState(); - const [selectedResources, setSelectedResources] = React.useState( - alertResourceIds - ); + const [selectedResources, setSelectedResources] = + React.useState(alertResourceIds); const [selectedOnly, setSelectedOnly] = React.useState(false); const [additionalFilters, setAdditionalFilters] = React.useState< Record diff --git a/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/DisplayAlertResources.tsx b/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/DisplayAlertResources.tsx index e9498d43b0a..7a5212ab7a1 100644 --- a/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/DisplayAlertResources.tsx +++ b/packages/manager/src/features/CloudPulse/Alerts/AlertsResources/DisplayAlertResources.tsx @@ -275,9 +275,8 @@ export const DisplayAlertResources = React.memo( {!isDataLoadingError && paginatedData.map((resource, index) => { const { checked, id } = resource; - const isItemCheckboxDisabled = isCheckboxDisabled( - checked - ); + const isItemCheckboxDisabled = + isCheckboxDisabled(checked); return ( {isSelectionsNeeded && ( diff --git a/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/MetricCriteria.test.tsx b/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/MetricCriteria.test.tsx index 4608d2eb10c..a5d3fb6cbcf 100644 --- a/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/MetricCriteria.test.tsx +++ b/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Criteria/MetricCriteria.test.tsx @@ -129,39 +129,7 @@ describe('MetricCriteriaField', () => { }); it('renders the initial metric field without the delete-icon', async () => { - const { - getByTestId, - queryByTestId, - } = renderWithThemeAndHookFormContext({ - component: ( - - ), - useFormOptions: { - defaultValues: { - rule_criteria: { - rules: [mockData.data[0]], - }, - }, - }, - }); - expect(getByTestId('rule_criteria.rules.0-id')).toBeInTheDocument(); - await waitFor(() => - expect(queryByTestId('clear-icon')).not.toBeInTheDocument() - ); - }); - - it('handles error state while fetching metric definitions', async () => { - // Mock the API to simulate error state - queryMocks.useGetCloudPulseMetricDefinitionsByServiceType.mockReturnValue({ - data: undefined, - isError: true, - isLoading: false, - status: 'error', - }), + const { getByTestId, queryByTestId } = renderWithThemeAndHookFormContext({ component: ( { }, }, }); - expect( - await screen.findByText('Error in fetching the data.') - ).toBeInTheDocument(); + expect(getByTestId('rule_criteria.rules.0-id')).toBeInTheDocument(); + await waitFor(() => + expect(queryByTestId('clear-icon')).not.toBeInTheDocument() + ); }); - it('adds and removes metric fields dynamically', async () => { - const { - getByTestId, - queryByTestId, - } = renderWithThemeAndHookFormContext({ + it('handles error state while fetching metric definitions', async () => { + // Mock the API to simulate error state + queryMocks.useGetCloudPulseMetricDefinitionsByServiceType.mockReturnValue({ + data: undefined, + isError: true, + isLoading: false, + status: 'error', + }); + + renderWithThemeAndHookFormContext({ component: ( { }, }, }); + expect( + await screen.findByText('Error in fetching the data.') + ).toBeInTheDocument(); + }); + + it('adds and removes metric fields dynamically', async () => { + const { getByTestId, queryByTestId } = + renderWithThemeAndHookFormContext({ + component: ( + + ), + useFormOptions: { + defaultValues: { + rule_criteria: { + rules: [mockData.data[0]], + }, + }, + }, + }); const ruleCriteriaID = 'rule_criteria.rules.1-id'; await user.click(screen.getByRole('button', { name: 'Add metric' })); expect(getByTestId(ruleCriteriaID)).toBeInTheDocument(); @@ -246,39 +243,36 @@ describe('MetricCriteriaField', () => { expect(setMaxInterval).toBeCalledWith(firstOptionConvertedTime); }); it('displays tooltip when the button is disabled', async () => { - const { - getByText, - } = renderWithThemeAndHookFormContext({ - component: ( - - ), - useFormOptions: { - defaultValues: { - rule_criteria: { - rules: [ - mockData.data[0], - mockData.data[0], - mockData.data[1], - mockData.data[1], - mockData.data[0], - ], + const { findByText } = + renderWithThemeAndHookFormContext({ + component: ( + + ), + useFormOptions: { + defaultValues: { + rule_criteria: { + rules: [ + mockData.data[0], + mockData.data[0], + mockData.data[1], + mockData.data[1], + mockData.data[0], + ], + }, }, }, - }, - }); + }); const addButton = screen.getByRole('button', { name: 'Add metric', }); expect(addButton).toBeDisabled(); - userEvent.hover(addButton); - await waitFor(() => - expect(getByText('You can add up to 5 metrics.')).toBeInTheDocument() - ); + await userEvent.hover(addButton); + await findByText('You can add up to 5 metrics.'); }); }); diff --git a/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Resources/CloudPulseModifyAlertResources.test.tsx b/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Resources/CloudPulseModifyAlertResources.test.tsx index f481fde660c..77fe7c0ec6b 100644 --- a/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Resources/CloudPulseModifyAlertResources.test.tsx +++ b/packages/manager/src/features/CloudPulse/Alerts/CreateAlert/Resources/CloudPulseModifyAlertResources.test.tsx @@ -75,19 +75,16 @@ beforeEach(() => { describe('CreateAlertResources component tests', () => { it('should be able to render the component on correct props and values', async () => { - const { - getByPlaceholderText, - getByTestId, - queryByTestId, - } = renderWithThemeAndHookFormContext({ - component: , - useFormOptions: { - defaultValues: { - entity_ids: [], - serviceType: 'linode', + const { getByPlaceholderText, getByTestId, queryByTestId } = + renderWithThemeAndHookFormContext({ + component: , + useFormOptions: { + defaultValues: { + entity_ids: [], + serviceType: 'linode', + }, }, - }, - }); + }); expect( getByPlaceholderText('Search for a Region or Resource') ).toBeInTheDocument(); @@ -141,34 +138,31 @@ describe('CreateAlertResources component tests', () => { }); it('should be able to see the error notice if the forms field state has error', async () => { - const { - getAllByTestId, - getByTestId, - getByText, - } = renderWithThemeAndHookFormContext({ - component: , - options: { - flags: { - aclpAlertServiceTypeConfig: [ - { - maxResourceSelectionCount: 2, - serviceType: 'linode', - }, - ], - }, - }, - useFormOptions: { - defaultValues: { - entity_ids: ['1', '2', '3'], - serviceType: 'linode', + const { getAllByTestId, getByTestId, getByText } = + renderWithThemeAndHookFormContext({ + component: , + options: { + flags: { + aclpAlertServiceTypeConfig: [ + { + maxResourceSelectionCount: 2, + serviceType: 'linode', + }, + ], + }, }, - errors: { - entity_ids: { - message: 'More than 2 resources selected', + useFormOptions: { + defaultValues: { + entity_ids: ['1', '2', '3'], + serviceType: 'linode', + }, + errors: { + entity_ids: { + message: 'More than 2 resources selected', + }, }, }, - }, - }); + }); expect(getAllByTestId('alert_message_notice').length).toBe(2); // one for error and one for selection warning expect(getByText('You can select up to 2 resources.')).toBeInTheDocument(); diff --git a/packages/manager/src/features/CloudPulse/Overview/GlobalFilters.test.tsx b/packages/manager/src/features/CloudPulse/Overview/GlobalFilters.test.tsx index 9625cf0e3bb..66787ec5510 100644 --- a/packages/manager/src/features/CloudPulse/Overview/GlobalFilters.test.tsx +++ b/packages/manager/src/features/CloudPulse/Overview/GlobalFilters.test.tsx @@ -23,21 +23,23 @@ describe('Global filters component test', () => { it('Should render refresh button', () => { const { getByTestId } = setup(); expect(getByTestId('global-refresh')).toBeInTheDocument(); - }), - it('Should show dashboard selectcomponent', () => { - const { getByTestId } = setup(); + }); - expect(getByTestId('cloudpulse-dashboard-select')).toBeInTheDocument(); - }), - it('Should have time range select with default value', () => { - const screen = setup(); + it('Should show dashboard selectcomponent', () => { + const { getByTestId } = setup(); + + expect(getByTestId('cloudpulse-dashboard-select')).toBeInTheDocument(); + }); + + it('Should have time range select with default value', () => { + const screen = setup(); - const timeRangeSelect = screen.getByTestId(timeRangeSelectId); + const timeRangeSelect = screen.getByTestId(timeRangeSelectId); - expect(timeRangeSelect).toBeInTheDocument(); + expect(timeRangeSelect).toBeInTheDocument(); - expect( - screen.getByRole('combobox', { name: 'Time Range' }) - ).toHaveAttribute('value', 'Last 30 Minutes'); - }); + expect( + screen.getByRole('combobox', { name: 'Time Range' }) + ).toHaveAttribute('value', 'Last 30 Minutes'); + }); }); diff --git a/packages/manager/src/features/CloudPulse/Utils/CloudPulseWidgetUtils.ts b/packages/manager/src/features/CloudPulse/Utils/CloudPulseWidgetUtils.ts index 979049493c9..22641de3959 100644 --- a/packages/manager/src/features/CloudPulse/Utils/CloudPulseWidgetUtils.ts +++ b/packages/manager/src/features/CloudPulse/Utils/CloudPulseWidgetUtils.ts @@ -273,7 +273,7 @@ export const generateMaxUnit = ( ) => { const maxValue = Math.max( 0, - ...legendRowsData?.map((row) => row?.data.max ?? 0) + ...legendRowsData.map((row) => row?.data.max ?? 0) ); return generateUnitByBaseUnit(maxValue, unit); diff --git a/packages/manager/src/features/CloudPulse/Utils/models.ts b/packages/manager/src/features/CloudPulse/Utils/models.ts index f553882ea99..979e1e00fcd 100644 --- a/packages/manager/src/features/CloudPulse/Utils/models.ts +++ b/packages/manager/src/features/CloudPulse/Utils/models.ts @@ -182,5 +182,6 @@ export enum CloudPulseSelectTypes { /** * static selection type, where the service owner will give the static options for the filter */ + // eslint-disable-next-line sonarjs/future-reserved-words static, } diff --git a/packages/manager/src/features/CloudPulse/Utils/unitConversion.test.ts b/packages/manager/src/features/CloudPulse/Utils/unitConversion.test.ts index a2cdde6c9d9..a38b17a929a 100644 --- a/packages/manager/src/features/CloudPulse/Utils/unitConversion.test.ts +++ b/packages/manager/src/features/CloudPulse/Utils/unitConversion.test.ts @@ -12,25 +12,29 @@ describe('Unit conversion', () => { it('should check current unit to be converted into appropriate unit', () => { expect(generateCurrentUnit('Bytes')).toBe('B'); expect(generateCurrentUnit('%')).toBe('%'); - }), - it('should generate rolled up unit based on value', () => { - expect(generateUnitByByteValue(2024)).toBe('KB'); - expect(generateUnitByBitValue(999)).toBe('b'); - expect(generateUnitByTimeValue(364000)).toBe('min'); - }), - it('should roll up value based on unit', () => { - expect(convertValueToUnit(2048, 'KB')).toBe(2); - expect(convertValueToUnit(3000000, 'Mb')).toBe(3); - expect(convertValueToUnit(60000, 'min')).toBe(1); - }), - it('should generate a tooltip', () => { - expect(formatToolTip(1000, 'b')).toBe('1 Kb'); - expect(formatToolTip(2048, 'B')).toBe('2 KB'); - expect(formatToolTip(1000, 'ms')).toBe('1 s'); - }), - it('should generate maximum unit based on the base unit & value', () => { - expect(generateUnitByBaseUnit(1000000, 'b')).toBe('Mb'); - expect(generateUnitByBaseUnit(2048, 'B')).toBe('KB'); - expect(generateUnitByBaseUnit(60001, 'ms')).toBe('min'); - }); + }); + + it('should generate rolled up unit based on value', () => { + expect(generateUnitByByteValue(2024)).toBe('KB'); + expect(generateUnitByBitValue(999)).toBe('b'); + expect(generateUnitByTimeValue(364000)).toBe('min'); + }); + + it('should roll up value based on unit', () => { + expect(convertValueToUnit(2048, 'KB')).toBe(2); + expect(convertValueToUnit(3000000, 'Mb')).toBe(3); + expect(convertValueToUnit(60000, 'min')).toBe(1); + }); + + it('should generate a tooltip', () => { + expect(formatToolTip(1000, 'b')).toBe('1 Kb'); + expect(formatToolTip(2048, 'B')).toBe('2 KB'); + expect(formatToolTip(1000, 'ms')).toBe('1 s'); + }); + + it('should generate maximum unit based on the base unit & value', () => { + expect(generateUnitByBaseUnit(1000000, 'b')).toBe('Mb'); + expect(generateUnitByBaseUnit(2048, 'B')).toBe('KB'); + expect(generateUnitByBaseUnit(60001, 'ms')).toBe('min'); + }); }); diff --git a/packages/manager/src/features/CloudPulse/Widget/components/Zoomer.test.tsx b/packages/manager/src/features/CloudPulse/Widget/components/Zoomer.test.tsx index 06e31143700..31b0636ec87 100644 --- a/packages/manager/src/features/CloudPulse/Widget/components/Zoomer.test.tsx +++ b/packages/manager/src/features/CloudPulse/Widget/components/Zoomer.test.tsx @@ -16,15 +16,16 @@ describe('Cloud Pulse Zoomer', () => { expect(getByTestId('zoom-out')).toBeInTheDocument(); expect(getByTestId('Minimize')).toBeInTheDocument(); // test id for tooltip - }), - it('Should render zoomer with zoom-in button', () => { - const props: ZoomIconProperties = { - handleZoomToggle: vi.fn(), - zoomIn: false, - }; - const { getByTestId } = renderWithTheme(); + }); - expect(getByTestId('zoom-in')).toBeInTheDocument(); - expect(getByTestId('Maximize')).toBeInTheDocument(); // test id for tooltip - }); + it('Should render zoomer with zoom-in button', () => { + const props: ZoomIconProperties = { + handleZoomToggle: vi.fn(), + zoomIn: false, + }; + const { getByTestId } = renderWithTheme(); + + expect(getByTestId('zoom-in')).toBeInTheDocument(); + expect(getByTestId('Maximize')).toBeInTheDocument(); // test id for tooltip + }); }); diff --git a/packages/manager/src/features/CloudPulse/shared/CloudPulseComponentRenderer.test.tsx b/packages/manager/src/features/CloudPulse/shared/CloudPulseComponentRenderer.test.tsx index 2b554c101b9..84e58e6623b 100644 --- a/packages/manager/src/features/CloudPulse/shared/CloudPulseComponentRenderer.test.tsx +++ b/packages/manager/src/features/CloudPulse/shared/CloudPulseComponentRenderer.test.tsx @@ -94,49 +94,50 @@ describe('ComponentRenderer component tests', () => { ); expect(getByPlaceholderText('Select a Region')).toBeDefined(); - }), - it('it should render provided resource filter in props', () => { - const resourceProps = { - configuration: { - dependency: ['region', 'tags'], - filterKey: 'resource_id', - filterType: 'string', - isFilterable: true, - isMetricsFilter: true, - isMultiSelect: true, - name: 'Resources', - neededInServicePage: false, - placeholder: 'Select Resources', - priority: 2, - }, - name: 'Resources', - }; - const mockDashboard = dashboardFactory.build({ - service_type: 'linode', - }); + }); - const { getByPlaceholderText } = renderWithTheme( - - {RenderComponent({ - componentKey: 'resource_id', - componentProps: { - ...getResourcesProperties( - { - config: resourceProps, - dashboard: mockDashboard, - dependentFilters: { region: 'us-east' }, - isServiceAnalyticsIntegration: false, - }, - vi.fn() - ), - }, - key: 'resource_id', - })} - - ); - expect(getByPlaceholderText('Select Resources')).toBeDefined(); + it('it should render provided resource filter in props', () => { + const resourceProps = { + configuration: { + dependency: ['region', 'tags'], + filterKey: 'resource_id', + filterType: 'string', + isFilterable: true, + isMetricsFilter: true, + isMultiSelect: true, + name: 'Resources', + neededInServicePage: false, + placeholder: 'Select Resources', + priority: 2, + }, + name: 'Resources', + }; + const mockDashboard = dashboardFactory.build({ + service_type: 'linode', }); + const { getByPlaceholderText } = renderWithTheme( + + {RenderComponent({ + componentKey: 'resource_id', + componentProps: { + ...getResourcesProperties( + { + config: resourceProps, + dashboard: mockDashboard, + dependentFilters: { region: 'us-east' }, + isServiceAnalyticsIntegration: false, + }, + vi.fn() + ), + }, + key: 'resource_id', + })} + + ); + expect(getByPlaceholderText('Select Resources')).toBeDefined(); + }); + it('it should render provided node type filter in props', () => { const nodeTypeProps = { configuration: { diff --git a/packages/manager/src/features/CloudPulse/shared/CloudPulseCustomSelect.tsx b/packages/manager/src/features/CloudPulse/shared/CloudPulseCustomSelect.tsx index a68af932c17..1d3b777370f 100644 --- a/packages/manager/src/features/CloudPulse/shared/CloudPulseCustomSelect.tsx +++ b/packages/manager/src/features/CloudPulse/shared/CloudPulseCustomSelect.tsx @@ -115,6 +115,7 @@ export interface CloudPulseCustomSelectProps { export enum CloudPulseSelectTypes { dynamic, + // eslint-disable-next-line sonarjs/future-reserved-words static, } diff --git a/packages/manager/src/features/CloudPulse/shared/CloudPulseDashboardSelect.test.tsx b/packages/manager/src/features/CloudPulse/shared/CloudPulseDashboardSelect.test.tsx index 9ac49f8f032..2da4aae3abf 100644 --- a/packages/manager/src/features/CloudPulse/shared/CloudPulseDashboardSelect.test.tsx +++ b/packages/manager/src/features/CloudPulse/shared/CloudPulseDashboardSelect.test.tsx @@ -65,41 +65,37 @@ describe('CloudPulse Dashboard select', () => { expect(getByTestId('cloudpulse-dashboard-select')).toBeInTheDocument(); expect(getByPlaceholderText('Select a Dashboard')).toBeInTheDocument(); - }), - it('Should render dashboard select component with data', () => { - renderWithTheme(); - - fireEvent.click(screen.getByRole('button', { name: 'Open' })); - - expect( - screen.getByRole('option', { name: dashboardLabel }) - ).toBeInTheDocument(); - }), - it('Should select the option on click', () => { - renderWithTheme(); - - fireEvent.click(screen.getByRole('button', { name: 'Open' })); - fireEvent.click(screen.getByRole('option', { name: dashboardLabel })); - - expect(screen.getByRole('combobox')).toHaveAttribute( - 'value', - dashboardLabel - ); - }), - it('Should select the default value from preferences', () => { - renderWithTheme( - - ); - - expect(screen.getByRole('combobox')).toHaveAttribute( - 'value', - dashboardLabel - ); - }); + }); + it('Should render dashboard select component with data', () => { + renderWithTheme(); + + fireEvent.click(screen.getByRole('button', { name: 'Open' })); + + expect( + screen.getByRole('option', { name: dashboardLabel }) + ).toBeInTheDocument(); + }); + it('Should select the option on click', () => { + renderWithTheme(); + + fireEvent.click(screen.getByRole('button', { name: 'Open' })); + fireEvent.click(screen.getByRole('option', { name: dashboardLabel })); + + expect(screen.getByRole('combobox')).toHaveAttribute( + 'value', + dashboardLabel + ); + }); + it('Should select the default value from preferences', () => { + renderWithTheme( + + ); + + expect(screen.getByRole('combobox')).toHaveAttribute( + 'value', + dashboardLabel + ); + }); it('Should show error message when only dashboard call fails', () => { vi.spyOn(utils, 'getAllDashboards').mockReturnValue({ diff --git a/packages/manager/src/features/CloudPulse/shared/CloudPulseResourcesSelect.test.tsx b/packages/manager/src/features/CloudPulse/shared/CloudPulseResourcesSelect.test.tsx index 8beef634dbb..4fa71ab54a3 100644 --- a/packages/manager/src/features/CloudPulse/shared/CloudPulseResourcesSelect.test.tsx +++ b/packages/manager/src/features/CloudPulse/shared/CloudPulseResourcesSelect.test.tsx @@ -342,4 +342,4 @@ describe('CloudPulseResourcesSelect component tests', () => { ).toHaveAttribute(ARIA_SELECTED, 'false'); }); }); -}); +}); \ No newline at end of file diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.tsx index a1851e19b2f..9aa747f7f34 100644 --- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.tsx +++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseBackups/DatabaseBackups.tsx @@ -143,7 +143,7 @@ export const DatabaseBackups = (props: Props) => { Databases are automatically backed-up with full daily backups for the past 14 days, and binary logs recorded continuously. Full backups are version-specific binary backups, which when combined with binary - logs allow for consistent recovery to a specific point in time (PITR). + logs allow for consistent recovery to a specific point in time (PITR). Restore a Backup diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/firewallRuleEditor.ts b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/firewallRuleEditor.ts index 1848b6a4d94..4aea42dddcb 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/firewallRuleEditor.ts +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/firewallRuleEditor.ts @@ -174,10 +174,7 @@ const ruleEditorReducer = ( lastRevision.errors.push(action.error); return; - case 'UNDO': - lastRevision = last(draft[action.idx]); - draft[action.idx].pop(); // If there's nothing left on the stack, we need to actually remove this revisionList. diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx index 5344eaaf0c4..ca4a7f4baff 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/index.tsx @@ -6,8 +6,13 @@ import { useMutateFirewall, useProfile, } from '@linode/queries'; -import { Chip, CircleProgress, ErrorState, Paper } from '@linode/ui'; -import { Typography } from '@mui/material'; +import { + Chip, + CircleProgress, + ErrorState, + Paper, + Typography, +} from '@linode/ui'; import { useParams } from '@tanstack/react-router'; import * as React from 'react'; diff --git a/packages/manager/src/features/Help/SearchHOC.tsx b/packages/manager/src/features/Help/SearchHOC.tsx index 4da31cb7a7a..02b65c3b641 100644 --- a/packages/manager/src/features/Help/SearchHOC.tsx +++ b/packages/manager/src/features/Help/SearchHOC.tsx @@ -1,4 +1,3 @@ -/* eslint-disable react-refresh/only-export-components */ import { truncate } from '@linode/utilities'; import Algolia from 'algoliasearch'; import * as React from 'react'; diff --git a/packages/manager/src/features/Images/ImagesLanding/ImagesLanding.test.tsx b/packages/manager/src/features/Images/ImagesLanding/ImagesLanding.test.tsx index 1914fff0156..e707e9dc21b 100644 --- a/packages/manager/src/features/Images/ImagesLanding/ImagesLanding.test.tsx +++ b/packages/manager/src/features/Images/ImagesLanding/ImagesLanding.test.tsx @@ -252,11 +252,8 @@ describe('Images Landing Table', () => { }) ); - const { - getAllByLabelText, - getByText, - queryByTestId, - } = await renderWithThemeAndRouter(); + const { getAllByLabelText, getByText, queryByTestId } = + await renderWithThemeAndRouter(); const loadingElement = queryByTestId(loadingTestId); if (loadingElement) { @@ -394,11 +391,8 @@ describe('Images Landing Table', () => { }) ); - const { - findAllByLabelText, - getAllByLabelText, - queryByTestId, - } = await renderWithThemeAndRouter(); + const { findAllByLabelText, getAllByLabelText, queryByTestId } = + await renderWithThemeAndRouter(); const loadingElement = queryByTestId(loadingTestId); if (loadingElement) { diff --git a/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx b/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx index 8d96b91b3e9..b3343e2dd66 100644 --- a/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx +++ b/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx @@ -89,6 +89,7 @@ const Panel = (props: NodePoolPanelProps) => { const addPool = (selectedPlanType: string, nodeCount: number) => { addNodePool({ count: nodeCount, + // eslint-disable-next-line sonarjs/pseudo-random id: Math.random(), type: selectedPlanType, }); diff --git a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx index f3636748414..c2c2a1191a2 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/DeleteKubernetesClusterDialog.test.tsx @@ -61,7 +61,7 @@ describe('Kubernetes deletion dialog', () => { ); const button = getByTestId('confirm'); - expect(button).toBeDisabled; + expect(button).toBeDisabled(); await findByTestId('textfield-input'); diff --git a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.test.tsx b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.test.tsx index 42a4abfb234..6e55e6a0b05 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.test.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.test.tsx @@ -49,12 +49,8 @@ vi.mock('src/queries/kubernetes', async () => { describe('KubeControlPaneACLDrawer', () => { it('renders the drawer as expected when the cluster is migrated', async () => { - const { - getAllByTestId, - getAllByText, - getByText, - queryByText, - } = renderWithTheme(); + const { getAllByTestId, getAllByText, getByText, queryByText } = + renderWithTheme(); expect(getByText('Control Plane ACL for Test')).toBeVisible(); expect(getByText(ACL_DRAWER_STANDARD_TIER_ACL_COPY)).toBeVisible(); diff --git a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.tsx b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.tsx index 4e0a40985c9..25da9b58efa 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/KubeControlPaneACLDrawer.tsx @@ -68,18 +68,14 @@ export const KubeControlPlaneACLDrawer = ( const isEnterpriseCluster = clusterTier === 'enterprise'; - const [ - isACLAcknowledgementChecked, - setIsACLAcknowledgementChecked, - ] = React.useState(false); + const [isACLAcknowledgementChecked, setIsACLAcknowledgementChecked] = + React.useState(false); - const { - mutateAsync: updateKubernetesClusterControlPlaneACL, - } = useKubernetesControlPlaneACLMutation(clusterId); + const { mutateAsync: updateKubernetesClusterControlPlaneACL } = + useKubernetesControlPlaneACLMutation(clusterId); - const { mutateAsync: updateKubernetesCluster } = useKubernetesClusterMutation( - clusterId - ); + const { mutateAsync: updateKubernetesCluster } = + useKubernetesClusterMutation(clusterId); const { control, @@ -236,7 +232,7 @@ export const KubeControlPlaneACLDrawer = ( control={ { setValue('acl.enabled', !field.value, { diff --git a/packages/manager/src/features/Linodes/CloneLanding/CloneLanding.tsx b/packages/manager/src/features/Linodes/CloneLanding/CloneLanding.tsx index 7f671780c24..db3d4754caa 100644 --- a/packages/manager/src/features/Linodes/CloneLanding/CloneLanding.tsx +++ b/packages/manager/src/features/Linodes/CloneLanding/CloneLanding.tsx @@ -172,7 +172,7 @@ export const CloneLanding = () => { // The configs we know about in our configSelection state. const configsInState = configs.filter((eachConfig) => - state.configSelection.hasOwnProperty(eachConfig.id) + Object.prototype.hasOwnProperty.call(state.configSelection, eachConfig.id) ); // The configs that are selected. const selectedConfigs = configsInState.filter( @@ -183,7 +183,7 @@ export const CloneLanding = () => { // The disks we know about in our diskSelection state. const disksInState = disks.filter((eachDisk) => - state.diskSelection.hasOwnProperty(eachDisk.id) + Object.prototype.hasOwnProperty.call(state.diskSelection, eachDisk.id) ); // The disks that are selected. const selectedDisks = disksInState.filter( diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx index 80e85ac5ea0..1046609b859 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Addons/Backups.test.tsx @@ -25,12 +25,11 @@ describe('Linode Create Backups Addon', () => { }); it('should get its value from the form context', () => { - const { - getByRole, - } = renderWithThemeAndHookFormContext({ - component: , - useFormOptions: { defaultValues: { backups_enabled: true } }, - }); + const { getByRole } = + renderWithThemeAndHookFormContext({ + component: , + useFormOptions: { defaultValues: { backups_enabled: true } }, + }); const checkbox = getByRole('checkbox'); @@ -70,12 +69,11 @@ describe('Linode Create Backups Addon', () => { }) ); - const { - getByRole, - } = renderWithThemeAndHookFormContext({ - component: , - useFormOptions: { defaultValues: { region: region.id } }, - }); + const { getByRole } = + renderWithThemeAndHookFormContext({ + component: , + useFormOptions: { defaultValues: { region: region.id } }, + }); const checkbox = getByRole('checkbox'); @@ -96,11 +94,10 @@ describe('Linode Create Backups Addon', () => { }) ); - const { - getByRole, - } = renderWithThemeAndHookFormContext({ - component: , - }); + const { getByRole } = + renderWithThemeAndHookFormContext({ + component: , + }); const checkbox = getByRole('checkbox'); @@ -110,14 +107,13 @@ describe('Linode Create Backups Addon', () => { }); it('renders a warning if disk encryption is enabled and backups are enabled', async () => { - const { - getByText, - } = renderWithThemeAndHookFormContext({ - component: , - useFormOptions: { - defaultValues: { backups_enabled: true, disk_encryption: 'enabled' }, - }, - }); + const { getByText } = + renderWithThemeAndHookFormContext({ + component: , + useFormOptions: { + defaultValues: { backups_enabled: true, disk_encryption: 'enabled' }, + }, + }); expect( getByText('Virtual Machine Backups are not encrypted.') diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx index 3e2dfa064ef..ea9af7c3d50 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Addons/PrivateIP.test.tsx @@ -24,12 +24,11 @@ describe('Linode Create Private IP Add-on', () => { }); it('should get its value from the form context', () => { - const { - getByRole, - } = renderWithThemeAndHookFormContext({ - component: , - useFormOptions: { defaultValues: { private_ip: true } }, - }); + const { getByRole } = + renderWithThemeAndHookFormContext({ + component: , + useFormOptions: { defaultValues: { private_ip: true } }, + }); const checkbox = getByRole('checkbox'); @@ -46,12 +45,11 @@ describe('Linode Create Private IP Add-on', () => { }) ); - const { - getByRole, - } = renderWithThemeAndHookFormContext({ - component: , - useFormOptions: { defaultValues: { region: region.id } }, - }); + const { getByRole } = + renderWithThemeAndHookFormContext({ + component: , + useFormOptions: { defaultValues: { region: region.id } }, + }); const checkbox = getByRole('checkbox'); @@ -72,11 +70,10 @@ describe('Linode Create Private IP Add-on', () => { }) ); - const { - getByRole, - } = renderWithThemeAndHookFormContext({ - component: , - }); + const { getByRole } = + renderWithThemeAndHookFormContext({ + component: , + }); const checkbox = getByRole('checkbox'); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx index 98fcf5c6a0d..f7f78afd388 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Details/Details.test.tsx @@ -29,12 +29,10 @@ describe('Linode Create Details', () => { }); it('renders an "Add Tags" field', () => { - const { - getByLabelText, - getByPlaceholderText, - } = renderWithThemeAndHookFormContext({ - component:
, - }); + const { getByLabelText, getByPlaceholderText } = + renderWithThemeAndHookFormContext({ + component:
, + }); expect(getByLabelText('Add Tags')).toBeVisible(); expect( diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Error.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Error.tsx index a179493359c..c59a271021c 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Error.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Error.tsx @@ -6,7 +6,7 @@ import { ErrorMessage } from 'src/components/ErrorMessage'; import type { CreateLinodeRequest } from '@linode/api-v4'; -export const Error = () => { +export const LinodeCreateError = () => { const { formState: { errors }, getValues, diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Networking/VPCRanges.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Networking/VPCRanges.tsx index 24f69fb5b91..f73944a79d5 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Networking/VPCRanges.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Networking/VPCRanges.tsx @@ -45,6 +45,7 @@ export const VPCRanges = ({ disabled, interfaceIndex }: Props) => { label={`IP Range ${index}`} onBlur={field.onBlur} onChange={field.onChange} + // eslint-disable-next-line sonarjs/no-hardcoded-ip placeholder="10.0.0.0/24" sx={{ minWidth: 290 }} value={field.value} diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Region.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Region.test.tsx index 2dbda81d991..1e31cf3af00 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Region.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Region.test.tsx @@ -73,12 +73,10 @@ describe('Region', () => { }) ); - const { - findByText, - getByPlaceholderText, - } = renderWithThemeAndHookFormContext({ - component: , - }); + const { findByText, getByPlaceholderText } = + renderWithThemeAndHookFormContext({ + component: , + }); const select = getByPlaceholderText('Select a Region'); @@ -111,20 +109,20 @@ describe('Region', () => { }) ); - const { - findByText, - getByPlaceholderText, - } = renderWithThemeAndHookFormContext({ - component: , - options: { - MemoryRouter: { initialEntries: ['/linodes/create?type=Clone+Linode'] }, - }, - useFormOptions: { - defaultValues: { - linode, + const { findByText, getByPlaceholderText } = + renderWithThemeAndHookFormContext({ + component: , + options: { + MemoryRouter: { + initialEntries: ['/linodes/create?type=Clone+Linode'], + }, }, - }, - }); + useFormOptions: { + defaultValues: { + linode, + }, + }, + }); const select = getByPlaceholderText('Select a Region'); @@ -149,21 +147,20 @@ describe('Region', () => { }) ); - const { - findByText, - getByPlaceholderText, - getByText, - } = renderWithThemeAndHookFormContext({ - component: , - options: { - MemoryRouter: { initialEntries: ['/linodes/create?type=Clone+Linode'] }, - }, - useFormOptions: { - defaultValues: { - linode, + const { findByText, getByPlaceholderText, getByText } = + renderWithThemeAndHookFormContext({ + component: , + options: { + MemoryRouter: { + initialEntries: ['/linodes/create?type=Clone+Linode'], + }, }, - }, - }); + useFormOptions: { + defaultValues: { + linode, + }, + }, + }); const select = getByPlaceholderText('Select a Region'); @@ -203,20 +200,18 @@ describe('Region', () => { }) ); - const { - findByText, - getByLabelText, - } = renderWithThemeAndHookFormContext({ - component: , - options: { - MemoryRouter: { initialEntries: ['/linodes/create?type=Images'] }, - }, - useFormOptions: { - defaultValues: { - image: image.id, + const { findByText, getByLabelText } = + renderWithThemeAndHookFormContext({ + component: , + options: { + MemoryRouter: { initialEntries: ['/linodes/create?type=Images'] }, }, - }, - }); + useFormOptions: { + defaultValues: { + image: image.id, + }, + }, + }); const regionSelect = getByLabelText('Region'); diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx b/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx index a74ee1ad629..d24dee51526 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/Security.test.tsx @@ -147,13 +147,12 @@ describe('Security', () => { }) ); - const { - findByLabelText, - } = renderWithThemeAndHookFormContext({ - component: , - options: { flags: { linodeDiskEncryption: true } }, - useFormOptions: { defaultValues: { region: region.id } }, - }); + const { findByLabelText } = + renderWithThemeAndHookFormContext({ + component: , + options: { flags: { linodeDiskEncryption: true } }, + useFormOptions: { defaultValues: { region: region.id } }, + }); await findByLabelText( 'Disk encryption is not available in the selected region. Select another region to use Disk Encryption.' @@ -177,14 +176,12 @@ describe('Security', () => { }) ); - const { - findByLabelText, - getByLabelText, - } = renderWithThemeAndHookFormContext({ - component: , - options: { flags: { linodeDiskEncryption: true } }, - useFormOptions: { defaultValues: { region: region.id } }, - }); + const { findByLabelText, getByLabelText } = + renderWithThemeAndHookFormContext({ + component: , + options: { flags: { linodeDiskEncryption: true } }, + useFormOptions: { defaultValues: { region: region.id } }, + }); await findByLabelText( 'Distributed Compute Instances are encrypted. This setting can not be changed.' diff --git a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/StackScripts/UserDefinedFields/utilities.ts b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/StackScripts/UserDefinedFields/utilities.ts index db0dc6b01e7..6b0a2b46d64 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/Tabs/StackScripts/UserDefinedFields/utilities.ts +++ b/packages/manager/src/features/Linodes/LinodeCreate/Tabs/StackScripts/UserDefinedFields/utilities.ts @@ -22,7 +22,8 @@ export const separateUDFsByRequiredStatus = (udfs: UserDefinedField[] = []) => { * @returns true if a User Defined Field should be considered required */ export const getIsUDFRequired = (udf: UserDefinedField) => - !udf.hasOwnProperty('default') || udf.hasOwnProperty('required'); + !Object.prototype.hasOwnProperty.call(udf, 'default') || + Object.prototype.hasOwnProperty.call(udf, 'required'); /** * Given an array of User Defined Fields, this returns an object of diff --git a/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPC.tsx b/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPC.tsx index 914e308bb7b..30af0ee2d41 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPC.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPC.tsx @@ -36,28 +36,21 @@ import type { LinodeCreateFormEventOptions } from 'src/utilities/analytics/types export const VPC = () => { const [isCreateDrawerOpen, setIsCreateDrawerOpen] = useState(false); - const { - control, - formState, - setValue, - } = useFormContext(); + const { control, formState, setValue } = + useFormContext(); const { data: regions } = useRegionsQuery(); - const [ - regionId, - selectedVPCId, - selectedSubnetId, - linodeVPCIPAddress, - ] = useWatch({ - control, - name: [ - 'region', - 'interfaces.0.vpc_id', - 'interfaces.0.subnet_id', - 'interfaces.0.ipv4.vpc', - ], - }); + const [regionId, selectedVPCId, selectedSubnetId, linodeVPCIPAddress] = + useWatch({ + control, + name: [ + 'region', + 'interfaces.0.vpc_id', + 'interfaces.0.subnet_id', + 'interfaces.0.ipv4.vpc', + ], + }); const regionSupportsVPCs = doesRegionSupportFeature( regionId, @@ -65,7 +58,11 @@ export const VPC = () => { 'VPCs' ); - const { data: vpcs, error, isLoading } = useAllVPCsQuery({ + const { + data: vpcs, + error, + isLoading, + } = useAllVPCsQuery({ enabled: regionSupportsVPCs, filter: { region: regionId }, }); @@ -106,13 +103,21 @@ export const VPC = () => { ( { field.onChange(vpc?.id ?? null); @@ -144,22 +149,14 @@ export const VPC = () => { }); } }} + options={vpcs ?? []} + placeholder="None" textFieldProps={{ tooltipText: REGION_CAVEAT_HELPER_TEXT, }} - disabled={!regionSupportsVPCs} - errorText={error?.[0].reason ?? fieldState.error?.message} - label="Assign VPC" - loading={isLoading} - noMarginTop - onBlur={field.onBlur} - options={vpcs ?? []} - placeholder="None" value={selectedVPC ?? null} /> )} - control={control} - name="interfaces.0.vpc_id" /> {regionId && regionSupportsVPCs && ( @@ -179,38 +176,41 @@ export const VPC = () => { {selectedVPCId && ( <> ( `${subnet.label} (${subnet.ipv4})` } - value={ - selectedVPC?.subnets.find( - (subnet) => subnet.id === field.value - ) ?? null - } - errorText={fieldState.error?.message} label="Subnet" noMarginTop onBlur={field.onBlur} onChange={(e, subnet) => field.onChange(subnet?.id ?? null)} options={selectedVPC?.subnets ?? []} placeholder="Select Subnet" + value={ + selectedVPC?.subnets.find( + (subnet) => subnet.id === field.value + ) ?? null + } /> )} - control={control} - name="interfaces.0.subnet_id" /> {selectedSubnetId && ( <> ( } label={ @@ -230,16 +230,15 @@ export const VPC = () => { // user can enter one. field.onChange(checked ? null : '') } - control={} /> )} - control={control} - name="interfaces.0.ipv4.vpc" /> {linodeVPCIPAddress !== null && linodeVPCIPAddress !== undefined && ( ( { value={field.value} /> )} - control={control} - name="interfaces.0.ipv4.vpc" /> )} ( } label={ Assign a public IPv4 address for this Linode } onChange={(e, checked) => field.onChange(checked ? 'any' : null) } - checked={field.value === 'any'} - control={} sx={{ mt: 0 }} /> )} - control={control} - name="interfaces.0.ipv4.nat_1_1" /> @@ -289,11 +286,10 @@ export const VPC = () => { Assign additional IPv4 ranges {formState.errors.interfaces?.[1] && - 'ip_ranges' in formState.errors.interfaces?.[1] && ( + formState.errors.interfaces[1] && + 'ip_ranges' in formState.errors.interfaces[1] && ( )} @@ -322,6 +318,7 @@ export const VPC = () => { setIsCreateDrawerOpen(false)} onSuccess={(vpc) => { setValue('interfaces.0.vpc_id', vpc.id); @@ -331,7 +328,6 @@ export const VPC = () => { setValue('interfaces.0.subnet_id', vpc.subnets[0].id); } }} - onClose={() => setIsCreateDrawerOpen(false)} open={isCreateDrawerOpen} selectedRegion={regionId} /> diff --git a/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPCRanges.tsx b/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPCRanges.tsx index 75bd7268682..caad19ec647 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPCRanges.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/VPC/VPCRanges.tsx @@ -32,6 +32,7 @@ export const VPCRanges = () => { label={`IP Range ${index}`} onBlur={field.onBlur} onChange={field.onChange} + // eslint-disable-next-line sonarjs/no-hardcoded-ip placeholder="10.0.0.0/24" sx={{ minWidth: 290 }} value={field.value} diff --git a/packages/manager/src/features/Linodes/LinodeCreate/index.tsx b/packages/manager/src/features/Linodes/LinodeCreate/index.tsx index ce5c061e547..9f8da8e65b7 100644 --- a/packages/manager/src/features/Linodes/LinodeCreate/index.tsx +++ b/packages/manager/src/features/Linodes/LinodeCreate/index.tsx @@ -36,7 +36,7 @@ import { import { Actions } from './Actions'; import { Addons } from './Addons/Addons'; import { Details } from './Details/Details'; -import { Error } from './Error'; +import { LinodeCreateError } from './Error'; import { EUAgreement } from './EUAgreement'; import { Firewall } from './Firewall'; import { FirewallAuthorization } from './FirewallAuthorization'; @@ -205,7 +205,7 @@ export const LinodeCreate = () => { title="Create" />
- + diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/IPSharing.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/IPSharing.tsx index b9f32081610..f2cb11ad22e 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/IPSharing.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeNetworking/IPSharing.tsx @@ -84,14 +84,13 @@ const IPSharingPanel = (props: Props) => { const linodeSharedIPs = [ ...(ips?.ipv4.shared.map((ip) => ip.address) ?? []), - ...sharedRanges?.map((range) => `${range.range}/${range.prefix}`), + ...sharedRanges.map((range) => `${range.range}/${range.prefix}`), ]; const linodeIPs = ips?.ipv4.public.map((i) => i.address) ?? []; - const availableRangesMap: AvailableRangesMap = formatAvailableRanges( - availableRanges - ); + const availableRangesMap: AvailableRangesMap = + formatAvailableRanges(availableRanges); const { data: linodes, isLoading } = useAllLinodesQuery( { page_size: API_MAX_PAGE_SIZE }, @@ -131,7 +130,7 @@ const IPSharingPanel = (props: Props) => { ); linodeSharedIPs.forEach((range) => { - if (!choiceLabels.hasOwnProperty(range)) { + if (!Object.prototype.hasOwnProperty.call(choiceLabels, range)) { choiceLabels[range] = ''; } }); @@ -200,7 +199,9 @@ const IPSharingPanel = (props: Props) => { // the Linode it is statically routed to, then to the current Linode if (isStaticv6) { const linodeId = ipToLinodeID[currentValue][0]; - if (groupedUnsharedRanges.hasOwnProperty(linodeId)) { + if ( + Object.prototype.hasOwnProperty.call(groupedUnsharedRanges, linodeId) + ) { groupedUnsharedRanges[linodeId] = [ ...groupedUnsharedRanges[linodeId], strippedIP, @@ -234,7 +235,7 @@ const IPSharingPanel = (props: Props) => { return; } - const promises: Promise<{} | void>[] = []; + const promises: Promise[] = []; if (flags.ipv6Sharing) { // share unshared ranges first to their staticly routed Linode, then later we can share to the current Linode @@ -514,11 +515,6 @@ export const IPSharingRow: React.FC = React.memo((props) => { }} > - setSelectedDiskId(Number(item?.value) ?? null) + setSelectedDiskId(Number(item?.value) || null) } value={ diskOptions?.find((item) => item.value === selectedDiskId) ?? null diff --git a/packages/manager/src/features/Linodes/transitions.ts b/packages/manager/src/features/Linodes/transitions.ts index a87a7265b52..266611aa992 100644 --- a/packages/manager/src/features/Linodes/transitions.ts +++ b/packages/manager/src/features/Linodes/transitions.ts @@ -46,7 +46,10 @@ export const linodeInTransition = ( return ( recentEvent !== undefined && - transitionActionMap.hasOwnProperty(recentEvent.action) && + Object.prototype.hasOwnProperty.call( + transitionActionMap, + recentEvent.action + ) && recentEvent.percent_complete !== null && recentEvent.percent_complete < 100 ); diff --git a/packages/manager/src/features/Lish/Glish.tsx b/packages/manager/src/features/Lish/Glish.tsx index 9528ae808f0..d855eddfe36 100644 --- a/packages/manager/src/features/Lish/Glish.tsx +++ b/packages/manager/src/features/Lish/Glish.tsx @@ -34,7 +34,6 @@ const Glish = (props: Props) => { } }, 30 * 1000); - // eslint-disable-next-line scanjs-rules/call_addEventListener document.addEventListener('paste', handlePaste); return () => { @@ -77,7 +76,6 @@ const Glish = (props: Props) => { monitor = new WebSocket(monitor_url, ws_protocols); - // eslint-disable-next-line scanjs-rules/call_addEventListener monitor.addEventListener('message', (ev) => { const data = JSON.parse(ev.data); diff --git a/packages/manager/src/features/Lish/Weblish.tsx b/packages/manager/src/features/Lish/Weblish.tsx index bdad1037915..498c09f9418 100644 --- a/packages/manager/src/features/Lish/Weblish.tsx +++ b/packages/manager/src/features/Lish/Weblish.tsx @@ -1,4 +1,3 @@ -/* eslint-disable scanjs-rules/call_addEventListener */ import { CircleProgress, ErrorState } from '@linode/ui'; import { Terminal } from '@xterm/xterm'; import * as React from 'react'; diff --git a/packages/manager/src/features/Longview/LongviewLanding/Gauges/CPU.tsx b/packages/manager/src/features/Longview/LongviewLanding/Gauges/CPU.tsx index 1524e933cdc..7a83502a299 100644 --- a/packages/manager/src/features/Longview/LongviewLanding/Gauges/CPU.tsx +++ b/packages/manager/src/features/Longview/LongviewLanding/Gauges/CPU.tsx @@ -12,7 +12,7 @@ import type { CPU } from '../../request.types'; import type { BaseProps as Props } from './common'; import type { Props as LVDataProps } from 'src/containers/longview.stats.container'; -interface getFinalUsedCPUProps extends Props, LVDataProps {} +interface GetFinalUsedCPUProps extends Props, LVDataProps {} export const getFinalUsedCPU = (data: LVDataProps['longviewClientData']) => { const numberOfCores = data?.SysInfo?.cpu?.cores ?? 0; @@ -21,7 +21,7 @@ export const getFinalUsedCPU = (data: LVDataProps['longviewClientData']) => { }; export const CPUGauge = withClientStats((ownProps) => ownProps.clientID)( - (props: getFinalUsedCPUProps) => { + (props: GetFinalUsedCPUProps) => { const { lastUpdatedError, longviewClientData, diff --git a/packages/manager/src/features/Longview/LongviewLanding/Gauges/Storage.tsx b/packages/manager/src/features/Longview/LongviewLanding/Gauges/Storage.tsx index c03c7eeeacf..6525978ebd6 100644 --- a/packages/manager/src/features/Longview/LongviewLanding/Gauges/Storage.tsx +++ b/packages/manager/src/features/Longview/LongviewLanding/Gauges/Storage.tsx @@ -12,57 +12,57 @@ import { baseGaugeProps } from './common'; import type { BaseProps as Props } from './common'; import type { Props as LVDataProps } from 'src/containers/longview.stats.container'; -interface getUsedStorageProps extends Props, LVDataProps {} +interface GetUsedStorageProps extends Props, LVDataProps {} export const getUsedStorage = (data: LVDataProps['longviewClientData']) => { const storageInBytes = sumStorage(data.Disk); return storageInBytes ? storageInBytes.total - storageInBytes.free : 0; }; -export const StorageGauge = withClientStats((props) => props.clientID)( - (props: getUsedStorageProps) => { - const { - lastUpdatedError, - longviewClientData, - longviewClientDataError: error, - longviewClientDataLoading: loading, - } = props; +export const StorageGauge = withClientStats((props) => props.clientID)(( + props: GetUsedStorageProps +) => { + const { + lastUpdatedError, + longviewClientData, + longviewClientDataError: error, + longviewClientDataLoading: loading, + } = props; - const theme = useTheme(); + const theme = useTheme(); - const storageInBytes = sumStorage(longviewClientData.Disk); + const storageInBytes = sumStorage(longviewClientData.Disk); - const usedStorage = storageInBytes - ? storageInBytes.total - storageInBytes.free - : 0; + const usedStorage = storageInBytes + ? storageInBytes.total - storageInBytes.free + : 0; - return ( - + return ( + + + Storage + + {!error && !loading && storageInBytes && ( - Storage + {readableBytes(storageInBytes.total).formatted} - {!error && !loading && storageInBytes && ( - - {readableBytes(storageInBytes.total).formatted} - - )} - - } - filledInColor={theme.graphs.orange} - max={storageInBytes ? storageInBytes.total : 0} - value={usedStorage} - /> - ); - } -); + )} + + } + value={usedStorage} + /> + ); +}); export const innerText = (value: string, loading: boolean, error: boolean) => { if (error) { diff --git a/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx b/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx index 69fa4a44863..10a62995dfe 100644 --- a/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx +++ b/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx @@ -9,8 +9,8 @@ import { import { renderWithThemeAndRouter } from 'src/utilities/testHelpers'; import { - LongviewClients, filterLongviewClientsByQuery, + LongviewClients, sortClientsBy, sortFunc, } from './LongviewClients'; @@ -56,15 +56,15 @@ describe('Utility Functions', () => { it('should properly filter longview clients by query', () => { expect(filterLongviewClientsByQuery('client-1', clients, {})).toEqual([ clients[0], - ]), - expect(filterLongviewClientsByQuery('client', clients, {})).toEqual( - clients - ), - expect(filterLongviewClientsByQuery('(', clients, {})).toEqual([]), - expect(filterLongviewClientsByQuery(')', clients, {})).toEqual([]), - expect(filterLongviewClientsByQuery('fdsafdsafsdf', clients, {})).toEqual( - [] - ); + ]); + expect(filterLongviewClientsByQuery('client', clients, {})).toEqual( + clients + ); + expect(filterLongviewClientsByQuery('(', clients, {})).toEqual([]); + expect(filterLongviewClientsByQuery(')', clients, {})).toEqual([]); + expect(filterLongviewClientsByQuery('fdsafdsafsdf', clients, {})).toEqual( + [] + ); }); describe('Sorting helpers', () => { @@ -82,11 +82,7 @@ describe('Utility Functions', () => { it('should respect the optional order argument', () => { expect([4, 3, 5, 1, 2].sort((a, b) => sortFunc(a, b, 'asc'))).toEqual([ - 1, - 2, - 3, - 4, - 5, + 1, 2, 3, 4, 5, ]); expect( diff --git a/packages/manager/src/features/Managed/Credentials/CredentialActionMenu.tsx b/packages/manager/src/features/Managed/Credentials/CredentialActionMenu.tsx index 30833a84a22..fe11a212d61 100644 --- a/packages/manager/src/features/Managed/Credentials/CredentialActionMenu.tsx +++ b/packages/manager/src/features/Managed/Credentials/CredentialActionMenu.tsx @@ -2,8 +2,8 @@ import { useTheme } from '@mui/material/styles'; import useMediaQuery from '@mui/material/useMediaQuery'; import * as React from 'react'; -import { ActionMenu } from 'src/components/ActionMenu/ActionMenu'; import { InlineMenuAction } from 'src/components/InlineMenuAction/InlineMenuAction'; +import { ActionMenu } from 'src/components/ActionMenu/ActionMenu'; import type { Theme } from '@mui/material/styles'; import type { Action } from 'src/components/ActionMenu/ActionMenu'; @@ -41,7 +41,6 @@ const CredentialActionMenu = (props: CredentialActionMenuProps) => { ]; return ( - // eslint-disable-next-line react/jsx-no-useless-fragment <> {matchesSmDown ? ( { const monitors = data || []; - const { - closeDialog, - dialog, - handleError, - openDialog, - submitDialog, - } = useDialog((id) => deleteServiceMonitor({ id: id || -1 })); + const { closeDialog, dialog, handleError, openDialog, submitDialog } = + useDialog((id) => deleteServiceMonitor({ id: id || -1 })); - const [historyDrawerOpen, setHistoryDrawerOpen] = React.useState( - false - ); + const [historyDrawerOpen, setHistoryDrawerOpen] = + React.useState(false); - const [monitorDrawerOpen, setMonitorDrawerOpen] = React.useState( - false - ); + const [monitorDrawerOpen, setMonitorDrawerOpen] = + React.useState(false); const [drawerMode, setDrawerMode] = React.useState('create'); const [editID, setEditID] = React.useState(0); - const { mutateAsync: updateServiceMonitor } = useUpdateMonitorMutation( - editID - ); + const { mutateAsync: updateServiceMonitor } = + useUpdateMonitorMutation(editID); const { mutateAsync: createServiceMonitor } = useCreateMonitorMutation(); const [editLabel, setEditLabel] = React.useState(''); @@ -158,17 +150,18 @@ export const MonitorTable = () => { // Clear drawer error state setStatus(undefined); - // eslint-disable-next-line no-unused-expressions - drawerMode === 'create' - ? createServiceMonitor({ ...values, timeout: +values.timeout }) - .then(_success) - .catch(_error) - : updateServiceMonitor({ - ...values, - timeout: +values.timeout, - }) - .then(_success) - .catch(_error); + if (drawerMode === 'create') { + createServiceMonitor({ ...values, timeout: +values.timeout }) + .then(_success) + .catch(_error); + } else { + updateServiceMonitor({ + ...values, + timeout: +values.timeout, + }) + .then(_success) + .catch(_error); + } }; return ( @@ -288,11 +281,11 @@ export const MonitorTable = () => { open={monitorDrawerOpen} /> thisIssue.services.includes(editID) )} - error={failureReason} - isFetching={areIssuesFetching} monitorLabel={editLabel} onClose={() => setHistoryDrawerOpen(false)} open={historyDrawerOpen} diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerConfigurations.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerConfigurations.tsx index e94811cd831..25f813a3fac 100644 --- a/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerConfigurations.tsx +++ b/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerConfigurations.tsx @@ -769,7 +769,7 @@ class NodeBalancerConfigurations extends React.Component< /* All of the Nodes are new since the config was just created */ return this.createNode(idx, nodeIdx); } - return new Promise((resolve) => resolve(true)); + return Promise.resolve(true); }); /* Set the success message if all of the requests succeed */ @@ -893,7 +893,7 @@ class NodeBalancerConfigurations extends React.Component< if (node.modifyStatus === 'update') { return this.updateNode(idx, nodeIdx); } - return new Promise((resolve) => resolve(undefined)); + return Promise.resolve(undefined); }); /* Set the success message if all of the requests succeed */ diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerSummary/TablesPanel.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerSummary/TablesPanel.tsx index f2fe70eeac1..795b24d8a72 100644 --- a/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerSummary/TablesPanel.tsx +++ b/packages/manager/src/features/NodeBalancers/NodeBalancerDetail/NodeBalancerSummary/TablesPanel.tsx @@ -34,9 +34,11 @@ export const TablesPanel = () => { }); const { data: nodebalancer } = useNodeBalancerQuery(Number(id), Boolean(id)); - const { data: stats, error, isLoading } = useNodeBalancerStatsQuery( - nodebalancer?.id ?? -1 - ); + const { + data: stats, + error, + isLoading, + } = useNodeBalancerStatsQuery(nodebalancer?.id ?? -1); const statsErrorString = error ? getAPIErrorOrDefault(error, 'Unable to load stats')[0].reason diff --git a/packages/manager/src/features/ObjectStorage/AccessKeyLanding/utils.ts b/packages/manager/src/features/ObjectStorage/AccessKeyLanding/utils.ts index 4cbd5667b73..111c186dab0 100644 --- a/packages/manager/src/features/ObjectStorage/AccessKeyLanding/utils.ts +++ b/packages/manager/src/features/ObjectStorage/AccessKeyLanding/utils.ts @@ -60,7 +60,7 @@ export const hasLabelOrRegionsChanged = ( ): boolean => { const regionsChanged = !areArraysEqual( [...updatedValues.regions].sort(sortRegionOptions), - [...initialValues.regions?.map((region) => region.id)].sort( + [...initialValues.regions.map((region) => region.id)].sort( sortRegionOptions ) ); diff --git a/packages/manager/src/features/ObjectStorage/BucketDetail/AccessSelect.tsx b/packages/manager/src/features/ObjectStorage/BucketDetail/AccessSelect.tsx index 48001d654f9..795efe67844 100644 --- a/packages/manager/src/features/ObjectStorage/BucketDetail/AccessSelect.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketDetail/AccessSelect.tsx @@ -100,7 +100,7 @@ export const AccessSelect = React.memo((props: Props) => { return { acl: _acl as ACLType, cors_enabled }; } return { acl: 'private' as ACLType, cors_enabled: true }; - }, [bucketAccessData, objectAccessData, , variant]); + }, [bucketAccessData, objectAccessData, variant]); const { control, diff --git a/packages/manager/src/features/ObjectStorage/BucketDetail/BucketDetail.tsx b/packages/manager/src/features/ObjectStorage/BucketDetail/BucketDetail.tsx index 39c719acba1..140d3c46060 100644 --- a/packages/manager/src/features/ObjectStorage/BucketDetail/BucketDetail.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketDetail/BucketDetail.tsx @@ -103,27 +103,18 @@ export const BucketDetail = (props: Props) => { isFetchingNextPage, isLoading, } = useObjectBucketObjectsInfiniteQuery(clusterId, bucketName, prefix); - const [ - isCreateFolderDrawerOpen, - setIsCreateFolderDrawerOpen, - ] = React.useState(false); + const [isCreateFolderDrawerOpen, setIsCreateFolderDrawerOpen] = + React.useState(false); const [objectToDelete, setObjectToDelete] = React.useState(); const [deleteObjectError, setDeleteObjectError] = React.useState(); - const [ - deleteObjectDialogOpen, - setDeleteObjectDialogOpen, - ] = React.useState(false); - const [ - selectedObject, - setSelectedObject, - ] = React.useState(); - const [ - objectDetailDrawerOpen, - setObjectDetailDrawerOpen, - ] = React.useState(false); - const [deleteObjectLoading, setDeleteObjectLoading] = React.useState( - false - ); + const [deleteObjectDialogOpen, setDeleteObjectDialogOpen] = + React.useState(false); + const [selectedObject, setSelectedObject] = + React.useState(); + const [objectDetailDrawerOpen, setObjectDetailDrawerOpen] = + React.useState(false); + const [deleteObjectLoading, setDeleteObjectLoading] = + React.useState(false); const handleDownload = async (objectName: string) => { try { diff --git a/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.tsx b/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.tsx index 74494b5e81d..7404639ccd3 100644 --- a/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketLanding/BucketLanding.tsx @@ -62,10 +62,8 @@ export const BucketLanding = (props: Props) => { const removeBucketConfirmationDialog = useOpenClose(); const [isLoading, setIsLoading] = React.useState(false); const [error, setError] = React.useState(undefined); - const [ - bucketDetailDrawerOpen, - setBucketDetailDrawerOpen, - ] = React.useState(false); + const [bucketDetailDrawerOpen, setBucketDetailDrawerOpen] = + React.useState(false); const [selectedBucket, setSelectedBucket] = React.useState< ObjectStorageBucket | undefined >(undefined); diff --git a/packages/manager/src/features/ObjectStorage/BucketLanding/BucketRegions.test.tsx b/packages/manager/src/features/ObjectStorage/BucketLanding/BucketRegions.test.tsx index de0ea605363..fd615e8f01e 100644 --- a/packages/manager/src/features/ObjectStorage/BucketLanding/BucketRegions.test.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketLanding/BucketRegions.test.tsx @@ -15,7 +15,6 @@ const mockRegions = { id: 'us-1', label: 'US Location', }), - , regionFactory.build({ capabilities: ['Linodes'], country: 'us', @@ -26,6 +25,7 @@ const mockRegions = { // Mock data as needed error: null, }; + vi.mock('@linode/queries', async (importOriginal) => ({ ...(await importOriginal()), useRegionsQuery: vi.fn(() => mockRegions), diff --git a/packages/manager/src/features/ObjectStorage/BucketLanding/OMC_BucketLanding.tsx b/packages/manager/src/features/ObjectStorage/BucketLanding/OMC_BucketLanding.tsx index cf074588211..6207bf51f50 100644 --- a/packages/manager/src/features/ObjectStorage/BucketLanding/OMC_BucketLanding.tsx +++ b/packages/manager/src/features/ObjectStorage/BucketLanding/OMC_BucketLanding.tsx @@ -59,10 +59,8 @@ export const OMC_BucketLanding = (props: Props) => { const [isLoading, setIsLoading] = React.useState(false); const [error, setError] = React.useState(undefined); - const [ - bucketDetailDrawerOpen, - setBucketDetailDrawerOpen, - ] = React.useState(false); + const [bucketDetailDrawerOpen, setBucketDetailDrawerOpen] = + React.useState(false); const [selectedBucket, setSelectedBucket] = React.useState< ObjectStorageBucket | undefined diff --git a/packages/manager/src/features/ObjectStorage/ObjectStorageLanding.tsx b/packages/manager/src/features/ObjectStorage/ObjectStorageLanding.tsx index a71f03fc532..a024fce14e0 100644 --- a/packages/manager/src/features/ObjectStorage/ObjectStorageLanding.tsx +++ b/packages/manager/src/features/ObjectStorage/ObjectStorageLanding.tsx @@ -44,11 +44,8 @@ export const ObjectStorageLanding = () => { const match = useMatch({ strict: false }); const [mode, setMode] = React.useState('creating'); - const { - _isRestrictedUser, - account, - accountSettings, - } = useAccountManagement(); + const { _isRestrictedUser, account, accountSettings } = + useAccountManagement(); const flags = useFlags(); const isObjMultiClusterEnabled = isFeatureEnabledV2( diff --git a/packages/manager/src/features/Profile/Referrals/Referrals.tsx b/packages/manager/src/features/Profile/Referrals/Referrals.tsx index ecf1cdaabb2..a8e7eea1f8f 100644 --- a/packages/manager/src/features/Profile/Referrals/Referrals.tsx +++ b/packages/manager/src/features/Profile/Referrals/Referrals.tsx @@ -47,7 +47,7 @@ export const Referrals = () => { return ; } - const { completed, credit, pending, total, url } = profile?.referrals; + const { completed, credit, pending, total, url } = profile.referrals; const allowReferral = Boolean(url); return ( diff --git a/packages/manager/src/features/VPCs/VPCDetail/AssignIPRanges.tsx b/packages/manager/src/features/VPCs/VPCDetail/AssignIPRanges.tsx index 967ab9f3537..b216775f483 100644 --- a/packages/manager/src/features/VPCs/VPCDetail/AssignIPRanges.tsx +++ b/packages/manager/src/features/VPCs/VPCDetail/AssignIPRanges.tsx @@ -62,6 +62,7 @@ export const AssignIPRanges = (props: Props) => { forVPCIPv4Ranges ips={ipRanges} onChange={handleIPRangeChange} + // eslint-disable-next-line sonarjs/no-hardcoded-ip placeholder="10.0.0.0/24" title="" // Empty string so a title isn't displayed for each IP input /> diff --git a/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.tsx b/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.tsx index 5417dc3fa88..7166a36ba21 100644 --- a/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.tsx +++ b/packages/manager/src/features/VPCs/VPCDetail/VPCDetail.tsx @@ -46,7 +46,7 @@ const VPCDetail = () => { error, isFetching: isFetchingVPC, isLoading, - } = useVPCQuery(Number(vpcId) ?? -1, Boolean(vpcId)); + } = useVPCQuery(Number(vpcId) || -1, Boolean(vpcId)); const { data: regions } = useRegionsQuery(); const handleEditVPC = (vpc: VPC) => { diff --git a/packages/manager/src/features/components/PlansPanel/utils.ts b/packages/manager/src/features/components/PlansPanel/utils.ts index b3d29611c1e..7b030ebd5e0 100644 --- a/packages/manager/src/features/components/PlansPanel/utils.ts +++ b/packages/manager/src/features/components/PlansPanel/utils.ts @@ -117,7 +117,7 @@ export const getPlanSelectionsByPlanType = < plansByType['shared'].push(type); break; default: - if (plansByType.hasOwnProperty(type.class)) { + if (Object.prototype.hasOwnProperty.call(plansByType, type.class)) { plansByType[type.class].push(type); } break; diff --git a/packages/manager/src/hooks/useGlobalKeyboardListener.ts b/packages/manager/src/hooks/useGlobalKeyboardListener.ts index 2208a04d829..8c1dc53fbf4 100644 --- a/packages/manager/src/hooks/useGlobalKeyboardListener.ts +++ b/packages/manager/src/hooks/useGlobalKeyboardListener.ts @@ -36,7 +36,6 @@ export const useGlobalKeyboardListener = () => { * Allow an Easter egg for toggling the theme with * a key combination */ - // eslint-disable-next-line scanjs-rules/call_addEventListener document.addEventListener('keydown', keyboardListener); return () => { document.removeEventListener('keydown', keyboardListener); diff --git a/packages/manager/src/hooks/useOrderV2.test.tsx b/packages/manager/src/hooks/useOrderV2.test.tsx index cf655ca0331..3cebff4adaf 100644 --- a/packages/manager/src/hooks/useOrderV2.test.tsx +++ b/packages/manager/src/hooks/useOrderV2.test.tsx @@ -1,7 +1,7 @@ +import { queryClientFactory } from '@linode/queries'; import { act, renderHook, waitFor } from '@testing-library/react'; import { HttpResponse, http, server } from 'src/mocks/testServer'; -import { queryClientFactory } from '@linode/queries'; import { wrapWithThemeAndRouter } from 'src/utilities/testHelpers'; import { useOrderV2 } from './useOrderV2'; @@ -53,6 +53,8 @@ describe('useOrderV2', () => { await waitFor(() => { expect(result.current.order).toBe('desc'); + }); + await waitFor(() => { expect(result.current.orderBy).toBe('status'); }); }); @@ -79,6 +81,8 @@ describe('useOrderV2', () => { await waitFor(() => { expect(result.current.order).toBe('desc'); + }); + await waitFor(() => { expect(result.current.orderBy).toBe('size'); }); }); @@ -100,6 +104,8 @@ describe('useOrderV2', () => { expect(result.current.order).toBe( defaultProps.initialRoute.defaultOrder.order ); + }); + await waitFor(() => { expect(result.current.orderBy).toBe( defaultProps.initialRoute.defaultOrder.orderBy ); @@ -138,6 +144,8 @@ describe('useOrderV2', () => { to: '/', }) ); + }); + await waitFor(() => { expect(mutatePreferencesMock).toHaveBeenCalledWith( expect.objectContaining({ sortKeys: expect.objectContaining({ @@ -148,7 +156,11 @@ describe('useOrderV2', () => { }), }) ); + }); + await waitFor(() => { expect(result.current.order).toBe('desc'); + }); + await waitFor(() => { expect(result.current.orderBy).toBe('size'); }); }); diff --git a/packages/manager/src/hooks/usePendo.ts b/packages/manager/src/hooks/usePendo.ts index 83166b48cd5..f187a6cbc91 100644 --- a/packages/manager/src/hooks/usePendo.ts +++ b/packages/manager/src/hooks/usePendo.ts @@ -41,10 +41,9 @@ export const transformUrl = (url: string) => { const bucketPathMatchingRegex = /(buckets\/[^\/]+\/[^\/]+)/; const userPathMatchingRegex = /(users\/).*/; const oauthPathMatchingRegex = /(#access_token).*/; - let transformedUrl = url; // Replace any ids with * and keep the rest of the URL intact - transformedUrl = url.replace(idMatchingRegex, `/*`); + let transformedUrl = url.replace(idMatchingRegex, `/*`); // Replace the region and bucket names with * and keep the rest of the URL intact. // Object storage file navigation is truncated via the 'clear search' transform. diff --git a/packages/manager/src/mocks/presets/crud/handlers/quotas.ts b/packages/manager/src/mocks/presets/crud/handlers/quotas.ts index 2d9c2cad3d1..52cc20c5fd6 100644 --- a/packages/manager/src/mocks/presets/crud/handlers/quotas.ts +++ b/packages/manager/src/mocks/presets/crud/handlers/quotas.ts @@ -204,18 +204,18 @@ export const getQuotas = () => [ used: 45, }) ); - case 'Shared CPU': + case 'GPU': return makeResponse( quotaUsageFactory.build({ quota_limit: quota.quota_limit, - used: 24, + used: 3, }) ); - case 'GPU': + case 'Shared CPU': return makeResponse( quotaUsageFactory.build({ quota_limit: quota.quota_limit, - used: 3, + used: 24, }) ); case 'VPU': @@ -242,25 +242,25 @@ export const getQuotas = () => [ ); case 'object-storage': switch (quota.quota_name) { - case 'Total Capacity': + case 'Number of Buckets': return makeResponse( quotaUsageFactory.build({ quota_limit: quota.quota_limit, - used: 100_000_000_000_000, + used: 75, }) ); - case 'Number of Buckets': + case 'Number of Objects': return makeResponse( quotaUsageFactory.build({ quota_limit: quota.quota_limit, - used: 75, + used: 10_000_000, }) ); - case 'Number of Objects': + case 'Total Capacity': return makeResponse( quotaUsageFactory.build({ quota_limit: quota.quota_limit, - used: 10_000_000, + used: 100_000_000_000_000, }) ); default: @@ -271,9 +271,12 @@ export const getQuotas = () => [ }) ); } + break; default: return makeNotFoundResponse(); } + + return makeNotFoundResponse(); } ), ]; diff --git a/packages/manager/src/mocks/serverHandlers.ts b/packages/manager/src/mocks/serverHandlers.ts index c3eea73bd93..db19425955d 100644 --- a/packages/manager/src/mocks/serverHandlers.ts +++ b/packages/manager/src/mocks/serverHandlers.ts @@ -299,8 +299,8 @@ const databases = [ params.engine === 'mysql' ? pickRandom(possibleMySQLReplicationTypes) : params.engine === 'postgresql' - ? pickRandom(possiblePostgresReplicationTypes) - : (undefined as any); + ? pickRandom(possiblePostgresReplicationTypes) + : (undefined as any); db.ssl_connection = true; } const database = databaseFactory.build(db); @@ -2075,8 +2075,8 @@ export const handlers = [ type: 'payment_due', }); - const blockStorageMigrationScheduledNotification = notificationFactory.build( - { + const blockStorageMigrationScheduledNotification = + notificationFactory.build({ body: 'Your volumes in us-east will be upgraded to NVMe.', entity: { id: 20, @@ -2091,11 +2091,10 @@ export const handlers = [ type: 'volume_migration_scheduled' as NotificationType, until: '2021-10-16T04:00:00', when: '2021-09-30T04:00:00', - } - ); + }); - const blockStorageMigrationScheduledNotificationUnattached = notificationFactory.build( - { + const blockStorageMigrationScheduledNotificationUnattached = + notificationFactory.build({ body: 'Your volume will be upgraded to NVMe.', entity: { id: 30, @@ -2110,8 +2109,7 @@ export const handlers = [ type: 'volume_migration_scheduled' as NotificationType, until: '2021-10-16T04:00:00', when: '2021-09-30T04:00:00', - } - ); + }); const blockStorageMigrationImminentNotification = notificationFactory.build( { @@ -2365,7 +2363,7 @@ export const handlers = [ } const response = placementGroupFactory.build({ - id: Number(params.placementGroupId) ?? -1, + id: Number(params.placementGroupId) || -1, label: 'pg-1', members: [ { @@ -2421,7 +2419,7 @@ export const handlers = [ } const response = placementGroupFactory.build({ - id: Number(params.placementGroupId) ?? -1, + id: Number(params.placementGroupId) || -1, label: 'pg-1', members: [ { diff --git a/packages/manager/src/queries/cloudpulse/alerts.ts b/packages/manager/src/queries/cloudpulse/alerts.ts index 569de45cde7..3a92b105e0e 100644 --- a/packages/manager/src/queries/cloudpulse/alerts.ts +++ b/packages/manager/src/queries/cloudpulse/alerts.ts @@ -155,8 +155,8 @@ export const useAddEntityToAlert = () => { alert ); queryClient.invalidateQueries({ - queryKey: queryFactory.alerts._ctx.alertsByServiceType(serviceType) - .queryKey, + queryKey: + queryFactory.alerts._ctx.alertsByServiceType(serviceType).queryKey, }); queryClient.invalidateQueries({ @@ -191,8 +191,8 @@ export const useRemoveEntityFromAlert = () => { alert ); queryClient.invalidateQueries({ - queryKey: queryFactory.alerts._ctx.alertsByServiceType(serviceType) - .queryKey, + queryKey: + queryFactory.alerts._ctx.alertsByServiceType(serviceType).queryKey, }); queryClient.invalidateQueries({ diff --git a/packages/manager/src/routes/objectStorage/index.ts b/packages/manager/src/routes/objectStorage/index.ts index 0238df938e7..a220f2f6d19 100644 --- a/packages/manager/src/routes/objectStorage/index.ts +++ b/packages/manager/src/routes/objectStorage/index.ts @@ -99,7 +99,7 @@ export const objectStorageRouteTree = objectStorageRoute.addChildren([ objectStorageBucketCreateRoute, objectStorageAccessKeyCreateRoute, objectStorageBucketsLandingRoute, - objectStorageAccessKeysLandingRoute + objectStorageAccessKeysLandingRoute, ]), objectStorageBucketDetailRoute.addChildren([ objectStorageBucketDetailObjectsRoute, diff --git a/packages/manager/src/types/index.ts b/packages/manager/src/types/index.ts index 17223c16b2a..735d7ae9586 100644 --- a/packages/manager/src/types/index.ts +++ b/packages/manager/src/types/index.ts @@ -4,3 +4,5 @@ * @see https://github.com/Microsoft/TypeScript-React-Starter/issues/12#issuecomment-326370098 */ declare module '*.png'; +declare module 'eslint-plugin-cypress/flat'; +declare module 'eslint-plugin-xss'; diff --git a/packages/manager/src/utilities/CustomKeyboardSensor.ts b/packages/manager/src/utilities/CustomKeyboardSensor.ts index 521799c45fb..286e38eaf1b 100644 --- a/packages/manager/src/utilities/CustomKeyboardSensor.ts +++ b/packages/manager/src/utilities/CustomKeyboardSensor.ts @@ -43,7 +43,6 @@ class Listeners { handler: (event: T) => void, options?: AddEventListenerOptions | boolean ) { - // eslint-disable-next-line scanjs-rules/call_addEventListener this.target?.addEventListener(eventName, handler as EventListener, options); this.listeners.push([eventName, handler as EventListener, options]); } diff --git a/packages/manager/src/utilities/codesnippets/generate-ansibleConfig.ts b/packages/manager/src/utilities/codesnippets/generate-ansibleConfig.ts index 6187140f72e..669510fb163 100644 --- a/packages/manager/src/utilities/codesnippets/generate-ansibleConfig.ts +++ b/packages/manager/src/utilities/codesnippets/generate-ansibleConfig.ts @@ -41,7 +41,7 @@ export function generateAnsibleConfig(config: CreateLinodeRequest): string { if (config.metadata) { configStr += ` metadata:\n user_data: "${config.metadata?.user_data}"\n`; } - if (config.hasOwnProperty('private_ip')) { + if (Object.prototype.hasOwnProperty.call(config, 'private_ip')) { configStr += ` private_ip: ${config.private_ip}\n`; } if (config.authorized_users && config.authorized_users.length > 0) { diff --git a/packages/manager/src/utilities/codesnippets/generate-cli.test.ts b/packages/manager/src/utilities/codesnippets/generate-cli.test.ts index 5b73e92717a..5288548ea45 100644 --- a/packages/manager/src/utilities/codesnippets/generate-cli.test.ts +++ b/packages/manager/src/utilities/codesnippets/generate-cli.test.ts @@ -72,16 +72,4 @@ describe('generateCLICommand', () => { expect(generatedCommand).toMatch('--authorized_users Linny'); expect(generatedCommand).toMatch('--authorized_users Gritty'); }); - - describe('parsing of string arguments', () => { - it.skip('should escape strings that contain single quotes, double quotes, and forward slashes', () => { - const password = `@C@mplexP@ssword'"\\`; - const escapedPassword = `@C@mplexP@ssword\\\'\\\"\\\\\\`; - const linodeRequest = createLinodeRequestFactory.build({ - root_pass: password, - }); - const cliCommand = generateCLICommand(linodeRequest); - expect(cliCommand).toMatch(`--root_pass $'${escapedPassword}'`); - }); - }); }); diff --git a/packages/manager/src/utilities/codesnippets/generate-terraformConfig.ts b/packages/manager/src/utilities/codesnippets/generate-terraformConfig.ts index db6e5c9ad0d..b9663ec390f 100644 --- a/packages/manager/src/utilities/codesnippets/generate-terraformConfig.ts +++ b/packages/manager/src/utilities/codesnippets/generate-terraformConfig.ts @@ -100,7 +100,7 @@ export function generateTerraformConfig(config: CreateLinodeRequest): string { if (config.swap_size) { terraformConfig += ` swap_size = ${config.swap_size}\n`; } - if (config.hasOwnProperty('private_ip')) { + if (Object.prototype.hasOwnProperty.call(config, 'private_ip')) { // Checks explicitly for property existence terraformConfig += ` private_ip = ${config.private_ip}\n`; } diff --git a/packages/manager/src/utilities/getAPIErrorFor.ts b/packages/manager/src/utilities/getAPIErrorFor.ts index 9980a5816b6..56fd1d26192 100644 --- a/packages/manager/src/utilities/getAPIErrorFor.ts +++ b/packages/manager/src/utilities/getAPIErrorFor.ts @@ -1,29 +1,28 @@ -import { APIError } from '@linode/api-v4/lib/types'; - import { DEFAULT_ERROR_MESSAGE } from 'src/constants'; -export const getAPIErrorFor = ( - errorMap: { [index: string]: string }, - arr: APIError[] = [] -) => (field: string): string | undefined => { - // Safeguard in case this function isn't called with an array. - if (!Array.isArray(arr)) { - return field === 'none' ? DEFAULT_ERROR_MESSAGE : undefined; - } +import type { APIError } from '@linode/api-v4/lib/types'; + +export const getAPIErrorFor = + (errorMap: { [index: string]: string }, arr: APIError[] = []) => + (field: string): string | undefined => { + // Safeguard in case this function isn't called with an array. + if (!Array.isArray(arr)) { + return field === 'none' ? DEFAULT_ERROR_MESSAGE : undefined; + } - let err; + let err; - if (field === 'none') { - err = arr.find((e) => !e.hasOwnProperty('field')); - } else { - err = arr.find((e) => e.field === field); - } + if (field === 'none') { + err = arr.find((e) => !Object.prototype.hasOwnProperty.call(e, 'field')); + } else { + err = arr.find((e) => e.field === field); + } - if (!err) { - return; - } + if (!err) { + return; + } - return err.field && errorMap[err.field] - ? err.reason.replace(err.field, errorMap[err.field]) - : err.reason; -}; + return err.field && errorMap[err.field] + ? err.reason.replace(err.field, errorMap[err.field]) + : err.reason; + }; diff --git a/packages/manager/src/utilities/subnets.ts b/packages/manager/src/utilities/subnets.ts index 93ff787506d..885db43d4bf 100644 --- a/packages/manager/src/utilities/subnets.ts +++ b/packages/manager/src/utilities/subnets.ts @@ -1,5 +1,6 @@ import { determineIPType } from '@linode/validation'; +// eslint-disable-next-line sonarjs/no-hardcoded-ip export const DEFAULT_SUBNET_IPV4_VALUE = '10.0.0.0/24'; export const RESERVED_IP_NUMBER = 4; diff --git a/packages/manager/src/utilities/testHelpers.tsx b/packages/manager/src/utilities/testHelpers.tsx index 862628256ee..5f3ef6d03e7 100644 --- a/packages/manager/src/utilities/testHelpers.tsx +++ b/packages/manager/src/utilities/testHelpers.tsx @@ -1,3 +1,4 @@ +import { queryClientFactory } from '@linode/queries'; import { CssBaseline } from '@mui/material'; import { QueryClientProvider } from '@tanstack/react-query'; import { @@ -7,7 +8,7 @@ import { createRoute, createRouter, } from '@tanstack/react-router'; -import { act, render, waitFor } from '@testing-library/react'; +import { render, waitFor } from '@testing-library/react'; import mediaQuery from 'css-mediaquery'; import { Formik } from 'formik'; import { LDProvider } from 'launchdarkly-react-client-sdk'; @@ -20,7 +21,6 @@ import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import { LinodeThemeWrapper } from 'src/LinodeThemeWrapper'; -import { queryClientFactory } from '@linode/queries'; import { setupInterceptors } from 'src/request'; import { migrationRouteTree } from 'src/routes'; import { defaultState, storeFactory } from 'src/store'; @@ -96,9 +96,7 @@ export const wrapWithTheme = (ui: any, options: Options = {}) => { // we have to call setupInterceptors so that our API error normalization works as expected // I'm sorry that it makes us pass it the "ApplicationStore" - setupInterceptors( - configureStore([thunk])(defaultState) - ); + setupInterceptors(configureStore([thunk])(defaultState)); const uiToRender = ui.children ?? ui; @@ -182,9 +180,7 @@ export const wrapWithThemeAndRouter = ( const queryClient = passedQueryClient ?? queryClientFactory(); const storeToPass = customStore ? baseStore(customStore) : storeFactory(); - setupInterceptors( - configureStore([thunk])(defaultState) - ); + setupInterceptors(configureStore([thunk])(defaultState)); const rootRoute = createRootRoute({}); const indexRoute = createRoute({ @@ -233,19 +229,17 @@ export const renderWithThemeAndRouter = async ( routeTree: options.routeTree || migrationRouteTree, }); - let renderResult: RenderResult; - - await act(async () => { - renderResult = render(wrapWithThemeAndRouter(ui, { ...options, router })); + const utils: RenderResult = render( + wrapWithThemeAndRouter(ui, { ...options, router }) + ); - // Wait for the router to be ready - await waitFor(() => expect(router.state.status).toBe('idle')); - }); + // Wait for the router to be ready + await waitFor(() => expect(router.state.status).toBe('idle')); return { - ...renderResult!, + ...utils, rerender: (ui) => - renderResult.rerender(wrapWithThemeAndRouter(ui, { ...options, router })), + utils.rerender(wrapWithThemeAndRouter(ui, { ...options, router })), router, }; }; @@ -288,10 +282,10 @@ export const renderWithTheme = ( ui: React.ReactNode, options: Options = {} ): RenderResult => { - const renderResult = render(wrapWithTheme(ui, options)); + const utils = render(wrapWithTheme(ui, options)); return { - ...renderResult, - rerender: (ui) => renderResult.rerender(wrapWithTheme(ui, options)), + ...utils, + rerender: (ui) => utils.rerender(wrapWithTheme(ui, options)), }; }; @@ -343,14 +337,16 @@ export const renderWithThemeAndHookFormContext = ( type Query = (f: MatcherFunction) => HTMLElement; /** H/T to https://stackoverflow.com/questions/55509875/how-to-query-by-text-string-which-contains-html-tags-using-react-testing-library */ -export const withMarkup = (query: Query) => (text: string): HTMLElement => - query((content: string, node: HTMLElement) => { - const hasText = (node: HTMLElement) => node.textContent === text; - const childrenDontHaveText = Array.from(node.children).every( - (child) => !hasText(child as HTMLElement) - ); - return hasText(node) && childrenDontHaveText; - }); +export const withMarkup = + (query: Query) => + (text: string): HTMLElement => + query((content: string, node: HTMLElement) => { + const hasText = (node: HTMLElement) => node.textContent === text; + const childrenDontHaveText = Array.from(node.children).every( + (child) => !hasText(child as HTMLElement) + ); + return hasText(node) && childrenDontHaveText; + }); /** * Assert that HTML elements appear in a specific order. `selectorAttribute` must select the parent diff --git a/packages/manager/tsconfig.json b/packages/manager/tsconfig.json index 652807581c7..94c172680f3 100644 --- a/packages/manager/tsconfig.json +++ b/packages/manager/tsconfig.json @@ -43,6 +43,6 @@ }, "include": [ "src", - "package.json" + "package.json", ] } diff --git a/packages/queries/.changeset/pr-11941-tech-stories-1743701305865.md b/packages/queries/.changeset/pr-11941-tech-stories-1743701305865.md new file mode 100644 index 00000000000..0283f467b31 --- /dev/null +++ b/packages/queries/.changeset/pr-11941-tech-stories-1743701305865.md @@ -0,0 +1,5 @@ +--- +"@linode/queries": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/queries/.eslintrc.json b/packages/queries/.eslintrc.json deleted file mode 100644 index b8f8c62e03a..00000000000 --- a/packages/queries/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - // Temporarily extending ESLint config from linode/manager as the base config. - // @todo: modularization - Replace the path with the base shared ESLint config once available. - "extends": ["../manager/.eslintrc.cjs"] -} diff --git a/packages/queries/eslint.config.js b/packages/queries/eslint.config.js new file mode 100644 index 00000000000..8818da48db2 --- /dev/null +++ b/packages/queries/eslint.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { baseConfig } from '../manager/eslint.config.js'; + +export default defineConfig({ + extends: baseConfig, +}); diff --git a/packages/queries/package.json b/packages/queries/package.json index adae314e4bc..2e103dcad7d 100644 --- a/packages/queries/package.json +++ b/packages/queries/package.json @@ -7,6 +7,7 @@ "types": "src/index.ts", "author": "Linode", "license": "Apache-2.0", + "type": "module", "repository": { "type": "git", "url": "https://github.com/linode/manager/tree/develop/packages/queries" @@ -35,29 +36,10 @@ "react-dom": "^18.2.0" }, "devDependencies": { - "@linode/eslint-plugin-cloud-manager": "^0.0.10", "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "~6.4.2", "@testing-library/react": "~16.0.0", "@types/react": "^18.2.55", - "@types/react-dom": "^18.2.18", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^7.1.0", - "eslint-config-prettier": "~8.1.0", - "eslint-plugin-cypress": "^2.11.3", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-perfectionist": "^1.4.0", - "eslint-plugin-prettier": "~3.3.1", - "eslint-plugin-ramda": "^2.5.1", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-refresh": "^0.4.13", - "eslint-plugin-react-hooks": "^3.0.0", - "eslint-plugin-scanjs-rules": "^0.2.1", - "eslint-plugin-sonarjs": "^0.5.0", - "eslint-plugin-testing-library": "^3.1.2", - "eslint-plugin-xss": "^0.1.10", - "lint-staged": "^15.2.9", - "prettier": "~2.2.1" + "@types/react-dom": "^18.2.18" } } diff --git a/packages/queries/src/firewalls/firewalls.ts b/packages/queries/src/firewalls/firewalls.ts index fea962ac76f..dd8bf43c0e8 100644 --- a/packages/queries/src/firewalls/firewalls.ts +++ b/packages/queries/src/firewalls/firewalls.ts @@ -5,8 +5,8 @@ import { deleteFirewallDevice, getFirewall, getFirewallDevices, - getFirewallSettings, getFirewalls, + getFirewallSettings, getTemplate, getTemplates, updateFirewall, @@ -49,14 +49,14 @@ import type { UseQueryOptions } from '@tanstack/react-query'; const getAllFirewallDevices = ( id: number, passedParams: Params = {}, - passedFilter: Filter = {} + passedFilter: Filter = {}, ) => getAll((params, filter) => getFirewallDevices( id, { ...params, ...passedParams }, - { ...filter, ...passedFilter } - ) + { ...filter, ...passedFilter }, + ), )().then((data) => data.data); const getAllFirewallTemplates = () => @@ -64,7 +64,7 @@ const getAllFirewallTemplates = () => const getAllFirewallsRequest = () => getAll((passedParams, passedFilter) => - getFirewalls(passedParams, passedFilter) + getFirewalls(passedParams, passedFilter), )().then((data) => data.data); export const firewallQueries = createQueryKeys('firewalls', { @@ -112,7 +112,7 @@ export const firewallQueries = createQueryKeys('firewalls', { export const useAllFirewallDevicesQuery = ( id: number, - enabled: boolean = true + enabled: boolean = true, ) => useQuery({ ...firewallQueries.firewall(id)._ctx.devices, @@ -154,7 +154,7 @@ export const useAddFirewallDeviceMutation = () => { } const indexOfFirewall = page.data.findIndex( - (firewall) => firewall.id === id + (firewall) => firewall.id === id, ); // If the firewall does not exist on this page, don't change anything @@ -171,7 +171,7 @@ export const useAddFirewallDeviceMutation = () => { entities: [...firewall.entities, firewallDevice.entity], }; return { ...page, data: newData }; - } + }, ); // Append the new entity to the Firewall object in the "all firewalls" store @@ -183,7 +183,7 @@ export const useAddFirewallDeviceMutation = () => { } const indexOfFirewall = firewalls.findIndex( - (firewall) => firewall.id === id + (firewall) => firewall.id === id, ); // If the firewall does not exist in the list, don't do anything @@ -201,7 +201,7 @@ export const useAddFirewallDeviceMutation = () => { }; return newFirewalls; - } + }, ); // Append the new entity to the Firewall object @@ -215,7 +215,7 @@ export const useAddFirewallDeviceMutation = () => { ...oldFirewall, entities: [...oldFirewall.entities, firewallDevice.entity], }; - } + }, ); // Add device to the dedicated devices store @@ -226,7 +226,7 @@ export const useAddFirewallDeviceMutation = () => { return [firewallDevice]; } return [...existingFirewallDevices, firewallDevice]; - } + }, ); // Refresh the cached result of the linode-specific firewalls query @@ -250,7 +250,7 @@ export const useAddFirewallDeviceMutation = () => { export const useRemoveFirewallDeviceMutation = ( firewallId: number, - deviceId: number + deviceId: number, ) => { const queryClient = useQueryClient(); @@ -273,7 +273,7 @@ export const useRemoveFirewallDeviceMutation = ( firewallQueries.firewall(firewallId)._ctx.devices.queryKey, (oldData) => { return oldData?.filter((device) => device.id !== deviceId) ?? []; - } + }, ); }, }); @@ -287,7 +287,7 @@ export const useFirewallsQuery = (params?: Params, filter?: Filter) => { }; export const useFirewallSettingsQuery = ( - options?: Partial> + options?: Partial>, ) => { return useQuery({ ...firewallQueries.settings, @@ -321,7 +321,7 @@ export const useMutateFirewallSettings = () => { onSuccess(firewallSettings) { queryClient.setQueryData( firewallQueries.settings.queryKey, - firewallSettings + firewallSettings, ); }, }); @@ -335,7 +335,7 @@ export const useMutateFirewall = (id: number) => { // Update the firewall in the store queryClient.setQueryData( firewallQueries.firewall(firewall.id).queryKey, - firewall + firewall, ); // Invalidate firewall lists @@ -359,7 +359,7 @@ export const useCreateFirewall = () => { // Set the firewall in the store queryClient.setQueryData( firewallQueries.firewall(firewall.id).queryKey, - firewall + firewall, ); // If a restricted user creates an entity, we must make sure grants are up to date. @@ -418,7 +418,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { return undefined; } return { ...oldData, rules: updatedRules }; - } + }, ); // Update the Firewall object in the paginated store @@ -430,7 +430,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { } const indexOfFirewall = page.data.findIndex( - (firewall) => firewall.id === firewallId + (firewall) => firewall.id === firewallId, ); // If the firewall does not exist on this page, don't change anything @@ -447,7 +447,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { rules: updatedRules, }; return { ...page, data: newData }; - } + }, ); // Update the the Firewall object in the "all firewalls" store @@ -459,7 +459,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { } const indexOfFirewall = firewalls.findIndex( - (firewall) => firewall.id === firewallId + (firewall) => firewall.id === firewallId, ); // If the firewall does not exist in the list, don't do anything @@ -477,7 +477,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { }; return newFirewalls; - } + }, ); }, }); @@ -494,6 +494,12 @@ export const firewallEventsHandler = ({ } switch (event.action) { + case 'firewall_create': + // Invalidate firewall lists + invalidateQueries({ + queryKey: firewallQueries.firewalls.queryKey, + }); + break; case 'firewall_delete': // Invalidate firewall lists invalidateQueries({ @@ -504,12 +510,9 @@ export const firewallEventsHandler = ({ queryClient.removeQueries({ queryKey: firewallQueries.firewall(event.entity.id).queryKey, }); - case 'firewall_create': - // Invalidate firewall lists - invalidateQueries({ - queryKey: firewallQueries.firewalls.queryKey, - }); + break; case 'firewall_device_add': + break; case 'firewall_device_remove': // For a firewall device event, the primary entity is the fireall and // the secondary entity is the device that is added/removed @@ -542,6 +545,7 @@ export const firewallEventsHandler = ({ invalidateQueries({ queryKey: firewallQueries.firewalls.queryKey, }); + break; case 'firewall_disable': case 'firewall_enable': case 'firewall_rules_update': diff --git a/packages/queries/src/nodebalancers/nodebalancers.ts b/packages/queries/src/nodebalancers/nodebalancers.ts index 580d517f6f5..c3d6085c548 100644 --- a/packages/queries/src/nodebalancers/nodebalancers.ts +++ b/packages/queries/src/nodebalancers/nodebalancers.ts @@ -44,17 +44,17 @@ import type { const getAllNodeBalancerTypes = () => getAll((params) => getNodeBalancerTypes(params))().then( - (results) => results.data + (results) => results.data, ); export const getAllNodeBalancerConfigs = (id: number) => getAll((params) => - getNodeBalancerConfigs(id, params) + getNodeBalancerConfigs(id, params), )().then((data) => data.data); export const getAllNodeBalancers = () => getAll((params) => getNodeBalancers(params))().then( - (data) => data.data + (data) => data.data, ); export const nodebalancerQueries = createQueryKeys('nodebalancers', { @@ -91,7 +91,7 @@ export const nodebalancerQueries = createQueryKeys('nodebalancers', { queryFn: ({ pageParam }) => getNodeBalancers( { page: pageParam as number, page_size: 25 }, - filter + filter, ), queryKey: [filter], }), @@ -125,7 +125,7 @@ export const useNodeBalancersQuery = (params: Params, filter: Filter) => export const useNodeBalancerQuery = ( id: number, enabled = true, - isUsingBetaEndpoint = false + isUsingBetaEndpoint = false, ) => { return useQuery({ ...nodebalancerQueries @@ -147,7 +147,7 @@ export const useNodebalancerUpdateMutation = (id: number) => { // Update the NodeBalancer store queryClient.setQueryData( nodebalancerQueries.nodebalancer(id).queryKey, - nodebalancer + nodebalancer, ); }, }); @@ -182,7 +182,7 @@ export const useNodebalancerCreateMutation = () => { // Prime the cache for this specific NodeBalancer queryClient.setQueryData( nodebalancerQueries.nodebalancer(nodebalancer.id).queryKey, - nodebalancer + nodebalancer, ); // If a restricted user creates an entity, we must make sure grants are up to date. queryClient.invalidateQueries({ @@ -219,7 +219,7 @@ export const useNodebalancerConfigCreateMutation = (id: number) => { return [config]; } return [...previousData, config]; - } + }, ); }, }); @@ -249,7 +249,7 @@ export const useNodebalancerConfigUpdateMutation = (nodebalancerId: number) => { return [config]; } const indexOfConfig = previousData.findIndex( - (c) => c.id === config.id + (c) => c.id === config.id, ); if (indexOfConfig === -1) { return [...previousData, config]; @@ -257,7 +257,7 @@ export const useNodebalancerConfigUpdateMutation = (nodebalancerId: number) => { const newConfigs = [...previousData]; newConfigs[indexOfConfig] = config; return newConfigs; - } + }, ); }, }); @@ -274,9 +274,9 @@ export const useNodebalancerConfigDeleteMutation = (nodebalancerId: number) => { .queryKey, (oldData) => { return (oldData ?? []).filter( - (config) => config.id !== vars.configId + (config) => config.id !== vars.configId, ); - } + }, ); }, }); @@ -297,7 +297,7 @@ export const useAllNodeBalancersQuery = (enabled = true) => export const useInfiniteNodebalancersQuery = ( filter: Filter, - enabled: boolean + enabled: boolean, ) => useInfiniteQuery, APIError[]>({ ...nodebalancerQueries.nodebalancers._ctx.infinite(filter), @@ -314,7 +314,7 @@ export const useInfiniteNodebalancersQuery = ( export const useNodeBalancersFirewallsQuery = (nodebalancerId: number) => useQuery, APIError[]>( - nodebalancerQueries.nodebalancer(nodebalancerId)._ctx.firewalls + nodebalancerQueries.nodebalancer(nodebalancerId)._ctx.firewalls, ); export const useNodeBalancerTypesQuery = () => @@ -342,8 +342,9 @@ export const nodebalancerEventHandler = ({ if (event.action.startsWith('nodebalancer_config')) { // If the event is about a NodeBalancer's configs, just invalidate the configs invalidateQueries({ - queryKey: nodebalancerQueries.nodebalancer(nodebalancerId)._ctx - .configurations.queryKey, + queryKey: + nodebalancerQueries.nodebalancer(nodebalancerId)._ctx.configurations + .queryKey, }); } else { // If we've made it here, the event is about a NodeBalancer diff --git a/packages/shared/.changeset/pr-11941-tech-stories-1743701490436.md b/packages/shared/.changeset/pr-11941-tech-stories-1743701490436.md new file mode 100644 index 00000000000..532a65b84d4 --- /dev/null +++ b/packages/shared/.changeset/pr-11941-tech-stories-1743701490436.md @@ -0,0 +1,5 @@ +--- +"@linode/shared": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/shared/.eslintrc.json b/packages/shared/.eslintrc.json deleted file mode 100644 index b8f8c62e03a..00000000000 --- a/packages/shared/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - // Temporarily extending ESLint config from linode/manager as the base config. - // @todo: modularization - Replace the path with the base shared ESLint config once available. - "extends": ["../manager/.eslintrc.cjs"] -} diff --git a/packages/shared/eslint.config.js b/packages/shared/eslint.config.js new file mode 100644 index 00000000000..8818da48db2 --- /dev/null +++ b/packages/shared/eslint.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { baseConfig } from '../manager/eslint.config.js'; + +export default defineConfig({ + extends: baseConfig, +}); diff --git a/packages/shared/package.json b/packages/shared/package.json index b0875312b6d..1a81f4de63f 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -7,6 +7,7 @@ "types": "src/index.ts", "author": "Linode", "license": "Apache-2.0", + "type": "module", "repository": { "type": "git", "url": "https://github.com/linode/manager/tree/develop/packages/shared" @@ -40,7 +41,6 @@ "react-dom": "^18.2.0" }, "devDependencies": { - "@linode/eslint-plugin-cloud-manager": "^0.0.10", "@storybook/addon-actions": "^8.6.7", "@storybook/react": "^8.6.7", "@testing-library/dom": "^10.1.0", @@ -49,24 +49,6 @@ "@testing-library/user-event": "^14.5.2", "@types/react": "^18.2.55", "@types/react-dom": "^18.2.18", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^7.1.0", - "eslint-config-prettier": "~8.1.0", - "eslint-plugin-cypress": "^2.11.3", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-perfectionist": "^1.4.0", - "eslint-plugin-prettier": "~3.3.1", - "eslint-plugin-ramda": "^2.5.1", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-hooks": "^3.0.0", - "eslint-plugin-react-refresh": "^0.4.13", - "eslint-plugin-scanjs-rules": "^0.2.1", - "eslint-plugin-sonarjs": "^0.5.0", - "eslint-plugin-testing-library": "^3.1.2", - "eslint-plugin-xss": "^0.1.10", - "lint-staged": "^15.2.9", - "prettier": "~2.2.1", "vite-plugin-svgr": "^3.2.0" } } diff --git a/packages/shared/src/utilities/wrap.tsx b/packages/shared/src/utilities/wrap.tsx index 4893cdafa9f..672af1b58da 100644 --- a/packages/shared/src/utilities/wrap.tsx +++ b/packages/shared/src/utilities/wrap.tsx @@ -1,4 +1,3 @@ -/* eslint-disable react-refresh/only-export-components */ import { queryClientFactory } from '@linode/queries'; import { QueryClientProvider } from '@tanstack/react-query'; import { render } from '@testing-library/react'; @@ -10,12 +9,12 @@ type Wrapper = (ui: React.ReactNode) => React.ReactNode; export const wrap = ( ui: React.ReactNode, - wrappers: Wrapper[] + wrappers: Wrapper[], ): React.ReactNode => wrappers.reduce((prev, wrapper) => wrapper(prev), ui); export const renderWithWrappers = ( ui: React.ReactNode, - wrappers: Wrapper[] + wrappers: Wrapper[], ): RenderResult => { const renderResult = render(wrap(ui, wrappers)); return { @@ -24,6 +23,8 @@ export const renderWithWrappers = ( }; }; -export const QueryClientWrapper = (queryClient = queryClientFactory()) => ( - ui: React.ReactNode -) => {ui}; +export const QueryClientWrapper = + (queryClient = queryClientFactory()) => + (ui: React.ReactNode) => ( + {ui} + ); diff --git a/packages/ui/.changeset/pr-11941-tech-stories-1743701371905.md b/packages/ui/.changeset/pr-11941-tech-stories-1743701371905.md new file mode 100644 index 00000000000..d72d57ef0af --- /dev/null +++ b/packages/ui/.changeset/pr-11941-tech-stories-1743701371905.md @@ -0,0 +1,5 @@ +--- +"@linode/ui": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/ui/.eslintrc.json b/packages/ui/.eslintrc.json deleted file mode 100644 index b8f8c62e03a..00000000000 --- a/packages/ui/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - // Temporarily extending ESLint config from linode/manager as the base config. - // @todo: modularization - Replace the path with the base shared ESLint config once available. - "extends": ["../manager/.eslintrc.cjs"] -} diff --git a/packages/ui/eslint.config.js b/packages/ui/eslint.config.js new file mode 100644 index 00000000000..8818da48db2 --- /dev/null +++ b/packages/ui/eslint.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { baseConfig } from '../manager/eslint.config.js'; + +export default defineConfig({ + extends: baseConfig, +}); diff --git a/packages/ui/package.json b/packages/ui/package.json index 2397152b70b..c29211ba17f 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -45,7 +45,6 @@ ] }, "devDependencies": { - "@linode/eslint-plugin-cloud-manager": "^0.0.10", "@storybook/addon-actions": "^8.6.7", "@storybook/preview-api": "^8.6.7", "@storybook/react": "^8.6.7", @@ -56,13 +55,6 @@ "@types/luxon": "3.4.2", "@types/react": "^18.2.55", "@types/react-dom": "^18.2.18", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^7.1.0", - "eslint-config-prettier": "~8.1.0", - "eslint-plugin-prettier": "~3.3.1", - "eslint-plugin-sonarjs": "^0.5.0", - "prettier": "~2.2.1", "vite-plugin-svgr": "^3.2.0" } } diff --git a/packages/ui/src/components/TooltipIcon/TooltipIcon.tsx b/packages/ui/src/components/TooltipIcon/TooltipIcon.tsx index 07bdecff490..c757d379c65 100644 --- a/packages/ui/src/components/TooltipIcon/TooltipIcon.tsx +++ b/packages/ui/src/components/TooltipIcon/TooltipIcon.tsx @@ -108,7 +108,7 @@ export const TooltipIcon = (props: TooltipIconProps) => { } }; - let renderIcon: JSX.Element | null = null; + let renderIcon: JSX.Element | null; const sxRootStyle = { '&&': { @@ -127,24 +127,24 @@ export const TooltipIcon = (props: TooltipIconProps) => { }; switch (status) { - case 'success': - renderIcon = ; - break; case 'error': renderIcon = ; break; - case 'warning': - renderIcon = ; + case 'help': + renderIcon = ; break; case 'info': renderIcon = ; break; - case 'help': - renderIcon = ; - break; case 'other': renderIcon = icon ?? null; break; + case 'success': + renderIcon = ; + break; + case 'warning': + renderIcon = ; + break; default: renderIcon = null; } @@ -164,12 +164,12 @@ export const TooltipIcon = (props: TooltipIconProps) => { width={width} > { // This prevents unwanted behavior when clicking a tooltip icon. // See https://github.com/linode/manager/pull/10331#pullrequestreview-1971338778 e.stopPropagation(); }} - data-qa-help-button size="large" sx={sxTooltipIcon} > @@ -186,7 +186,7 @@ const StyledTooltip = styled( { label: 'StyledTooltip', shouldForwardProp: omittedProps(['width']), - } + }, )` & .${tooltipClasses.tooltip} { max-width: ${(props) => (props.width ? props.width + 'px' : undefined)}; diff --git a/packages/ui/src/utilities/stringUtils.ts b/packages/ui/src/utilities/stringUtils.ts index 67aaeab9a7a..7af10566fd0 100644 --- a/packages/ui/src/utilities/stringUtils.ts +++ b/packages/ui/src/utilities/stringUtils.ts @@ -1,6 +1,9 @@ export const convertForAria = (str: string) => { - return str - .trim() - .toLowerCase() - .replace(/([^A-Z0-9]+)(.)/gi, (match, p1, p2) => p2.toUpperCase()); + return ( + str + .trim() + .toLowerCase() + // eslint-disable-next-line sonarjs/slow-regex + .replace(/([^A-Z0-9]+)(.)/gi, (match, p1, p2) => p2.toUpperCase()) + ); }; diff --git a/packages/utilities/.changeset/pr-11941-tech-stories-1743701383002.md b/packages/utilities/.changeset/pr-11941-tech-stories-1743701383002.md new file mode 100644 index 00000000000..b3ac279d913 --- /dev/null +++ b/packages/utilities/.changeset/pr-11941-tech-stories-1743701383002.md @@ -0,0 +1,5 @@ +--- +"@linode/utilities": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/utilities/.eslintrc.json b/packages/utilities/.eslintrc.json deleted file mode 100644 index b8f8c62e03a..00000000000 --- a/packages/utilities/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - // Temporarily extending ESLint config from linode/manager as the base config. - // @todo: modularization - Replace the path with the base shared ESLint config once available. - "extends": ["../manager/.eslintrc.cjs"] -} diff --git a/packages/utilities/eslint.config.js b/packages/utilities/eslint.config.js new file mode 100644 index 00000000000..8818da48db2 --- /dev/null +++ b/packages/utilities/eslint.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { baseConfig } from '../manager/eslint.config.js'; + +export default defineConfig({ + extends: baseConfig, +}); diff --git a/packages/utilities/package.json b/packages/utilities/package.json index 4822500cfcb..43c9d13292e 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -7,6 +7,7 @@ "types": "src/index.ts", "author": "Linode", "license": "Apache-2.0", + "type": "module", "repository": { "type": "git", "url": "https://github.com/linode/manager/tree/develop/packages/utilities" @@ -38,7 +39,6 @@ "react-dom": "^18.2.0" }, "devDependencies": { - "@linode/eslint-plugin-cloud-manager": "^0.0.10", "@testing-library/dom": "^10.1.0", "@testing-library/jest-dom": "~6.4.2", "@testing-library/react": "~16.0.0", @@ -46,13 +46,6 @@ "@types/ramda": "0.25.16", "@types/react": "^18.2.55", "@types/react-dom": "^18.2.18", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "eslint": "^7.1.0", - "eslint-config-prettier": "~8.1.0", - "eslint-plugin-prettier": "~3.3.1", - "eslint-plugin-sonarjs": "^0.5.0", - "factory.ts": "^0.5.1", - "prettier": "~2.2.1" + "factory.ts": "^0.5.1" } } diff --git a/packages/utilities/src/factories/profile.ts b/packages/utilities/src/factories/profile.ts index 1aa5aaf5607..fafd4c540ab 100644 --- a/packages/utilities/src/factories/profile.ts +++ b/packages/utilities/src/factories/profile.ts @@ -31,8 +31,8 @@ export const profileFactory = Factory.Sync.makeFactory({ verified_phone_number: '+15555555555', }); -export const securityQuestionsFactory = Factory.Sync.makeFactory( - { +export const securityQuestionsFactory = + Factory.Sync.makeFactory({ security_questions: [ { id: 1, question: 'In what city were you born?', response: null }, { @@ -127,8 +127,7 @@ export const securityQuestionsFactory = Factory.Sync.makeFactory( { @@ -150,7 +149,7 @@ export const userPreferencesFactory = Factory.Sync.makeFactory( }, theme: 'light', type_to_confirm: true, - } + }, ); export const sshKeyFactory = Factory.Sync.makeFactory({ diff --git a/packages/utilities/src/helpers/accessibility.ts b/packages/utilities/src/helpers/accessibility.ts index 66055695386..acb4aa202a2 100644 --- a/packages/utilities/src/helpers/accessibility.ts +++ b/packages/utilities/src/helpers/accessibility.ts @@ -4,6 +4,7 @@ */ export const srSpeak = (text: string, priority: 'assertive' | 'polite') => { const el = document.createElement('div'); + // eslint-disable-next-line sonarjs/pseudo-random const id = 'speak-' + Math.random().toString(36).substr(2, 9); el.setAttribute('id', id); el.setAttribute('aria-live', priority || 'polite'); diff --git a/packages/utilities/src/helpers/formatStorageUnits.ts b/packages/utilities/src/helpers/formatStorageUnits.ts index 5208381d2d5..a17d86ea45b 100644 --- a/packages/utilities/src/helpers/formatStorageUnits.ts +++ b/packages/utilities/src/helpers/formatStorageUnits.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line sonarjs/single-char-in-character-classes const storageRegex = /([0-9])([kMGTPEZY]?i?[B])/; const labelPrefixRegex = /^(DBaaS).+- /; diff --git a/packages/utilities/src/helpers/getUserTimezone.test.ts b/packages/utilities/src/helpers/getUserTimezone.test.ts index 4713958d419..694f8ad6be0 100644 --- a/packages/utilities/src/helpers/getUserTimezone.test.ts +++ b/packages/utilities/src/helpers/getUserTimezone.test.ts @@ -21,19 +21,19 @@ describe('getUserTimezone', () => { it('should handle an empty string timezone', () => { setMockProfileTimezone(''); expect(getUserTimezone(mockProfile.timezone)).toBe( - DateTime.local().zoneName + DateTime.local().zoneName, ); }); it('should handle a null timezone', () => { setMockProfileTimezone(null); expect(getUserTimezone(mockProfile.timezone)).toBe( - DateTime.local().zoneName + DateTime.local().zoneName, ); }); it('should handle an undefined timezone', () => { setMockProfileTimezone(undefined); expect(getUserTimezone(mockProfile.timezone)).toBe( - DateTime.local().zoneName + DateTime.local().zoneName, ); }); }); diff --git a/packages/utilities/src/helpers/random.ts b/packages/utilities/src/helpers/random.ts index f21149ad513..67e8aafa653 100644 --- a/packages/utilities/src/helpers/random.ts +++ b/packages/utilities/src/helpers/random.ts @@ -4,6 +4,7 @@ * @returns {T} an element of the given type */ export const pickRandom = (items: T[]): T => { + // eslint-disable-next-line sonarjs/pseudo-random return items[Math.floor(Math.random() * items.length)]; }; @@ -15,6 +16,7 @@ export const pickRandom = (items: T[]): T => { */ export const randomDate = ( start: Date = new Date(), - end: Date = new Date(2021, 10, 25) + end: Date = new Date(2021, 10, 25), ) => + // eslint-disable-next-line sonarjs/pseudo-random new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); diff --git a/packages/validation/.changeset/pr-11941-tech-stories-1743701398312.md b/packages/validation/.changeset/pr-11941-tech-stories-1743701398312.md new file mode 100644 index 00000000000..b6320562f4b --- /dev/null +++ b/packages/validation/.changeset/pr-11941-tech-stories-1743701398312.md @@ -0,0 +1,5 @@ +--- +"@linode/validation": Tech Stories +--- + +Eslint Overhaul ([#11941](https://github.com/linode/manager/pull/11941)) diff --git a/packages/validation/.eslintrc.json b/packages/validation/.eslintrc.json deleted file mode 100644 index d82f136b975..00000000000 --- a/packages/validation/.eslintrc.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "ignorePatterns": ["node_modules", "lib", "index.js", "!.eslintrc.js"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2020, - "warnOnUnsupportedTypeScriptVersion": true - }, - "plugins": ["@typescript-eslint", "sonarjs", "prettier"], - "extends": [ - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:sonarjs/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "no-unused-vars": [ - "warn", - { - "argsIgnorePattern": "^_" - } - ], - "no-unused-expressions": "warn", - "no-bitwise": "error", - "no-caller": "error", - "no-eval": "error", - "no-throw-literal": "warn", - "no-loop-func": "error", - "no-await-in-loop": "error", - "array-callback-return": "error", - "no-invalid-this": "off", - "no-new-wrappers": "error", - "no-restricted-imports": ["error", "rxjs"], - "no-console": "error", - "no-undef-init": "off", - "radix": "error", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-namespace": "warn", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-empty-interface": "warn", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/interface-name-prefix": "off", - "sonarjs/cognitive-complexity": "warn", - "sonarjs/no-duplicate-string": "warn", - "sonarjs/prefer-immediate-return": "warn", - "sonarjs/no-identical-functions": "warn", - "sonarjs/no-redundant-jump": "warn", - "sonarjs/no-small-switch": "warn", - "no-multiple-empty-lines": "error", - "curly": "warn", - "sort-keys": "off", - "comma-dangle": "off", - "no-trailing-spaces": "warn", - "no-mixed-requires": "warn", - "spaced-comment": "warn", - "object-shorthand": "warn", - "prettier/prettier": "warn" - } -} diff --git a/packages/validation/eslint.config.js b/packages/validation/eslint.config.js new file mode 100644 index 00000000000..8818da48db2 --- /dev/null +++ b/packages/validation/eslint.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { baseConfig } from '../manager/eslint.config.js'; + +export default defineConfig({ + extends: baseConfig, +}); diff --git a/packages/validation/package.json b/packages/validation/package.json index bf51a614846..dbf242ceed4 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -42,9 +42,6 @@ }, "devDependencies": { "concurrently": "^9.0.1", - "eslint": "^6.8.0", - "eslint-plugin-sonarjs": "^0.5.0", - "prettier": "~2.2.1", "tsup": "^8.4.0" }, "keywords": [ diff --git a/packages/validation/src/domains.schema.ts b/packages/validation/src/domains.schema.ts index 4e0e7d1f29b..206b5e96a7b 100644 --- a/packages/validation/src/domains.schema.ts +++ b/packages/validation/src/domains.schema.ts @@ -7,8 +7,9 @@ export const importZoneSchema = object({ const domainSchemaBase = object().shape({ domain: string().matches( + // eslint-disable-next-line sonarjs/slow-regex /([a-zA-Z0-9-_]+\.)+([a-zA-Z]{2,3}\.)?([a-zA-Z]{2,16}|XN--[a-zA-Z0-9]+)/, - 'Domain is not valid.' + 'Domain is not valid.', ), status: mixed().oneOf(['disabled', 'active', 'edit_mode', 'has_errors']), tags: array(), @@ -29,8 +30,9 @@ export const createDomainSchema = domainSchemaBase.shape({ domain: string() .required('Domain is required.') .matches( + // eslint-disable-next-line sonarjs/slow-regex /([a-zA-Z0-9-_]+\.)+([a-zA-Z]{2,3}\.)?([a-zA-Z]{2,16}|XN--[a-zA-Z0-9]+)/, - 'Domain is not valid.' + 'Domain is not valid.', ), tags: array().of(string()), type: mixed().required().oneOf(['master', 'slave']), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 626c42f845a..d711ebe6295 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,24 +15,78 @@ importers: .: devDependencies: + '@eslint/js': + specifier: ^9.23.0 + version: 9.23.0 + '@linode/eslint-plugin-cloud-manager': + specifier: ^0.0.10 + version: 0.0.10(eslint@9.23.0(jiti@2.4.2)) + '@typescript-eslint/eslint-plugin': + specifier: ^8.29.0 + version: 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^8.29.0 + version: 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) '@vitest/ui': specifier: ^3.0.7 version: 3.0.7(vitest@3.0.7) concurrently: specifier: 9.1.0 version: 9.1.0 + eslint: + specifier: ^9.23.0 + version: 9.23.0(jiti@2.4.2) + eslint-config-prettier: + specifier: ^10.1.1 + version: 10.1.1(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-cypress: + specifier: ^4.2.0 + version: 4.2.0(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: + specifier: ^6.10.2 + version: 6.10.2(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-perfectionist: + specifier: ^4.10.1 + version: 4.10.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + eslint-plugin-prettier: + specifier: ~5.2.6 + version: 5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.1(eslint@9.23.0(jiti@2.4.2)))(eslint@9.23.0(jiti@2.4.2))(prettier@3.5.3) + eslint-plugin-react: + specifier: ^7.37.4 + version: 7.37.4(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-sonarjs: + specifier: ^3.0.2 + version: 3.0.2(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-testing-library: + specifier: ^7.1.1 + version: 7.1.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + eslint-plugin-xss: + specifier: ^0.1.12 + version: 0.1.12 husky: specifier: ^9.1.6 version: 9.1.7 + jiti: + specifier: ^2.4.2 + version: 2.4.2 lint-staged: specifier: ^15.4.3 version: 15.4.3 + prettier: + specifier: ~3.5.3 + version: 3.5.3 typescript: specifier: ^5.7.3 version: 5.7.3 + typescript-eslint: + specifier: ^8.29.0 + version: 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) vitest: specifier: ^3.0.7 - version: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@1.21.6)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + version: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) packages/api-v4: dependencies: @@ -55,18 +109,9 @@ importers: concurrently: specifier: ^9.0.1 version: 9.1.0 - eslint: - specifier: ^6.8.0 - version: 6.8.0 - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@6.8.0) - prettier: - specifier: ~2.2.1 - version: 2.2.1 tsup: specifier: ^8.4.0 - version: 8.4.0(@swc/core@1.10.11)(jiti@1.21.6)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.6.1) + version: 8.4.0(@swc/core@1.10.11)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.6.1) packages/manager: dependencies: @@ -308,51 +353,48 @@ importers: '@4tw/cypress-drag-drop': specifier: ^2.3.0 version: 2.3.0(cypress@14.0.1) - '@linode/eslint-plugin-cloud-manager': - specifier: ^0.0.10 - version: 0.0.10(eslint@7.32.0) '@storybook/addon-a11y': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-actions': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-controls': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-docs': specifier: ^8.6.7 - version: 8.6.9(@types/react@18.3.12)(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(@types/react@18.3.12)(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-mdx-gfm': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-measure': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-storysource': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/addon-viewport': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/blocks': specifier: ^8.6.7 - version: 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3)) '@storybook/manager-api': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/preview-api': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/react': specifier: ^8.6.7 - version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3) + version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3) '@storybook/react-vite': specifier: ^8.6.7 - version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) '@storybook/theming': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@swc/core': specifier: ^1.10.9 version: 1.10.11 @@ -383,6 +425,9 @@ importers: '@types/css-mediaquery': specifier: ^0.1.1 version: 0.1.4 + '@types/eslint-plugin-jsx-a11y': + specifier: ^6.10.0 + version: 6.10.0 '@types/he': specifier: ^1.1.0 version: 1.2.3 @@ -446,15 +491,9 @@ importers: '@types/zxcvbn': specifier: ^4.4.0 version: 4.4.5 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3))(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@7.32.0)(typescript@5.7.3) '@vitejs/plugin-react-swc': specifier: ^3.7.2 - version: 3.7.2(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + version: 3.7.2(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) '@vitest/coverage-v8': specifier: ^3.0.7 version: 3.0.7(vitest@3.0.7) @@ -493,58 +532,19 @@ importers: version: 1.14.0(cypress@14.0.1) cypress-vite: specifier: ^1.6.0 - version: 1.6.0(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + version: 1.6.0(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) dotenv: specifier: ^16.0.3 version: 16.4.5 - eslint: - specifier: ^7.1.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ~8.1.0 - version: 8.1.0(eslint@7.32.0) - eslint-plugin-cypress: - specifier: ^2.11.3 - version: 2.15.2(eslint@7.32.0) - eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.10.2(eslint@7.32.0) - eslint-plugin-perfectionist: - specifier: ^1.4.0 - version: 1.5.1(eslint@7.32.0)(typescript@5.7.3) - eslint-plugin-prettier: - specifier: ~3.3.1 - version: 3.3.1(eslint-config-prettier@8.1.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.2.1) - eslint-plugin-ramda: - specifier: ^2.5.1 - version: 2.5.1 - eslint-plugin-react: - specifier: ^7.19.0 - version: 7.37.2(eslint@7.32.0) - eslint-plugin-react-hooks: - specifier: ^3.0.0 - version: 3.0.0(eslint@7.32.0) - eslint-plugin-react-refresh: - specifier: 0.4.13 - version: 0.4.13(eslint@7.32.0) - eslint-plugin-scanjs-rules: - specifier: ^0.2.1 - version: 0.2.1 - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@7.32.0) - eslint-plugin-testing-library: - specifier: ^3.1.2 - version: 3.10.2(eslint@7.32.0)(typescript@5.7.3) - eslint-plugin-xss: - specifier: ^0.1.10 - version: 0.1.12 factory.ts: specifier: ^0.5.1 version: 0.5.2 glob: specifier: ^10.3.1 version: 10.4.5 + globals: + specifier: ^16.0.0 + version: 16.0.0 history: specifier: '4' version: 4.10.1 @@ -560,24 +560,21 @@ importers: pdfreader: specifier: ^3.0.7 version: 3.0.7 - prettier: - specifier: ~2.2.1 - version: 2.2.1 redux-mock-store: specifier: ^1.5.3 version: 1.5.5(redux@4.2.1) storybook: specifier: ^8.6.7 - version: 8.6.9(prettier@2.2.1) + version: 8.6.9(prettier@3.5.3) storybook-dark-mode: specifier: 4.0.1 - version: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1)) + version: 4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3)) vite: specifier: ^6.2.5 - version: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + version: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) vite-plugin-svgr: specifier: ^3.2.0 - version: 3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + version: 3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) packages/queries: dependencies: @@ -600,9 +597,6 @@ importers: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) devDependencies: - '@linode/eslint-plugin-cloud-manager': - specifier: ^0.0.10 - version: 0.0.10(eslint@7.32.0) '@testing-library/dom': specifier: ^10.1.0 version: 10.4.0 @@ -618,60 +612,6 @@ importers: '@types/react-dom': specifier: ^18.2.18 version: 18.3.1 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3))(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@7.32.0)(typescript@5.7.3) - eslint: - specifier: ^7.1.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ~8.1.0 - version: 8.1.0(eslint@7.32.0) - eslint-plugin-cypress: - specifier: ^2.11.3 - version: 2.15.2(eslint@7.32.0) - eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.10.2(eslint@7.32.0) - eslint-plugin-perfectionist: - specifier: ^1.4.0 - version: 1.5.1(eslint@7.32.0)(typescript@5.7.3) - eslint-plugin-prettier: - specifier: ~3.3.1 - version: 3.3.1(eslint-config-prettier@8.1.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.2.1) - eslint-plugin-ramda: - specifier: ^2.5.1 - version: 2.5.1 - eslint-plugin-react: - specifier: ^7.19.0 - version: 7.37.2(eslint@7.32.0) - eslint-plugin-react-hooks: - specifier: ^3.0.0 - version: 3.0.0(eslint@7.32.0) - eslint-plugin-react-refresh: - specifier: ^0.4.13 - version: 0.4.13(eslint@7.32.0) - eslint-plugin-scanjs-rules: - specifier: ^0.2.1 - version: 0.2.1 - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@7.32.0) - eslint-plugin-testing-library: - specifier: ^3.1.2 - version: 3.10.2(eslint@7.32.0)(typescript@5.7.3) - eslint-plugin-xss: - specifier: ^0.1.10 - version: 0.1.12 - lint-staged: - specifier: ^15.2.9 - version: 15.4.3 - prettier: - specifier: ~2.2.1 - version: 2.2.1 packages/search: dependencies: @@ -683,7 +623,7 @@ importers: version: 4.2.0 vite: specifier: ^6.2.5 - version: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + version: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) packages/shared: dependencies: @@ -712,15 +652,12 @@ importers: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) devDependencies: - '@linode/eslint-plugin-cloud-manager': - specifier: ^0.0.10 - version: 0.0.10(eslint@7.32.0) '@storybook/addon-actions': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/react': specifier: ^8.6.7 - version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3) + version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3) '@testing-library/dom': specifier: ^10.1.0 version: 10.4.0 @@ -739,63 +676,9 @@ importers: '@types/react-dom': specifier: ^18.2.18 version: 18.3.1 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3))(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@7.32.0)(typescript@5.7.3) - eslint: - specifier: ^7.1.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ~8.1.0 - version: 8.1.0(eslint@7.32.0) - eslint-plugin-cypress: - specifier: ^2.11.3 - version: 2.15.2(eslint@7.32.0) - eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.10.2(eslint@7.32.0) - eslint-plugin-perfectionist: - specifier: ^1.4.0 - version: 1.5.1(eslint@7.32.0)(typescript@5.7.3) - eslint-plugin-prettier: - specifier: ~3.3.1 - version: 3.3.1(eslint-config-prettier@8.1.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.2.1) - eslint-plugin-ramda: - specifier: ^2.5.1 - version: 2.5.1 - eslint-plugin-react: - specifier: ^7.19.0 - version: 7.37.2(eslint@7.32.0) - eslint-plugin-react-hooks: - specifier: ^3.0.0 - version: 3.0.0(eslint@7.32.0) - eslint-plugin-react-refresh: - specifier: ^0.4.13 - version: 0.4.13(eslint@7.32.0) - eslint-plugin-scanjs-rules: - specifier: ^0.2.1 - version: 0.2.1 - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@7.32.0) - eslint-plugin-testing-library: - specifier: ^3.1.2 - version: 3.10.2(eslint@7.32.0)(typescript@5.7.3) - eslint-plugin-xss: - specifier: ^0.1.10 - version: 0.1.12 - lint-staged: - specifier: ^15.2.9 - version: 15.4.3 - prettier: - specifier: ~2.2.1 - version: 2.2.1 vite-plugin-svgr: specifier: ^3.2.0 - version: 3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + version: 3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) packages/ui: dependencies: @@ -833,18 +716,15 @@ importers: specifier: ^4.8.2 version: 4.9.13(@emotion/react@11.13.5(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.4.5(@emotion/react@11.13.5(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) devDependencies: - '@linode/eslint-plugin-cloud-manager': - specifier: ^0.0.10 - version: 0.0.10(eslint@7.32.0) '@storybook/addon-actions': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/preview-api': specifier: ^8.6.7 - version: 8.6.9(storybook@8.6.9(prettier@2.2.1)) + version: 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/react': specifier: ^8.6.7 - version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3) + version: 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3) '@testing-library/dom': specifier: ^10.1.0 version: 10.4.0 @@ -866,30 +746,9 @@ importers: '@types/react-dom': specifier: ^18.2.18 version: 18.3.1 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3))(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@7.32.0)(typescript@5.7.3) - eslint: - specifier: ^7.1.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ~8.1.0 - version: 8.1.0(eslint@7.32.0) - eslint-plugin-prettier: - specifier: ~3.3.1 - version: 3.3.1(eslint-config-prettier@8.1.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.2.1) - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@7.32.0) - prettier: - specifier: ~2.2.1 - version: 2.2.1 vite-plugin-svgr: specifier: ^3.2.0 - version: 3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + version: 3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) packages/utilities: dependencies: @@ -909,9 +768,6 @@ importers: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) devDependencies: - '@linode/eslint-plugin-cloud-manager': - specifier: ^0.0.10 - version: 0.0.10(eslint@7.32.0) '@testing-library/dom': specifier: ^10.1.0 version: 10.4.0 @@ -933,30 +789,9 @@ importers: '@types/react-dom': specifier: ^18.2.18 version: 18.3.1 - '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3))(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@7.32.0)(typescript@5.7.3) - eslint: - specifier: ^7.1.0 - version: 7.32.0 - eslint-config-prettier: - specifier: ~8.1.0 - version: 8.1.0(eslint@7.32.0) - eslint-plugin-prettier: - specifier: ~3.3.1 - version: 3.3.1(eslint-config-prettier@8.1.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.2.1) - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@7.32.0) factory.ts: specifier: ^0.5.1 version: 0.5.2 - prettier: - specifier: ~2.2.1 - version: 2.2.1 packages/validation: dependencies: @@ -973,18 +808,9 @@ importers: concurrently: specifier: ^9.0.1 version: 9.1.0 - eslint: - specifier: ^6.8.0 - version: 6.8.0 - eslint-plugin-sonarjs: - specifier: ^0.5.0 - version: 0.5.0(eslint@6.8.0) - prettier: - specifier: ~2.2.1 - version: 2.2.1 tsup: specifier: ^8.4.0 - version: 8.4.0(@swc/core@1.10.11)(jiti@1.21.6)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.6.1) + version: 8.4.0(@swc/core@1.10.11)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.6.1) scripts: devDependencies: @@ -1075,9 +901,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.12.11': - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -1124,10 +947,6 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.25.9': - resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.26.2': resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} @@ -1599,9 +1418,33 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@0.4.3': - resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} - engines: {node: ^10.12.0 || >=12.0.0} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.0': + resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.23.0': + resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fontsource/fira-code@5.1.1': resolution: {integrity: sha512-w9b1CtWyfdyZP2Y/j7Z86SNYtLXMZ4yGtxrtw0qejjrGuzoasEoMhgdLJOwX9exrpKRVFaecKjcAuWkvmvOITw==} @@ -1614,14 +1457,25 @@ packages: peerDependencies: react-hook-form: ^7.0.0 - '@humanwhocodes/config-array@0.5.0': - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - 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.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} '@inquirer/checkbox@4.0.3': resolution: {integrity: sha512-CEt9B4e8zFOGtc/LYeQx5m8nfqQeG/4oNNv0PUvXGG0mys+wR/WbJ3B4KfSQ4Fcr3AQfpiuFOi3fVvmPfvNbxw==} @@ -1967,6 +1821,10 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.2.0': + resolution: {integrity: sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -2727,6 +2585,12 @@ packages: '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/eslint-plugin-jsx-a11y@6.10.0': + resolution: {integrity: sha512-TGKmk2gO6DrvTVADNOGQMqn3SzqcFcJILFnXNllQA34us9uClS3/AsL/cERPz6jS9ePI3bx+1q8/d2GZsxPVYw==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2846,9 +2710,6 @@ packages: '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} @@ -2885,113 +2746,52 @@ packages: '@types/zxcvbn@4.4.5': resolution: {integrity: sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA==} - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/experimental-utils@3.10.1': - resolution: {integrity: sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: '*' - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@8.29.0': + resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/parser@8.29.0': + resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@3.10.1': - resolution: {integrity: sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.29.0': + resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@3.10.1': - resolution: {integrity: sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==} - engines: {node: ^10.12.0 || >=12.0.0} + '@typescript-eslint/type-utils@8.29.0': + resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@8.29.0': + resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/typescript-estree@8.29.0': + resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/utils@8.29.0': + resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@3.10.1': - resolution: {integrity: sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.29.0': + resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -3070,11 +2870,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -3091,9 +2886,6 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@4.24.0: resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} @@ -3109,10 +2901,6 @@ packages: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} - ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3121,10 +2909,6 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3147,9 +2931,6 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3164,14 +2945,14 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -3184,6 +2965,10 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} @@ -3192,6 +2977,10 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -3213,10 +3002,6 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} - astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -3266,13 +3051,6 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-eslint@10.1.0: - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' - babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -3345,12 +3123,20 @@ 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'} + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3367,6 +3153,14 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3404,10 +3198,6 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -3495,10 +3285,6 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -3629,20 +3415,12 @@ packages: country-region-data@3.1.0: resolution: {integrity: sha512-Xy5HoXk2byCS45+88ErCor/a0q6r22ur/Os69p71kfmescu3od4B1lpe7dQdAa0T9HYqqKX04QsrnZ5FmIWh9g==} - create-eslint-index@1.0.0: - resolution: {integrity: sha512-nXvJjnfDytOOaPOonX0h0a1ggMoqrhdekGeZkD6hkcWYvlCWhU719tKFVh8eU04CnMwu3uwe1JjwuUF2C3k2qg==} - engines: {node: '>=4.0.0'} - credit-card-type@10.0.1: resolution: {integrity: sha512-vQOuWmBgsgG1ovGeDi8m6Zeu1JaqH/JncrxKmaqMbv/LunyOQdLiQhPHtOsNlbUI05TocR5nod/Mbs3HYtr6sQ==} credit-card-type@9.1.0: resolution: {integrity: sha512-CpNFuLxiPFxuZqhSKml3M+t0K/484pMAnfYWH14JoD7OZMnmC0Lmo+P7JX9SobqFpRoo7ifA18kOHdxJywYPEA==} - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -3769,14 +3547,26 @@ packages: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} @@ -3864,10 +3654,6 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -3914,9 +3700,6 @@ packages: emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3949,6 +3732,10 @@ packages: resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -3961,25 +3748,17 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} @@ -3991,6 +3770,10 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + es-toolkit@1.27.0: resolution: {integrity: sha512-ETSFA+ZJArcuSCpzD2TjAy6UHpx4E4uqFsoDg9F/nTLogrLmVVZQ+zNxco5h7cWnA1nNak07IXsLcaSMih+ZPQ==} @@ -4028,16 +3811,16 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-prettier@8.1.0: - resolution: {integrity: sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==} + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-cypress@2.15.2: - resolution: {integrity: sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==} + eslint-plugin-cypress@4.2.0: + resolution: {integrity: sha512-v5cyt0VYb1tEEODBJSE44PocYOwQsckyexJhCs7LtdD3FGO6D2GjnZB2s2Sts4RcxdxECTWX01nObOZRs26bQw==} peerDependencies: - eslint: '>= 3.2.1' + eslint: '>=9' eslint-plugin-jsx-a11y@6.10.2: resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} @@ -4045,105 +3828,78 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-perfectionist@1.5.1: - resolution: {integrity: sha512-PiUrAfGDc/l6MKKUP8qt5RXueC7FZC6F/0j8ijXYU8o3x8o2qUi6zEEYBkId/IiKloIXM5KTD4jrH9833kDNzA==} + eslint-plugin-perfectionist@4.10.1: + resolution: {integrity: sha512-GXwFfL47RfBLZRGQdrvGZw9Ali2T2GPW8p4Gyj2fyWQ9396R/HgJMf0m9kn7D6WXRwrINfTDGLS+QYIeok9qEg==} + engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - eslint: '>=8.0.0' + eslint: '>=8.45.0' - eslint-plugin-prettier@3.3.1: - resolution: {integrity: sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==} - engines: {node: '>=6.0.0'} + eslint-plugin-prettier@5.2.6: + resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=5.0.0' - eslint-config-prettier: '*' - prettier: '>=1.13.0' + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' peerDependenciesMeta: + '@types/eslint': + optional: true eslint-config-prettier: optional: true - eslint-plugin-ramda@2.5.1: - resolution: {integrity: sha512-1Uuyl5hMiyBNsn1F0Px0q8hGX95HC6CAzaEBeKngwixXwsbw+j98U7fatxDME8lUKyLPXuO5Ulon2QOcwVDrxw==} - engines: {node: '>=4.0.0'} - - eslint-plugin-react-hooks@3.0.0: - resolution: {integrity: sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==} - engines: {node: '>=7'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - - eslint-plugin-react-refresh@0.4.13: - resolution: {integrity: sha512-f1EppwrpJRWmqDTyvAyomFVDYRtrS7iTEqv3nokETnMiMzs2SSTmKRTACce4O2p4jYyowiSMvpdwC/RLcMFhuQ==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} peerDependencies: - eslint: '>=7' + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-scanjs-rules@0.2.1: - resolution: {integrity: sha512-GE48zzqKpvmlTJQAniY5Eb/6TwEnlnlocuHtT69REZLhoLpJKCbwnvK5cBih2pe9QcSzZ6JagFPb+yfwXKRcIQ==} - - eslint-plugin-sonarjs@0.5.0: - resolution: {integrity: sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ==} - engines: {node: '>=6'} + eslint-plugin-sonarjs@3.0.2: + resolution: {integrity: sha512-LxjbfwI7ypENeTmGyKmDyNux3COSkMi7H/6Cal5StSLQ6edf0naP45SZR43OclaNR7WfhVTZdhOn63q3/Y6puQ==} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + eslint: ^8.0.0 || ^9.0.0 - eslint-plugin-testing-library@3.10.2: - resolution: {integrity: sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==} - engines: {node: ^10.12.0 || >=12.0.0, npm: '>=6'} + eslint-plugin-testing-library@7.1.1: + resolution: {integrity: sha512-nszC833aZPwB6tik1nMkbFqmtgIXTT0sfJEYs0zMBKMlkQ4to2079yUV96SvmLh00ovSBJI4pgcBC1TiIP8mXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: ^9.14.0} peerDependencies: - eslint: ^5 || ^6 || ^7 + eslint: ^8.57.0 || ^9.0.0 eslint-plugin-xss@0.1.12: resolution: {integrity: sha512-L5oYaD//ZE7fKNtWUfVgYTRW19jrZlvaHe2swyFLxXQ5pwVQLivi5m92rtXd/ww8yqg4Drasqyi0hlBmhf9YQg==} engines: {node: '>=0.10.0'} - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-utils@1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} - - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@6.8.0: - resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@7.32.0: - resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} - engines: {node: ^10.12.0 || >=12.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint@9.23.0: + resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - - espree@7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -4158,10 +3914,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4244,9 +3996,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} - fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -4271,13 +4020,9 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-selector@0.2.4: resolution: {integrity: sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==} @@ -4301,24 +4046,14 @@ packages: flag-icons@6.15.0: resolution: {integrity: sha512-ARo9Q+aATZEjyjveeec9e+orx+xLWUBdOX9baOKoGqDzMbvZ65ghPhaHbVt5T7ZB+Q4OFsB4Hr+eQnpV8Q+dLA==} - flat-cache@2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - - flat-cache@3.2.0: - 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'} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@2.0.2: - resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -4337,6 +4072,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -4390,7 +4129,11 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} - functional-red-black-tree@1.0.1: + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} functions-have-names@1.2.3: @@ -4408,10 +4151,6 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4432,6 +4171,10 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -4445,6 +4188,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -4466,30 +4213,27 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@12.4.0: - resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - goober@2.1.16: resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} peerDependencies: csstype: ^3.0.10 - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4507,10 +4251,6 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -4522,8 +4262,8 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} has-symbols@1.1.0: @@ -4613,10 +4353,6 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -4659,14 +4395,14 @@ packages: peerDependencies: '@types/node': '>=18' - inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -4690,6 +4426,10 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -4700,6 +4440,10 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -4708,6 +4452,10 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -4727,10 +4475,18 @@ packages: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -4743,9 +4499,9 @@ packages: is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -4786,6 +4542,10 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -4813,6 +4573,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -4821,6 +4585,10 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -4833,14 +4601,26 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -4855,6 +4635,10 @@ packages: is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} @@ -4898,15 +4682,15 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true joycon@3.1.1: @@ -4916,10 +4700,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -4959,9 +4739,6 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -5032,10 +4809,6 @@ packages: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} engines: {node: '> 0.8'} - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5095,10 +4868,6 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - lodash.isempty@4.4.0: resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} @@ -5123,9 +4892,6 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -5373,10 +5139,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -5388,10 +5150,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -5441,9 +5199,6 @@ packages: typescript: optional: true - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -5456,14 +5211,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -5518,6 +5271,10 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} @@ -5530,6 +5287,10 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5556,10 +5317,6 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -5574,6 +5331,10 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -5620,10 +5381,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -5732,10 +5489,6 @@ packages: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5744,13 +5497,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@2.2.1: - resolution: {integrity: sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -5766,10 +5514,6 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - promise-polyfill@8.2.3: resolution: {integrity: sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==} @@ -5989,6 +5733,14 @@ packages: redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -6008,18 +5760,14 @@ packages: regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} - regexpp@2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} @@ -6029,10 +5777,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - req-all@1.0.0: - resolution: {integrity: sha512-k8RAnaq+vrezRAZWQlI6sbwGIlII699fnPYamb8K0UVgQel3Wb6YgPfpGyair00vmArXNag1vr5PjwDQBE7DUA==} - engines: {node: '>=4'} - request-progress@3.0.0: resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} @@ -6040,10 +5784,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -6098,16 +5838,6 @@ packages: resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} engines: {node: '>= 0.8.15'} - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rollup@4.34.8: resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -6121,10 +5851,6 @@ packages: rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -6132,10 +5858,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -6143,13 +5865,25 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -6166,6 +5900,10 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + search-string@3.1.0: resolution: {integrity: sha512-yY3b0VlaXfKi2B//34PN5AFF+GQvwme6Kj4FjggmoSBOa7B8AHfS1nYZbsrYu+IyGeYOAkF8ywL9LN9dkrOo6g==} @@ -6188,6 +5926,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -6195,18 +5937,10 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -6217,10 +5951,26 @@ packages: shiki@3.1.0: resolution: {integrity: sha512-LdTNyWQlC5zdCaHdcp1zPA1OVA2ivb+KjGOOnGcy02tGaF5ja+dGibWFH7Ar8YlngUgK/scDqworK18Ys9cbYA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -6238,14 +5988,6 @@ packages: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -6291,9 +6033,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -6332,10 +6071,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -6352,13 +6087,17 @@ packages: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -6366,6 +6105,10 @@ packages: string.prototype.trimend@1.0.8: resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} @@ -6373,10 +6116,6 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -6417,10 +6156,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6447,13 +6182,9 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - table@5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} - - table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} - engines: {node: '>=10.0.0'} + synckit@0.11.1: + resolution: {integrity: sha512-fWZqNBZNNFp/7mTUy1fSsydhKsAKJ+u90Nk7kOK5Gcq9vObaqLBLjWFDBkyVU9Vvc6Y71VbOevMuGhqv02bT+Q==} + engines: {node: ^14.18.0 || >=16.0.0} tcomb-validation@3.4.1: resolution: {integrity: sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==} @@ -6473,9 +6204,6 @@ packages: text-segmentation@1.0.3: resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -6585,11 +6313,11 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} - engines: {node: '>=16'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -6640,12 +6368,6 @@ packages: typescript: optional: true - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tsx@4.19.3: resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} engines: {node: '>=18.0.0'} @@ -6657,26 +6379,14 @@ packages: tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -6689,18 +6399,41 @@ packages: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.29.0: + resolution: {integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + typescript-fsa-reducers@1.2.2: resolution: {integrity: sha512-IQ2VsIqUvmzVgWNDjxkeOxX97itl/rq+2u82jGsRdzCSFi9OtV4qf1Ec1urvj/eDlPHOaihIL7wMZzLYx9GvFg==} peerDependencies: @@ -6729,6 +6462,10 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -6801,9 +6538,6 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - validator@13.12.0: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} @@ -6943,10 +6677,18 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + which-builtin-type@1.1.4: resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} engines: {node: '>= 0.4'} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -6958,9 +6700,9 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -6998,10 +6740,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write@1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -7184,10 +6922,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.12.11': - dependencies: - '@babel/highlight': 7.25.9 - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -7259,13 +6993,6 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.26.0 - '@babel/highlight@7.25.9': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/parser@7.26.2': dependencies: '@babel/types': 7.26.0 @@ -7629,27 +7356,50 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@7.32.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.23.0(jiti@2.4.2))': dependencies: - eslint: 7.32.0 + eslint: 9.23.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@0.4.3': + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.0': {} + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0(supports-color@8.1.1) - espree: 7.3.1 - globals: 13.24.0 - ignore: 4.0.6 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 3.14.1 + js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + '@eslint/js@9.23.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.7': + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + '@fontsource/fira-code@5.1.1': {} '@fontsource/nunito-sans@5.1.1': {} @@ -7658,15 +7408,18 @@ snapshots: dependencies: react-hook-form: 7.53.2(react@18.3.1) - '@humanwhocodes/config-array@0.5.0': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.4.0(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@1.2.1': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} '@inquirer/checkbox@4.0.3(@types/node@20.17.6)': dependencies: @@ -7805,12 +7558,12 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': dependencies: glob: 10.4.5 magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.7.3) - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) optionalDependencies: typescript: 5.7.3 @@ -7853,9 +7606,9 @@ snapshots: '@linode/design-language-system@4.0.0': {} - '@linode/eslint-plugin-cloud-manager@0.0.10(eslint@7.32.0)': + '@linode/eslint-plugin-cloud-manager@0.0.10(eslint@9.23.0(jiti@2.4.2))': dependencies: - eslint: 7.32.0 + eslint: 9.23.0(jiti@2.4.2) '@lukemorales/query-key-factory@1.3.4(@tanstack/query-core@5.51.24)(@tanstack/react-query@5.51.24(react@18.3.1))': dependencies: @@ -8043,6 +7796,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.2.0': {} + '@polka/url@1.0.0-next.28': {} '@popperjs/core@2.11.8': {} @@ -8079,7 +7834,7 @@ snapshots: '@rollup/pluginutils@5.1.3(rollup@4.39.0)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: @@ -8299,106 +8054,106 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@storybook/addon-a11y@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-a11y@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - '@storybook/addon-highlight': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/addon-highlight': 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/test': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/test': 8.6.9(storybook@8.6.9(prettier@3.5.3)) axe-core: 4.10.2 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/addon-actions@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-actions@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) uuid: 9.0.1 - '@storybook/addon-controls@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-controls@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@8.6.9(@types/react@18.3.12)(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-docs@8.6.9(@types/react@18.3.12)(storybook@8.6.9(prettier@3.5.3))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.12)(react@18.3.1) - '@storybook/blocks': 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1)) - '@storybook/csf-plugin': 8.6.9(storybook@8.6.9(prettier@2.2.1)) - '@storybook/react-dom-shim': 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1)) + '@storybook/blocks': 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.9(storybook@8.6.9(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-highlight@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-highlight@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/addon-mdx-gfm@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-mdx-gfm@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: remark-gfm: 4.0.0 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - '@storybook/addon-measure@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-measure@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-storysource@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-storysource@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - '@storybook/source-loader': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/source-loader': 8.6.9(storybook@8.6.9(prettier@3.5.3)) estraverse: 5.3.0 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-viewport@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/addon-viewport@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: memoizerific: 1.11.3 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/blocks@8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))': + '@storybook/blocks@8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.6.9(storybook@8.6.9(prettier@2.2.1))(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': + '@storybook/builder-vite@8.6.9(storybook@8.6.9(prettier@3.5.3))(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': dependencies: - '@storybook/csf-plugin': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/csf-plugin': 8.6.9(storybook@8.6.9(prettier@3.5.3)) browser-assert: 1.2.1 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) - '@storybook/components@8.4.5(storybook@8.6.9(prettier@2.2.1))': + '@storybook/components@8.4.5(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/components@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/components@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/core-events@8.4.5(storybook@8.6.9(prettier@2.2.1))': + '@storybook/core-events@8.4.5(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/core@8.6.9(prettier@2.2.1)(storybook@8.6.9(prettier@2.2.1))': + '@storybook/core@8.6.9(prettier@3.5.3)(storybook@8.6.9(prettier@3.5.3))': dependencies: - '@storybook/theming': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/theming': 8.6.9(storybook@8.6.9(prettier@3.5.3)) better-opn: 3.0.2 browser-assert: 1.2.1 esbuild: 0.25.2 @@ -8410,16 +8165,16 @@ snapshots: util: 0.12.5 ws: 8.18.0 optionalDependencies: - prettier: 2.2.1 + prettier: 3.5.3 transitivePeerDependencies: - bufferutil - storybook - supports-color - utf-8-validate - '@storybook/csf-plugin@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/csf-plugin@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) unplugin: 1.16.0 '@storybook/global@5.0.0': {} @@ -8429,84 +8184,84 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/instrumenter@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/instrumenter@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.5 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/manager-api@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/manager-api@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/preview-api@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/preview-api@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/react-dom-shim@8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))': + '@storybook/react-dom-shim@8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/react-vite@8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': + '@storybook/react-vite@8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) '@rollup/pluginutils': 5.1.3(rollup@4.39.0) - '@storybook/builder-vite': 8.6.9(storybook@8.6.9(prettier@2.2.1))(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) - '@storybook/react': 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3) + '@storybook/builder-vite': 8.6.9(storybook@8.6.9(prettier@3.5.3))(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + '@storybook/react': 8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3) find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 react-docgen: 7.1.0 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) optionalDependencies: - '@storybook/test': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/test': 8.6.9(storybook@8.6.9(prettier@3.5.3)) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1))(typescript@5.7.3)': + '@storybook/react@8.6.9(@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3))(typescript@5.7.3)': dependencies: - '@storybook/components': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/components': 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.9(storybook@8.6.9(prettier@2.2.1)) - '@storybook/preview-api': 8.6.9(storybook@8.6.9(prettier@2.2.1)) - '@storybook/react-dom-shim': 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1)) - '@storybook/theming': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/manager-api': 8.6.9(storybook@8.6.9(prettier@3.5.3)) + '@storybook/preview-api': 8.6.9(storybook@8.6.9(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3)) + '@storybook/theming': 8.6.9(storybook@8.6.9(prettier@3.5.3)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) optionalDependencies: - '@storybook/test': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/test': 8.6.9(storybook@8.6.9(prettier@3.5.3)) typescript: 5.7.3 - '@storybook/source-loader@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/source-loader@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: es-toolkit: 1.27.0 estraverse: 5.3.0 - prettier: 3.3.3 - storybook: 8.6.9(prettier@2.2.1) + prettier: 3.5.3 + storybook: 8.6.9(prettier@3.5.3) - '@storybook/test@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/test@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/instrumenter': 8.6.9(storybook@8.6.9(prettier@3.5.3)) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) - '@storybook/theming@8.6.9(storybook@8.6.9(prettier@2.2.1))': + '@storybook/theming@8.6.9(storybook@8.6.9(prettier@3.5.3))': dependencies: - storybook: 8.6.9(prettier@2.2.1) + storybook: 8.6.9(prettier@3.5.3) '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)': dependencies: @@ -8800,6 +8555,15 @@ snapshots: '@types/doctrine@0.0.9': {} + '@types/eslint-plugin-jsx-a11y@6.10.0': + dependencies: + '@types/eslint': 9.6.1 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.6': {} '@types/estree@1.0.7': {} @@ -8924,8 +8688,6 @@ snapshots: '@types/resolve@1.20.6': {} - '@types/semver@7.5.8': {} - '@types/sinonjs__fake-timers@8.1.1': {} '@types/sizzle@2.3.9': {} @@ -8956,174 +8718,91 @@ snapshots: '@types/zxcvbn@4.4.5': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3))(eslint@7.32.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/utils': 6.21.0(eslint@7.32.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7 - eslint: 7.32.0 + '@typescript-eslint/parser': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/type-utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.29.0 + eslint: 9.23.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.7.3) - optionalDependencies: + ts-api-utils: 2.1.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@3.10.1(eslint@7.32.0)(typescript@5.7.3)': - dependencies: - '@types/json-schema': 7.0.15 - '@typescript-eslint/types': 3.10.1 - '@typescript-eslint/typescript-estree': 3.10.1(typescript@5.7.3) - eslint: 7.32.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/parser@6.21.0(eslint@7.32.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7 - eslint: 7.32.0 - optionalDependencies: + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.29.0 + debug: 4.4.0(supports-color@8.1.1) + eslint: 9.23.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - - '@typescript-eslint/scope-manager@6.21.0': + '@typescript-eslint/scope-manager@8.29.0': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 - '@typescript-eslint/type-utils@6.21.0(eslint@7.32.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 6.21.0(eslint@7.32.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0(supports-color@8.1.1) - eslint: 7.32.0 - ts-api-utils: 1.4.0(typescript@5.7.3) - optionalDependencies: + eslint: 9.23.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@3.10.1': {} - - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/types@8.29.0': {} - '@typescript-eslint/typescript-estree@3.10.1(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 3.10.1 - '@typescript-eslint/visitor-keys': 3.10.1 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 debug: 4.4.0(supports-color@8.1.1) - glob: 7.2.3 + fast-glob: 3.3.2 is-glob: 4.0.3 - lodash: 4.17.21 + minimatch: 9.0.5 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.7.3) - optionalDependencies: + ts-api-utils: 2.1.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.3)': + '@typescript-eslint/utils@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.7.3) - optionalDependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + eslint: 9.23.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.3)': + '@typescript-eslint/visitor-keys@8.29.0': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.7.3) - optionalDependencies: - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.29.0 + eslint-visitor-keys: 4.2.0 - '@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@5.7.3)': + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react-swc@3.7.2(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@7.32.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) - eslint: 7.32.0 - eslint-scope: 5.1.1 - semver: 7.6.3 + '@swc/core': 1.10.11 + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@6.21.0(eslint@7.32.0)(typescript@5.7.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@7.32.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) - eslint: 7.32.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@3.10.1': - dependencies: - eslint-visitor-keys: 1.3.0 - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.3.0': {} - - '@vitejs/plugin-react-swc@3.7.2(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': - dependencies: - '@swc/core': 1.10.11 - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) - transitivePeerDependencies: - - '@swc/helpers' + - '@swc/helpers' '@vitest/coverage-v8@3.0.7(vitest@3.0.7)': dependencies: @@ -9139,7 +8818,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@1.21.6)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) transitivePeerDependencies: - supports-color @@ -9157,14 +8836,14 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.7(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': + '@vitest/mocker@3.0.7(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1))': dependencies: '@vitest/spy': 3.0.7 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.6.5(@types/node@20.17.6)(typescript@5.7.3) - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) '@vitest/pretty-format@2.0.5': dependencies: @@ -9206,7 +8885,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@1.21.6)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) '@vitest/utils@2.0.5': dependencies: @@ -9229,11 +8908,9 @@ snapshots: '@xterm/xterm@5.5.0': {} - acorn-jsx@5.3.2(acorn@7.4.1): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 7.4.1 - - acorn@7.4.1: {} + acorn: 8.14.1 acorn@8.14.1: {} @@ -9255,13 +8932,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - algoliasearch@4.24.0: dependencies: '@algolia/cache-browser-local-storage': 4.24.0 @@ -9290,16 +8960,10 @@ snapshots: dependencies: environment: 1.1.0 - ansi-regex@4.1.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -9317,10 +8981,6 @@ snapshots: arch@2.2.0: {} - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} aria-query@5.3.0: @@ -9334,24 +8994,27 @@ snapshots: call-bind: 1.0.7 is-array-buffer: 3.0.4 + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 is-string: 1.0.7 - array-union@2.1.0: {} - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.5 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: @@ -9368,6 +9031,13 @@ snapshots: es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.5 + es-shim-unscopables: 1.0.2 + array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 @@ -9387,6 +9057,16 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + asap@2.0.6: {} asn1@0.2.6: @@ -9403,8 +9083,6 @@ snapshots: dependencies: tslib: 2.8.1 - astral-regex@1.0.0: {} - astral-regex@2.0.0: {} async@3.2.6: {} @@ -9443,18 +9121,6 @@ snapshots: axobject-query@4.1.0: {} - babel-eslint@10.1.0(eslint@7.32.0): - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - eslint: 7.32.0 - eslint-visitor-keys: 1.3.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.26.0 @@ -9537,11 +9203,15 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + builtin-modules@3.3.0: {} + bundle-require@5.1.0(esbuild@0.25.1): dependencies: esbuild: 0.25.1 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + cac@6.7.14: {} cachedir@2.4.0: {} @@ -9559,6 +9229,18 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase@5.3.1: {} @@ -9599,12 +9281,6 @@ snapshots: loupe: 3.1.2 pathval: 2.0.0 - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -9693,8 +9369,6 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 - cli-width@3.0.0: {} - cli-width@4.1.0: {} cliui@6.0.0: @@ -9812,22 +9486,10 @@ snapshots: country-region-data@3.1.0: {} - create-eslint-index@1.0.0: - dependencies: - lodash.get: 4.4.2 - credit-card-type@10.0.1: {} credit-card-type@9.1.0: {} - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 7.6.3 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -9890,11 +9552,11 @@ snapshots: dependencies: cypress: 14.0.1 - cypress-vite@1.6.0(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)): + cypress-vite@1.6.0(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)): dependencies: chokidar: 3.6.0 debug: 4.4.0(supports-color@8.1.1) - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) transitivePeerDependencies: - supports-color @@ -9999,18 +9661,36 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dateformat@4.6.3: {} dayjs@1.11.13: {} @@ -10073,10 +9753,6 @@ snapshots: diff@5.2.0: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -10124,8 +9800,6 @@ snapshots: emoji-regex@10.4.0: {} - emoji-regex@7.0.3: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -10161,16 +9835,16 @@ snapshots: data-view-buffer: 1.0.1 data-view-byte-length: 1.0.1 data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-set-tostringtag: 2.1.0 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.3.0 get-symbol-description: 1.0.2 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.1.0 @@ -10201,6 +9875,60 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + es-define-property@1.0.0: dependencies: get-intrinsic: 1.3.0 @@ -10209,40 +9937,31 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 es-module-lexer@1.6.0: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -10260,6 +9979,12 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + es-toolkit@1.27.0: {} esbuild-register@3.6.0(esbuild@0.25.2): @@ -10335,16 +10060,16 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@8.1.0(eslint@7.32.0): + eslint-config-prettier@10.1.1(eslint@9.23.0(jiti@2.4.2)): dependencies: - eslint: 7.32.0 + eslint: 9.23.0(jiti@2.4.2) - eslint-plugin-cypress@2.15.2(eslint@7.32.0): + eslint-plugin-cypress@4.2.0(eslint@9.23.0(jiti@2.4.2)): dependencies: - eslint: 7.32.0 - globals: 13.24.0 + eslint: 9.23.0(jiti@2.4.2) + globals: 15.15.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@7.32.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.23.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -10354,7 +10079,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 7.32.0 + eslint: 9.23.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -10363,82 +10088,70 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@1.5.1(eslint@7.32.0)(typescript@5.7.3): + eslint-plugin-perfectionist@4.10.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@5.7.3) - eslint: 7.32.0 - is-core-module: 2.15.1 - json5: 2.2.3 - minimatch: 9.0.5 - natural-compare-lite: 1.4.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.23.0(jiti@2.4.2) + natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-prettier@3.3.1(eslint-config-prettier@8.1.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.2.1): + eslint-plugin-prettier@5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.1(eslint@9.23.0(jiti@2.4.2)))(eslint@9.23.0(jiti@2.4.2))(prettier@3.5.3): dependencies: - eslint: 7.32.0 - prettier: 2.2.1 + eslint: 9.23.0(jiti@2.4.2) + prettier: 3.5.3 prettier-linter-helpers: 1.0.0 + synckit: 0.11.1 optionalDependencies: - eslint-config-prettier: 8.1.0(eslint@7.32.0) + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.1(eslint@9.23.0(jiti@2.4.2)) - eslint-plugin-ramda@2.5.1: + eslint-plugin-react-hooks@5.2.0(eslint@9.23.0(jiti@2.4.2)): dependencies: - create-eslint-index: 1.0.0 - ramda: 0.25.0 - req-all: 1.0.0 + eslint: 9.23.0(jiti@2.4.2) - eslint-plugin-react-hooks@3.0.0(eslint@7.32.0): - dependencies: - eslint: 7.32.0 - - eslint-plugin-react-refresh@0.4.13(eslint@7.32.0): - dependencies: - eslint: 7.32.0 - - eslint-plugin-react@7.37.2(eslint@7.32.0): + eslint-plugin-react@7.37.4(eslint@9.23.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 - eslint: 7.32.0 + es-iterator-helpers: 1.2.1 + eslint: 9.23.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 7.6.3 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-scanjs-rules@0.2.1: - dependencies: - babel-eslint: 10.1.0(eslint@7.32.0) - eslint: 7.32.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-sonarjs@0.5.0(eslint@6.8.0): - dependencies: - eslint: 6.8.0 - - eslint-plugin-sonarjs@0.5.0(eslint@7.32.0): + eslint-plugin-sonarjs@3.0.2(eslint@9.23.0(jiti@2.4.2)): dependencies: - eslint: 7.32.0 + '@eslint-community/regexpp': 4.12.1 + builtin-modules: 3.3.0 + bytes: 3.1.2 + eslint: 9.23.0(jiti@2.4.2) + functional-red-black-tree: 1.0.1 + jsx-ast-utils: 3.3.5 + minimatch: 9.0.5 + scslre: 0.3.0 + semver: 7.6.3 + typescript: 5.7.3 - eslint-plugin-testing-library@3.10.2(eslint@7.32.0)(typescript@5.7.3): + eslint-plugin-testing-library@7.1.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/experimental-utils': 3.10.1(eslint@7.32.0)(typescript@5.7.3) - eslint: 7.32.0 + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.23.0(jiti@2.4.2) transitivePeerDependencies: - supports-color - typescript @@ -10447,123 +10160,62 @@ snapshots: dependencies: requireindex: 1.1.0 - eslint-scope@5.1.1: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-utils@1.4.3: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-visitor-keys@1.3.0: {} - - eslint-visitor-keys@2.1.0: {} + estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@6.8.0: - dependencies: - '@babel/code-frame': 7.26.2 - ajv: 6.12.6 - chalk: 2.4.2 - cross-spawn: 6.0.6 - debug: 4.3.7 - doctrine: 3.0.0 - eslint-scope: 5.1.1 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.6.0 - esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 12.4.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - inquirer: 7.3.3 - is-glob: 4.0.3 - js-yaml: 3.14.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.21 - minimatch: 3.1.2 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 7.6.3 - strip-ansi: 5.2.0 - strip-json-comments: 3.1.1 - table: 5.4.6 - text-table: 0.2.0 - v8-compile-cache: 2.4.0 - transitivePeerDependencies: - - supports-color + eslint-visitor-keys@4.2.0: {} - eslint@7.32.0: + eslint@9.23.0(jiti@2.4.2): dependencies: - '@babel/code-frame': 7.12.11 - '@eslint/eslintrc': 0.4.3 - '@humanwhocodes/config-array': 0.5.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.2.0 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.23.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 - doctrine: 3.0.0 - enquirer: 2.4.1 + debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 2.1.0 - espree: 7.3.1 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 13.24.0 - ignore: 4.0.6 - import-fresh: 3.3.0 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-yaml: 3.14.1 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.6.3 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - table: 6.8.2 - text-table: 0.2.0 - v8-compile-cache: 2.4.0 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color - espree@6.2.1: - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 - - espree@7.3.1: + espree@10.3.0: dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 esprima@4.0.1: {} @@ -10575,8 +10227,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -10668,8 +10318,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.3: {} - fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -10700,13 +10348,9 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@5.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 2.0.1 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 file-selector@0.2.4: dependencies: @@ -10730,24 +10374,13 @@ snapshots: flag-icons@6.15.0: {} - flat-cache@2.0.1: - dependencies: - flatted: 2.0.2 - rimraf: 2.6.3 - write: 1.0.3 - - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flat@5.0.2: {} - flatted@2.0.2: {} - - flatted@3.3.2: {} - flatted@3.3.3: {} follow-redirects@1.15.9: {} @@ -10758,6 +10391,10 @@ snapshots: dependencies: is-callable: 1.2.7 + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -10829,6 +10466,15 @@ snapshots: es-abstract: 1.23.5 functions-have-names: 1.2.3 + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + functional-red-black-tree@1.0.1: {} functions-have-names@1.2.3: {} @@ -10839,14 +10485,6 @@ snapshots: get-east-asian-width@1.3.0: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.1.0 - hasown: 2.0.2 - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10877,6 +10515,12 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -10893,6 +10537,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@10.4.5: dependencies: foreground-child: 3.3.0 @@ -10925,36 +10573,21 @@ snapshots: globals@11.12.0: {} - globals@12.4.0: - dependencies: - type-fest: 0.8.1 + globals@14.0.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@15.15.0: {} + + globals@16.0.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - goober@2.1.16(csstype@3.1.3): dependencies: csstype: 3.1.3 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -10965,8 +10598,6 @@ snapshots: has-bigints@1.0.2: {} - has-flag@3.0.0: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -10975,7 +10606,9 @@ snapshots: has-proto@1.0.3: {} - has-symbols@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 has-symbols@1.1.0: {} @@ -11076,8 +10709,6 @@ snapshots: ieee754@1.2.1: {} - ignore@4.0.6: {} - ignore@5.3.2: {} immediate@3.0.6: {} @@ -11111,25 +10742,9 @@ snapshots: '@inquirer/type': 3.0.1(@types/node@20.17.6) '@types/node': 20.17.6 ansi-escapes: 4.3.2 - mute-stream: 2.0.0 - run-async: 3.0.0 - rxjs: 7.8.1 - - inquirer@7.3.3: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 + mute-stream: 2.0.0 + run-async: 3.0.0 + rxjs: 7.8.1 internal-slot@1.0.7: dependencies: @@ -11137,6 +10752,12 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + internmap@2.0.3: {} invariant@2.2.4: @@ -11157,6 +10778,12 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.3.0 + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} is-async-function@2.0.0: @@ -11167,6 +10794,10 @@ snapshots: dependencies: has-bigints: 1.0.2 + is-bigint@1.1.0: + dependencies: + has-bigints: 1.0.2 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -11176,6 +10807,11 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-buffer@1.1.6: {} is-buffer@2.0.5: {} @@ -11190,19 +10826,32 @@ snapshots: dependencies: is-typed-array: 1.1.13 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-docker@2.2.1: {} is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 - is-fullwidth-code-point@2.0.0: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} @@ -11235,6 +10884,11 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-path-inside@3.0.3: {} @@ -11254,12 +10908,23 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -11268,14 +10933,29 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-symbol@1.0.4: dependencies: has-symbols: 1.1.0 + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} @@ -11286,9 +10966,13 @@ snapshots: dependencies: call-bind: 1.0.7 + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + is-weakset@2.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.3.0 is-wsl@2.2.0: @@ -11333,12 +11017,13 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.3: + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 + get-proto: 1.0.1 has-symbols: 1.1.0 - reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 jackspeak@3.4.3: @@ -11347,18 +11032,12 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.6: - optional: true + jiti@2.4.2: {} joycon@3.1.1: {} js-tokens@4.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -11405,8 +11084,6 @@ snapshots: json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} - json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -11494,11 +11171,6 @@ snapshots: lazy-ass@1.6.0: {} - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -11573,8 +11245,6 @@ snapshots: lodash.camelcase@4.3.0: {} - lodash.get@4.4.2: {} - lodash.isempty@4.4.0: {} lodash.isfunction@3.0.9: {} @@ -11591,8 +11261,6 @@ snapshots: lodash.sortby@4.7.0: {} - lodash.truncate@4.4.2: {} - lodash@4.17.21: {} log-symbols@4.1.0: @@ -12022,10 +11690,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -12034,10 +11698,6 @@ snapshots: minipass@7.1.2: {} - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mkdirp@3.0.1: {} mocha-junit-reporter@2.2.1(mocha@10.8.2): @@ -12140,8 +11800,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - mute-stream@0.0.8: {} - mute-stream@2.0.0: {} mz@2.7.0: @@ -12152,11 +11810,9 @@ snapshots: nanoid@3.3.11: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} - nice-try@1.0.5: {} + natural-orderby@5.0.0: {} no-case@3.0.4: dependencies: @@ -12203,24 +11859,40 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 once@1.4.0: dependencies: @@ -12252,15 +11924,6 @@ snapshots: opener@1.5.2: {} - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -12276,6 +11939,12 @@ snapshots: outvariant@1.4.3: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -12319,8 +11988,6 @@ snapshots: path-is-absolute@1.0.1: {} - path-key@2.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -12378,11 +12045,11 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.6.1): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.6.1): dependencies: lilconfig: 3.1.3 optionalDependencies: - jiti: 1.21.6 + jiti: 2.4.2 postcss: 8.5.3 tsx: 4.19.3 yaml: 2.6.1 @@ -12393,17 +12060,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prelude-ls@1.1.2: {} - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - prettier@2.2.1: {} - - prettier@3.3.3: {} + prettier@3.5.3: {} pretty-bytes@5.6.0: {} @@ -12415,8 +12078,6 @@ snapshots: process@0.11.10: {} - progress@2.0.3: {} - promise-polyfill@8.2.3: {} promise-polyfill@8.3.0: {} @@ -12676,11 +12337,26 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + reflect.getprototypeof@1.0.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 get-intrinsic: 1.3.0 globalthis: 1.0.4 @@ -12701,6 +12377,11 @@ snapshots: dependencies: regex-utilities: 2.3.0 + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.7 @@ -12708,10 +12389,6 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regexpp@2.0.1: {} - - regexpp@3.2.0: {} - remark-gfm@4.0.0: dependencies: '@types/mdast': 4.0.4 @@ -12738,16 +12415,12 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - req-all@1.0.0: {} - request-progress@3.0.0: dependencies: throttleit: 1.0.1 require-directory@2.1.1: {} - require-from-string@2.0.2: {} - require-main-filename@2.0.0: {} requireindex@1.1.0: {} @@ -12795,14 +12468,6 @@ snapshots: rgbcolor@1.0.1: optional: true - rimraf@2.6.3: - dependencies: - glob: 7.2.3 - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rollup@4.34.8: dependencies: '@types/estree': 1.0.6 @@ -12856,18 +12521,12 @@ snapshots: rrweb-cssom@0.7.1: {} - run-async@2.4.1: {} - run-async@3.0.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 - rxjs@7.8.1: dependencies: tslib: 2.8.1 @@ -12879,14 +12538,33 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} sax@1.4.1: {} @@ -12904,6 +12582,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.12.1 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + search-string@3.1.0: {} semver@7.6.3: {} @@ -12930,22 +12614,22 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setimmediate@1.0.5: {} shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} shell-quote@1.8.1: {} @@ -12961,6 +12645,26 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -12968,6 +12672,14 @@ snapshots: get-intrinsic: 1.3.0 object-inspect: 1.13.3 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -12988,14 +12700,6 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - slash@3.0.0: {} - - slice-ansi@2.1.0: - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -13042,8 +12746,6 @@ snapshots: space-separated-tokens@2.0.2: {} - sprintf-js@1.0.3: {} - sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -13065,14 +12767,14 @@ snapshots: std-env@3.8.0: {} - storybook-dark-mode@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@2.2.1)): + storybook-dark-mode@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.9(prettier@3.5.3)): dependencies: - '@storybook/components': 8.4.5(storybook@8.6.9(prettier@2.2.1)) - '@storybook/core-events': 8.4.5(storybook@8.6.9(prettier@2.2.1)) + '@storybook/components': 8.4.5(storybook@8.6.9(prettier@3.5.3)) + '@storybook/core-events': 8.4.5(storybook@8.6.9(prettier@3.5.3)) '@storybook/global': 5.0.0 '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/manager-api': 8.6.9(storybook@8.6.9(prettier@2.2.1)) - '@storybook/theming': 8.6.9(storybook@8.6.9(prettier@2.2.1)) + '@storybook/manager-api': 8.6.9(storybook@8.6.9(prettier@3.5.3)) + '@storybook/theming': 8.6.9(storybook@8.6.9(prettier@3.5.3)) fast-deep-equal: 3.1.3 memoizerific: 1.11.3 transitivePeerDependencies: @@ -13080,11 +12782,11 @@ snapshots: - react-dom - storybook - storybook@8.6.9(prettier@2.2.1): + storybook@8.6.9(prettier@3.5.3): dependencies: - '@storybook/core': 8.6.9(prettier@2.2.1)(storybook@8.6.9(prettier@2.2.1)) + '@storybook/core': 8.6.9(prettier@3.5.3)(storybook@8.6.9(prettier@3.5.3)) optionalDependencies: - prettier: 2.2.1 + prettier: 3.5.3 transitivePeerDependencies: - bufferutil - supports-color @@ -13094,12 +12796,6 @@ snapshots: string-argv@0.3.2: {} - string-width@3.1.0: - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -13124,26 +12820,37 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.5 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.23.5 + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -13157,6 +12864,13 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 @@ -13168,10 +12882,6 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@5.2.0: - dependencies: - ansi-regex: 4.1.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -13208,10 +12918,6 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -13231,20 +12937,10 @@ snapshots: symbol-tree@3.2.4: {} - table@5.4.6: - dependencies: - ajv: 6.12.6 - lodash: 4.17.21 - slice-ansi: 2.1.0 - string-width: 3.1.0 - - table@6.8.2: + synckit@0.11.1: dependencies: - ajv: 8.17.1 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + '@pkgr/core': 0.2.0 + tslib: 2.8.1 tcomb-validation@3.4.1: dependencies: @@ -13271,8 +12967,6 @@ snapshots: utrie: 1.0.2 optional: true - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -13359,7 +13053,7 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.0(typescript@5.7.3): + ts-api-utils@2.1.0(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -13387,7 +13081,7 @@ snapshots: optionalDependencies: '@mui/material': 6.4.5(@emotion/react@11.13.5(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tsup@8.4.0(@swc/core@1.10.11)(jiti@1.21.6)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.6.1): + tsup@8.4.0(@swc/core@1.10.11)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.7.3)(yaml@2.6.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.1) cac: 6.7.14 @@ -13397,7 +13091,7 @@ snapshots: esbuild: 0.25.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.6.1) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.6.1) resolve-from: 5.0.0 rollup: 4.34.8 source-map: 0.8.0-beta.0 @@ -13415,11 +13109,6 @@ snapshots: - tsx - yaml - tsutils@3.21.0(typescript@5.7.3): - dependencies: - tslib: 1.14.1 - typescript: 5.7.3 - tsx@4.19.3: dependencies: esbuild: 0.25.1 @@ -13433,20 +13122,12 @@ snapshots: tweetnacl@0.14.5: {} - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@0.21.3: {} - type-fest@0.8.1: {} - type-fest@2.19.0: {} type-fest@4.27.0: {} @@ -13457,6 +13138,12 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.13 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -13465,6 +13152,14 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 @@ -13474,6 +13169,16 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 @@ -13483,6 +13188,25 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.6 + + typescript-eslint@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.23.0(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + typescript-fsa-reducers@1.2.2(typescript-fsa@3.0.0): dependencies: typescript-fsa: 3.0.0 @@ -13504,6 +13228,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.0.2 + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.0.2 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undici-types@6.19.8: {} unified@11.0.5: @@ -13588,8 +13319,6 @@ snapshots: uuid@9.0.1: {} - v8-compile-cache@2.4.0: {} - validator@13.12.0: {} value-equal@1.0.1: {} @@ -13627,13 +13356,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@3.0.7(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1): + vite-node@3.0.7(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' - jiti @@ -13648,18 +13377,18 @@ snapshots: - tsx - yaml - vite-plugin-svgr@3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)): + vite-plugin-svgr@3.3.0(rollup@4.39.0)(typescript@5.7.3)(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.39.0) '@svgr/core': 8.1.0(typescript@5.7.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3)) - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1): + vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1): dependencies: esbuild: 0.25.2 postcss: 8.5.3 @@ -13667,15 +13396,15 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 fsevents: 2.3.3 - jiti: 1.21.6 + jiti: 2.4.2 terser: 5.36.0 tsx: 4.19.3 yaml: 2.6.1 - vitest@3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@1.21.6)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1): + vitest@3.0.7(@types/debug@4.1.12)(@types/node@20.17.6)(@vitest/ui@3.0.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1): dependencies: '@vitest/expect': 3.0.7 - '@vitest/mocker': 3.0.7(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(vite@6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) + '@vitest/mocker': 3.0.7(msw@2.6.5(@types/node@20.17.6)(typescript@5.7.3))(vite@6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)) '@vitest/pretty-format': 3.0.7 '@vitest/runner': 3.0.7 '@vitest/snapshot': 3.0.7 @@ -13691,8 +13420,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.5(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) - vite-node: 3.0.7(@types/node@20.17.6)(jiti@1.21.6)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite: 6.2.5(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) + vite-node: 3.0.7(@types/node@20.17.6)(jiti@2.4.2)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -13757,20 +13486,44 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + which-builtin-type@1.1.4: dependencies: - function.prototype.name: 1.1.6 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.0.10 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -13789,9 +13542,15 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which@1.3.1: + which-typed-array@1.1.19: dependencies: - isexe: 2.0.0 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 which@2.0.2: dependencies: @@ -13832,10 +13591,6 @@ snapshots: wrappy@1.0.2: {} - write@1.0.3: - dependencies: - mkdirp: 0.5.6 - ws@8.18.0: {} xml-name-validator@5.0.0: {} diff --git a/scripts/changelog/utils/constants.mjs b/scripts/changelog/utils/constants.mjs index a0919fc8866..a70f33aaff3 100644 --- a/scripts/changelog/utils/constants.mjs +++ b/scripts/changelog/utils/constants.mjs @@ -44,6 +44,7 @@ const CHANGESET_DIRECTORIES = { "manager": path.join(__dirname, "../../../packages/manager/.changeset"), "queries": path.join(__dirname, "../../../packages/queries/.changeset"), "ui": path.join(__dirname, "../../../packages/ui/.changeset"), + "shared": path.join(__dirname, "../../../packages/shared/.changeset"), "utilities": path.join(__dirname, "../../../packages/utilities/.changeset"), "validation": path.join(__dirname, "../../../packages/validation/.changeset"), "shared": path.join(__dirname, "../../../packages/shared/.changeset"), @@ -54,6 +55,7 @@ const PACKAGE_JSON_PATHS = { "manager": path.join(__dirname, "../../../packages/manager/package.json"), "queries": path.join(__dirname, "../../../packages/queries/package.json"), "ui": path.join(__dirname, "../../../packages/ui/package.json"), + "shared": path.join(__dirname, "../../../packages/shared/package.json"), "utilities": path.join(__dirname, "../../../packages/utilities/package.json"), "validation": path.join(__dirname, "../../../packages/validation/package.json"), "shared": path.join(__dirname, "../../../packages/shared/package.json"),