From 7797915a67378a963586edccbea1cf96484073b4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:59:09 +1000 Subject: [PATCH] ESLint 9, flat config migration (#1537) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Aaron Moat <2937187+AaronMoat@users.noreply.github.com> Co-authored-by: skuba <34733141+seek-oss-ci@users.noreply.github.com> Co-authored-by: Sam Chung --- .changeset/big-weeks-enjoy.md | 18 + .changeset/changelog.js | 14 +- .changeset/inject.js | 1 + .changeset/rich-chairs-wink.md | 20 + .changeset/thick-taxis-vanish.md | 16 + .eslintignore | 20 - .eslintrc.js | 37 - config/eslint.js | 4 +- docs/cli/init.md | 3 +- docs/deep-dives/eslint.md | 15 +- eslint.config.js | 56 + package.json | 3 +- packages/eslint-config-skuba/.eslintignore | 15 - packages/eslint-config-skuba/eslint.config.js | 1 + packages/eslint-config-skuba/index.js | 319 +++-- packages/eslint-config-skuba/package.json | 18 +- packages/eslint-config-skuba/tsconfig.json | 2 +- packages/skuba-dive/.eslintignore | 15 - packages/skuba-dive/.eslintrc.js | 3 - packages/skuba-dive/eslint.config.js | 1 + packages/skuba-dive/package.json | 2 +- pnpm-lock.yaml | 1121 ++++++++++------- scripts/test-template.sh | 6 + src/api/git/currentBranch.int.test.ts | 2 +- src/api/git/remote.int.test.ts | 2 +- src/cli/__snapshots__/format.int.test.ts.snap | 28 +- src/cli/__snapshots__/lint.int.test.ts.snap | 26 +- src/cli/adapter/eslint.ts | 46 +- .../__snapshots__/project.test.ts.snap | 31 +- src/cli/configure/modules/eslint.test.ts | 26 +- src/cli/configure/modules/eslint.ts | 11 +- src/cli/configure/modules/prettier.test.ts | 2 +- src/cli/configure/processing/configFile.ts | 2 +- src/cli/format.int.test.ts | 4 +- src/cli/format.ts | 7 +- src/cli/init/getConfig.ts | 2 +- src/cli/init/index.ts | 2 +- src/cli/init/types.ts | 1 + src/cli/lint.test.ts | 5 +- src/cli/lint/autofix.ts | 6 +- src/cli/lint/eslint.ts | 4 +- .../lint/internalLints/patchRenovateConfig.ts | 9 +- .../internalLints/refreshConfigFiles.test.ts | 52 +- .../lint/internalLints/refreshConfigFiles.ts | 1 - .../8.2.1/collapseDuplicateMergeKeys.test.ts | 265 ++++ .../8.2.1/collapseDuplicateMergeKeys.ts | 81 ++ .../upgrade/patches/8.2.1/index.ts | 10 + .../patches/8.2.1/patchDockerCompose.ts | 2 +- .../patches/8.2.1/upgradeESLint.test.ts | 252 ++++ .../upgrade/patches/8.2.1/upgradeESLint.ts | 133 ++ src/cli/lint/types.ts | 5 + src/eslint.d.ts | 7 + src/index.ts | 2 +- src/skuba.ts | 2 +- src/utils/copy.ts | 1 + src/utils/dir.test.ts | 1 - src/why-is-node-running.d.ts | 3 - src/wrapper/main.ts | 2 +- template/base/_.eslintignore | 15 - template/base/_.eslintrc.js | 3 - template/base/_eslint.config.js | 1 + .../koa-rest-api/src/framework/server.test.ts | 3 +- .../lambda-sqs-worker/src/types/jobScorer.ts | 2 +- 63 files changed, 1857 insertions(+), 912 deletions(-) create mode 100644 .changeset/big-weeks-enjoy.md create mode 100644 .changeset/rich-chairs-wink.md create mode 100644 .changeset/thick-taxis-vanish.md delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.js delete mode 100644 packages/eslint-config-skuba/.eslintignore create mode 100644 packages/eslint-config-skuba/eslint.config.js delete mode 100644 packages/skuba-dive/.eslintignore delete mode 100644 packages/skuba-dive/.eslintrc.js create mode 100644 packages/skuba-dive/eslint.config.js create mode 100644 src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.test.ts create mode 100644 src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.ts create mode 100644 src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.test.ts create mode 100644 src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.ts create mode 100644 src/eslint.d.ts delete mode 100644 src/why-is-node-running.d.ts delete mode 100644 template/base/_.eslintignore delete mode 100644 template/base/_.eslintrc.js create mode 100644 template/base/_eslint.config.js diff --git a/.changeset/big-weeks-enjoy.md b/.changeset/big-weeks-enjoy.md new file mode 100644 index 000000000..ff67bceef --- /dev/null +++ b/.changeset/big-weeks-enjoy.md @@ -0,0 +1,18 @@ +--- +'skuba': major +--- + +lint: Migrate to ESLint 9 and `@typescript-eslint` 8. + +These changes may affect your project setup if customising your ESLint configuration. See the individual migration guides: + +- https://eslint.org/docs/latest/use/migrate-to-9.0.0 +- https://typescript-eslint.io/blog/announcing-typescript-eslint-v8 + +In addition, through these major upgrades, some lint rules have changed or have been renamed. You will likely need adjust your code after running ESLint. + +Furthermore, `eslint-plugin-import` has been replaced with `eslint-plugin-import-x`. To migrate, any references to `eslint-plugin-import` should be replaced with `eslint-plugin-import-x`, and `import/` rules with `import-x/`. + +As part of this migration, skuba has migrated to using Flat ESLint configuration. Read the migration: https://eslint.org/docs/latest/use/configure/migration-guide. + +`skuba format` will attempt to migrate to flat configuration for you, where `.eslintignore` and `.eslintrc` are replaced by `eslint.config.js`. diff --git a/.changeset/changelog.js b/.changeset/changelog.js index 5ffa3d304..35ca5512e 100644 --- a/.changeset/changelog.js +++ b/.changeset/changelog.js @@ -67,16 +67,17 @@ const gitHubChangelogFunctions = { const replacedChangelog = changeset.summary .replace(/^\s*(?:pr|pull|pull\s+request):\s*#?(\d+)/im, (_, pr) => { - let num = Number(pr); - if (!isNaN(num)) prFromSummary = num; + const num = Number(pr); + if (!isNaN(num)) { + prFromSummary = num; + } return ''; }) .replace(/^\s*commit:\s*([^\s]+)/im, (_, commit) => { commitFromSummary = commit; return ''; }) - .replace(/^\s*(?:author|user):\s*@?([^\s]+)/gim, (_, user) => { - usersFromSummary.push(user); + .replace(/^\s*(?:author|user):\s*@?([^\s]+)/gim, () => { return ''; }) .trim(); @@ -87,6 +88,7 @@ const gitHubChangelogFunctions = { const links = await (async () => { if (prFromSummary !== undefined) { + // eslint-disable-next-line no-shadow let { links } = await getInfoFromPullRequest({ repo: options.repo, pull: prFromSummary, @@ -101,7 +103,8 @@ const gitHubChangelogFunctions = { } const commitToFetchFrom = commitFromSummary || changeset.commit; if (commitToFetchFrom) { - let { links } = await getInfo({ + // eslint-disable-next-line no-shadow + const { links } = await getInfo({ repo: options.repo, commit: commitToFetchFrom, }); @@ -128,6 +131,7 @@ const gitHubChangelogFunctions = { if (process.env.GITHUB_TOKEN) { module.exports = gitHubChangelogFunctions; } else { + // eslint-disable-next-line no-console console.warn( `Defaulting to Git-based versioning. Enable GitHub-based versioning by setting the GITHUB_TOKEN environment variable. diff --git a/.changeset/inject.js b/.changeset/inject.js index 8c3f7213f..a59ea202e 100644 --- a/.changeset/inject.js +++ b/.changeset/inject.js @@ -1,4 +1,5 @@ // Hack to add a preamble from .changeset/.PREAMBLE.md to the CHANGELOG.md for a given release +/* eslint-disable no-sync */ const fs = require('fs'); diff --git a/.changeset/rich-chairs-wink.md b/.changeset/rich-chairs-wink.md new file mode 100644 index 000000000..db2f06bab --- /dev/null +++ b/.changeset/rich-chairs-wink.md @@ -0,0 +1,20 @@ +--- +'skuba': minor +--- + +lint: Replace `.buildkite/` files with duplicated YAML merge keys, for example: + +```yaml +# Before +- <<: *deploy + <<: *docker + label: stuff + +# After +- <<: [*deploy, *docker] + label: stuff +``` + +This should have no functional change, and is to support standardised YAML parsing across different tools, including the latest ESLint upgrades. + +This migration will not be capture all cases of this (e.g. if there are keys between the merge keys). If you have other cases, update them following the example above. diff --git a/.changeset/thick-taxis-vanish.md b/.changeset/thick-taxis-vanish.md new file mode 100644 index 000000000..936e056f3 --- /dev/null +++ b/.changeset/thick-taxis-vanish.md @@ -0,0 +1,16 @@ +--- +'eslint-config-skuba': major +--- + +Migrate to ESLint 9, `@typescript-eslint` 8, `eslint-config-seek` 14. + +These changes may affect your project setup if customising your ESLint configuration. See the individual migration guides: + +- https://eslint.org/docs/latest/use/migrate-to-9.0.0 +- https://typescript-eslint.io/blog/announcing-typescript-eslint-v8 + +Through these major upgrades, some lint rules have changed or have been renamed. You will likely need to adjust your code after running ESLint. + +As part of this migration, this project has migrated to Flat ESLint configuration. Read the migration: https://eslint.org/docs/latest/use/configure/migration-guide. + +Furthermore, `eslint-plugin-import` has been replaced with `eslint-plugin-import-x`. To migrate, any references to `eslint-plugin-import` should be replaced with `eslint-plugin-import-x`, and `import/` rules with `import-x/`. diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index a680095f6..000000000 --- a/.eslintignore +++ /dev/null @@ -1,20 +0,0 @@ -# managed by skuba -.idea/* -.vscode/* - -.cdk.staging/ -.pnpm-store/ -.serverless/ -cdk.out/ -node_modules*/ - -/coverage*/ -/dist*/ -/lib*/ -/tmp*/ -# end managed by skuba - -/integration/base/ -/integration/format/ -/template/ -/packages/**/*/lib*/ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 9a81c7d0e..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,37 +0,0 @@ -const { ts } = require('eslint-config-seek/extensions'); - -module.exports = { - extends: ['skuba'], - overrides: [ - { - files: [`integration/**/*.{${ts}}`], - parser: '@typescript-eslint/parser', - parserOptions: { - // seek-oss/eslint-config-seek#124 - // typescript-eslint/typescript-eslint#3851 - allowAutomaticSingleRunInference: false, - }, - }, - { - files: [`src/**/*.{${ts}}`], - rules: { - 'no-restricted-imports': [ - 'error', - { - paths: [ - { - name: 'fs', - message: - 'Prefer fs-extra as it implements graceful-fs behaviour.', - }, - ], - }, - ], - }, - }, - ], - rules: { - // internal to skuba itself - 'no-process-exit': 'off', - }, -}; diff --git a/config/eslint.js b/config/eslint.js index 8ed57d8e6..35bf04c06 100644 --- a/config/eslint.js +++ b/config/eslint.js @@ -1,3 +1 @@ -module.exports = { - extends: ['skuba'], -}; +module.exports = require('eslint-config-skuba'); diff --git a/docs/cli/init.md b/docs/cli/init.md index 76dde73ef..3c1769604 100644 --- a/docs/cli/init.md +++ b/docs/cli/init.md @@ -158,13 +158,12 @@ Familiarise yourself with the directory structure that **skuba** has created: ├── app.test.ts ├── app.ts ├── .dockerignore -├── .eslintignore -├── .eslintrc.js ├── .gitignore ├── .nvmrc ├── .prettierignore ├── .prettierrc.js ├── Dockerfile +├── eslint.config.js ├── README.md ├── docker-compose.yml ├── jest.config.js diff --git a/docs/deep-dives/eslint.md b/docs/deep-dives/eslint.md index e7983eeeb..dca3d8993 100644 --- a/docs/deep-dives/eslint.md +++ b/docs/deep-dives/eslint.md @@ -24,16 +24,17 @@ Please contribute to the [eslint-config-seek] preset if you feel something is mi It may worthwhile starting with a discussion in [#typescriptification] to garner feedback. If you wish to enforce additional rules within a given codebase or team, -you can [extend] your `.eslintrc.js`: +you can [extend] your `eslint.config.js`: ```javascript -module.exports = { - extends: ['skuba'], - rules: { - // https://eslint.org/docs/rules/complexity - complexity: ['error', { max: 3 }], +module.exports = [ + ...require('eslint-config-skuba'), + { + rules: { + // Your custom rules here + }, }, -}; +]; ``` Let's check that our new rule has taken effect. diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..bded4203d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,56 @@ +const tsParser = require('@typescript-eslint/parser'); + +const skuba = require('eslint-config-skuba'); + +module.exports = [ + { + ignores: [ + 'integration/base/', + 'integration/format/', + 'template/', + 'packages/**/*/lib*/', + ], + }, + ...skuba, + { + rules: { + 'no-process-exit': 'off', + }, + }, + { + files: ['integration/**/*.{ts,cts,mts,tsx}'], + + languageOptions: { + parser: tsParser, + ecmaVersion: 5, + sourceType: 'script', + + parserOptions: { + allowAutomaticSingleRunInference: false, + }, + }, + }, + { + files: ['src/**/*.{ts,cts,mts,tsx}'], + + rules: { + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + name: 'fs', + message: + 'Prefer fs-extra as it implements graceful-fs behaviour.', + }, + { + name: 'fs/promises', + message: + 'Prefer fs-extra as it implements graceful-fs behaviour.', + }, + ], + }, + ], + }, + }, +]; diff --git a/package.json b/package.json index b7fcc0fa6..c1ae568f4 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ }, "dependencies": { "@esbuild-plugins/tsconfig-paths": "^0.1.0", + "@eslint/migrate-config": "^1.2.0", "@jest/types": "^29.0.0", "@octokit/graphql": "^8.0.0", "@octokit/graphql-schema": "^15.3.0", @@ -83,7 +84,7 @@ "ejs": "^3.1.6", "enquirer": "^2.3.6", "esbuild": "~0.24.0", - "eslint": "^8.56.0", + "eslint": "^9.11.1", "eslint-config-skuba": "workspace:*", "execa": "^5.0.0", "fast-glob": "^3.3.2", diff --git a/packages/eslint-config-skuba/.eslintignore b/packages/eslint-config-skuba/.eslintignore deleted file mode 100644 index aeb96d742..000000000 --- a/packages/eslint-config-skuba/.eslintignore +++ /dev/null @@ -1,15 +0,0 @@ -# managed by skuba -.idea/* -.vscode/* - -.cdk.staging/ -.pnpm-store/ -.serverless/ -cdk.out/ -node_modules*/ - -/coverage*/ -/dist*/ -/lib*/ -/tmp*/ -# end managed by skuba diff --git a/packages/eslint-config-skuba/eslint.config.js b/packages/eslint-config-skuba/eslint.config.js new file mode 100644 index 000000000..edac839e9 --- /dev/null +++ b/packages/eslint-config-skuba/eslint.config.js @@ -0,0 +1 @@ +module.exports = require('.'); diff --git a/packages/eslint-config-skuba/index.js b/packages/eslint-config-skuba/index.js index 7bdbbf4af..63831d9d7 100644 --- a/packages/eslint-config-skuba/index.js +++ b/packages/eslint-config-skuba/index.js @@ -1,151 +1,194 @@ -/** @type {{ js: string[], ts: string[] }} */ +const base = require('eslint-config-seek/base'); const extensions = require('eslint-config-seek/extensions'); +const jestPlugin = require('eslint-plugin-jest'); +const tsdoc = require('eslint-plugin-tsdoc'); +const eslintPluginYml = require('eslint-plugin-yml'); +const tseslint = require('typescript-eslint'); -const { js, ts } = extensions; - -/** @type {import('eslint').Linter.Config} */ -module.exports = { - extends: ['seek/base'], - ignorePatterns: [ - '**/.eslintrc.js', - - // Gantry resource files support non-standard syntax (Go templating) - '**/.gantry/**/*.yaml', - '**/.gantry/**/*.yml', - '**/gantry*.yaml', - '**/gantry*.yml', - ], - overrides: [ - { - extends: [ - 'plugin:@typescript-eslint/recommended-type-checked', - 'plugin:@typescript-eslint/stylistic-type-checked', - ], - files: [`*.{${ts.join(',')}}`], - parserOptions: { - project: true, - }, - rules: { - '@typescript-eslint/consistent-type-exports': 'error', - '@typescript-eslint/no-floating-promises': 'error', - // allow || on strings and booleans - '@typescript-eslint/prefer-nullish-coalescing': [ - 'error', - { - ignorePrimitives: { string: true, boolean: true }, +const { js: jsExtensions, ts: tsExtensions } = extensions; + +module.exports = [ + { plugins: { jest: jestPlugin } }, + { + ignores: [ + // Gantry resource files support non-standard syntax (Go templating) + '**/.gantry/**/*.yaml', + '**/.gantry/**/*.yml', + '**/gantry*.yaml', + '**/gantry*.yml', + '.idea/*', + '.vscode/*', + '**/.cdk.staging/', + '**/.pnpm-store/', + '**/.serverless/', + '**/cdk.out/', + '**/node_modules*/', + 'coverage*/', + 'dist*/', + 'lib*/', + 'tmp*/', + ], + }, + ...base.map(({ plugins: { jest: _jest, ...restPlugins } = {}, ...conf }) => ({ + ...conf, + plugins: restPlugins, + })), + { + rules: { + 'import-x/no-duplicates': 'error', + + 'import-x/order': [ + 'error', + { + alphabetize: { + order: 'asc', }, - ], - // prefer type assertions over null assertions - '@typescript-eslint/no-non-null-assertion': 'error', - '@typescript-eslint/non-nullable-type-assertion-style': 'off', - // too spicy 🌶️ - '@typescript-eslint/consistent-type-definitions': 'off', - }, + 'newlines-between': 'always', + + pathGroups: [ + { + group: 'external', + pattern: 'src', + position: 'after', + }, + { + group: 'external', + pattern: 'src/**', + position: 'after', + }, + ], + + pathGroupsExcludedImportTypes: ['builtin'], + }, + ], + + 'jest/expect-expect': 'off', + 'jest/no-deprecated-functions': 'error', + 'jest/prefer-expect-resolves': 'error', + 'jest/prefer-spy-on': 'error', + 'jest/prefer-strict-equal': 'off', + 'jest/prefer-to-be': 'error', + 'jest/prefer-to-contain': 'error', + 'jest/prefer-to-have-length': 'error', + 'jest/prefer-todo': 'error', + 'jest/valid-title': 'error', + 'no-use-before-define': 'off', + + // https://github.com/prettier/eslint-config-prettier/blob/v8.5.0/README.md#quotes + quotes: [ + 'warn', + 'single', + { + allowTemplateLiterals: false, + avoidEscape: true, + }, + ], + + 'sort-imports': [ + 'error', + { + ignoreDeclarationSort: true, + }, + ], }, - { - files: [`*.{${js.join(',')}}`], - rules: { - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - 'import/no-unresolved': 'off', + }, + ...[ + ...tseslint.configs.recommendedTypeChecked, + ...tseslint.configs.stylisticTypeChecked, + ].map((config) => ({ + ...config, + files: [`**/*.{${tsExtensions}}`], + })), + { + files: [`**/*.{${tsExtensions}}`], + + languageOptions: { + ecmaVersion: 5, + sourceType: 'script', + + parserOptions: { + projectService: true, }, }, - { - files: [`*.{${ts.join(',')}}`], - plugins: ['eslint-plugin-tsdoc'], - rules: { - 'tsdoc/syntax': 'error', - }, + + rules: { + '@typescript-eslint/consistent-type-exports': 'error', + '@typescript-eslint/no-floating-promises': 'error', + // allow || on strings and booleans + '@typescript-eslint/prefer-nullish-coalescing': [ + 'error', + { + ignorePrimitives: { + string: true, + boolean: true, + }, + }, + ], + // prefer type assertions over null assertions + '@typescript-eslint/no-non-null-assertion': 'error', + '@typescript-eslint/non-nullable-type-assertion-style': 'off', + // too spicy 🌶️ + '@typescript-eslint/consistent-type-definitions': 'off', }, - { - files: [`*.test.{${ts.join(',')}}`, `**/testing/**/*.{${ts.join(',')}}`], - rules: { - // Allow `any` in tests - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-explicit-any': 'off', - - // Allow ! in tests - '@typescript-eslint/no-non-null-assertion': 'off', - - // Allow e.g. `expect(logger.child).toBeCalledWith()` - '@typescript-eslint/unbound-method': 'off', - - // Allow backtick default in `expect().toMatchInlineSnapshot()` - quotes: 'off', - - // Allow e.g. `/** @jest-environment jsdom */` directives - 'tsdoc/syntax': 'off', - - // Allow potential floating promises in tests only for Koa compatibility - // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-misused-promises.md#checksvoidreturn - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/42551#issuecomment-648816869 - '@typescript-eslint/no-misused-promises': [ - 'error', - { checksVoidReturn: false }, - ], - }, + }, + { + files: [`**/*.{${jsExtensions}}`], + + rules: { + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', }, - { - extends: ['plugin:yml/prettier'], - files: ['*.{yaml,yml}'], + }, + { + files: [`**/*.{${tsExtensions}}`], + + plugins: { + tsdoc, }, - ], - rules: { - 'import/no-duplicates': 'error', - 'import/order': [ - 'error', - { - alphabetize: { - order: 'asc', - }, - 'newlines-between': 'always', - pathGroups: [ - { - group: 'external', - pattern: 'src', - position: 'after', - }, - { - group: 'external', - pattern: 'src/**', - position: 'after', - }, - ], - pathGroupsExcludedImportTypes: ['builtin'], - }, - ], - 'jest/expect-expect': 'off', - 'jest/no-deprecated-functions': 'error', - 'jest/prefer-expect-resolves': 'error', - 'jest/prefer-spy-on': 'error', - 'jest/prefer-strict-equal': 'off', - 'jest/prefer-to-be': 'error', - 'jest/prefer-to-contain': 'error', - 'jest/prefer-to-have-length': 'error', - 'jest/prefer-todo': 'error', - 'jest/valid-title': 'error', - - 'no-use-before-define': 'off', - - // https://github.com/prettier/eslint-config-prettier/blob/v8.5.0/README.md#quotes - quotes: [ - 'warn', - 'single', - { allowTemplateLiterals: false, avoidEscape: true }, - ], + rules: { + 'tsdoc/syntax': 'error', + }, + }, + { + files: [`**/*.test.{${tsExtensions}}`, `**/testing/**/*.{${tsExtensions}}`], - 'sort-imports': [ - 'error', - { - ignoreDeclarationSort: true, - }, - ], + rules: { + // Allow `any` in tests + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-explicit-any': 'off', + + // Allow ! in tests + '@typescript-eslint/no-non-null-assertion': 'off', + + // Allow e.g. `expect(logger.child).toBeCalledWith()` + '@typescript-eslint/unbound-method': 'off', + + // Allow backtick default in `expect().toMatchInlineSnapshot()` + quotes: 'off', + + // Allow e.g. `/** @jest-environment jsdom */` directives + 'tsdoc/syntax': 'off', + + // Allow potential floating promises in tests only for Koa compatibility + // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-misused-promises.md#checksvoidreturn + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/42551#issuecomment-648816869 + '@typescript-eslint/no-misused-promises': [ + 'error', + { + checksVoidReturn: false, + }, + ], + }, }, -}; + ...eslintPluginYml.configs['flat/prettier'].map((config) => ({ + ...config, + files: ['**/*.{yaml,yml}'], + })), +]; diff --git a/packages/eslint-config-skuba/package.json b/packages/eslint-config-skuba/package.json index 23d47d8d6..98c342c56 100644 --- a/packages/eslint-config-skuba/package.json +++ b/packages/eslint-config-skuba/package.json @@ -26,21 +26,19 @@ "skuba": "node --experimental-vm-modules ../../lib/skuba" }, "dependencies": { - "@types/eslint": "^8.4.1", - "@typescript-eslint/eslint-plugin": "^7.14.1", - "@typescript-eslint/parser": "^7.14.1", - "eslint-config-seek": "^13.0.0", - "eslint-plugin-jest": "^28.0.0", + "eslint-config-seek": "^14.0.0", + "eslint-plugin-jest": "^28.8.3", "eslint-plugin-tsdoc": "^0.3.0", - "eslint-plugin-yml": "^1.5.0" + "eslint-plugin-yml": "^1.14.0", + "typescript-eslint": "^8.6.0" }, "devDependencies": { - "eslint": "^9.0.0", + "eslint": "^9.11.1", "typescript": "~5.6.0" }, "peerDependencies": { - "eslint": ">=8.56.0", - "typescript": ">=4.7.5" + "eslint": ">=9.11.1", + "typescript": ">=5.5.4" }, "packageManager": "pnpm@9.11.0", "engines": { @@ -53,6 +51,6 @@ "entryPoint": "index.js", "template": "oss-npm-package", "type": "package", - "version": "7.5.1" + "version": "8.2.1" } } diff --git a/packages/eslint-config-skuba/tsconfig.json b/packages/eslint-config-skuba/tsconfig.json index 7e31225e0..f39954b06 100644 --- a/packages/eslint-config-skuba/tsconfig.json +++ b/packages/eslint-config-skuba/tsconfig.json @@ -6,5 +6,5 @@ }, "exclude": ["lib*/**/*"], "extends": "../../config/tsconfig.json", - "include": [".eslintrc.js", "index.d.ts", "index.js"] + "include": ["eslint.config.js", "index.d.ts", "index.js"] } diff --git a/packages/skuba-dive/.eslintignore b/packages/skuba-dive/.eslintignore deleted file mode 100644 index aeb96d742..000000000 --- a/packages/skuba-dive/.eslintignore +++ /dev/null @@ -1,15 +0,0 @@ -# managed by skuba -.idea/* -.vscode/* - -.cdk.staging/ -.pnpm-store/ -.serverless/ -cdk.out/ -node_modules*/ - -/coverage*/ -/dist*/ -/lib*/ -/tmp*/ -# end managed by skuba diff --git a/packages/skuba-dive/.eslintrc.js b/packages/skuba-dive/.eslintrc.js deleted file mode 100644 index 8ed57d8e6..000000000 --- a/packages/skuba-dive/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ['skuba'], -}; diff --git a/packages/skuba-dive/eslint.config.js b/packages/skuba-dive/eslint.config.js new file mode 100644 index 000000000..35bf04c06 --- /dev/null +++ b/packages/skuba-dive/eslint.config.js @@ -0,0 +1 @@ +module.exports = require('eslint-config-skuba'); diff --git a/packages/skuba-dive/package.json b/packages/skuba-dive/package.json index 2a2d7940d..d6aa3f40b 100644 --- a/packages/skuba-dive/package.json +++ b/packages/skuba-dive/package.json @@ -44,6 +44,6 @@ "entryPoint": "src/index.ts", "template": "oss-npm-package", "type": "package", - "version": "7.5.0" + "version": "8.2.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 060532c07..3ac3baf73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@esbuild-plugins/tsconfig-paths': specifier: ^0.1.0 version: 0.1.2(esbuild@0.24.0)(typescript@5.6.2) + '@eslint/migrate-config': + specifier: ^1.2.0 + version: 1.3.0 '@jest/types': specifier: ^29.0.0 version: 29.6.3 @@ -51,8 +54,8 @@ importers: specifier: ~0.24.0 version: 0.24.0 eslint: - specifier: ^8.56.0 - version: 8.57.0 + specifier: ^9.11.1 + version: 9.11.1 eslint-config-skuba: specifier: workspace:* version: link:packages/eslint-config-skuba @@ -142,7 +145,7 @@ importers: version: 2.2.0 ts-jest: specifier: ^29.1.0 - version: 29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.24.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.1.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.24.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.16.5)(typescript@5.6.2) @@ -252,31 +255,25 @@ importers: packages/eslint-config-skuba: dependencies: - '@types/eslint': - specifier: ^8.4.1 - version: 8.56.10 - '@typescript-eslint/eslint-plugin': - specifier: ^7.14.1 - version: 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/parser': - specifier: ^7.14.1 - version: 7.14.1(eslint@9.10.0)(typescript@5.6.2) eslint-config-seek: - specifier: ^13.0.0 - version: 13.1.0(eslint@9.10.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) + specifier: ^14.0.0 + version: 14.0.0(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2))(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) eslint-plugin-jest: - specifier: ^28.0.0 - version: 28.6.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) + specifier: ^28.8.3 + version: 28.8.3(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) eslint-plugin-tsdoc: specifier: ^0.3.0 version: 0.3.0 eslint-plugin-yml: - specifier: ^1.5.0 - version: 1.14.0(eslint@9.10.0) + specifier: ^1.14.0 + version: 1.14.0(eslint@9.11.1) + typescript-eslint: + specifier: ^8.6.0 + version: 8.6.0(eslint@9.11.1)(typescript@5.6.2) devDependencies: eslint: - specifier: ^9.0.0 - version: 9.10.0 + specifier: ^9.11.1 + version: 9.11.1 typescript: specifier: ~5.6.0 version: 5.6.2 @@ -326,7 +323,7 @@ importers: version: 11.2.1 skuba: specifier: '*' - version: 8.0.1(@babel/core@7.24.7)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.24.7))(skuba-dive@2.0.0) + version: 8.0.1(@babel/core@7.25.2)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.25.2))(skuba-dive@2.0.0) supertest: specifier: ^7.0.0 version: 7.0.0 @@ -339,10 +336,10 @@ importers: devDependencies: '@types/node': specifier: ^20.9.0 - version: 20.16.5 + version: 20.14.5 skuba: specifier: '*' - version: 8.0.1(@babel/core@7.24.7)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.24.7))(skuba-dive@2.0.0) + version: 8.0.1(@babel/core@7.25.2)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.25.2))(skuba-dive@2.0.0) template/koa-rest-api: dependencies: @@ -427,7 +424,7 @@ importers: version: 11.2.1 skuba: specifier: '*' - version: 8.0.1(@babel/core@7.24.7)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.24.7))(skuba-dive@2.0.0) + version: 8.0.1(@babel/core@7.25.2)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.25.2))(skuba-dive@2.0.0) supertest: specifier: ^7.0.0 version: 7.0.0 @@ -494,7 +491,7 @@ importers: version: 2.0.2(serverless@3.39.0(encoding@0.1.13)) skuba: specifier: '*' - version: 8.0.1(@babel/core@7.24.7)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.24.7))(skuba-dive@2.0.0) + version: 8.0.1(@babel/core@7.25.2)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.25.2))(skuba-dive@2.0.0) template/lambda-sqs-worker-cdk: dependencies: @@ -540,7 +537,7 @@ importers: version: 11.2.1 skuba: specifier: '*' - version: 8.0.1(@babel/core@7.24.7)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.24.7))(skuba-dive@2.0.0) + version: 8.0.1(@babel/core@7.25.2)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.25.2))(skuba-dive@2.0.0) packages: @@ -797,51 +794,39 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.7': - resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.7': - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.24.7': - resolution: {integrity: sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==} + '@babel/eslint-parser@7.25.1': + resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.24.7': - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.24.7': - resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.7': - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -854,24 +839,20 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.7': - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.7': - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.7': - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': @@ -883,6 +864,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -990,16 +976,16 @@ packages: resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.7': - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.7': - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.7': - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1530,18 +1516,22 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/compat@1.1.1': + resolution: {integrity: sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.18.0': resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1554,16 +1544,21 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.10.0': - resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} + '@eslint/js@9.11.1': + resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/migrate-config@1.3.0': + resolution: {integrity: sha512-8461PwdLhTkPuvRlaTZT0qhu3U1zZi/80CW3OPzPjnHKURpHdTlpll9uWIQCMST2kUWsDaCqsK8PWCiLO3wNYg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.1.0': - resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@4.0.1': @@ -1754,7 +1749,6 @@ packages: '@koa/router@12.0.1': resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==} engines: {node: '>= 12'} - deprecated: Use v12.0.2 or higher to fix the vulnerability issue '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -1795,6 +1789,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@npmcli/agent@2.2.2': resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} @@ -2554,6 +2552,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/express-serve-static-core@4.19.3': resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} @@ -2656,6 +2657,9 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.14.5': + resolution: {integrity: sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==} + '@types/node@20.16.5': resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} @@ -2763,6 +2767,17 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@8.6.0': + resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@7.14.1': resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2773,18 +2788,32 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.6.0': + resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.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@7.13.1': - resolution: {integrity: sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@7.14.1': resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.4.0': + resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.6.0': + resolution: {integrity: sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@7.14.1': resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2795,18 +2824,31 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@8.6.0': + resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@7.13.1': - resolution: {integrity: sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@7.14.1': resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.4.0': + resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.6.0': + resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@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} @@ -2816,8 +2858,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.13.1': - resolution: {integrity: sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==} + '@typescript-eslint/typescript-estree@7.14.1': + resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -2825,9 +2867,18 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.14.1': - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.4.0': + resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.6.0': + resolution: {integrity: sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2840,30 +2891,40 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@7.13.1': - resolution: {integrity: sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - '@typescript-eslint/utils@7.14.1': resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 + '@typescript-eslint/utils@8.4.0': + resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/utils@8.6.0': + resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@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} - '@typescript-eslint/visitor-keys@7.13.1': - resolution: {integrity: sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@7.14.1': resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.4.0': + resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.6.0': + resolution: {integrity: sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -3055,9 +3116,6 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} @@ -3084,6 +3142,10 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} @@ -3333,6 +3395,10 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001636: resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} @@ -4090,6 +4156,12 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-config-seek@13.1.0: resolution: {integrity: sha512-1mAZd62xAc7d3y1Hgh0RTgzvZAD/kG2u+5JLpezT8r27NvfsFksvC1rSc1yU5Xmh2wBEImRC33J8tGGd9QFsew==} engines: {node: '>=18.18.0'} @@ -4097,6 +4169,13 @@ packages: eslint: '>=8.56.0' typescript: '>=4.7.5' + eslint-config-seek@14.0.0: + resolution: {integrity: sha512-3bYlLJeJBGwzU5cZv1nydp2mFYSkx4pz/X3ma1qSrvQy8DjMB16SGGkueedQfe3I+iwdpzdPbx9i9ZzeQCNCSw==} + engines: {node: '>=18.18.0'} + peerDependencies: + eslint: '>=9.9.1' + typescript: '>=5.5.4' + eslint-config-skuba@4.0.0: resolution: {integrity: sha512-4ZXgujubXw90CF9PcgJg7g3KLPcrvA/ED7X3FawC4Z3dcgK87BkWbJ8RDz4xl8Ao4TR9OmHfLJgV5418A9q7vw==} engines: {node: '>=18.18.0'} @@ -4114,6 +4193,19 @@ packages: eslint: '*' eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.6.3: + resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + eslint-module-utils@2.8.1: resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} @@ -4135,11 +4227,17 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-cypress@3.3.0: - resolution: {integrity: sha512-HPHMPzYBIshzJM8wqgKSKHG2p/8R0Gbg4Pb3tcdC9WrmkuqxiKxSKbjunUrajhV5l7gCIFrh1P7C7GuBqH6YuQ==} + eslint-plugin-cypress@3.5.0: + resolution: {integrity: sha512-JZQ6XnBTNI8h1B9M7wJSFzc48SYbh7VMMKaNTQOFa3BQlnmXPrVc4PKen8R+fpv6VleiPeej6VxloGb42zdRvw==} peerDependencies: eslint: '>=7' + eslint-plugin-import-x@4.2.1: + resolution: {integrity: sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + eslint-plugin-import@2.29.1: resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} @@ -4163,11 +4261,11 @@ packages: jest: optional: true - eslint-plugin-jest@28.6.0: - resolution: {integrity: sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==} + eslint-plugin-jest@28.8.3: + resolution: {integrity: sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 + '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 jest: '*' peerDependenciesMeta: @@ -4182,11 +4280,11 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.34.2: - resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} + eslint-plugin-react@7.35.2: + resolution: {integrity: sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-plugin-tsdoc@0.2.17: resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} @@ -4229,8 +4327,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - eslint@9.10.0: - resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} + eslint@9.11.1: + resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4774,6 +4872,10 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -5117,6 +5219,9 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-bun-module@1.1.0: + resolution: {integrity: sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6312,10 +6417,6 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - object.values@1.2.0: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} @@ -6849,6 +6950,10 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + redeyed@2.1.1: resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} @@ -7378,6 +7483,9 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -7434,6 +7542,9 @@ packages: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} 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.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -7631,6 +7742,9 @@ packages: tiny-async-pool@2.1.0: resolution: {integrity: sha512-ltAHPh/9k0STRQqaoUX52NH4ZQYAJz24ZAEwf1Zm+HYg3l9OXTWeqWKyYsHu40wF/F0rxd2N2bk5sLvX2qlSvg==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tlhunter-sorted-set@0.1.0: resolution: {integrity: sha512-eGYW4bjf1DtrHzUYxYfAcSytpOkA44zsr7G2n3PV7yOUR23vmkGe3LL4R+1jL9OsXtbsFOwe8XtbCrabeaEFnw==} @@ -7861,6 +7975,15 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript-eslint@8.6.0: + resolution: {integrity: sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -7882,6 +8005,9 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -8286,7 +8412,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -8334,7 +8460,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -8479,7 +8605,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -8571,7 +8697,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -8716,7 +8842,7 @@ snapshots: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-bucket-endpoint': 3.598.0 '@aws-sdk/middleware-expect-continue': 3.598.0 '@aws-sdk/middleware-flexible-checksums': 3.598.0 @@ -8916,7 +9042,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -9050,7 +9176,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/core': 3.598.0 - '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-node': 3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/middleware-host-header': 3.598.0 '@aws-sdk/middleware-logger': 3.598.0 '@aws-sdk/middleware-recursion-detection': 3.598.0 @@ -9146,13 +9272,13 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0)': + '@aws-sdk/credential-provider-ini@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0)': dependencies: '@aws-sdk/client-sts': 3.600.0 '@aws-sdk/credential-provider-env': 3.598.0 '@aws-sdk/credential-provider-http': 3.598.0 '@aws-sdk/credential-provider-process': 3.598.0 - '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/types': 3.598.0 '@smithy/credential-provider-imds': 3.1.1 @@ -9183,13 +9309,13 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.600.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0)': + '@aws-sdk/credential-provider-node@3.600.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0)': dependencies: '@aws-sdk/credential-provider-env': 3.598.0 '@aws-sdk/credential-provider-http': 3.598.0 - '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))(@aws-sdk/client-sts@3.600.0) + '@aws-sdk/credential-provider-ini': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0)(@aws-sdk/client-sts@3.600.0) '@aws-sdk/credential-provider-process': 3.598.0 - '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/credential-provider-sso': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/credential-provider-web-identity': 3.598.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/types': 3.598.0 '@smithy/credential-provider-imds': 3.1.1 @@ -9223,10 +9349,10 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-sso@3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))': + '@aws-sdk/credential-provider-sso@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: '@aws-sdk/client-sso': 3.598.0 - '@aws-sdk/token-providers': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0)) + '@aws-sdk/token-providers': 3.598.0(@aws-sdk/client-sso-oidc@3.600.0) '@aws-sdk/types': 3.598.0 '@smithy/property-provider': 3.1.1 '@smithy/shared-ini-file-loader': 3.1.1 @@ -9398,7 +9524,7 @@ snapshots: '@smithy/types': 3.1.0 tslib: 2.6.3 - '@aws-sdk/token-providers@3.598.0(@aws-sdk/client-sso-oidc@3.600.0(@aws-sdk/client-sts@3.600.0))': + '@aws-sdk/token-providers@3.598.0(@aws-sdk/client-sso-oidc@3.600.0)': dependencies: '@aws-sdk/client-sso-oidc': 3.600.0(@aws-sdk/client-sts@3.600.0) '@aws-sdk/types': 3.598.0 @@ -9451,20 +9577,20 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - '@babel/compat-data@7.24.7': {} + '@babel/compat-data@7.25.4': {} - '@babel/core@7.24.7': + '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 debug: 4.3.5(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -9473,69 +9599,47 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.24.7(@babel/core@7.24.7)(eslint@8.57.0)': + '@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.0)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/eslint-parser@7.24.7(@babel/core@7.24.7)(eslint@9.10.0)': - dependencies: - '@babel/core': 7.24.7 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.10.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - - '@babel/generator@7.24.7': + '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 - '@babel/helper-compilation-targets@7.24.7': + '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.24.7 - '@babel/helper-validator-option': 7.24.7 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-function-name@7.24.7': - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - - '@babel/helper-hoist-variables@7.24.7': - dependencies: - '@babel/types': 7.24.7 - '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -9543,25 +9647,21 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-string-parser@7.24.7': {} + '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.24.7': {} + '@babel/helper-validator-option@7.24.8': {} - '@babel/helpers@7.24.7': + '@babel/helpers@7.25.6': dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 '@babel/highlight@7.24.7': dependencies: @@ -9572,116 +9672,120 @@ snapshots: '@babel/parser@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': + '@babel/parser@7.25.6': dependencies: - '@babel/core': 7.24.7 + '@babel/types': 7.25.6 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/types': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - '@babel/preset-react@7.24.7(@babel/core@7.24.7)': + '@babel/preset-react@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-validator-option': 7.24.7 - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.24.7) + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -9689,30 +9793,27 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.7': + '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - '@babel/traverse@7.24.7': + '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 debug: 4.3.5(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.7': + '@babel/types@7.25.6': dependencies: - '@babel/helper-string-parser': 7.24.7 + '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 @@ -10197,15 +10298,15 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1)': dependencies: - eslint: 9.10.0 + eslint: 9.11.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.1': {} - '@eslint-community/regexpp@4.11.0': {} + '@eslint/compat@1.1.1': {} + '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 @@ -10214,6 +10315,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/core@0.6.0': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -10244,11 +10347,20 @@ snapshots: '@eslint/js@8.57.0': {} - '@eslint/js@9.10.0': {} + '@eslint/js@9.11.1': {} + + '@eslint/migrate-config@1.3.0': + dependencies: + '@eslint/compat': 1.1.1 + '@eslint/eslintrc': 3.1.0 + camelcase: 8.0.0 + recast: 0.23.9 + transitivePeerDependencies: + - supports-color '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.1.0': + '@eslint/plugin-kit@0.2.0': dependencies: levn: 0.4.1 @@ -10502,7 +10614,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -10637,6 +10749,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nolyfill/is-core-module@1.0.39': {} + '@npmcli/agent@2.2.2': dependencies: agent-base: 7.1.1 @@ -11689,24 +11803,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@types/body-parser@1.19.5': dependencies: @@ -11762,6 +11876,8 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/express-serve-static-core@4.19.3': dependencies: '@types/node': 20.16.5 @@ -11883,6 +11999,10 @@ snapshots: '@types/node@12.20.55': {} + '@types/node@20.14.5': + dependencies: + undici-types: 5.26.5 + '@types/node@20.16.5': dependencies: undici-types: 6.19.8 @@ -11988,7 +12108,7 @@ snapshots: '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.14.1 '@typescript-eslint/type-utils': 7.14.1(eslint@8.57.0)(typescript@5.4.5) @@ -12004,15 +12124,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.14.1(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 7.14.1 - eslint: 9.10.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.6.0 + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.6.0 + eslint: 9.11.1 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -12035,14 +12155,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/scope-manager': 8.6.0 + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.6.0 debug: 4.3.5(supports-color@8.1.1) - eslint: 9.10.0 + eslint: 9.11.1 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -12053,16 +12173,21 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@7.13.1': - dependencies: - '@typescript-eslint/types': 7.13.1 - '@typescript-eslint/visitor-keys': 7.13.1 - '@typescript-eslint/scope-manager@7.14.1': dependencies: '@typescript-eslint/types': 7.14.1 '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/scope-manager@8.4.0': + dependencies: + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 + + '@typescript-eslint/scope-manager@8.6.0': + dependencies: + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/type-utils@7.14.1(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) @@ -12075,24 +12200,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.14.1(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.6.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.1)(typescript@5.6.2) debug: 4.3.5(supports-color@8.1.1) - eslint: 9.10.0 ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: + - eslint - supports-color '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.13.1': {} - '@typescript-eslint/types@7.14.1': {} + '@typescript-eslint/types@8.4.0': {} + + '@typescript-eslint/types@8.6.0': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -12107,26 +12234,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@7.14.1(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.5(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.4 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.6.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.13.1(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.4.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 7.13.1 - '@typescript-eslint/visitor-keys': 7.13.1 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 debug: 4.3.5(supports-color@8.1.1) - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.3 @@ -12136,27 +12264,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 - debug: 4.3.5(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/visitor-keys': 8.6.0 debug: 4.3.5(supports-color@8.1.1) - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.3 @@ -12181,32 +12294,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@5.62.0(eslint@9.10.0)(typescript@5.6.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.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.6.2) - eslint: 9.10.0 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.13.1(eslint@9.10.0)(typescript@5.6.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) - '@typescript-eslint/scope-manager': 7.13.1 - '@typescript-eslint/types': 7.13.1 - '@typescript-eslint/typescript-estree': 7.13.1(typescript@5.6.2) - eslint: 9.10.0 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@7.14.1(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -12218,13 +12305,24 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.14.1(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/utils@8.4.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) - eslint: 9.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.2) + eslint: 9.11.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.6.0(eslint@9.11.1)(typescript@5.6.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) + '@typescript-eslint/scope-manager': 8.6.0 + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) + eslint: 9.11.1 transitivePeerDependencies: - supports-color - typescript @@ -12234,14 +12332,19 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.13.1': + '@typescript-eslint/visitor-keys@7.14.1': dependencies: - '@typescript-eslint/types': 7.13.1 + '@typescript-eslint/types': 7.14.1 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.14.1': + '@typescript-eslint/visitor-keys@8.4.0': dependencies: - '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/types': 8.4.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@8.6.0': + dependencies: + '@typescript-eslint/types': 8.6.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -12464,13 +12567,6 @@ snapshots: es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - array.prototype.toreversed@1.1.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 @@ -12504,6 +12600,10 @@ snapshots: dependencies: tslib: 2.6.3 + ast-types@0.16.1: + dependencies: + tslib: 2.6.3 + async-lock@1.4.1: {} async-retry@1.3.1: @@ -12571,13 +12671,13 @@ snapshots: transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.24.7): + babel-jest@29.7.0(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.7) + babel-preset-jest: 29.6.3(@babel/core@7.25.2) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -12596,32 +12696,32 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): - dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) - - babel-preset-jest@29.6.3(@babel/core@7.24.7): - dependencies: - '@babel/core': 7.24.7 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + + babel-preset-jest@29.6.3(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) bail@2.0.2: {} @@ -12819,6 +12919,8 @@ snapshots: camelcase@6.3.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001636: {} cardinal@2.1.1: @@ -13759,33 +13861,33 @@ snapshots: eslint: 8.57.0 semver: 7.6.3 - eslint-compat-utils@0.5.1(eslint@9.10.0): + eslint-compat-utils@0.5.1(eslint@9.11.1): dependencies: - eslint: 9.10.0 + eslint: 9.11.1 semver: 7.6.3 eslint-config-prettier@8.10.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - eslint-config-prettier@8.10.0(eslint@9.10.0): + eslint-config-prettier@9.1.0(eslint@9.11.1): dependencies: - eslint: 9.10.0 + eslint: 9.11.1 eslint-config-seek@13.1.0(eslint@8.57.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5): dependencies: - '@babel/core': 7.24.7 - '@babel/eslint-parser': 7.24.7(@babel/core@7.24.7)(eslint@8.57.0) - '@babel/preset-react': 7.24.7(@babel/core@7.24.7) + '@babel/core': 7.25.2 + '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) + '@babel/preset-react': 7.24.7(@babel/core@7.25.2) '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-config-prettier: 8.10.0(eslint@8.57.0) eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-cypress: 3.3.0(eslint@8.57.0) + eslint-plugin-cypress: 3.5.0(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5) - eslint-plugin-react: 7.34.2(eslint@8.57.0) + eslint-plugin-react: 7.35.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) find-root: 1.1.0 typescript: 5.4.5 @@ -13795,26 +13897,26 @@ snapshots: - jest - supports-color - eslint-config-seek@13.1.0(eslint@9.10.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): - dependencies: - '@babel/core': 7.24.7 - '@babel/eslint-parser': 7.24.7(@babel/core@7.24.7)(eslint@9.10.0) - '@babel/preset-react': 7.24.7(@babel/core@7.24.7) - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/parser': 7.14.1(eslint@9.10.0)(typescript@5.6.2) - eslint: 9.10.0 - eslint-config-prettier: 8.10.0(eslint@9.10.0) - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0) - eslint-plugin-cypress: 3.3.0(eslint@9.10.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@9.10.0) - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) - eslint-plugin-react: 7.34.2(eslint@9.10.0) - eslint-plugin-react-hooks: 4.6.2(eslint@9.10.0) - find-root: 1.1.0 + eslint-config-seek@14.0.0(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2))(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): + dependencies: + '@eslint/compat': 1.1.1 + eslint: 9.11.1 + eslint-config-prettier: 9.1.0(eslint@9.11.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1) + eslint-plugin-cypress: 3.5.0(eslint@9.11.1) + eslint-plugin-import-x: 4.2.1(eslint@9.11.1)(typescript@5.6.2) + eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2) + eslint-plugin-react: 7.35.2(eslint@9.11.1) + eslint-plugin-react-hooks: 4.6.2(eslint@9.11.1) + globals: 15.9.0 typescript: 5.6.2 + typescript-eslint: 8.6.0(eslint@9.11.1)(typescript@5.6.2) transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack + - eslint-plugin-import - jest - supports-color @@ -13861,18 +13963,20 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1): dependencies: + '@nolyfill/is-core-module': 1.0.39 debug: 4.3.5(supports-color@8.1.1) enhanced-resolve: 5.17.1 - eslint: 9.10.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0))(eslint@9.10.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@9.10.0) + eslint: 9.11.1 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1))(eslint@9.11.1) + fast-glob: 3.3.2 get-tsconfig: 4.7.5 - globby: 13.2.2 - is-core-module: 2.13.1 + is-bun-module: 1.1.0 is-glob: 4.0.3 - synckit: 0.8.8 + optionalDependencies: + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1) + eslint-plugin-import-x: 4.2.1(eslint@9.11.1)(typescript@5.6.2) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -13890,27 +13994,54 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0))(eslint@9.10.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.14.1(eslint@9.10.0)(typescript@5.6.2) - eslint: 9.10.0 + '@typescript-eslint/parser': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + eslint: 9.11.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0) + transitivePeerDependencies: + - supports-color + optional: true + + eslint-module-utils@2.8.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1))(eslint@9.11.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + eslint: 9.11.1 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.11.1)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1))(eslint@9.11.1) transitivePeerDependencies: - supports-color - eslint-plugin-cypress@3.3.0(eslint@8.57.0): + eslint-plugin-cypress@3.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 globals: 13.24.0 - eslint-plugin-cypress@3.3.0(eslint@9.10.0): + eslint-plugin-cypress@3.5.0(eslint@9.11.1): dependencies: - eslint: 9.10.0 + eslint: 9.11.1 globals: 13.24.0 + eslint-plugin-import-x@4.2.1(eslint@9.11.1)(typescript@5.6.2): + dependencies: + '@typescript-eslint/utils': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + debug: 4.3.5(supports-color@8.1.1) + doctrine: 3.0.0 + eslint: 9.11.1 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.7.5 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.3 + stable-hash: 0.0.4 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): dependencies: array-includes: 3.1.8 @@ -13938,7 +14069,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@9.10.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -13946,9 +14077,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.10.0 + eslint: 9.11.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0))(eslint@9.10.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -13959,11 +14090,12 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.14.1(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/parser': 8.6.0(eslint@9.11.1)(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + optional: true eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5): dependencies: @@ -13976,23 +14108,12 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@9.10.0)(typescript@5.6.2) - eslint: 9.10.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) - jest: 29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): + eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: - '@typescript-eslint/utils': 7.13.1(eslint@9.10.0)(typescript@5.6.2) - eslint: 9.10.0 + '@typescript-eslint/utils': 8.4.0(eslint@9.11.1)(typescript@5.6.2) + eslint: 9.11.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2) jest: 29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) transitivePeerDependencies: - supports-color @@ -14002,53 +14123,53 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-hooks@4.6.2(eslint@9.10.0): + eslint-plugin-react-hooks@4.6.2(eslint@9.11.1): dependencies: - eslint: 9.10.0 + eslint: 9.11.1 - eslint-plugin-react@7.34.2(eslint@8.57.0): + eslint-plugin-react@7.35.2(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 eslint: 8.57.0 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.hasown: 1.1.4 object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 - eslint-plugin-react@7.34.2(eslint@9.10.0): + eslint-plugin-react@7.35.2(eslint@9.11.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 - eslint: 9.10.0 + eslint: 9.11.1 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.hasown: 1.1.4 object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 eslint-plugin-tsdoc@0.2.17: dependencies: @@ -14071,11 +14192,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@9.10.0): + eslint-plugin-yml@1.14.0(eslint@9.11.1): dependencies: debug: 4.3.5(supports-color@8.1.1) - eslint: 9.10.0 - eslint-compat-utils: 0.5.1(eslint@9.10.0) + eslint: 9.11.1 + eslint-compat-utils: 0.5.1(eslint@9.11.1) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 @@ -14106,7 +14227,7 @@ snapshots: eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -14146,17 +14267,20 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.10.0: + eslint@9.11.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) '@eslint-community/regexpp': 4.11.0 '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.10.0 - '@eslint/plugin-kit': 0.1.0 + '@eslint/js': 9.11.1 + '@eslint/plugin-kit': 0.2.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -14867,6 +14991,8 @@ snapshots: globals@14.0.0: {} + globals@15.9.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -15283,6 +15409,10 @@ snapshots: is-buffer@2.0.5: {} + is-bun-module@1.1.0: + dependencies: + semver: 7.6.3 + is-callable@1.2.7: {} is-core-module@2.13.1: @@ -15450,8 +15580,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -15460,7 +15590,7 @@ snapshots: istanbul-lib-instrument@6.0.2: dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -15563,10 +15693,10 @@ snapshots: jest-config@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)): dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7) + babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -15748,15 +15878,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) - '@babel/types': 7.24.7 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -16720,12 +16850,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.3 - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - object.values@1.2.0: dependencies: call-bind: 1.0.7 @@ -17315,6 +17439,14 @@ snapshots: real-require@0.2.0: {} + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.6.3 + redeyed@2.1.1: dependencies: esprima: 4.0.1 @@ -18017,7 +18149,7 @@ snapshots: dependencies: module-alias: 2.2.3 - skuba@8.0.1(@babel/core@7.24.7)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.24.7))(skuba-dive@2.0.0): + skuba@8.0.1(@babel/core@7.25.2)(@jest/transform@29.7.0)(babel-jest@29.7.0(@babel/core@7.25.2))(skuba-dive@2.0.0): dependencies: '@esbuild-plugins/tsconfig-paths': 0.1.2(esbuild@0.20.2)(typescript@5.4.5) '@jest/types': 29.6.3 @@ -18062,7 +18194,7 @@ snapshots: simple-git: 3.25.0(supports-color@8.1.1) strip-ansi: 6.0.1 ts-dedent: 2.2.0 - ts-jest: 29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.20.2)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5) + ts-jest: 29.1.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.20.2)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5) ts-node: 10.9.2(@types/node@20.16.5)(typescript@5.4.5) ts-node-dev: 2.0.0(@types/node@20.16.5)(typescript@5.4.5) tsconfig-paths: 4.2.0 @@ -18221,6 +18353,8 @@ snapshots: dependencies: minipass: 7.1.2 + stable-hash@0.0.4: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -18293,6 +18427,11 @@ snapshots: set-function-name: 2.0.2 side-channel: 1.0.6 + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -18533,6 +18672,8 @@ snapshots: tiny-async-pool@2.1.0: {} + tiny-invariant@1.3.3: {} + tlhunter-sorted-set@0.1.0: {} tmp@0.0.33: @@ -18588,7 +18729,7 @@ snapshots: ts-dedent@2.2.0: {} - ts-jest@29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.20.2)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5): + ts-jest@29.1.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.20.2)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -18601,13 +18742,13 @@ snapshots: typescript: 5.4.5 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7) + babel-jest: 29.7.0(@babel/core@7.25.2) esbuild: 0.20.2 - ts-jest@29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.24.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.1.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.24.0)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -18620,10 +18761,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7) + babel-jest: 29.7.0(@babel/core@7.25.2) esbuild: 0.24.0 ts-md5@1.3.1: {} @@ -18715,11 +18856,6 @@ snapshots: tslib: 1.14.1 typescript: 5.4.5 - tsutils@3.21.0(typescript@5.6.2): - dependencies: - tslib: 1.14.1 - typescript: 5.6.2 - tsx@4.16.2: dependencies: esbuild: 0.21.5 @@ -18803,6 +18939,17 @@ snapshots: typedarray@0.0.6: {} + typescript-eslint@8.6.0(eslint@9.11.1)(typescript@5.6.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.1)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - eslint + - supports-color + typescript@5.4.5: {} typescript@5.6.2: {} @@ -18822,6 +18969,8 @@ snapshots: buffer: 5.7.1 through: 2.3.8 + undici-types@5.26.5: {} + undici-types@6.19.8: {} uni-global@1.0.0: diff --git a/scripts/test-template.sh b/scripts/test-template.sh index 65f9120fe..ed4900547 100755 --- a/scripts/test-template.sh +++ b/scripts/test-template.sh @@ -25,7 +25,13 @@ echo '--- pnpm build' pnpm build echo '--- pnpm pack' +# I'm sure there's a better way to do this +eslint_config_skuba_tar="$(pwd)/packages/eslint-config-skuba/$(cd packages/eslint-config-skuba && pnpm pack | grep -o 'eslint-config-skuba-.*\.tgz')" +jq ".dependencies[\"eslint-config-skuba\"] = \"file:${eslint_config_skuba_tar}\"" package.json > package.json.tmp +mv package.json package.json.bak +mv package.json.tmp package.json skuba_tar="$(pwd)/$(pnpm pack | grep -o 'skuba-.*\.tgz')" +mv package.json.bak package.json skuba_temp_directory='tmp-skuba' diff --git a/src/api/git/currentBranch.int.test.ts b/src/api/git/currentBranch.int.test.ts index b8e51f95e..8c79652ed 100644 --- a/src/api/git/currentBranch.int.test.ts +++ b/src/api/git/currentBranch.int.test.ts @@ -5,7 +5,7 @@ import { currentBranch } from './currentBranch'; jest.mock('fs-extra', () => memfs); -// eslint-disable-next-line import/order +// eslint-disable-next-line import-x/order import fs from 'fs-extra'; beforeEach(async () => { diff --git a/src/api/git/remote.int.test.ts b/src/api/git/remote.int.test.ts index 8a12936bb..b9b849719 100644 --- a/src/api/git/remote.int.test.ts +++ b/src/api/git/remote.int.test.ts @@ -5,7 +5,7 @@ import { getOwnerAndRepo } from './remote'; jest.mock('fs-extra', () => memfs); -// eslint-disable-next-line import/order +// eslint-disable-next-line import-x/order import fs from 'fs-extra'; beforeEach(async () => { diff --git a/src/cli/__snapshots__/format.int.test.ts.snap b/src/cli/__snapshots__/format.int.test.ts.snap index 87e57d0c6..bcf051a6d 100644 --- a/src/cli/__snapshots__/format.int.test.ts.snap +++ b/src/cli/__snapshots__/format.int.test.ts.snap @@ -19,11 +19,14 @@ Patch skipped: Move .npmrc out of the .dockerignore managed section - no .docker Patch skipped: Ensure the pnpm package manager version specified in package.json is used in Dockerfiles - no packageManager declaration in package.json found +Patch skipped: Collapse duplicate merge keys in .buildkite files - no Buildkite files found + +Patch skipped: Upgrade to ESLint flat config - no .eslintrc.js - have you already migrated? + Patch skipped: Remove version field from docker-compose files - no docker-compose files found skuba update complete. -Refreshed .eslintignore. refresh-config-files Refreshed .gitignore. refresh-config-files Refreshed .prettierignore. refresh-config-files Refreshed .npmrc. refresh-config-files @@ -96,11 +99,14 @@ Patch skipped: Move .npmrc out of the .dockerignore managed section - no .docker Patch skipped: Ensure the pnpm package manager version specified in package.json is used in Dockerfiles - no packageManager declaration in package.json found +Patch skipped: Collapse duplicate merge keys in .buildkite files - no Buildkite files found + +Patch skipped: Upgrade to ESLint flat config - no .eslintrc.js - have you already migrated? + Patch skipped: Remove version field from docker-compose files - no docker-compose files found skuba update complete. -Refreshed .eslintignore. refresh-config-files Refreshed .gitignore. refresh-config-files Refreshed .prettierignore. refresh-config-files Refreshed .npmrc. refresh-config-files @@ -111,19 +117,17 @@ ESLint Initialising ESLint... Processing files... Processed 2 files in s. -○ a/a/a.ts ○ d.js +○ a/a/a.ts Prettier Initialising Prettier... Detected project root: Discovering files... -Discovered 11 files. +Discovered 10 files. Formatting files... .dockerignore parser: - -.eslintignore - parser: - .gitignore parser: - .npmrc @@ -170,11 +174,14 @@ Patch skipped: Move .npmrc out of the .dockerignore managed section - no .docker Patch skipped: Ensure the pnpm package manager version specified in package.json is used in Dockerfiles - no packageManager declaration in package.json found +Patch skipped: Collapse duplicate merge keys in .buildkite files - no Buildkite files found + +Patch skipped: Upgrade to ESLint flat config - no .eslintrc.js - have you already migrated? + Patch skipped: Remove version field from docker-compose files - no docker-compose files found skuba update complete. -Refreshed .eslintignore. refresh-config-files Refreshed .gitignore. refresh-config-files Refreshed .prettierignore. refresh-config-files Refreshed .npmrc. refresh-config-files @@ -213,11 +220,14 @@ Patch skipped: Move .npmrc out of the .dockerignore managed section - no .docker Patch skipped: Ensure the pnpm package manager version specified in package.json is used in Dockerfiles - no packageManager declaration in package.json found +Patch skipped: Collapse duplicate merge keys in .buildkite files - no Buildkite files found + +Patch skipped: Upgrade to ESLint flat config - no .eslintrc.js - have you already migrated? + Patch skipped: Remove version field from docker-compose files - no docker-compose files found skuba update complete. -Refreshed .eslintignore. refresh-config-files Refreshed .gitignore. refresh-config-files Refreshed .prettierignore. refresh-config-files Refreshed .npmrc. refresh-config-files @@ -230,7 +240,7 @@ Processed 2 files in s. 8:3 error Unexpected console statement no-console /d.js - 1:0 error Parsing error: Unexpected token (1:0) + 1:1 error Parsing error: Unexpected token } ✖ 2 problems (2 errors, 0 warnings) diff --git a/src/cli/__snapshots__/lint.int.test.ts.snap b/src/cli/__snapshots__/lint.int.test.ts.snap index e0bcabae7..71bebcf60 100644 --- a/src/cli/__snapshots__/lint.int.test.ts.snap +++ b/src/cli/__snapshots__/lint.int.test.ts.snap @@ -5,13 +5,13 @@ exports[`fixable 1`] = ` ESLint │ Processed 4 files in s. ESLint │ /a/a/a.mjs - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order /a/a/a.mts - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order /a/a/a.ts - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order ✖ 3 problems (3 errors, 0 warnings) 3 errors and 0 warnings potentially fixable with the \`--fix\` option. @@ -42,13 +42,13 @@ Options: { context: 'skuba-lint', scopeContextToStep: true, style: 'error' } \`\`\`term /a/a/a.mjs - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order /a/a/a.mts - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order /a/a/a.ts - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order ✖ 3 problems (3 errors, 0 warnings) 3 errors and 0 warnings potentially fixable with the \`--fix\` option. @@ -101,17 +101,15 @@ exports[`ok --debug 1`] = ` ESLint │ Initialising ESLint... ESLint │ Processing files... ESLint │ Processed 2 files in s. -ESLint │ ○ a/a/a.ts ESLint │ ○ d.js +ESLint │ ○ a/a/a.ts Prettier │ Initialising Prettier... Prettier │ Detected project root: Prettier │ Discovering files... -Prettier │ Discovered 11 files. +Prettier │ Discovered 10 files. Prettier │ Linting files... Prettier │ .dockerignore Prettier │ parser: - -Prettier │ .eslintignore -Prettier │ parser: - Prettier │ .gitignore Prettier │ parser: - Prettier │ .npmrc @@ -184,11 +182,11 @@ exports[`unfixable 1`] = ` ESLint │ Processed 2 files in s. ESLint │ /a/a/a.ts - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order 8:3 error Unexpected console statement no-console /d.js - 1:0 error Parsing error: Unexpected token (1:0) + 1:1 error Parsing error: Unexpected token } ✖ 3 problems (3 errors, 0 warnings) 1 error and 0 warnings potentially fixable with the \`--fix\` option. @@ -221,11 +219,11 @@ Options: { context: 'skuba-lint', scopeContextToStep: true, style: 'error' } \`\`\`term /a/a/a.ts - 3:1 error \`fs\` import should occur before import of \`path\` import/order + 3:1 error \`fs\` import should occur before import of \`path\` import-x/order 8:3 error Unexpected console statement no-console /d.js - 1:0 error Parsing error: Unexpected token (1:0) + 1:1 error Parsing error: Unexpected token } ✖ 3 problems (3 errors, 0 warnings) 1 error and 0 warnings potentially fixable with the \`--fix\` option. diff --git a/src/cli/adapter/eslint.ts b/src/cli/adapter/eslint.ts index 73ac50835..4595732bf 100644 --- a/src/cli/adapter/eslint.ts +++ b/src/cli/adapter/eslint.ts @@ -1,7 +1,7 @@ import path from 'path'; import chalk from 'chalk'; -import { ESLint, type Linter } from 'eslint'; +import { type ESLint, type Linter, loadESLint } from 'eslint'; import { type Logger, pluralise } from '../../utils/logging'; @@ -29,26 +29,40 @@ export interface ESLintOutput { export const runESLint = async ( mode: 'format' | 'lint', logger: Logger, + overrideConfigFile?: string, ): Promise => { logger.debug('Initialising ESLint...'); + const cwd = process.cwd(); + + const ESLint = await loadESLint({ useFlatConfig: true }); const engine = new ESLint({ cache: true, fix: mode === 'format', - reportUnusedDisableDirectives: 'error', + overrideConfigFile, + overrideConfig: { + linterOptions: { + reportUnusedDisableDirectives: true, + }, + }, }); - const cwd = process.cwd(); - logger.debug('Processing files...'); const start = process.hrtime.bigint(); - const [formatter, results] = await Promise.all([ + const [formatter, { type, results }] = await Promise.all([ engine.loadFormatter(), - engine.lintFiles('.'), + lintFiles(engine), ]); + if (type === 'no-config') { + logger.plain( + 'skuba could not find an eslint config file. Do you need to run format or configure?', + ); + return { ok: false, fixable: false, errors: [], warnings: [], output: '' }; + } + const end = process.hrtime.bigint(); logger.plain( @@ -89,7 +103,10 @@ export const runESLint = async ( await ESLint.outputFixes(results); - const output = await formatter.format(results); + const output = await formatter.format( + results, + engine.getRulesMetaForResults(results), + ); if (output) { logger.plain(output); @@ -97,3 +114,18 @@ export const runESLint = async ( return { errors, fixable, ok, output, warnings }; }; + +const lintFiles = async (engine: ESLint) => { + try { + const result = await engine.lintFiles([]); + return { type: 'results', results: result } as const; + } catch (error) { + if ( + error instanceof Error && + error.message === 'Could not find config file.' + ) { + return { type: 'no-config', results: undefined } as const; + } + throw error; + } +}; diff --git a/src/cli/configure/analysis/__snapshots__/project.test.ts.snap b/src/cli/configure/analysis/__snapshots__/project.test.ts.snap index 0eb7cd397..96e4c1d86 100644 --- a/src/cli/configure/analysis/__snapshots__/project.test.ts.snap +++ b/src/cli/configure/analysis/__snapshots__/project.test.ts.snap @@ -20,32 +20,6 @@ node_modules*/ npm-debug.log yarn-error.log # end managed by skuba -", - "operation": "A", - }, - ".eslintignore": { - "data": "# managed by skuba -.idea/* -.vscode/* - -.cdk.staging/ -.pnpm-store/ -.serverless/ -cdk.out/ -node_modules*/ - -/coverage*/ -/dist*/ -/lib*/ -/tmp*/ -# end managed by skuba -", - "operation": "A", - }, - ".eslintrc.js": { - "data": "module.exports = { - extends: ['skuba'], -}; ", "operation": "A", }, @@ -100,6 +74,11 @@ coverage }, ".prettierrc.js": { "data": "module.exports = require('skuba/config/prettier'); +", + "operation": "A", + }, + "eslint.config.js": { + "data": "module.exports = require('eslint-config-skuba'); ", "operation": "A", }, diff --git a/src/cli/configure/modules/eslint.test.ts b/src/cli/configure/modules/eslint.test.ts index 144d3d8ed..bd635f852 100644 --- a/src/cli/configure/modules/eslint.test.ts +++ b/src/cli/configure/modules/eslint.test.ts @@ -12,13 +12,13 @@ describe('eslintModule', () => { defaultOpts, ); - expect(outputFiles['.eslintrc.js']).toContain('skuba'); + expect(outputFiles['eslint.config.js']).toContain('skuba'); }); it('deletes rogue configs', async () => { const inputFiles = { '.eslintrc': 'this is deprecated!', - '.eslintrc.js': undefined, + 'eslint.config.js': undefined, '.eslintrc.yml': undefined, 'package.json': JSON.stringify({ $name: 'secret-service', @@ -35,7 +35,7 @@ describe('eslintModule', () => { ); expect(outputFiles['.eslintrc']).toBeUndefined(); - expect(outputFiles['.eslintrc.js']).toContain('skuba'); + expect(outputFiles['eslint.config.js']).toContain('skuba'); expect(outputFiles['.eslintrc.yml']).toBeUndefined(); expect(outputFiles['package.json']).toContain('secret-service'); expect(outputFiles['package.json']).not.toContain('eslintConfig'); @@ -43,7 +43,7 @@ describe('eslintModule', () => { it('overwrites divergent config', async () => { const inputFiles = { - '.eslintrc.js': "module.exports = { extends: ['skydive'] }", + 'eslint.config.js': "module.exports = { extends: ['skydive'] }", }; const outputFiles = await executeModule( @@ -52,13 +52,13 @@ describe('eslintModule', () => { defaultOpts, ); - expect(outputFiles['.eslintrc.js']).toContain('skuba'); - expect(outputFiles['.eslintrc.js']).not.toContain('skydive'); + expect(outputFiles['eslint.config.js']).toContain('skuba'); + expect(outputFiles['eslint.config.js']).not.toContain('skydive'); }); it('preserves config extending old module import', async () => { const inputFiles = { - '.eslintrc.js': + 'eslint.config.js': "module.exports = { extends: [require.resolve('@seek/skuba/config/eslint')], rules: { 'no-process-exit': 'off' } }", }; @@ -68,7 +68,7 @@ describe('eslintModule', () => { defaultOpts, ); - expect(outputFiles['.eslintrc.js']).toMatchInlineSnapshot(` + expect(outputFiles['eslint.config.js']).toMatchInlineSnapshot(` "module.exports = { extends: ['skuba'], rules: { 'no-process-exit': 'off' } }; " `); @@ -76,7 +76,7 @@ describe('eslintModule', () => { it('preserves config extending new module import', async () => { const inputFiles = { - '.eslintrc.js': `module.exports = { extends: [ + 'eslint.config.js': `module.exports = { extends: [ require.resolve("skuba/config/eslint")], rules: { "no-process-exit": "off" } }`, }; @@ -86,7 +86,7 @@ describe('eslintModule', () => { defaultOpts, ); - expect(outputFiles['.eslintrc.js']).toMatchInlineSnapshot(` + expect(outputFiles['eslint.config.js']).toMatchInlineSnapshot(` "module.exports = { extends: ['skuba'], rules: { 'no-process-exit': 'off' } }; " `); @@ -94,7 +94,7 @@ describe('eslintModule', () => { it('preserves config extending shareable config', async () => { const inputFiles = { - '.eslintrc.js': + 'eslint.config.js': "module.exports = { extends: ['skuba'], rules: { 'no-process-exit': 'off' } };\n", }; @@ -104,6 +104,8 @@ describe('eslintModule', () => { defaultOpts, ); - expect(outputFiles['.eslintrc.js']).toBe(inputFiles['.eslintrc.js']); + expect(outputFiles['eslint.config.js']).toBe( + inputFiles['eslint.config.js'], + ); }); }); diff --git a/src/cli/configure/modules/eslint.ts b/src/cli/configure/modules/eslint.ts index 390f61134..676a78912 100644 --- a/src/cli/configure/modules/eslint.ts +++ b/src/cli/configure/modules/eslint.ts @@ -1,15 +1,11 @@ import { readBaseTemplateFile } from '../../../utils/template'; -import { mergeWithConfigFile } from '../processing/configFile'; import { deleteFiles } from '../processing/deleteFiles'; import { withPackage } from '../processing/package'; import { formatPrettier } from '../processing/prettier'; import type { Module } from '../types'; export const eslintModule = async (): Promise => { - const [configFile, ignoreFile] = await Promise.all([ - readBaseTemplateFile('_.eslintrc.js'), - readBaseTemplateFile('_.eslintignore'), - ]); + const configFile = await readBaseTemplateFile('_eslint.config.js'); return { ...deleteFiles( @@ -18,10 +14,11 @@ export const eslintModule = async (): Promise => { '.eslintrc.yml', '.eslintrc.json', '.eslintrc', + '.eslintignore', ), // allow customised ESLint configs that extend skuba - '.eslintrc.js': (inputFile) => { + 'eslint.config.js': (inputFile) => { if (inputFile?.includes('skuba')) { const processedFile = inputFile.replace( /require.resolve\(['"](@seek\/)?skuba\/config\/eslint['"]\)/, @@ -34,8 +31,6 @@ export const eslintModule = async (): Promise => { return configFile; }, - '.eslintignore': mergeWithConfigFile(ignoreFile), - 'package.json': withPackage(({ eslintConfig, ...data }) => data), }; }; diff --git a/src/cli/configure/modules/prettier.test.ts b/src/cli/configure/modules/prettier.test.ts index 7885dea09..d413b877d 100644 --- a/src/cli/configure/modules/prettier.test.ts +++ b/src/cli/configure/modules/prettier.test.ts @@ -18,7 +18,7 @@ describe('prettierModule', () => { it('deletes rogue configs', async () => { const inputFiles = { '.prettierrc': 'this is deprecated!', - '.eslintrc.js': undefined, + 'eslint.config.js': undefined, '.prettierrc.toml': undefined, 'package.json': JSON.stringify({ $name: 'secret-service', diff --git a/src/cli/configure/processing/configFile.ts b/src/cli/configure/processing/configFile.ts index 8a38981dd..8fe14d94f 100644 --- a/src/cli/configure/processing/configFile.ts +++ b/src/cli/configure/processing/configFile.ts @@ -47,7 +47,7 @@ export const generateNpmrcSimpleVariants = (patterns: string[]) => { for (const pattern of patterns) { set.add(pattern); - const match = pattern.match(/^(?[^"=]+)="?(?[^"=]+)"?$/); + const match = /^(?[^"=]+)="?(?[^"=]+)"?$/.exec(pattern); if (!match?.groups) { continue; } diff --git a/src/cli/format.int.test.ts b/src/cli/format.int.test.ts index 1a7da9911..9b17bfbba 100644 --- a/src/cli/format.int.test.ts +++ b/src/cli/format.int.test.ts @@ -137,7 +137,9 @@ test.each` const originalFiles = await prepareTempDirectory(baseDir, tempDir); - await expect(format(args)).resolves.toBeUndefined(); + await expect( + format(args, require.resolve('eslint-config-skuba')), + ).resolves.toBeUndefined(); expect(stdout(new RegExp(tempDir, 'g'))).toMatchSnapshot(); diff --git a/src/cli/format.ts b/src/cli/format.ts index 2e3ecb902..3dc41f025 100644 --- a/src/cli/format.ts +++ b/src/cli/format.ts @@ -7,7 +7,10 @@ import { runESLint } from './adapter/eslint'; import { runPrettier } from './adapter/prettier'; import { internalLint } from './lint/internal'; -export const format = async (args = process.argv.slice(2)): Promise => { +export const format = async ( + args = process.argv.slice(2), + overrideConfigFile?: string, +): Promise => { const debug = hasDebugFlag(args); log.plain(chalk.blueBright('skuba lints')); @@ -18,7 +21,7 @@ export const format = async (args = process.argv.slice(2)): Promise => { log.newline(); log.plain(chalk.magenta('ESLint')); - const eslint = await runESLint('format', logger); + const eslint = await runESLint('format', logger, overrideConfigFile); log.newline(); log.plain(chalk.cyan('Prettier')); diff --git a/src/cli/init/getConfig.ts b/src/cli/init/getConfig.ts index 429f004a2..a4f177940 100644 --- a/src/cli/init/getConfig.ts +++ b/src/cli/init/getConfig.ts @@ -162,7 +162,7 @@ export const getTemplateConfig = (dir: string): TemplateConfig => { const templateConfigPath = path.join(dir, TEMPLATE_CONFIG_FILENAME); try { - /* eslint-disable-next-line @typescript-eslint/no-var-requires */ + // eslint-disable-next-line @typescript-eslint/no-require-imports const templateConfig = require(templateConfigPath) as unknown; return templateConfigSchema.parse(templateConfig); diff --git a/src/cli/init/index.ts b/src/cli/init/index.ts index d8d5332ca..c5f6dd691 100644 --- a/src/cli/init/index.ts +++ b/src/cli/init/index.ts @@ -55,7 +55,7 @@ export const init = async (args = process.argv.slice(2)) => { // prefer template-specific files overwrite: false, processors, - // base template has files like _.eslintrc.js + // base template has files like _eslint.config.js stripUnderscorePrefix: true, }); diff --git a/src/cli/init/types.ts b/src/cli/init/types.ts index 4a9945d08..193ce5b9b 100644 --- a/src/cli/init/types.ts +++ b/src/cli/init/types.ts @@ -30,6 +30,7 @@ export const initConfigInputSchema = z.object({ export type InitConfig = z.infer; +// eslint-disable-next-line @typescript-eslint/no-unused-vars const initConfigSchema = initConfigInputSchema .omit({ templateData: true, diff --git a/src/cli/lint.test.ts b/src/cli/lint.test.ts index 3ec78a02f..e247df44a 100644 --- a/src/cli/lint.test.ts +++ b/src/cli/lint.test.ts @@ -42,7 +42,8 @@ describe('TypeScript', () => { test('unknown on catch Clause Bindings', () => { try { - } catch (err: unknown) {} + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_err: unknown) {} }); }); @@ -123,7 +124,7 @@ describe('TypeScript', () => { describe('4.3', () => { test('Separate Write Types of Properties', () => { - // eslint-disable-next-line @typescript-eslint/no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface Thing { // get size(): number // set size(value: number | string | boolean); diff --git a/src/cli/lint/autofix.ts b/src/cli/lint/autofix.ts index 5c7f6c4f6..f8187574e 100644 --- a/src/cli/lint/autofix.ts +++ b/src/cli/lint/autofix.ts @@ -69,7 +69,7 @@ const shouldPush = async ({ if (currentBranch?.startsWith(RENOVATE_DEFAULT_PREFIX)) { try { await GitHub.getPullRequestNumber(); - } catch (error) { + } catch { const warning = 'An autofix is available, but it was not pushed because an open pull request for this Renovate branch could not be found. If a pull request has since been created, retry the lint step to push the fix.'; log.warn(warning); @@ -113,6 +113,8 @@ interface AutofixParameters { eslint: boolean; prettier: boolean; internal: boolean; + + eslintConfigFile?: string; } export const autofix = async (params: AutofixParameters): Promise => { @@ -151,7 +153,7 @@ export const autofix = async (params: AutofixParameters): Promise => { } if (params.eslint) { - await runESLint('format', logger); + await runESLint('format', logger, params.eslintConfigFile); } // Unconditionally re-run Prettier; reaching here means we have pre-existing diff --git a/src/cli/lint/eslint.ts b/src/cli/lint/eslint.ts index e644a9901..7ae34b8d1 100644 --- a/src/cli/lint/eslint.ts +++ b/src/cli/lint/eslint.ts @@ -11,8 +11,8 @@ import type { Input } from './types'; const LOG_PREFIX = chalk.magenta('ESLint │'); -export const runESLintInCurrentThread = ({ debug }: Input) => - runESLint('lint', createLogger(debug, LOG_PREFIX)); +export const runESLintInCurrentThread = ({ debug, eslintConfigFile }: Input) => + runESLint('lint', createLogger(debug, LOG_PREFIX), eslintConfigFile); export const runESLintInWorkerThread = (input: Input) => execWorkerThread( diff --git a/src/cli/lint/internalLints/patchRenovateConfig.ts b/src/cli/lint/internalLints/patchRenovateConfig.ts index 12782f135..d23e93d41 100644 --- a/src/cli/lint/internalLints/patchRenovateConfig.ts +++ b/src/cli/lint/internalLints/patchRenovateConfig.ts @@ -13,16 +13,13 @@ import { formatPrettier } from '../../configure/processing/prettier'; import type { PatchFunction, PatchReturnType } from './upgrade'; -const RENOVATE_PRESETS = [ - 'local>seekasia/renovate-config', - 'local>seek-jobs/renovate-config', -] as const; - const EXISTING_REPO_PRESET_REGEX = /(github|local)>(seek-jobs|seekasia)\//; type RenovateFiletype = 'json' | 'json5'; -type RenovatePreset = (typeof RENOVATE_PRESETS)[number]; +type RenovatePreset = + | 'local>seekasia/renovate-config' + | 'local>seek-jobs/renovate-config'; const renovateConfigSchema = z.object({ extends: z.array(z.string()), diff --git a/src/cli/lint/internalLints/refreshConfigFiles.test.ts b/src/cli/lint/internalLints/refreshConfigFiles.test.ts index 44015b70e..d8a71c0f2 100644 --- a/src/cli/lint/internalLints/refreshConfigFiles.test.ts +++ b/src/cli/lint/internalLints/refreshConfigFiles.test.ts @@ -100,8 +100,6 @@ describe('refreshConfigFiles', () => { it('should report not ok + fixable if files are out of date, and output a message', async () => { setupDestinationFiles({ - '.eslintignore': - '# managed by skuba\nfake content for _.eslintignore\nextra# end managed by skuba', '.gitignore': '# managed by skuba\n# end managed by skuba\n\nstuff afterwards', '.prettierignore': @@ -112,11 +110,6 @@ describe('refreshConfigFiles', () => { ok: false, fixable: true, annotations: [ - { - message: - 'The .eslintignore file is out of date. Run `pnpm exec skuba format` to update it.', - path: '.eslintignore', - }, { message: 'The .gitignore file is out of date. Run `pnpm exec skuba format` to update it.', @@ -126,7 +119,6 @@ describe('refreshConfigFiles', () => { }); expect(`\n${stdout()}`).toBe(` -The .eslintignore file is out of date. Run \`pnpm exec skuba format\` to update it. refresh-config-files The .gitignore file is out of date. Run \`pnpm exec skuba format\` to update it. refresh-config-files `); @@ -206,29 +198,20 @@ The .npmrc file is out of date. Run \`pnpm exec skuba format\` to update it. ref jest .mocked(Git.isFileGitIgnored) .mockImplementation(({ absolutePath }) => - Promise.resolve(absolutePath.endsWith('.eslintignore')), + Promise.resolve(absolutePath.endsWith('.dockerignore')), ); setupDestinationFiles({ - '.eslintignore': undefined, '.dockerignore': undefined, }); await expect(refreshConfigFiles('lint', log)).resolves.toEqual({ - ok: false, - fixable: true, - annotations: [ - { - message: - 'The .dockerignore file is out of date. Run `pnpm exec skuba format` to update it.', - path: '.dockerignore', - }, - ], + ok: true, + fixable: false, + annotations: [], }); - expect(`\n${stdout()}`).toBe(` -The .dockerignore file is out of date. Run \`pnpm exec skuba format\` to update it. refresh-config-files -`); + expect(stdout()).toBe(''); expect(writeFile).not.toHaveBeenCalled(); }); @@ -254,8 +237,6 @@ The .dockerignore file is out of date. Run \`pnpm exec skuba format\` to update it('should report ok if files are out of date, and update them and output filenames', async () => { setupDestinationFiles({ - '.eslintignore': - '# managed by skuba\nfake content for _.eslintignore\nextra# end managed by skuba', '.gitignore': '# managed by skuba\n# end managed by skuba\n\nstuff afterwards', '.prettierignore': @@ -268,15 +249,9 @@ The .dockerignore file is out of date. Run \`pnpm exec skuba format\` to update annotations: [], }); - expect(stdout()).toBe( - 'Refreshed .eslintignore. refresh-config-files\nRefreshed .gitignore. refresh-config-files\n', - ); + expect(stdout()).toBe('Refreshed .gitignore. refresh-config-files\n'); - expect(writeFile).toHaveBeenCalledTimes(2); - expect(writeFile).toHaveBeenCalledWith( - path.join(process.cwd(), '.eslintignore'), - '# managed by skuba\nfake content for _.eslintignore\n# end managed by skuba', - ); + expect(writeFile).toHaveBeenCalledTimes(1); expect(writeFile).toHaveBeenCalledWith( path.join(process.cwd(), '.gitignore'), '# managed by skuba\nfake content for _.gitignore\n# end managed by skuba\n\nstuff afterwards', @@ -352,11 +327,10 @@ Refreshed .npmrc. refresh-config-files jest .mocked(Git.isFileGitIgnored) .mockImplementation(({ absolutePath }) => - Promise.resolve(absolutePath.endsWith('.eslintignore')), + Promise.resolve(absolutePath.endsWith('.dockerignore')), ); setupDestinationFiles({ - '.eslintignore': undefined, '.dockerignore': undefined, }); @@ -366,15 +340,9 @@ Refreshed .npmrc. refresh-config-files annotations: [], }); - expect(`\n${stdout()}`).toBe(` -Refreshed .dockerignore. refresh-config-files -`); + expect(stdout()).toBe(''); - expect(writeFile).toHaveBeenCalledTimes(1); - expect(writeFile).toHaveBeenCalledWith( - path.join(process.cwd(), '.dockerignore'), - '# managed by skuba\nfake content for _.dockerignore\n# end managed by skuba', - ); + expect(writeFile).not.toHaveBeenCalled(); }); it('should format an extraneous !.npmrc', async () => { diff --git a/src/cli/lint/internalLints/refreshConfigFiles.ts b/src/cli/lint/internalLints/refreshConfigFiles.ts index 7a5630825..d31f1623a 100644 --- a/src/cli/lint/internalLints/refreshConfigFiles.ts +++ b/src/cli/lint/internalLints/refreshConfigFiles.ts @@ -50,7 +50,6 @@ const removeRedundantNpmrc = (contents: string) => { }; export const REFRESHABLE_CONFIG_FILES: RefreshableConfigFile[] = [ - { name: '.eslintignore', type: 'ignore' }, { name: '.gitignore', type: 'ignore', diff --git a/src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.test.ts b/src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.test.ts new file mode 100644 index 000000000..c41692b5b --- /dev/null +++ b/src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.test.ts @@ -0,0 +1,265 @@ +// eslint-disable-next-line no-restricted-imports -- fs-extra is mocked +import fsp from 'fs/promises'; + +import memfs, { vol } from 'memfs'; + +import type { PatchConfig } from '../..'; +import { configForPackageManager } from '../../../../../../utils/packageManager'; + +import { tryCollapseDuplicateMergeKeys } from './collapseDuplicateMergeKeys'; + +const volToJson = () => vol.toJSON(process.cwd(), undefined, true); + +jest.mock('fs-extra', () => memfs); +jest.mock('fast-glob', () => ({ + glob: (pat: any, opts: any) => + jest.requireActual('fast-glob').glob(pat, { ...opts, fs: memfs }), +})); + +beforeEach(() => vol.reset()); + +describe('collapseDuplicateMergeKeys', () => { + const baseArgs = { + manifest: {} as PatchConfig['manifest'], + packageManager: configForPackageManager('pnpm'), + }; + + afterEach(() => jest.resetAllMocks()); + + describe.each(['lint', 'format'] as const)('%s', (mode) => { + it('should not need to modify any of the template pipelines', async () => { + for (const template of await fsp.readdir('template')) { + const pipelineFile = `template/${template}/.buildkite/pipeline.yml`; + try { + await fsp.stat(pipelineFile); + } catch { + continue; + } + + const contents = await fsp.readFile(pipelineFile, 'utf-8'); + + vol.fromJSON({ + '.buildkite/pipeline.yml': contents, + }); + + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ + result: 'skip', + reason: 'no duplicate merge keys found', + }); + + expect(volToJson()).toEqual({ + '.buildkite/pipeline.yml': contents, + }); + } + }); + + it('should skip if no Buildkite files are found', async () => { + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ + result: 'skip', + reason: 'no Buildkite files found', + }); + + expect(volToJson()).toEqual({}); + }); + + it('should skip if no duplicate merge keys are found', async () => { + const input = ` +configs: + environments: + - &prod + agents: + queue: my-prod-queue + +steps: + - label: 'My Step' + <<: *prod + command: echo 'Hello, world!' +`; + + vol.fromJSON({ + '.buildkite/pipeline.yml': input, + }); + + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ + result: 'skip', + reason: 'no duplicate merge keys found', + }); + + expect(volToJson()).toEqual({ + '.buildkite/pipeline.yml': input, + }); + }); + + it('should process 2 duplicate merge keys', async () => { + const input = ` +configs: + environments: + - &prod + agents: + queue: my-prod-queue + base-steps: + - &timeout + timeout_in_minutes: 10 + +steps: +- label: 'My Step' + <<: *prod + <<: *timeout + command: echo 'Hello, world!' +`; + + vol.fromJSON({ + '.buildkite/pipeline.yml': input, + }); + + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + '.buildkite/pipeline.yml': + mode === 'lint' + ? input + : ` +configs: + environments: + - &prod + agents: + queue: my-prod-queue + base-steps: + - &timeout + timeout_in_minutes: 10 + +steps: +- label: 'My Step' + <<: [*prod, *timeout] + command: echo 'Hello, world!' +`, + }); + }); + + it('should process multiple duplicate merge keys', async () => { + const input = ` +configs: + environments: + - &prod + agents: + queue: my-prod-queue + base-steps: + - &timeout + timeout_in_minutes: 10 + +steps: +- <<: *prod + <<: *timeout + <<: *icantbebothereddefiningmorekeys + label: 'My Step' + command: echo 'Hello, world!' +`; + + vol.fromJSON({ + '.buildkite/pipeline.yml': input, + }); + + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + '.buildkite/pipeline.yml': + mode === 'lint' + ? input + : ` +configs: + environments: + - &prod + agents: + queue: my-prod-queue + base-steps: + - &timeout + timeout_in_minutes: 10 + +steps: +- <<: [*prod, *timeout, *icantbebothereddefiningmorekeys] + label: 'My Step' + command: echo 'Hello, world!' +`, + }); + }); + + it('should not bother if the keys are separated by other keys', async () => { + const input = `steps: + - <<: *prod + label: 'My Step' + <<: *timeout + command: echo 'Hello, world!' +`; + + vol.fromJSON({ + '.buildkite/pipeline.yml': input, + }); + + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ + result: 'skip', + reason: 'no duplicate merge keys found', + }); + + expect(volToJson()).toEqual({ + '.buildkite/pipeline.yml': input, + }); + }); + + it('should not merge when not at the same level', async () => { + const input = `steps: + - plugins: + <<: *plugins + <<: *timeout + command: echo 'Hello, world!' +`; + + vol.fromJSON({ + '.buildkite/pipeline.yml': input, + }); + + await expect( + tryCollapseDuplicateMergeKeys({ + ...baseArgs, + mode, + }), + ).resolves.toEqual({ + result: 'skip', + reason: 'no duplicate merge keys found', + }); + + expect(volToJson()).toEqual({ + '.buildkite/pipeline.yml': input, + }); + }); + }); +}); diff --git a/src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.ts b/src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.ts new file mode 100644 index 000000000..7cdaec5e8 --- /dev/null +++ b/src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.ts @@ -0,0 +1,81 @@ +import { inspect } from 'util'; + +import { glob } from 'fast-glob'; +import { promises as fs } from 'fs-extra'; + +import type { PatchFunction, PatchReturnType } from '../..'; +import { log } from '../../../../../../utils/logging'; + +const collapseDuplicateMergeKeys: PatchFunction = async ({ + mode, +}): Promise => { + const buildkiteFiles = await glob( + ['.buildkite/**/*.yml', '.buildkite/**/*.yaml'], + { onlyFiles: true }, + ); + + if (buildkiteFiles.length === 0) { + return { result: 'skip', reason: 'no Buildkite files found' }; + } + + const input = await Promise.all( + buildkiteFiles.map((name) => fs.readFile(name, 'utf-8')), + ); + + const replaced = input.map(collapseDuplicateMergeKeysInFile); + + if (replaced.every((r, i) => r === input[i])) { + return { result: 'skip', reason: 'no duplicate merge keys found' }; + } + + if (mode === 'lint') { + return { result: 'apply' }; + } + + await Promise.all( + buildkiteFiles.flatMap((name, i) => + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + replaced[i] !== input[i] ? [fs.writeFile(name, replaced[i]!)] : [], + ), + ); + + return { result: 'apply' }; +}; + +const collapseDuplicateMergeKeysInFile = (input: string) => + replaceAllUntilStable( + input, + /^([ \-]*)<<: \[?(\*[^\n\]]+)\]?$\n^( *)<<: \[?(\*[^\n\]]+)\]?$/gm, + (match, a, b, c, d) => { + if (a.length === c.length) { + return `${a}<<: [${b}, ${d}]`; + } + return match; + }, + ); + +const replaceAllUntilStable = ( + input: string, + searchValue: RegExp, + replacer: (substring: string, ...args: string[]) => string, +): string => { + let output = input; + let previousOutput; + + do { + previousOutput = output; + output = output.replace(searchValue, replacer); + } while (output !== previousOutput); + + return output; +}; + +export const tryCollapseDuplicateMergeKeys: PatchFunction = async (config) => { + try { + return await collapseDuplicateMergeKeys(config); + } catch (err) { + log.warn('Failed to collapse duplicate merge keys.'); + log.subtle(inspect(err)); + return { result: 'skip', reason: 'due to an error' }; + } +}; diff --git a/src/cli/lint/internalLints/upgrade/patches/8.2.1/index.ts b/src/cli/lint/internalLints/upgrade/patches/8.2.1/index.ts index 504283ee0..bdc0e341a 100644 --- a/src/cli/lint/internalLints/upgrade/patches/8.2.1/index.ts +++ b/src/cli/lint/internalLints/upgrade/patches/8.2.1/index.ts @@ -1,8 +1,18 @@ import type { Patches } from '../..'; +import { tryCollapseDuplicateMergeKeys } from './collapseDuplicateMergeKeys'; import { tryPatchDockerComposeFiles } from './patchDockerCompose'; +import { tryUpgradeESLint } from './upgradeESLint'; export const patches: Patches = [ + { + apply: tryCollapseDuplicateMergeKeys, + description: 'Collapse duplicate merge keys in .buildkite files', + }, + { + apply: tryUpgradeESLint, + description: 'Upgrade to ESLint flat config', + }, { apply: tryPatchDockerComposeFiles, description: 'Remove version field from docker-compose files', diff --git a/src/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.ts b/src/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.ts index d6694deae..f6c2a504c 100644 --- a/src/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.ts +++ b/src/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.ts @@ -37,7 +37,7 @@ const patchDockerComposeFiles: PatchFunction = async ({ const dockerComposeFiles = await fetchFiles(maybeDockerComposeFiles); const dockerComposeFilesToPatch = dockerComposeFiles.filter(({ contents }) => - contents.match(DOCKER_COMPOSE_VERSION_REGEX), + DOCKER_COMPOSE_VERSION_REGEX.exec(contents), ); if (!dockerComposeFilesToPatch.length) { diff --git a/src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.test.ts b/src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.test.ts new file mode 100644 index 000000000..d4883469b --- /dev/null +++ b/src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.test.ts @@ -0,0 +1,252 @@ +import memfs, { vol } from 'memfs'; + +import type { PatchConfig } from '../..'; +import { configForPackageManager } from '../../../../../../utils/packageManager'; + +import { tryUpgradeESLint } from './upgradeESLint'; + +const volToJson = () => vol.toJSON(process.cwd(), undefined, true); + +jest.mock('fs-extra', () => memfs); + +beforeEach(() => vol.reset()); + +describe('upgradeESLint', () => { + const baseArgs = { + manifest: {} as PatchConfig['manifest'], + packageManager: configForPackageManager('pnpm'), + }; + + afterEach(() => jest.resetAllMocks()); + + describe('lint', () => { + const args = { ...baseArgs, mode: 'lint' } as const; + + it('should skip if no .eslintrc.js file', async () => { + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ + result: 'skip', + reason: 'no .eslintrc.js - have you already migrated?', + }); + }); + + it('should apply if .eslintrc.js file exists', async () => { + vol.fromJSON({ + '.eslintrc.js': 'module.exports = { extends: ["skuba"] };', + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + '.eslintrc.js': 'module.exports = { extends: ["skuba"] };', + }); + }); + }); + + describe('format', () => { + const args = { ...baseArgs, mode: 'format' } as const; + + it('should skip if no .eslintrc.js file', async () => { + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ + result: 'skip', + reason: 'no .eslintrc.js - have you already migrated?', + }); + }); + + it('should perform a basic migration with no .eslintignore', async () => { + vol.fromJSON({ + '.eslintrc.js': 'module.exports = { extends: ["skuba"] };', + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + 'eslint.config.js': `module.exports = require('eslint-config-skuba');\n`, + }); + }); + + it('should perform a basic migration with .eslintignore without managed section', async () => { + vol.fromJSON({ + '.eslintrc.js': 'module.exports = { extends: ["skuba"] };', + '.eslintignore': 'a\nb\n!c', + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + 'eslint.config.js': `const skuba = require('eslint-config-skuba'); + +module.exports = [ + { + ignores: ['**/a', '**/b', '!**/c'], + }, + ...skuba, +]; +`, + }); + }); + + it('should perform a basic migration with .eslintignore with managed section', async () => { + vol.fromJSON({ + '.eslintrc.js': 'module.exports = { extends: ["skuba"] };', + '.eslintignore': + '# managed by skuba\nstuff that will be ignored\n# end managed by skuba\na\nb\n!c', + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + 'eslint.config.js': `const skuba = require('eslint-config-skuba'); + +module.exports = [ + { + ignores: ['**/a', '**/b', '!**/c'], + }, + ...skuba, +]; +`, + }); + }); + + it('should perform a basic migration with .eslintignore that is only a managed section', async () => { + vol.fromJSON({ + '.eslintrc.js': 'module.exports = { extends: ["skuba"] };', + '.eslintignore': + '\n\n# managed by skuba\nstuff that will be ignored\n# end managed by skuba\n', + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + 'eslint.config.js': `module.exports = require('eslint-config-skuba');\n`, + }); + }); + + it('should perform a migration with overrides', async () => { + vol.fromJSON({ + '.eslintignore': 'a', + '.eslintrc.js': `module.exports = { + extends: ["skuba"], + overrides: [ + { + files: ["cli/**/*.ts"], + rules: { + "no-console": "off", + }, + }, + ], +}; +`, + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + 'eslint.config.js': `const skuba = require('eslint-config-skuba'); + +module.exports = [ + { + ignores: ['**/a'], + }, + ...skuba, + { + files: ['cli/**/*.ts'], + + rules: { + 'no-console': 'off', + }, + }, +]; +`, + }); + }); + + it('should perform a complex migration', async () => { + vol.fromJSON({ + '.eslintignore': 'a', + '.eslintrc.js': `/** @type {import('eslint').Linter.Config} */ +module.exports = { + env: { + node: true, + es6: true, + }, + plugins: ['jest-formatting'], + extends: ['eslint-config-skuba', 'plugin:jest-formatting/recommended'], + ignorePatterns: [ + 'src/**/__mocks__*', + 'src/**/**/__mocks__*', + 'src/schema/generated/graphql.ts', + ], + overrides: [ + { + files: ['scripts/**/*'], + rules: { + 'no-console': 'off', + 'no-sync': 'off', + }, + }, + ], +};`, + }); + + const result = await tryUpgradeESLint(args); + expect(result).toEqual({ result: 'apply' }); + + expect(volToJson()).toEqual({ + 'eslint.config.js': `const jestFormatting = require('eslint-plugin-jest-formatting'); +const globals = require('globals'); +const js = require('@eslint/js'); + +const { FlatCompat } = require('@eslint/eslintrc'); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +module.exports = [ + { + ignores: [ + 'src/**/__mocks__*', + 'src/**/**/__mocks__*', + 'src/schema/generated/graphql.ts', + '**/a', + ], + }, + ...compat.extends( + 'eslint-config-skuba', + 'plugin:jest-formatting/recommended', + ), + { + plugins: { + 'jest-formatting': jestFormatting, + }, + + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, + { + files: ['scripts/**/*'], + + rules: { + 'no-console': 'off', + 'no-sync': 'off', + }, + }, +]; +`, + }); + }); + }); +}); diff --git a/src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.ts b/src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.ts new file mode 100644 index 000000000..d3120cb80 --- /dev/null +++ b/src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.ts @@ -0,0 +1,133 @@ +// eslint-disable-next-line no-restricted-imports -- fs-extra is mocked +import * as fsp from 'fs/promises'; +import path from 'path'; +import { inspect } from 'util'; + +import { promises as fsExtra } from 'fs-extra'; + +import type { PatchFunction, PatchReturnType } from '../..'; +import { createExec } from '../../../../../../utils/exec'; +import { log } from '../../../../../../utils/logging'; +import { createDestinationFileReader } from '../../../../../configure/analysis/project'; +import { mergeWithConfigFile } from '../../../../../configure/processing/configFile'; +import { formatPrettier } from '../../../../../configure/processing/prettier'; + +const IGNORE_FILE = '.eslintignore'; +const OLD_CONFIG_FILE = '.eslintrc.js'; +const NEW_CONFIG_FILE_CJS = 'eslint.config.cjs'; +const NEW_CONFIG_FILE_JS = 'eslint.config.js'; + +const upgradeESLint: PatchFunction = async ({ + mode, + dir: cwd = process.cwd(), +}): Promise => { + const readFile = createDestinationFileReader(cwd); + const [ignoreFileContents, oldConfig] = await Promise.all([ + readFile(IGNORE_FILE), + readFile(OLD_CONFIG_FILE), + ]); + + if (oldConfig === undefined) { + return { + result: 'skip', + reason: `no ${OLD_CONFIG_FILE} - have you already migrated?`, + }; + } + + if (mode === 'lint') { + return { result: 'apply' }; + } + + const ignoreContentsWithoutSkubaManaged = mergeWithConfigFile( + '', + 'ignore', + )(ignoreFileContents); + + const exec = createExec({ + cwd: process.cwd(), + stdio: 'ignore', + }); + + // eslint-migrate-config require()s the file, so for testability, put it in a temporary location + const dir = await writeTemporaryFiles({ + [OLD_CONFIG_FILE]: oldConfig, + ...(ignoreContentsWithoutSkubaManaged.trim().length > 0 + ? { [IGNORE_FILE]: ignoreContentsWithoutSkubaManaged } + : {}), + }); + try { + await exec( + 'eslint-migrate-config', + path.join(dir, OLD_CONFIG_FILE), + '--commonjs', + ); + + const output = fiddleWithOutput( + await fsp.readFile(path.join(dir, NEW_CONFIG_FILE_CJS), 'utf-8'), + ); + await fsExtra.writeFile( + NEW_CONFIG_FILE_JS, + await formatPrettier(output, { filepath: NEW_CONFIG_FILE_JS }), + ); + + await Promise.all([ + ignoreFileContents === undefined + ? Promise.resolve() + : fsExtra.rm(IGNORE_FILE), + fsExtra.rm(OLD_CONFIG_FILE), + ]); + + return { result: 'apply' }; + } finally { + await fsp.rm(dir, { recursive: true }); + } +}; + +const writeTemporaryFiles = async (contents: Record) => { + const dir = await fsp.mkdtemp('eslint-migrate-config'); + + await Promise.all( + Object.entries(contents).map(([file, content]) => + fsp.writeFile(path.join(dir, file), content), + ), + ); + + return dir; +}; + +const fiddleWithOutput = (input: string) => { + let output = input.replace(/compat.extends\(["']skuba["']\)/, 'skuba'); + + if (!output.includes('eslint-config-skuba')) { + output = `const skuba = require('eslint-config-skuba');\n\n${output}`; + } + + if (!output.includes('compat.')) { + output = output.replace(/const compat = new FlatCompat\(\{[^}]+\}\);/m, ''); + output = output.replace( + /const \{\s*FlatCompat,?\s*\}\s*=\s*require\(["']@eslint\/eslintrc["']\);/m, + '', + ); + } + + if (!output.includes('js.')) { + output = output.replace(/const js = require\(['"]@eslint\/js['"]\);/, ''); + } + + output = output.replace( + /^const skuba = require\('eslint-config-skuba'\);\s*module.exports = \[...skuba\];$/m, + "module.exports = require('eslint-config-skuba');", + ); + + return output; +}; + +export const tryUpgradeESLint: PatchFunction = async (config) => { + try { + return await upgradeESLint(config); + } catch (err) { + log.warn('Failed to upgrade ESLint to flat config.'); + log.subtle(inspect(err)); + return { result: 'skip', reason: 'due to an error' }; + } +}; diff --git a/src/cli/lint/types.ts b/src/cli/lint/types.ts index e3ab8f4b8..34a25b4bc 100644 --- a/src/cli/lint/types.ts +++ b/src/cli/lint/types.ts @@ -34,4 +34,9 @@ export interface Input { * Defaults to `true`. */ workerThreads?: boolean; + + /** + * An override to point to a specific ESLint config file. + */ + eslintConfigFile?: string; } diff --git a/src/eslint.d.ts b/src/eslint.d.ts new file mode 100644 index 000000000..ab986f2b3 --- /dev/null +++ b/src/eslint.d.ts @@ -0,0 +1,7 @@ +declare module '@eslint/migrate-config/src/migrate-config.js' { + // incomplete types for upgradeESLint.ts + export function migrateConfig( + config: { ignorePatterns: string[] }, + opts: { sourceType: 'commonjs' | 'module'; gitignore?: boolean }, + ): string; +} diff --git a/src/index.ts b/src/index.ts index 61b0f4718..56c83fbea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,7 @@ export * as Net from './api/net'; declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace WebAssembly { - // eslint-disable-next-line @typescript-eslint/no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface Module {} } } diff --git a/src/skuba.ts b/src/skuba.ts index d532a4061..8b84d7bee 100644 --- a/src/skuba.ts +++ b/src/skuba.ts @@ -34,7 +34,7 @@ const skuba = async () => { if (COMMAND_SET.has(commandName)) { const moduleName = commandToModule(commandName as Command); - /* eslint-disable @typescript-eslint/no-var-requires */ + /* eslint-disable @typescript-eslint/no-require-imports */ const commandModule = require( path.join(COMMAND_DIR, moduleName), ) as unknown; diff --git a/src/utils/copy.ts b/src/utils/copy.ts index 46014c782..3e7df0ad9 100644 --- a/src/utils/copy.ts +++ b/src/utils/copy.ts @@ -82,6 +82,7 @@ export const copyFiles = async ( ? filename .replace(/^_\./, '.') .replace(/^_package\.json/, 'package.json') + .replace(/^_eslint\.config\.js/, 'eslint.config.js') : filename, ); diff --git a/src/utils/dir.test.ts b/src/utils/dir.test.ts index 158a09d05..d380d5406 100644 --- a/src/utils/dir.test.ts +++ b/src/utils/dir.test.ts @@ -132,7 +132,6 @@ describe('createInclusionFilter', () => { it.each([ '.buildkite/pipeline.yml', - '.eslintignore', '.prettierrc.js', '.vscode/extensions.json', 'Dockerfile', diff --git a/src/why-is-node-running.d.ts b/src/why-is-node-running.d.ts deleted file mode 100644 index d0e84abba..000000000 --- a/src/why-is-node-running.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'why-is-node-running' { - export default function whyIsNodeRunning(): void; -} diff --git a/src/wrapper/main.ts b/src/wrapper/main.ts index b2b136fe1..74f4df310 100644 --- a/src/wrapper/main.ts +++ b/src/wrapper/main.ts @@ -12,7 +12,7 @@ export const main = async (rawEntryPoint: string, rawPort: string) => { .split('#', 2); // Load entry point as module - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports const entryPoint = require(modulePath as string) as unknown; return functionName diff --git a/template/base/_.eslintignore b/template/base/_.eslintignore deleted file mode 100644 index aeb96d742..000000000 --- a/template/base/_.eslintignore +++ /dev/null @@ -1,15 +0,0 @@ -# managed by skuba -.idea/* -.vscode/* - -.cdk.staging/ -.pnpm-store/ -.serverless/ -cdk.out/ -node_modules*/ - -/coverage*/ -/dist*/ -/lib*/ -/tmp*/ -# end managed by skuba diff --git a/template/base/_.eslintrc.js b/template/base/_.eslintrc.js deleted file mode 100644 index 8ed57d8e6..000000000 --- a/template/base/_.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ['skuba'], -}; diff --git a/template/base/_eslint.config.js b/template/base/_eslint.config.js new file mode 100644 index 000000000..35bf04c06 --- /dev/null +++ b/template/base/_eslint.config.js @@ -0,0 +1 @@ +module.exports = require('eslint-config-skuba'); diff --git a/template/koa-rest-api/src/framework/server.test.ts b/template/koa-rest-api/src/framework/server.test.ts index bb02f69e1..7953e28ba 100644 --- a/template/koa-rest-api/src/framework/server.test.ts +++ b/template/koa-rest-api/src/framework/server.test.ts @@ -203,7 +203,7 @@ describe('createApp', () => { it('handles null error', async () => { middleware.mockImplementation(() => { - /* eslint-disable-next-line no-throw-literal */ + /* eslint-disable-next-line @typescript-eslint/only-throw-error */ throw null; }); @@ -233,6 +233,7 @@ describe('createApp', () => { const err = chance.sentence(); middleware.mockImplementation(() => { + // eslint-disable-next-line @typescript-eslint/only-throw-error throw err; }); diff --git a/template/lambda-sqs-worker/src/types/jobScorer.ts b/template/lambda-sqs-worker/src/types/jobScorer.ts index 0668daa92..ee9d3d119 100644 --- a/template/lambda-sqs-worker/src/types/jobScorer.ts +++ b/template/lambda-sqs-worker/src/types/jobScorer.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; export type JobScorerInput = z.infer; -const JobScorerInputSchema = z.object({ +export const JobScorerInputSchema = z.object({ id: z.string(), details: z.string(), });