diff --git a/.eslintrc.js b/.eslintrc.js index 20228a5a3..f5c296ce2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -98,7 +98,7 @@ module.exports = { globals, }, { - files: ['src/**/*', 'dangerfile.ts', 'tools/*'], + files: ['src/**/*', 'dangerfile.ts', 'tools/*', './jest.config.ts'], parserOptions: { sourceType: 'module', }, diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 8432c615e..75256d525 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -71,22 +71,16 @@ jobs: strategy: fail-fast: false matrix: - node-version: [14.x, 16.x, 18.x, 19.x, 20.x, 21.x] - eslint-version: [7, 8] - ts-eslint-plugin-version: [5, 6, 7] + node-version: [16.x, 18.x, 20.x, 21.x] + eslint-version: [7, 8, 9] + ts-eslint-plugin-version: [6, 7] exclude: - # ts-eslint/plugin@6 doesn't support node@14 - - node-version: 14.x - ts-eslint-plugin-version: 6 - # ts-eslint/plugin@7 doesn't support node@14 - - node-version: 14.x - ts-eslint-plugin-version: 7 # ts-eslint/plugin@7 doesn't support node@16 - node-version: 16.x ts-eslint-plugin-version: 7 - # ts-eslint/plugin@7 doesn't support node@19 - - node-version: 19.x - ts-eslint-plugin-version: 7 + # eslint@9 doesn't support node@16 + - node-version: 16.x + eslint-version: 9 # ts-eslint/plugin@7 doesn't support eslint@7 - eslint-version: 7 ts-eslint-plugin-version: 7 @@ -109,7 +103,7 @@ jobs: yarn add --dev eslint@${{ matrix.eslint-version }} @typescript-eslint/eslint-plugin@${{ matrix.ts-eslint-plugin-version }} @typescript-eslint/parser@${{ matrix.ts-eslint-plugin-version }} - name: run tests # only collect coverage on eslint versions that support dynamic import - run: yarn test --coverage ${{ matrix.eslint-version >= 8 }} + run: yarn test --coverage ${{ matrix.eslint-version == 8 }} env: CI: true - uses: codecov/codecov-action@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index af6657b36..965b9be25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,78 @@ +# [28.0.0-next.7](https://github.com/jest-community/eslint-plugin-jest/compare/v28.0.0-next.6...v28.0.0-next.7) (2024-04-06) + + +### Bug Fixes + +* allow ESLint 9 as peer dependency ([#1547](https://github.com/jest-community/eslint-plugin-jest/issues/1547)) ([3c5e167](https://github.com/jest-community/eslint-plugin-jest/commit/3c5e1673afd02dc2c9b90d259c0452326715ae6c)) +* drop support for Node 19 ([#1548](https://github.com/jest-community/eslint-plugin-jest/issues/1548)) ([c87e388](https://github.com/jest-community/eslint-plugin-jest/commit/c87e3887e736c40d1460af9cdbdffe30f79fdaea)) + + +### BREAKING CHANGES + +* Node v19 is no longer supported + +# [28.0.0-next.6](https://github.com/jest-community/eslint-plugin-jest/compare/v28.0.0-next.5...v28.0.0-next.6) (2024-03-29) + + +### Bug Fixes + +* **no-large-snapshots:** avoid `instanceof RegExp` check for ESLint v9 compatibility ([#1542](https://github.com/jest-community/eslint-plugin-jest/issues/1542)) ([af4a9c9](https://github.com/jest-community/eslint-plugin-jest/commit/af4a9c94d624b5db4643c994f5bec96b0cb889b8)) + +# [28.0.0-next.5](https://github.com/jest-community/eslint-plugin-jest/compare/v28.0.0-next.4...v28.0.0-next.5) (2024-03-27) + + +### Features + +* remove `snapshot` processor and `flat/snapshot` config ([#1532](https://github.com/jest-community/eslint-plugin-jest/issues/1532)) ([98087f9](https://github.com/jest-community/eslint-plugin-jest/commit/98087f9bb27082f9fbda59a56c65536fb9d8a0dc)) + + +### BREAKING CHANGES + +* removed unneeded `snapshot` processor and `flat/snapshot` config + +# [28.0.0-next.4](https://github.com/jest-community/eslint-plugin-jest/compare/v28.0.0-next.3...v28.0.0-next.4) (2024-03-23) + + +### Features + +* drop support for `@typescript-eslint/eslint-plugin` v5 ([#1530](https://github.com/jest-community/eslint-plugin-jest/issues/1530)) ([150e355](https://github.com/jest-community/eslint-plugin-jest/commit/150e3558a637b49ddd76d362f88332b30f78dc5c)) + + +### BREAKING CHANGES + +* dropped support for `@typescript-eslint/eslint-plugin` v5 + +# [28.0.0-next.3](https://github.com/jest-community/eslint-plugin-jest/compare/v28.0.0-next.2...v28.0.0-next.3) (2024-03-22) + + +### Features + +* upgrade `@typescript-eslint/utils` to v6 ([#1508](https://github.com/jest-community/eslint-plugin-jest/issues/1508)) ([dc6e8cd](https://github.com/jest-community/eslint-plugin-jest/commit/dc6e8cd249817de585b50e473c2146e1542dd146)) + +# [28.0.0-next.2](https://github.com/jest-community/eslint-plugin-jest/compare/v28.0.0-next.1...v28.0.0-next.2) (2024-03-21) + + +### Features + +* drop support for Node v14 ([#1527](https://github.com/jest-community/eslint-plugin-jest/issues/1527)) ([df5e580](https://github.com/jest-community/eslint-plugin-jest/commit/df5e58081d1bd15fbed8bd22f6c03d5f350d73b6)) + + +### BREAKING CHANGES + +* dropped support for Node v14 + +# [28.0.0-next.1](https://github.com/jest-community/eslint-plugin-jest/compare/v27.9.0...v28.0.0-next.1) (2024-03-21) + + +### Features + +* remove `no-if` rule ([#1528](https://github.com/jest-community/eslint-plugin-jest/issues/1528)) ([f976fc8](https://github.com/jest-community/eslint-plugin-jest/commit/f976fc8c71fc5e9f55cd5ae09092f15ee277fd2c)) + + +### BREAKING CHANGES + +* removed `no-if` in favor of `no-conditional-in-test` + # [27.9.0](https://github.com/jest-community/eslint-plugin-jest/compare/v27.8.0...v27.9.0) (2024-02-16) diff --git a/README.md b/README.md index 02d08e26b..825ed26a8 100644 --- a/README.md +++ b/README.md @@ -275,35 +275,6 @@ While the `recommended` and `style` configurations only change in major versions the `all` configuration may change in any release and is thus unsuited for installations requiring long-term consistency. -## Snapshot processing - -> [!NOTE] -> -> This is only relevant for `eslint.config.js` - -This plugin provides a -[custom processor](https://eslint.org/docs/latest/extend/custom-processors) to -allow rules to "lint" snapshot files. - -For `.eslintrc` based configs, this is automatically enabled out of the box but -must be opted into for `eslint.config.js` using the `flat/snapshots` config: - -```js -const jest = require('eslint-plugin-jest'); - -module.exports = [ - { - ...jest.configs['flat/snapshots'], - rules: { - 'jest/no-large-snapshots': ['error', { maxSize: 1 }], - }, - }, -]; -``` - -Unlike other configs, this includes a `files` array that matches `.snap` files -meaning you can use it directly - ## Rules @@ -318,69 +289,67 @@ set to warn in.\ 🎨 Set in the `style` [configuration](https://github.com/jest-community/eslint-plugin-jest/blob/main/README.md#shareable-configurations).\ πŸ”§ Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\ -πŸ’‘ Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).\ -❌ Deprecated. - -| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  | Description | πŸ’Ό | ⚠️ | πŸ”§ | πŸ’‘ | ❌ | -| :--------------------------------------------------------------------------- | :------------------------------------------------------------------------ | :-- | :-- | :-- | :-- | :-- | -| [consistent-test-it](docs/rules/consistent-test-it.md) | Enforce `test` and `it` usage conventions | | | πŸ”§ | | | -| [expect-expect](docs/rules/expect-expect.md) | Enforce assertion to be made in a test body | | βœ… | | | | -| [max-expects](docs/rules/max-expects.md) | Enforces a maximum number assertion calls in a test body | | | | | | -| [max-nested-describe](docs/rules/max-nested-describe.md) | Enforces a maximum depth to nested describe calls | | | | | | -| [no-alias-methods](docs/rules/no-alias-methods.md) | Disallow alias methods | βœ… | 🎨 | πŸ”§ | | | -| [no-commented-out-tests](docs/rules/no-commented-out-tests.md) | Disallow commented out tests | | βœ… | | | | -| [no-conditional-expect](docs/rules/no-conditional-expect.md) | Disallow calling `expect` conditionally | βœ… | | | | | -| [no-conditional-in-test](docs/rules/no-conditional-in-test.md) | Disallow conditional logic in tests | | | | | | -| [no-confusing-set-timeout](docs/rules/no-confusing-set-timeout.md) | Disallow confusing usages of jest.setTimeout | | | | | | -| [no-deprecated-functions](docs/rules/no-deprecated-functions.md) | Disallow use of deprecated functions | βœ… | | πŸ”§ | | | -| [no-disabled-tests](docs/rules/no-disabled-tests.md) | Disallow disabled tests | | βœ… | | | | -| [no-done-callback](docs/rules/no-done-callback.md) | Disallow using a callback in asynchronous tests and hooks | βœ… | | | πŸ’‘ | | -| [no-duplicate-hooks](docs/rules/no-duplicate-hooks.md) | Disallow duplicate setup and teardown hooks | | | | | | -| [no-export](docs/rules/no-export.md) | Disallow using `exports` in files containing tests | βœ… | | | | | -| [no-focused-tests](docs/rules/no-focused-tests.md) | Disallow focused tests | βœ… | | | πŸ’‘ | | -| [no-hooks](docs/rules/no-hooks.md) | Disallow setup and teardown hooks | | | | | | -| [no-identical-title](docs/rules/no-identical-title.md) | Disallow identical titles | βœ… | | | | | -| [no-if](docs/rules/no-if.md) | Disallow conditional logic | | | | | ❌ | -| [no-interpolation-in-snapshots](docs/rules/no-interpolation-in-snapshots.md) | Disallow string interpolation inside snapshots | βœ… | | | | | -| [no-jasmine-globals](docs/rules/no-jasmine-globals.md) | Disallow Jasmine globals | βœ… | | πŸ”§ | | | -| [no-large-snapshots](docs/rules/no-large-snapshots.md) | Disallow large snapshots | | | | | | -| [no-mocks-import](docs/rules/no-mocks-import.md) | Disallow manually importing from `__mocks__` | βœ… | | | | | -| [no-restricted-jest-methods](docs/rules/no-restricted-jest-methods.md) | Disallow specific `jest.` methods | | | | | | -| [no-restricted-matchers](docs/rules/no-restricted-matchers.md) | Disallow specific matchers & modifiers | | | | | | -| [no-standalone-expect](docs/rules/no-standalone-expect.md) | Disallow using `expect` outside of `it` or `test` blocks | βœ… | | | | | -| [no-test-prefixes](docs/rules/no-test-prefixes.md) | Require using `.only` and `.skip` over `f` and `x` | βœ… | | πŸ”§ | | | -| [no-test-return-statement](docs/rules/no-test-return-statement.md) | Disallow explicitly returning from tests | | | | | | -| [no-untyped-mock-factory](docs/rules/no-untyped-mock-factory.md) | Disallow using `jest.mock()` factories without an explicit type parameter | | | πŸ”§ | | | -| [prefer-called-with](docs/rules/prefer-called-with.md) | Suggest using `toBeCalledWith()` or `toHaveBeenCalledWith()` | | | | | | -| [prefer-comparison-matcher](docs/rules/prefer-comparison-matcher.md) | Suggest using the built-in comparison matchers | | | πŸ”§ | | | -| [prefer-each](docs/rules/prefer-each.md) | Prefer using `.each` rather than manual loops | | | | | | -| [prefer-equality-matcher](docs/rules/prefer-equality-matcher.md) | Suggest using the built-in equality matchers | | | | πŸ’‘ | | -| [prefer-expect-assertions](docs/rules/prefer-expect-assertions.md) | Suggest using `expect.assertions()` OR `expect.hasAssertions()` | | | | πŸ’‘ | | -| [prefer-expect-resolves](docs/rules/prefer-expect-resolves.md) | Prefer `await expect(...).resolves` over `expect(await ...)` syntax | | | πŸ”§ | | | -| [prefer-hooks-in-order](docs/rules/prefer-hooks-in-order.md) | Prefer having hooks in a consistent order | | | | | | -| [prefer-hooks-on-top](docs/rules/prefer-hooks-on-top.md) | Suggest having hooks before any test cases | | | | | | -| [prefer-lowercase-title](docs/rules/prefer-lowercase-title.md) | Enforce lowercase test names | | | πŸ”§ | | | -| [prefer-mock-promise-shorthand](docs/rules/prefer-mock-promise-shorthand.md) | Prefer mock resolved/rejected shorthands for promises | | | πŸ”§ | | | -| [prefer-snapshot-hint](docs/rules/prefer-snapshot-hint.md) | Prefer including a hint with external snapshots | | | | | | -| [prefer-spy-on](docs/rules/prefer-spy-on.md) | Suggest using `jest.spyOn()` | | | πŸ”§ | | | -| [prefer-strict-equal](docs/rules/prefer-strict-equal.md) | Suggest using `toStrictEqual()` | | | | πŸ’‘ | | -| [prefer-to-be](docs/rules/prefer-to-be.md) | Suggest using `toBe()` for primitive literals | 🎨 | | πŸ”§ | | | -| [prefer-to-contain](docs/rules/prefer-to-contain.md) | Suggest using `toContain()` | 🎨 | | πŸ”§ | | | -| [prefer-to-have-length](docs/rules/prefer-to-have-length.md) | Suggest using `toHaveLength()` | 🎨 | | πŸ”§ | | | -| [prefer-todo](docs/rules/prefer-todo.md) | Suggest using `test.todo` | | | πŸ”§ | | | -| [require-hook](docs/rules/require-hook.md) | Require setup and teardown code to be within a hook | | | | | | -| [require-to-throw-message](docs/rules/require-to-throw-message.md) | Require a message for `toThrow()` | | | | | | -| [require-top-level-describe](docs/rules/require-top-level-describe.md) | Require test cases and hooks to be inside a `describe` block | | | | | | -| [valid-describe-callback](docs/rules/valid-describe-callback.md) | Enforce valid `describe()` callback | βœ… | | | | | -| [valid-expect](docs/rules/valid-expect.md) | Enforce valid `expect()` usage | βœ… | | | | | -| [valid-expect-in-promise](docs/rules/valid-expect-in-promise.md) | Require promises that have expectations in their chain to be valid | βœ… | | | | | -| [valid-title](docs/rules/valid-title.md) | Enforce valid titles | βœ… | | πŸ”§ | | | +πŸ’‘ Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions). + +| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  | Description | πŸ’Ό | ⚠️ | πŸ”§ | πŸ’‘ | +| :--------------------------------------------------------------------------- | :------------------------------------------------------------------------ | :-- | :-- | :-- | :-- | +| [consistent-test-it](docs/rules/consistent-test-it.md) | Enforce `test` and `it` usage conventions | | | πŸ”§ | | +| [expect-expect](docs/rules/expect-expect.md) | Enforce assertion to be made in a test body | | βœ… | | | +| [max-expects](docs/rules/max-expects.md) | Enforces a maximum number assertion calls in a test body | | | | | +| [max-nested-describe](docs/rules/max-nested-describe.md) | Enforces a maximum depth to nested describe calls | | | | | +| [no-alias-methods](docs/rules/no-alias-methods.md) | Disallow alias methods | βœ… | 🎨 | πŸ”§ | | +| [no-commented-out-tests](docs/rules/no-commented-out-tests.md) | Disallow commented out tests | | βœ… | | | +| [no-conditional-expect](docs/rules/no-conditional-expect.md) | Disallow calling `expect` conditionally | βœ… | | | | +| [no-conditional-in-test](docs/rules/no-conditional-in-test.md) | Disallow conditional logic in tests | | | | | +| [no-confusing-set-timeout](docs/rules/no-confusing-set-timeout.md) | Disallow confusing usages of jest.setTimeout | | | | | +| [no-deprecated-functions](docs/rules/no-deprecated-functions.md) | Disallow use of deprecated functions | βœ… | | πŸ”§ | | +| [no-disabled-tests](docs/rules/no-disabled-tests.md) | Disallow disabled tests | | βœ… | | | +| [no-done-callback](docs/rules/no-done-callback.md) | Disallow using a callback in asynchronous tests and hooks | βœ… | | | πŸ’‘ | +| [no-duplicate-hooks](docs/rules/no-duplicate-hooks.md) | Disallow duplicate setup and teardown hooks | | | | | +| [no-export](docs/rules/no-export.md) | Disallow using `exports` in files containing tests | βœ… | | | | +| [no-focused-tests](docs/rules/no-focused-tests.md) | Disallow focused tests | βœ… | | | πŸ’‘ | +| [no-hooks](docs/rules/no-hooks.md) | Disallow setup and teardown hooks | | | | | +| [no-identical-title](docs/rules/no-identical-title.md) | Disallow identical titles | βœ… | | | | +| [no-interpolation-in-snapshots](docs/rules/no-interpolation-in-snapshots.md) | Disallow string interpolation inside snapshots | βœ… | | | | +| [no-jasmine-globals](docs/rules/no-jasmine-globals.md) | Disallow Jasmine globals | βœ… | | πŸ”§ | | +| [no-large-snapshots](docs/rules/no-large-snapshots.md) | Disallow large snapshots | | | | | +| [no-mocks-import](docs/rules/no-mocks-import.md) | Disallow manually importing from `__mocks__` | βœ… | | | | +| [no-restricted-jest-methods](docs/rules/no-restricted-jest-methods.md) | Disallow specific `jest.` methods | | | | | +| [no-restricted-matchers](docs/rules/no-restricted-matchers.md) | Disallow specific matchers & modifiers | | | | | +| [no-standalone-expect](docs/rules/no-standalone-expect.md) | Disallow using `expect` outside of `it` or `test` blocks | βœ… | | | | +| [no-test-prefixes](docs/rules/no-test-prefixes.md) | Require using `.only` and `.skip` over `f` and `x` | βœ… | | πŸ”§ | | +| [no-test-return-statement](docs/rules/no-test-return-statement.md) | Disallow explicitly returning from tests | | | | | +| [no-untyped-mock-factory](docs/rules/no-untyped-mock-factory.md) | Disallow using `jest.mock()` factories without an explicit type parameter | | | πŸ”§ | | +| [prefer-called-with](docs/rules/prefer-called-with.md) | Suggest using `toBeCalledWith()` or `toHaveBeenCalledWith()` | | | | | +| [prefer-comparison-matcher](docs/rules/prefer-comparison-matcher.md) | Suggest using the built-in comparison matchers | | | πŸ”§ | | +| [prefer-each](docs/rules/prefer-each.md) | Prefer using `.each` rather than manual loops | | | | | +| [prefer-equality-matcher](docs/rules/prefer-equality-matcher.md) | Suggest using the built-in equality matchers | | | | πŸ’‘ | +| [prefer-expect-assertions](docs/rules/prefer-expect-assertions.md) | Suggest using `expect.assertions()` OR `expect.hasAssertions()` | | | | πŸ’‘ | +| [prefer-expect-resolves](docs/rules/prefer-expect-resolves.md) | Prefer `await expect(...).resolves` over `expect(await ...)` syntax | | | πŸ”§ | | +| [prefer-hooks-in-order](docs/rules/prefer-hooks-in-order.md) | Prefer having hooks in a consistent order | | | | | +| [prefer-hooks-on-top](docs/rules/prefer-hooks-on-top.md) | Suggest having hooks before any test cases | | | | | +| [prefer-lowercase-title](docs/rules/prefer-lowercase-title.md) | Enforce lowercase test names | | | πŸ”§ | | +| [prefer-mock-promise-shorthand](docs/rules/prefer-mock-promise-shorthand.md) | Prefer mock resolved/rejected shorthands for promises | | | πŸ”§ | | +| [prefer-snapshot-hint](docs/rules/prefer-snapshot-hint.md) | Prefer including a hint with external snapshots | | | | | +| [prefer-spy-on](docs/rules/prefer-spy-on.md) | Suggest using `jest.spyOn()` | | | πŸ”§ | | +| [prefer-strict-equal](docs/rules/prefer-strict-equal.md) | Suggest using `toStrictEqual()` | | | | πŸ’‘ | +| [prefer-to-be](docs/rules/prefer-to-be.md) | Suggest using `toBe()` for primitive literals | 🎨 | | πŸ”§ | | +| [prefer-to-contain](docs/rules/prefer-to-contain.md) | Suggest using `toContain()` | 🎨 | | πŸ”§ | | +| [prefer-to-have-length](docs/rules/prefer-to-have-length.md) | Suggest using `toHaveLength()` | 🎨 | | πŸ”§ | | +| [prefer-todo](docs/rules/prefer-todo.md) | Suggest using `test.todo` | | | πŸ”§ | | +| [require-hook](docs/rules/require-hook.md) | Require setup and teardown code to be within a hook | | | | | +| [require-to-throw-message](docs/rules/require-to-throw-message.md) | Require a message for `toThrow()` | | | | | +| [require-top-level-describe](docs/rules/require-top-level-describe.md) | Require test cases and hooks to be inside a `describe` block | | | | | +| [valid-describe-callback](docs/rules/valid-describe-callback.md) | Enforce valid `describe()` callback | βœ… | | | | +| [valid-expect](docs/rules/valid-expect.md) | Enforce valid `expect()` usage | βœ… | | | | +| [valid-expect-in-promise](docs/rules/valid-expect-in-promise.md) | Require promises that have expectations in their chain to be valid | βœ… | | | | +| [valid-title](docs/rules/valid-title.md) | Enforce valid titles | βœ… | | πŸ”§ | | ### Requires Type Checking -| NameΒ Β Β Β Β Β Β Β Β Β  | Description | πŸ’Ό | ⚠️ | πŸ”§ | πŸ’‘ | ❌ | -| :--------------------------------------------- | :----------------------------------------------------------- | :-- | :-- | :-- | :-- | :-- | -| [unbound-method](docs/rules/unbound-method.md) | Enforce unbound methods are called with their expected scope | | | | | | +| NameΒ Β Β Β Β Β Β Β Β Β  | Description | πŸ’Ό | ⚠️ | πŸ”§ | πŸ’‘ | +| :--------------------------------------------- | :----------------------------------------------------------- | :-- | :-- | :-- | :-- | +| [unbound-method](docs/rules/unbound-method.md) | Enforce unbound methods are called with their expected scope | | | | | diff --git a/docs/rules/no-if.md b/docs/rules/no-if.md deleted file mode 100644 index c5add5524..000000000 --- a/docs/rules/no-if.md +++ /dev/null @@ -1,58 +0,0 @@ -# Disallow conditional logic (`no-if`) - -❌ This rule is deprecated. It was replaced by -[`jest/no-conditional-in-test`](no-conditional-in-test.md). - - - -Conditional logic in tests is usually an indication that a test is attempting to -cover too much, and not testing the logic it intends to. Each branch of code -executing within an if statement will usually be better served by a test devoted -to it. - -Conditionals are often used to satisfy the typescript type checker. In these -cases, using the non-null assertion operator (!) would be best. - -## Rule details - -This rule prevents the use of if/ else statements and conditional (ternary) -operations in tests. - -The following patterns are considered warnings: - -```js -it('foo', () => { - if ('bar') { - // an if statement here is invalid - // you are probably testing too much - } -}); - -it('foo', () => { - const bar = foo ? 'bar' : null; -}); -``` - -These patterns would not be considered warnings: - -```js -it('foo', () => { - // only test the 'foo' case -}); - -it('bar', () => { - // test the 'bar' case separately -}); - -it('foo', () => { - function foo(bar) { - // nested functions are valid - return foo ? bar : null; - } -}); -``` - -## When Not To Use It - -If you do not wish to prevent the use of if statements in tests, you can safely -disable this rule. diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 000000000..e5a6b638e --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,58 @@ +import { version as typescriptESLintPluginVersion } from '@typescript-eslint/eslint-plugin/package.json'; +import { version as eslintVersion } from 'eslint/package.json'; +import type { Config } from 'jest'; +import * as semver from 'semver'; + +const config = { + clearMocks: true, + restoreMocks: true, + resetMocks: true, + + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, + + projects: [ + { + displayName: 'test', + testPathIgnorePatterns: [ + '/lib/.*', + '/src/rules/__tests__/fixtures/*', + '/src/rules/__tests__/test-utils.ts', + ], + coveragePathIgnorePatterns: ['/node_modules/'], + }, + { + displayName: 'lint', + runner: 'jest-runner-eslint', + testMatch: ['/**/*.{js,ts}'], + testPathIgnorePatterns: ['/lib/.*'], + coveragePathIgnorePatterns: ['/node_modules/'], + }, + ], +} satisfies Config; + +if (semver.major(eslintVersion) >= 9) { + config.projects = config.projects.filter( + ({ displayName }) => displayName !== 'lint', + ); + + // jest/unbound-method doesn't work when using @typescript-eslint v6 + if (semver.major(typescriptESLintPluginVersion) === 6) { + for (const project of config.projects) { + project.testPathIgnorePatterns.push( + '/src/rules/__tests__/unbound-method.test.ts', + ); + project.coveragePathIgnorePatterns.push( + '/src/rules/unbound-method.ts', + ); + } + } +} + +export default config; diff --git a/package.json b/package.json index 37fd5a354..8c96ce99d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-jest", - "version": "27.9.0", + "version": "28.0.0-next.7", "description": "ESLint rules for Jest", "keywords": [ "eslint", @@ -64,38 +64,8 @@ "@semantic-release/github" ] }, - "jest": { - "coverageThreshold": { - "global": { - "branches": 100, - "functions": 100, - "lines": 100, - "statements": 100 - } - }, - "projects": [ - { - "displayName": "test", - "testPathIgnorePatterns": [ - "/lib/.*", - "/src/rules/__tests__/fixtures/*", - "/src/rules/__tests__/test-utils.ts" - ] - }, - { - "displayName": "lint", - "runner": "jest-runner-eslint", - "testMatch": [ - "/**/*.{js,ts}" - ], - "testPathIgnorePatterns": [ - "/lib/.*" - ] - } - ] - }, "dependencies": { - "@typescript-eslint/utils": "^5.10.0" + "@typescript-eslint/utils": "^6.0.0" }, "devDependencies": { "@babel/cli": "^7.4.4", @@ -107,16 +77,16 @@ "@schemastore/package": "^0.0.10", "@semantic-release/changelog": "^6.0.0", "@semantic-release/git": "^10.0.0", - "@tsconfig/node14": "^14.1.0", + "@tsconfig/node16": "^16.0.0", "@types/eslint": "^8.4.6", "@types/jest": "^29.0.0", "@types/node": "^14.18.26", - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", "babel-jest": "^29.0.0", "babel-plugin-replace-ts-export-assignment": "^0.0.2", "dedent": "^1.5.0", - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "eslint-config-prettier": "^9.0.0", "eslint-doc-generator": "^1.0.0", "eslint-plugin-eslint-comments": "^3.1.2", @@ -142,8 +112,8 @@ "typescript": "^5.0.4" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "jest": "*" }, "peerDependenciesMeta": { @@ -156,7 +126,7 @@ }, "packageManager": "yarn@3.8.1", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "publishConfig": { "provenance": true diff --git a/src/__tests__/__snapshots__/rules.test.ts.snap b/src/__tests__/__snapshots__/rules.test.ts.snap index 3044c709a..b0d635013 100644 --- a/src/__tests__/__snapshots__/rules.test.ts.snap +++ b/src/__tests__/__snapshots__/rules.test.ts.snap @@ -193,20 +193,6 @@ exports[`rules should export configs that refer to actual rules 1`] = ` "jest/valid-title": "error", }, }, - "flat/snapshots": { - "files": [ - "**/*.snap", - ], - "plugins": { - "jest": ObjectContaining { - "meta": { - "name": "eslint-plugin-jest", - "version": Any, - }, - }, - }, - "processor": "jest/snapshots", - }, "flat/style": { "languageOptions": { "globals": { diff --git a/src/__tests__/rules.test.ts b/src/__tests__/rules.test.ts index 59a6e3beb..db8eb4635 100644 --- a/src/__tests__/rules.test.ts +++ b/src/__tests__/rules.test.ts @@ -2,7 +2,7 @@ import { existsSync } from 'fs'; import { resolve } from 'path'; import plugin from '../'; -const numberOfRules = 53; +const numberOfRules = 52; const ruleNames = Object.keys(plugin.rules); const deprecatedRules = Object.entries(plugin.rules) .filter(([, rule]) => rule.meta.deprecated) @@ -61,7 +61,6 @@ describe('rules', () => { 'flat/recommended': { plugins: { jest: expectJestPlugin } }, 'flat/style': { plugins: { jest: expectJestPlugin } }, 'flat/all': { plugins: { jest: expectJestPlugin } }, - 'flat/snapshots': { plugins: { jest: expectJestPlugin } }, }); expect(Object.keys(recommendedConfigs)).toEqual([ 'all', @@ -70,7 +69,6 @@ describe('rules', () => { 'flat/all', 'flat/recommended', 'flat/style', - 'flat/snapshots', ]); expect(Object.keys(recommendedConfigs.all.rules)).toHaveLength( ruleNames.length - deprecatedRules.length, @@ -78,12 +76,9 @@ describe('rules', () => { expect(Object.keys(recommendedConfigs['flat/all'].rules)).toHaveLength( ruleNames.length - deprecatedRules.length, ); - const allConfigRules = Object.values(recommendedConfigs) - .map(config => Object.keys(config.rules ?? {})) - .reduce((previousValue, currentValue) => [ - ...previousValue, - ...currentValue, - ]); + const allConfigRules = Object.values(recommendedConfigs).flatMap(config => + Object.keys(config.rules ?? {}), + ); allConfigRules.forEach(rule => { const ruleNamePrefix = 'jest/'; diff --git a/src/index.ts b/src/index.ts index 2396738e6..d6322697a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,50 +1,16 @@ import { readdirSync } from 'fs'; import { join, parse } from 'path'; -import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; +import type { TSESLint } from '@typescript-eslint/utils'; import { name as packageName, version as packageVersion, } from '../package.json'; import globals from './globals.json'; -import * as snapshotProcessor from './processors/snapshot-processor'; type RuleModule = TSESLint.RuleModule & { meta: Required, 'docs'>>; }; -// v5 of `@typescript-eslint/experimental-utils` removed this -declare module '@typescript-eslint/utils/dist/ts-eslint/Rule' { - export interface RuleMetaDataDocs { - category: 'Best Practices' | 'Possible Errors'; - } -} - -declare module '@typescript-eslint/utils/dist/ts-eslint/SourceCode' { - export interface SourceCode { - /** - * Returns the scope of the given node. - * This information can be used track references to variables. - * @since 8.37.0 - */ - getScope(node: TSESTree.Node): TSESLint.Scope.Scope; - /** - * Returns an array of the ancestors of the given node, starting at - * the root of the AST and continuing through the direct parent of the current node. - * This array does not include the currently-traversed node itself. - * @since 8.38.0 - */ - getAncestors(node: TSESTree.Node): TSESTree.Node[]; - /** - * Returns a list of variables declared by the given node. - * This information can be used to track references to variables. - * @since 8.38.0 - */ - getDeclaredVariables( - node: TSESTree.Node, - ): readonly TSESLint.Scope.Variable[]; - } -} - // copied from https://github.com/babel/babel/blob/d8da63c929f2d28c401571e2a43166678c555bc4/packages/babel-helpers/src/helpers.js#L602-L606 /* istanbul ignore next */ const interopRequireDefault = (obj: any): { default: any } => @@ -109,8 +75,7 @@ const plugin = { | 'style' | 'flat/all' | 'flat/recommended' - | 'flat/style' - | 'flat/snapshots', + | 'flat/style', Pick, 'rules'> >, environments: { @@ -118,10 +83,6 @@ const plugin = { globals, }, }, - processors: { - snapshots: snapshotProcessor, - '.snap': snapshotProcessor, - }, rules, }; @@ -146,12 +107,6 @@ plugin.configs = { 'flat/all': createFlatConfig(allRules), 'flat/recommended': createFlatConfig(recommendedRules), 'flat/style': createFlatConfig(styleRules), - 'flat/snapshots': { - // @ts-expect-error this is introduced in flat config - files: ['**/*.snap'], - plugins: { jest: plugin }, - processor: 'jest/snapshots', - }, }; export = plugin; diff --git a/src/processors/__tests__/snapshot-processor.test.ts b/src/processors/__tests__/snapshot-processor.test.ts deleted file mode 100644 index 4ea625822..000000000 --- a/src/processors/__tests__/snapshot-processor.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as snapshotProcessor from '../snapshot-processor'; - -describe('snapshot-processor', () => { - it('exports an object with preprocess and postprocess functions', () => { - expect(snapshotProcessor).toMatchObject({ - preprocess: expect.any(Function), - postprocess: expect.any(Function), - }); - }); - - describe('preprocess function', () => { - it('should pass on untouched source code to source array', () => { - const { preprocess } = snapshotProcessor; - const sourceCode = "const name = 'johnny bravo';"; - const result = preprocess(sourceCode, 'my-file.snap'); - - expect(result).toEqual([sourceCode]); - }); - }); - - describe('postprocess function', () => { - it('should only return messages about snapshot specific rules', () => { - const { postprocess } = snapshotProcessor; - - const result = postprocess( - [ - ['no-console', 'global-require', 'jest/no-large-snapshots'].map( - ruleId => ({ - ruleId, - column: 1, - line: 1, - source: null, - nodeType: 'Program', - message: 'something is not right about this...', - severity: 1, - }), - ), - ], - 'my-file.snap', - ); - - expect(result).toEqual([ - { - ruleId: 'jest/no-large-snapshots', - column: 1, - line: 1, - source: null, - nodeType: 'Program', - message: 'something is not right about this...', - severity: 1, - }, - ]); - }); - }); -}); diff --git a/src/processors/snapshot-processor.ts b/src/processors/snapshot-processor.ts deleted file mode 100644 index f455e3cb1..000000000 --- a/src/processors/snapshot-processor.ts +++ /dev/null @@ -1,15 +0,0 @@ -// https://eslint.org/docs/developer-guide/working-with-plugins#processors-in-plugins -// https://github.com/typescript-eslint/typescript-eslint/issues/808 -import type { TSESLint } from '@typescript-eslint/utils'; -import { - name as packageName, - version as packageVersion, -} from '../../package.json'; - -type SnapshotProcessor = Required; - -export const meta = { name: packageName, version: packageVersion }; -export const preprocess: SnapshotProcessor['preprocess'] = source => [source]; -export const postprocess: SnapshotProcessor['postprocess'] = messages => - // snapshot files should only be linted with snapshot specific rules - messages[0].filter(message => message.ruleId === 'jest/no-large-snapshots'); diff --git a/src/rules/__tests__/consistent-test-it.test.ts b/src/rules/__tests__/consistent-test-it.test.ts index 354629e17..c11577c22 100644 --- a/src/rules/__tests__/consistent-test-it.test.ts +++ b/src/rules/__tests__/consistent-test-it.test.ts @@ -1,10 +1,9 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../consistent-test-it'; import { TestCaseName } from '../utils'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/expect-expect.test.ts b/src/rules/__tests__/expect-expect.test.ts index edaed7a4a..59018e817 100644 --- a/src/rules/__tests__/expect-expect.test.ts +++ b/src/rules/__tests__/expect-expect.test.ts @@ -1,9 +1,9 @@ -import { AST_NODE_TYPES, TSESLint } from '@typescript-eslint/utils'; +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../expect-expect'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/max-expects.test.ts b/src/rules/__tests__/max-expects.test.ts index 17a2853fb..e629c5695 100644 --- a/src/rules/__tests__/max-expects.test.ts +++ b/src/rules/__tests__/max-expects.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../max-expects'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/max-nested-describe.test.ts b/src/rules/__tests__/max-nested-describe.test.ts index a23465071..54301882e 100644 --- a/src/rules/__tests__/max-nested-describe.test.ts +++ b/src/rules/__tests__/max-nested-describe.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../max-nested-describe'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/no-alias-methods.test.ts b/src/rules/__tests__/no-alias-methods.test.ts index 22b1bf954..a49717f2f 100644 --- a/src/rules/__tests__/no-alias-methods.test.ts +++ b/src/rules/__tests__/no-alias-methods.test.ts @@ -1,7 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../no-alias-methods'; +import { FlatCompatRuleTester } from './test-utils'; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new FlatCompatRuleTester(); ruleTester.run('no-alias-methods', rule, { valid: [ diff --git a/src/rules/__tests__/no-commented-out-tests.test.ts b/src/rules/__tests__/no-commented-out-tests.test.ts index 540269919..d919a0bb7 100644 --- a/src/rules/__tests__/no-commented-out-tests.test.ts +++ b/src/rules/__tests__/no-commented-out-tests.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-commented-out-tests'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-conditional-expect.test.ts b/src/rules/__tests__/no-conditional-expect.test.ts index 86c9cee5d..93eddc043 100644 --- a/src/rules/__tests__/no-conditional-expect.test.ts +++ b/src/rules/__tests__/no-conditional-expect.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-conditional-expect'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2019, diff --git a/src/rules/__tests__/no-conditional-in-test.test.ts b/src/rules/__tests__/no-conditional-in-test.test.ts index f133a7647..c005cd3c1 100644 --- a/src/rules/__tests__/no-conditional-in-test.test.ts +++ b/src/rules/__tests__/no-conditional-in-test.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-conditional-in-test'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-confusing-set-timeout.test.ts b/src/rules/__tests__/no-confusing-set-timeout.test.ts index c7369d1ac..ec2d9a276 100644 --- a/src/rules/__tests__/no-confusing-set-timeout.test.ts +++ b/src/rules/__tests__/no-confusing-set-timeout.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-confusing-set-timeout'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2020, diff --git a/src/rules/__tests__/no-deprecated-functions.test.ts b/src/rules/__tests__/no-deprecated-functions.test.ts index c4964c687..4fd970c3a 100644 --- a/src/rules/__tests__/no-deprecated-functions.test.ts +++ b/src/rules/__tests__/no-deprecated-functions.test.ts @@ -4,6 +4,7 @@ import { type JestVersion, detectJestVersion, } from '../utils/detectJestVersion'; +import { FlatCompatRuleTester, usingFlatConfig } from './test-utils'; jest.mock('../utils/detectJestVersion'); @@ -11,7 +12,7 @@ const detectJestVersionMock = detectJestVersion as jest.MockedFunction< typeof detectJestVersion >; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new FlatCompatRuleTester(); const generateValidCases = ( jestVersion: JestVersion | string | undefined, @@ -120,30 +121,26 @@ describe('the rule', () => { valid: [ 'jest', 'require("fs")', - ...allowedFunctions - .map(func => generateValidCases(jestVersion, func)) - .reduce((acc, arr) => acc.concat(arr), []), + ...allowedFunctions.flatMap(func => + generateValidCases(jestVersion, func), + ), ], - invalid: deprecations - .map(([, deprecation, replacement]) => - generateInvalidCases(jestVersion, deprecation, replacement), - ) - .reduce((acc, arr) => acc.concat(arr), []), + invalid: deprecations.flatMap(([, deprecation, replacement]) => + generateInvalidCases(jestVersion, deprecation, replacement), + ), }); ruleTester.run('detected jest version', rule, { valid: [ 'jest', 'require("fs")', - ...allowedFunctions - .map(func => generateValidCases(undefined, func)) - .reduce((acc, arr) => acc.concat(arr), []), + ...allowedFunctions.flatMap(func => + generateValidCases(undefined, func), + ), ], - invalid: deprecations - .map(([, deprecation, replacement]) => - generateInvalidCases(undefined, deprecation, replacement), - ) - .reduce((acc, arr) => acc.concat(arr), []), + invalid: deprecations.flatMap(([, deprecation, replacement]) => + generateInvalidCases(undefined, deprecation, replacement), + ), }); }); @@ -158,6 +155,20 @@ describe('the rule', () => { expect(() => { const linter = new TSESLint.Linter(); + /* istanbul ignore if */ + if (usingFlatConfig) { + linter.verify('jest.resetModuleRegistry()', [ + { + plugins: { + jest: { rules: { 'no-deprecated-functions': rule } }, + }, + rules: { 'jest/no-deprecated-functions': 'error' }, + }, + ]); + + return; + } + linter.defineRule('no-deprecated-functions', rule); linter.verify('jest.resetModuleRegistry()', { diff --git a/src/rules/__tests__/no-disabled-tests.test.ts b/src/rules/__tests__/no-disabled-tests.test.ts index b331767ba..0210d1a94 100644 --- a/src/rules/__tests__/no-disabled-tests.test.ts +++ b/src/rules/__tests__/no-disabled-tests.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-disabled-tests'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-done-callback.test.ts b/src/rules/__tests__/no-done-callback.test.ts index dcb258bc0..0fef8cb61 100644 --- a/src/rules/__tests__/no-done-callback.test.ts +++ b/src/rules/__tests__/no-done-callback.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-done-callback'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, @@ -477,6 +476,14 @@ ruleTester.run('no-done-callback', rule, { messageId: 'noDoneCallback', line: 1, column: 37, + suggestions: [ + { + messageId: 'suggestWrappingInPromise', + data: { callback: 'done' }, + output: + 'test.each``("something", () => {return new Promise(done => { done(); })})', + }, + ], }, ], }, @@ -487,6 +494,14 @@ ruleTester.run('no-done-callback', rule, { messageId: 'noDoneCallback', line: 1, column: 35, + suggestions: [ + { + messageId: 'suggestWrappingInPromise', + data: { callback: 'done' }, + output: + 'it.each``("something", () => {return new Promise(done => { done(); })})', + }, + ], }, ], }, diff --git a/src/rules/__tests__/no-duplicate-hooks.test.ts b/src/rules/__tests__/no-duplicate-hooks.test.ts index 12e067392..48b198ea4 100644 --- a/src/rules/__tests__/no-duplicate-hooks.test.ts +++ b/src/rules/__tests__/no-duplicate-hooks.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-duplicate-hooks'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-export.test.ts b/src/rules/__tests__/no-export.test.ts index 2fc5dbb52..8a5f3e3a6 100644 --- a/src/rules/__tests__/no-export.test.ts +++ b/src/rules/__tests__/no-export.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-export'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-focused-tests.test.ts b/src/rules/__tests__/no-focused-tests.test.ts index 320610868..46946f8e7 100644 --- a/src/rules/__tests__/no-focused-tests.test.ts +++ b/src/rules/__tests__/no-focused-tests.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-focused-tests'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 6, diff --git a/src/rules/__tests__/no-hooks.test.ts b/src/rules/__tests__/no-hooks.test.ts index ffb3e1c8f..915e41f0a 100644 --- a/src/rules/__tests__/no-hooks.test.ts +++ b/src/rules/__tests__/no-hooks.test.ts @@ -1,10 +1,9 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-hooks'; import { HookName } from '../utils'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-identical-title.test.ts b/src/rules/__tests__/no-identical-title.test.ts index 28c1e011e..5e601ee71 100644 --- a/src/rules/__tests__/no-identical-title.test.ts +++ b/src/rules/__tests__/no-identical-title.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-identical-title'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-if.test.ts b/src/rules/__tests__/no-if.test.ts deleted file mode 100644 index 786ace8e5..000000000 --- a/src/rules/__tests__/no-if.test.ts +++ /dev/null @@ -1,866 +0,0 @@ -import { TSESLint } from '@typescript-eslint/utils'; -import dedent from 'dedent'; -import rule from '../no-if'; -import { espreeParser } from './test-utils'; - -const ruleTester = new TSESLint.RuleTester({ - parser: espreeParser, - parserOptions: { - ecmaVersion: 2015, - }, -}); - -ruleTester.run('conditional expressions', rule, { - valid: [ - 'const x = y ? 1 : 0', - dedent` - it('foo', () => { - const foo = function (bar) { - return foo ? bar : null; - }; - }); - `, - dedent` - it('foo', function () { - const foo = function (bar) { - return foo ? bar : null; - }; - }); - `, - dedent` - it.each()('foo', function () { - const foo = function (bar) { - return foo ? bar : null; - }; - }); - `, - ], - invalid: [ - { - code: dedent` - it('foo', () => { - expect(bar ? foo : baz).toBe(boo); - }) - `, - errors: [ - { - data: { condition: 'conditional' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it('foo', () => { - const foo = bar ? foo : baz; - }) - `, - errors: [ - { - data: { condition: 'conditional' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it('foo', () => { - const foo = bar ? foo : baz; - }) - const foo = bar ? foo : baz; - `, - errors: [ - { - data: { condition: 'conditional' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it('foo', () => { - const foo = bar ? foo : baz; - const anotherFoo = anotherBar ? anotherFoo : anotherBaz; - }) - `, - errors: [ - { - data: { condition: 'conditional' }, - messageId: 'conditionalInTest', - }, - { - data: { condition: 'conditional' }, - messageId: 'conditionalInTest', - }, - ], - }, - ], -}); - -ruleTester.run('switch statements', rule, { - valid: [ - dedent` - switch (true) { - case true: {} - } - `, - `it('foo', () => {})`, - dedent` - it('foo', () => {}); - function myTest() { - switch ('bar') { - } - } - `, - dedent` - foo('bar', () => { - switch(baz) {} - }) - `, - dedent` - describe('foo', () => { - switch('bar') {} - }) - `, - dedent` - describe.skip('foo', () => { - switch('bar') {} - }) - `, - dedent` - describe.skip.each()('foo', () => { - switch('bar') {} - }) - `, - dedent` - xdescribe('foo', () => { - switch('bar') {} - }) - `, - dedent` - fdescribe('foo', () => { - switch('bar') {} - }) - `, - dedent` - describe('foo', () => { - switch('bar') {} - }) - switch('bar') {} - `, - dedent` - describe('foo', () => { - afterEach(() => { - switch('bar') {} - }); - }); - `, - dedent` - it('valid', () => { - const values = something.map(thing => { - switch (thing.isFoo) { - case true: - return thing.foo; - default: - return thing.bar; - } - }); - - expect(values).toStrictEqual(['foo']); - }); - `, - dedent` - describe('valid', () => { - it('still valid', () => { - const values = something.map(thing => { - switch (thing.isFoo) { - case true: - return thing.foo; - default: - return thing.bar; - } - }); - - expect(values).toStrictEqual(['foo']); - }); - }); - `, - ], - invalid: [ - { - code: dedent` - it('foo', () => { - switch (true) { - case true: {} - } - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.skip('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.only('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - xit('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - fit('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - fit.concurrent('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - test('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - test.skip('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - test.only('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - xtest('foo', () => { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - xtest('foo', function () { - switch('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - describe('foo', () => { - it('bar', () => { - - switch('bar') {} - }) - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: "it('foo', myTest); function myTest() { switch ('bar') {} }", - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - describe('foo', () => { - it('bar', () => { - switch('bar') {} - }) - it('baz', () => { - switch('qux') {} - switch('quux') {} - }) - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it('foo', () => { - callExpression() - switch ('bar') {} - }) - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - describe('valid', () => { - describe('still valid', () => { - it('really still valid', () => { - const values = something.map((thing) => { - switch (thing.isFoo) { - case true: - return thing.foo; - default: - return thing.bar; - } - }); - - switch('invalid') { - case true: - expect(values).toStrictEqual(['foo']); - } - }); - }); - }); - `, - errors: [ - { - data: { condition: 'switch' }, - messageId: 'conditionalInTest', - }, - ], - }, - ], -}); - -ruleTester.run('if statements', rule, { - valid: [ - 'if(foo) {}', - "it('foo', () => {})", - 'it("foo", function () {})', - "it('foo', () => {}); function myTest() { if('bar') {} }", - dedent` - foo('bar', () => { - if(baz) {} - }) - `, - dedent` - describe('foo', () => { - if('bar') {} - }) - `, - dedent` - describe.skip('foo', () => { - if('bar') {} - }) - `, - dedent` - xdescribe('foo', () => { - if('bar') {} - }) - `, - dedent` - fdescribe('foo', () => { - if('bar') {} - }) - `, - dedent` - describe('foo', () => { - if('bar') {} - }) - if('baz') {} - `, - dedent` - describe('foo', () => { - afterEach(() => { - if('bar') {} - }); - }) - `, - dedent` - describe.each\`\`('foo', () => { - afterEach(() => { - if('bar') {} - }); - }) - `, - dedent` - describe('foo', () => { - beforeEach(() => { - if('bar') {} - }); - }) - `, - 'const foo = bar ? foo : baz;', - dedent` - it('valid', () => { - const values = something.map((thing) => { - if (thing.isFoo) { - return thing.foo - } else { - return thing.bar; - } - }); - - expect(values).toStrictEqual(['foo']); - }); - `, - dedent` - describe('valid', () => { - it('still valid', () => { - const values = something.map((thing) => { - if (thing.isFoo) { - return thing.foo - } else { - return thing.bar; - } - }); - - expect(values).toStrictEqual(['foo']); - }); - }); - `, - dedent` - describe('valid', () => { - describe('still valid', () => { - it('really still valid', () => { - const values = something.map((thing) => { - if (thing.isFoo) { - return thing.foo - } else { - return thing.bar; - } - }); - - expect(values).toStrictEqual(['foo']); - }); - }); - }); - `, - dedent` - it('foo', () => { - const foo = function(bar) { - if (bar) { - return 1; - } else { - return 2; - } - }; - }); - `, - dedent` - it('foo', () => { - function foo(bar) { - if (bar) { - return 1; - } else { - return 2; - } - }; - }); - `, - ], - invalid: [ - { - code: dedent` - it('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.skip('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.skip('foo', function () { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.only('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - xit('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - fit('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - fit.concurrent('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - test('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - test.skip('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - test.only('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - xtest('foo', () => { - if('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - describe('foo', () => { - it('bar', () => { - if('bar') {} - }) - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: "it('foo', myTest); function myTest() { if ('bar') {} }", - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - describe('foo', () => { - it('bar', () => { - if('bar') {} - }) - it('baz', () => { - if('qux') {} - if('quux') {} - }) - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it('foo', () => { - callExpression() - if ('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.each\`\`('foo', () => { - callExpression() - if ('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.each()('foo', () => { - callExpression() - if ('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.only.each\`\`('foo', () => { - callExpression() - if ('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - it.only.each()('foo', () => { - callExpression() - if ('bar') {} - }) - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - { - code: dedent` - describe('valid', () => { - describe('still valid', () => { - it('really still valid', () => { - const values = something.map((thing) => { - if (thing.isFoo) { - return thing.foo - } else { - return thing.bar; - } - }); - - if('invalid') { - expect(values).toStrictEqual(['foo']); - } - }); - }); - }); - `, - errors: [ - { - data: { condition: 'if' }, - messageId: 'conditionalInTest', - }, - ], - }, - ], -}); diff --git a/src/rules/__tests__/no-interpolation-in-snapshots.test.ts b/src/rules/__tests__/no-interpolation-in-snapshots.test.ts index e54f1f1a4..d5ab94d27 100644 --- a/src/rules/__tests__/no-interpolation-in-snapshots.test.ts +++ b/src/rules/__tests__/no-interpolation-in-snapshots.test.ts @@ -1,8 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../no-interpolation-in-snapshots'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/no-jasmine-globals.test.ts b/src/rules/__tests__/no-jasmine-globals.test.ts index e4ac33425..ba25ebe6f 100644 --- a/src/rules/__tests__/no-jasmine-globals.test.ts +++ b/src/rules/__tests__/no-jasmine-globals.test.ts @@ -1,7 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../no-jasmine-globals'; +import { FlatCompatRuleTester } from './test-utils'; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new FlatCompatRuleTester(); ruleTester.run('no-jasmine-globals', rule, { valid: [ diff --git a/src/rules/__tests__/no-large-snapshots.test.ts b/src/rules/__tests__/no-large-snapshots.test.ts index 981f7935b..5d8fa2500 100644 --- a/src/rules/__tests__/no-large-snapshots.test.ts +++ b/src/rules/__tests__/no-large-snapshots.test.ts @@ -1,9 +1,13 @@ import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-large-snapshots'; -import { espreeParser } from './test-utils'; +import { + FlatCompatRuleTester, + espreeParser, + usingFlatConfig, +} from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, @@ -267,6 +271,34 @@ describe('no-large-snapshots', () => { expect(() => { const linter = new TSESLint.Linter(); + /* istanbul ignore if */ + if (usingFlatConfig) { + linter.verify( + 'console.log()', + [ + { + files: ['*.snap'], + plugins: { + jest: { rules: { 'no-large-snapshots': rule } }, + }, + rules: { + 'jest/no-large-snapshots': [ + 'error', + { + allowedSnapshots: { + 'mock-component.jsx.snap': [/a big component \d+/u], + }, + }, + ], + }, + }, + ], + 'mock-component.jsx.snap', + ); + + return; + } + linter.defineRule('no-large-snapshots', rule); linter.verify( diff --git a/src/rules/__tests__/no-mocks-import.test.ts b/src/rules/__tests__/no-mocks-import.test.ts index cdeb49361..de59594df 100644 --- a/src/rules/__tests__/no-mocks-import.test.ts +++ b/src/rules/__tests__/no-mocks-import.test.ts @@ -1,8 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../no-mocks-import'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-restricted-jest-methods.test.ts b/src/rules/__tests__/no-restricted-jest-methods.test.ts index dc60aba1d..20e0b98ed 100644 --- a/src/rules/__tests__/no-restricted-jest-methods.test.ts +++ b/src/rules/__tests__/no-restricted-jest-methods.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-restricted-jest-methods'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/no-restricted-matchers.test.ts b/src/rules/__tests__/no-restricted-matchers.test.ts index 60cfd963b..b31d2d10b 100644 --- a/src/rules/__tests__/no-restricted-matchers.test.ts +++ b/src/rules/__tests__/no-restricted-matchers.test.ts @@ -1,8 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../no-restricted-matchers'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/no-standalone-expect.test.ts b/src/rules/__tests__/no-standalone-expect.test.ts index 439a302de..342f61039 100644 --- a/src/rules/__tests__/no-standalone-expect.test.ts +++ b/src/rules/__tests__/no-standalone-expect.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-standalone-expect'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/no-test-prefixes.test.ts b/src/rules/__tests__/no-test-prefixes.test.ts index b688c883a..107bf4c3b 100644 --- a/src/rules/__tests__/no-test-prefixes.test.ts +++ b/src/rules/__tests__/no-test-prefixes.test.ts @@ -1,8 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-test-prefixes'; +import { FlatCompatRuleTester } from './test-utils'; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new FlatCompatRuleTester(); ruleTester.run('no-test-prefixes', rule, { valid: [ diff --git a/src/rules/__tests__/no-test-return-statement.test.ts b/src/rules/__tests__/no-test-return-statement.test.ts index 9209ed00e..30314f52f 100644 --- a/src/rules/__tests__/no-test-return-statement.test.ts +++ b/src/rules/__tests__/no-test-return-statement.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-test-return-statement'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015 }, }); diff --git a/src/rules/__tests__/no-untyped-mock-factory.test.ts b/src/rules/__tests__/no-untyped-mock-factory.test.ts index 171497699..9965ca771 100644 --- a/src/rules/__tests__/no-untyped-mock-factory.test.ts +++ b/src/rules/__tests__/no-untyped-mock-factory.test.ts @@ -1,8 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../no-untyped-mock-factory'; +import { FlatCompatRuleTester } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: require.resolve('@typescript-eslint/parser'), }); diff --git a/src/rules/__tests__/prefer-called-with.test.ts b/src/rules/__tests__/prefer-called-with.test.ts index cf2832199..e41d17adc 100644 --- a/src/rules/__tests__/prefer-called-with.test.ts +++ b/src/rules/__tests__/prefer-called-with.test.ts @@ -1,7 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../prefer-called-with'; +import { FlatCompatRuleTester } from './test-utils'; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new FlatCompatRuleTester(); ruleTester.run('prefer-called-with', rule, { valid: [ diff --git a/src/rules/__tests__/prefer-comparison-matcher.test.ts b/src/rules/__tests__/prefer-comparison-matcher.test.ts index 8df6065e7..a72d030a0 100644 --- a/src/rules/__tests__/prefer-comparison-matcher.test.ts +++ b/src/rules/__tests__/prefer-comparison-matcher.test.ts @@ -1,8 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; +import type { TSESLint } from '@typescript-eslint/utils'; import rule from '../prefer-comparison-matcher'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, @@ -205,29 +205,23 @@ const generateValidStringLiteralCases = (operator: string, matcher: string) => { ['x', "'y'"], ['x', '`y`'], ['x', '`y${z}`'], - ].reduce((cases, [a, b]) => [ - ...cases, - ...[ - `expect(${a} ${operator} ${b}).${matcher}(true)`, - `expect(${a} ${operator} ${b}).${matcher}(false)`, - `expect(${a} ${operator} ${b}).not.${matcher}(true)`, - `expect(${a} ${operator} ${b}).not.${matcher}(false)`, - `expect(${b} ${operator} ${a}).${matcher}(true)`, - `expect(${b} ${operator} ${a}).${matcher}(false)`, - `expect(${b} ${operator} ${a}).not.${matcher}(true)`, - `expect(${b} ${operator} ${a}).not.${matcher}(false)`, - `expect(${a} ${operator} ${b}).${matcher}(true)`, - `expect(${a} ${operator} ${b}).${matcher}(false)`, - `expect(${a} ${operator} ${b}).not.${matcher}(true)`, - `expect(${a} ${operator} ${b}).not.${matcher}(false)`, - `expect(${b} ${operator} ${a}).${matcher}(true)`, - `expect(${b} ${operator} ${a}).${matcher}(false)`, - `expect(${b} ${operator} ${a}).not.${matcher}(true)`, - `expect(${b} ${operator} ${a}).not.${matcher}(false)`, - `expect(${b} ${operator} ${b}).not.${matcher}(false)`, - `expect(${b} ${operator} ${b}).resolves.not.${matcher}(false)`, - `expect(${b} ${operator} ${b}).resolves.${matcher}(false)`, - ], + ].flatMap(([a, b]) => [ + `expect(${a} ${operator} ${b}).${matcher}(true)`, + `expect(${a} ${operator} ${b}).${matcher}(false)`, + `expect(${a} ${operator} ${b}).not.${matcher}(true)`, + `expect(${a} ${operator} ${b}).not.${matcher}(false)`, + `expect(${a} ${operator} ${b}).resolves.${matcher}(true)`, + `expect(${a} ${operator} ${b}).resolves.${matcher}(false)`, + `expect(${a} ${operator} ${b}).resolves.not.${matcher}(true)`, + `expect(${a} ${operator} ${b}).resolves.not.${matcher}(false)`, + `expect(${b} ${operator} ${a}).resolves.not.${matcher}(false)`, + `expect(${b} ${operator} ${a}).resolves.not.${matcher}(true)`, + `expect(${b} ${operator} ${a}).resolves.${matcher}(false)`, + `expect(${b} ${operator} ${a}).resolves.${matcher}(true)`, + `expect(${b} ${operator} ${a}).not.${matcher}(false)`, + `expect(${b} ${operator} ${a}).not.${matcher}(true)`, + `expect(${b} ${operator} ${a}).${matcher}(false)`, + `expect(${b} ${operator} ${a}).${matcher}(true)`, ]); }; @@ -236,7 +230,7 @@ const testComparisonOperator = ( preferredMatcher: string, preferredMatcherWhenNegated: string, ) => { - ruleTester.run(`prefer-to-be-comparison: ${operator}`, rule, { + ruleTester.run(`prefer-comparison-matcher: ${operator}`, rule, { valid: [ 'expect()', 'expect({}).toStrictEqual({})', @@ -244,27 +238,17 @@ const testComparisonOperator = ( `expect(value).${preferredMatcherWhenNegated}(1);`, `expect(value).not.${preferredMatcher}(1);`, `expect(value).not.${preferredMatcherWhenNegated}(1);`, - ...['toBe', 'toEqual', 'toStrictEqual'].reduce( - (cases, equalityMatcher) => [ - ...cases, - ...generateValidStringLiteralCases(operator, equalityMatcher), - ], - [], + ...['toBe', 'toEqual', 'toStrictEqual'].flatMap(equalityMatcher => + generateValidStringLiteralCases(operator, equalityMatcher), ), ], - invalid: ['toBe', 'toEqual', 'toStrictEqual'].reduce< - Array> - >( - (cases, equalityMatcher) => [ - ...cases, - ...generateInvalidCases( - operator, - equalityMatcher, - preferredMatcher, - preferredMatcherWhenNegated, - ), - ], - [], + invalid: ['toBe', 'toEqual', 'toStrictEqual'].flatMap(equalityMatcher => + generateInvalidCases( + operator, + equalityMatcher, + preferredMatcher, + preferredMatcherWhenNegated, + ), ), }); }; @@ -274,7 +258,7 @@ testComparisonOperator('<', 'toBeLessThan', 'toBeGreaterThanOrEqual'); testComparisonOperator('>=', 'toBeGreaterThanOrEqual', 'toBeLessThan'); testComparisonOperator('<=', 'toBeLessThanOrEqual', 'toBeGreaterThan'); -ruleTester.run(`prefer-to-be-comparison`, rule, { +ruleTester.run(`prefer-comparison-matcher`, rule, { valid: [ 'expect.hasAssertions', 'expect.hasAssertions()', diff --git a/src/rules/__tests__/prefer-each.test.ts b/src/rules/__tests__/prefer-each.test.ts index d001ccb0c..7abde3462 100644 --- a/src/rules/__tests__/prefer-each.test.ts +++ b/src/rules/__tests__/prefer-each.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-each'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-equality-matcher.test.ts b/src/rules/__tests__/prefer-equality-matcher.test.ts index 0f18bacb2..7b266c62f 100644 --- a/src/rules/__tests__/prefer-equality-matcher.test.ts +++ b/src/rules/__tests__/prefer-equality-matcher.test.ts @@ -1,8 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; +import type { TSESLint } from '@typescript-eslint/utils'; import rule from '../prefer-equality-matcher'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-expect-assertions.test.ts b/src/rules/__tests__/prefer-expect-assertions.test.ts index f7d208abe..d83a1a056 100644 --- a/src/rules/__tests__/prefer-expect-assertions.test.ts +++ b/src/rules/__tests__/prefer-expect-assertions.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-expect-assertions'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, @@ -94,7 +93,7 @@ ruleTester.run('prefer-expect-assertions', rule, { it("returns numbers that are greater than four", function() { pleaseExpect.assertions(2); - + for(let thing in things) { pleaseExpect(number).toBeGreaterThan(4); } @@ -374,6 +373,24 @@ ruleTester.run('prefer-expect-assertions', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("it1", async function() {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("it1", async function() {expect.assertions(); + expect(someValue).toBe(true); + }); + `, + }, + ], }, ], }, @@ -391,6 +408,28 @@ ruleTester.run('prefer-expect-assertions', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.hasAssertions(); + for(let thing in things) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.assertions(); + for(let thing in things) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], }, ], }, @@ -408,6 +447,28 @@ ruleTester.run('prefer-expect-assertions', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], }, ], }, @@ -431,6 +492,40 @@ ruleTester.run('prefer-expect-assertions', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => { + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(5); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => { + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(5); + } + }); + `, + }, + ], }, ], }, @@ -493,6 +588,28 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('only returns numbers that are greater than six', () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(6); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('only returns numbers that are greater than six', () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(6); + } + }); + `, + }, + ], }, ], }, @@ -514,6 +631,36 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('returns numbers that are greater than two', function () {expect.hasAssertions(); + const expectNumbersToBeGreaterThan = (numbers, value) => { + for (let number of numbers) { + expect(number).toBeGreaterThan(value); + } + }; + + expectNumbersToBeGreaterThan(getNumbers(), 2); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('returns numbers that are greater than two', function () {expect.assertions(); + const expectNumbersToBeGreaterThan = (numbers, value) => { + for (let number of numbers) { + expect(number).toBeGreaterThan(value); + } + }; + + expectNumbersToBeGreaterThan(getNumbers(), 2); + }); + `, + }, + ], }, ], }, @@ -533,6 +680,32 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("only returns numbers that are greater than seven", function () {expect.hasAssertions(); + const numbers = getNumbers(); + + for (let i = 0; i < numbers.length; i++) { + expect(numbers[i]).toBeGreaterThan(7); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("only returns numbers that are greater than seven", function () {expect.assertions(); + const numbers = getNumbers(); + + for (let i = 0; i < numbers.length; i++) { + expect(numbers[i]).toBeGreaterThan(7); + } + }); + `, + }, + ], }, ], }, @@ -554,6 +727,36 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 5, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('has the number two', () => { + expect(number).toBe(2); + }); + + it('only returns numbers that are less than twenty', () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeLessThan(20); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('has the number two', () => { + expect(number).toBe(2); + }); + + it('only returns numbers that are less than twenty', () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeLessThan(20); + } + }); + `, + }, + ], }, ], }, @@ -573,6 +776,32 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 3, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("is wrong"); + + it("is a test", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("is wrong"); + + it("is a test", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], }, ], }, @@ -598,6 +827,44 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 5, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + + it("returns numbers that are greater than four", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => { + expect(number).toBeGreaterThan(5); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + + it("returns numbers that are greater than four", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => { + expect(number).toBeGreaterThan(5); + }); + `, + }, + ], }, ], }, @@ -619,6 +886,36 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it.each([1, 2, 3])("returns numbers that are greater than four", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it.each([1, 2, 3])("returns numbers that are greater than four", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + ], }, ], }, @@ -640,6 +937,36 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + ], }, ], }, @@ -663,6 +990,40 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("is a number that is greater than four", () => { + expect.hasAssertions(); + + expect(number).toBeGreaterThan(4); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("is a number that is greater than four", () => { + expect.hasAssertions(); + + expect(number).toBeGreaterThan(4); + }); + `, + }, + ], }, ], }, @@ -688,6 +1049,44 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("it1", () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + + it("it1", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("it1", () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + + it("it1", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + `, + }, + ], }, ], }, @@ -711,21 +1110,89 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, - }, - { - messageId: 'haveExpectAssertions', - column: 1, - line: 7, - }, - ], - }, - { - code: dedent` - it("it1", async () => { - expect.hasAssertions(); - - for (const number of getNumbers()) { - expect(number).toBeGreaterThan(4); + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.hasAssertions(); + for (const number of await getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => { + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(5); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => {expect.assertions(); + for (const number of await getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => { + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(5); + } + }); + `, + }, + ], + }, + { + messageId: 'haveExpectAssertions', + column: 1, + line: 7, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => { + for (const number of await getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(5); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", async () => { + for (const number of await getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("returns numbers that are greater than five", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(5); + } + }); + `, + }, + ], + }, + ], + }, + { + code: dedent` + it("it1", async () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); } }); @@ -741,6 +1208,44 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("it1", async () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("it1", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("it1", async () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("it1", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], }, ], }, @@ -766,6 +1271,44 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it.skip.each\`\`("it1", async () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("it1", () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it.skip.each\`\`("it1", async () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("it1", () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], }, ], }, @@ -791,6 +1334,44 @@ ruleTester.run('prefer-expect-assertions (loops)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("it1", async () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("it1", () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("it1", async () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + + it("it1", () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], }, ], }, @@ -927,6 +1508,32 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('sends the data as a string', () => {expect.hasAssertions(); + const stream = openStream(); + + stream.on('data', data => { + expect(data).toBe(expect.any(String)); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('sends the data as a string', () => {expect.assertions(); + const stream = openStream(); + + stream.on('data', data => { + expect(data).toBe(expect.any(String)); + }); + }); + `, + }, + ], }, ], }, @@ -944,6 +1551,28 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('responds ok', function () {expect.hasAssertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('responds ok', function () {expect.assertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + `, + }, + ], }, ], }, @@ -963,6 +1592,32 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('responds ok', function () {expect.hasAssertions(); + client.get('/user', response => { + expect.assertions(1); + + expect(response.status).toBe(200); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('responds ok', function () {expect.assertions(); + client.get('/user', response => { + expect.assertions(1); + + expect(response.status).toBe(200); + }); + }); + `, + }, + ], }, ], }, @@ -973,7 +1628,7 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { expect.assertions(1); expect(response.status).toBe(200); - }; + }; client.get('/user', expectOkResponse); }); @@ -984,6 +1639,36 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('responds ok', function () {expect.hasAssertions(); + const expectOkResponse = response => { + expect.assertions(1); + + expect(response.status).toBe(200); + }; + + client.get('/user', expectOkResponse); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('responds ok', function () {expect.assertions(); + const expectOkResponse = response => { + expect.assertions(1); + + expect(response.status).toBe(200); + }; + + client.get('/user', expectOkResponse); + }); + `, + }, + ], }, ], }, @@ -1003,6 +1688,32 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('returns numbers that are greater than two', function () {expect.hasAssertions(); + const expectNumberToBeGreaterThan = (number, value) => { + expect(number).toBeGreaterThan(value); + }; + + expectNumberToBeGreaterThan(1, 2); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('returns numbers that are greater than two', function () {expect.assertions(); + const expectNumberToBeGreaterThan = (number, value) => { + expect(number).toBeGreaterThan(value); + }; + + expectNumberToBeGreaterThan(1, 2); + }); + `, + }, + ], }, ], }, @@ -1024,6 +1735,36 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('returns numbers that are greater than two', function () {expect.hasAssertions(); + const expectNumbersToBeGreaterThan = (numbers, value) => { + for (let number of numbers) { + expect(number).toBeGreaterThan(value); + } + }; + + expectNumbersToBeGreaterThan(getNumbers(), 2); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('returns numbers that are greater than two', function () {expect.assertions(); + const expectNumbersToBeGreaterThan = (numbers, value) => { + for (let number of numbers) { + expect(number).toBeGreaterThan(value); + } + }; + + expectNumbersToBeGreaterThan(getNumbers(), 2); + }); + `, + }, + ], }, ], }, @@ -1041,6 +1782,28 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('only returns numbers that are greater than six', () => {expect.hasAssertions(); + getNumbers().forEach(number => { + expect(number).toBeGreaterThan(6); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('only returns numbers that are greater than six', () => {expect.assertions(); + getNumbers().forEach(number => { + expect(number).toBeGreaterThan(6); + }); + }); + `, + }, + ], }, ], }, @@ -1064,6 +1827,40 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 3, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("is wrong"); + + it('responds ok', function () {expect.hasAssertions(); + const expectOkResponse = response => { + expect.assertions(1); + + expect(response.status).toBe(200); + }; + + client.get('/user', expectOkResponse); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("is wrong"); + + it('responds ok', function () {expect.assertions(); + const expectOkResponse = response => { + expect.assertions(1); + + expect(response.status).toBe(200); + }; + + client.get('/user', expectOkResponse); + }); + `, + }, + ], }, ], }, @@ -1091,6 +1888,48 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 5, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + + it('responds ok', function () {expect.hasAssertions(); + const expectOkResponse = response => { + expect(response.status).toBe(200); + }; + + client.get('/user', expectOkResponse); + }); + + it("returns numbers that are greater than five", () => { + expect(number).toBeGreaterThan(5); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + + it('responds ok', function () {expect.assertions(); + const expectOkResponse = response => { + expect(response.status).toBe(200); + }; + + client.get('/user', expectOkResponse); + }); + + it("returns numbers that are greater than five", () => { + expect(number).toBeGreaterThan(5); + }); + `, + }, + ], }, ], }, @@ -1116,6 +1955,44 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 5, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + + it("returns numbers that are greater than four", () => {expect.hasAssertions(); + getNumbers().map(number => { + expect(number).toBeGreaterThan(0); + }); + }); + + it("returns numbers that are greater than five", () => { + expect(number).toBeGreaterThan(5); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + + it("returns numbers that are greater than four", () => {expect.assertions(); + getNumbers().map(number => { + expect(number).toBeGreaterThan(0); + }); + }); + + it("returns numbers that are greater than five", () => { + expect(number).toBeGreaterThan(5); + }); + `, + }, + ], }, ], }, @@ -1137,6 +2014,36 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it.each([1, 2, 3])("returns ok", id => {expect.hasAssertions(); + client.get(\`/users/$\{id}\`, response => { + expect(response.status).toBe(200); + }); + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it.each([1, 2, 3])("returns ok", id => {expect.assertions(); + client.get(\`/users/$\{id}\`, response => { + expect(response.status).toBe(200); + }); + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + ], }, ], }, @@ -1158,6 +2065,36 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('responds ok', function () {expect.hasAssertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('responds ok', function () {expect.assertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it("is a number that is greater than four", () => { + expect(number).toBeGreaterThan(4); + }); + `, + }, + ], }, ], }, @@ -1181,6 +2118,40 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('responds ok', function () {expect.hasAssertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it("is a number that is greater than four", () => { + expect.hasAssertions(); + + expect(number).toBeGreaterThan(4); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('responds ok', function () {expect.assertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it("is a number that is greater than four", () => { + expect.hasAssertions(); + + expect(number).toBeGreaterThan(4); + }); + `, + }, + ], }, ], }, @@ -1206,6 +2177,44 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("it1", () => { + expect.hasAssertions(); + + getNumbers().forEach(number => { + expect(number).toBeGreaterThan(0); + }); + }); + + it("it1", () => {expect.hasAssertions(); + getNumbers().forEach(number => { + expect(number).toBeGreaterThan(0); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("it1", () => { + expect.hasAssertions(); + + getNumbers().forEach(number => { + expect(number).toBeGreaterThan(0); + }); + }); + + it("it1", () => {expect.assertions(); + getNumbers().forEach(number => { + expect(number).toBeGreaterThan(0); + }); + }); + `, + }, + ], }, ], }, @@ -1231,6 +2240,44 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('responds ok', function () { + expect.hasAssertions(); + + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it('responds not found', function () {expect.hasAssertions(); + client.get('/user', response => { + expect(response.status).toBe(404); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('responds ok', function () { + expect.hasAssertions(); + + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it('responds not found', function () {expect.assertions(); + client.get('/user', response => { + expect(response.status).toBe(404); + }); + }); + `, + }, + ], }, ], }, @@ -1256,6 +2303,44 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it.skip.each\`\`("it1", async () => { + expect.hasAssertions(); + + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it("responds ok", () => {expect.hasAssertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it.skip.each\`\`("it1", async () => { + expect.hasAssertions(); + + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + + it("responds ok", () => {expect.assertions(); + client.get('/user', response => { + expect(response.status).toBe(200); + }); + }); + `, + }, + ], }, ], }, @@ -1270,7 +2355,39 @@ ruleTester.run('prefer-expect-assertions (callbacks)', rule, { }); `, parserOptions: { sourceType: 'module' }, - errors: [{ endColumn: 3, column: 1, messageId: 'haveExpectAssertions' }], + errors: [ + { + messageId: 'haveExpectAssertions', + column: 1, + endColumn: 3, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("returns numbers that are greater than four", function(expect) {expect.hasAssertions(); + expect.assertions(2); + + for(let thing in things) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("returns numbers that are greater than four", function(expect) {expect.assertions(); + expect.assertions(2); + + for(let thing in things) { + expect(number).toBeGreaterThan(4); + } + }); + `, + }, + ], + }, + ], }, ], }); @@ -1333,6 +2450,40 @@ ruleTester.run('prefer-expect-assertions (mixed)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('only returns numbers that are greater than zero', () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + + it("is zero", () => { + expect.hasAssertions(); + + expect(0).toBe(0); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('only returns numbers that are greater than zero', () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + + it("is zero", () => { + expect.hasAssertions(); + + expect(0).toBe(0); + }); + `, + }, + ], }, ], }, @@ -1358,6 +2509,44 @@ ruleTester.run('prefer-expect-assertions (mixed)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 9, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('only returns numbers that are greater than zero', () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + + it('only returns numbers that are less than 100', () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeLessThan(0); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('only returns numbers that are greater than zero', () => { + expect.hasAssertions(); + + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + + it('only returns numbers that are less than 100', () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeLessThan(0); + } + }); + `, + }, + ], }, ], }, @@ -1378,6 +2567,24 @@ ruleTester.run('prefer-expect-assertions (mixed)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it("to be true", async function() {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it("to be true", async function() {expect.assertions(); + expect(someValue).toBe(true); + }); + `, + }, + ], }, ], }, @@ -1400,6 +2607,28 @@ ruleTester.run('prefer-expect-assertions (mixed)', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it('only returns numbers that are greater than zero', async () => {expect.hasAssertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it('only returns numbers that are greater than zero', async () => {expect.assertions(); + for (const number of getNumbers()) { + expect(number).toBeGreaterThan(0); + } + }); + `, + }, + ], }, ], }, @@ -1501,6 +2730,24 @@ ruleTester.run('.each support', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + test.each()("is not fine", () => {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + test.each()("is not fine", () => {expect.assertions(); + expect(someValue).toBe(true); + }); + `, + }, + ], }, ], }, @@ -1517,6 +2764,28 @@ ruleTester.run('.each support', rule, { messageId: 'haveExpectAssertions', column: 3, line: 2, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + describe.each()('something', () => { + it("is not fine", () => {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + describe.each()('something', () => { + it("is not fine", () => {expect.assertions(); + expect(someValue).toBe(true); + }); + }); + `, + }, + ], }, ], }, @@ -1533,6 +2802,28 @@ ruleTester.run('.each support', rule, { messageId: 'haveExpectAssertions', column: 3, line: 2, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + describe.each()('something', () => { + test.each()("is not fine", () => {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + describe.each()('something', () => { + test.each()("is not fine", () => {expect.assertions(); + expect(someValue).toBe(true); + }); + }); + `, + }, + ], }, ], }, @@ -1548,6 +2839,24 @@ ruleTester.run('.each support', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + test.each()("is not fine", async () => {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + test.each()("is not fine", async () => {expect.assertions(); + expect(someValue).toBe(true); + }); + `, + }, + ], }, ], }, @@ -1563,6 +2872,24 @@ ruleTester.run('.each support', rule, { messageId: 'haveExpectAssertions', column: 1, line: 1, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + it.each()("is not fine", async () => {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + it.each()("is not fine", async () => {expect.assertions(); + expect(someValue).toBe(true); + }); + `, + }, + ], }, ], }, @@ -1580,6 +2907,28 @@ ruleTester.run('.each support', rule, { messageId: 'haveExpectAssertions', column: 3, line: 2, + suggestions: [ + { + messageId: 'suggestAddingHasAssertions', + output: dedent` + describe.each()('something', () => { + test.each()("is not fine", async () => {expect.hasAssertions(); + expect(someValue).toBe(true); + }); + }); + `, + }, + { + messageId: 'suggestAddingAssertions', + output: dedent` + describe.each()('something', () => { + test.each()("is not fine", async () => {expect.assertions(); + expect(someValue).toBe(true); + }); + }); + `, + }, + ], }, ], }, diff --git a/src/rules/__tests__/prefer-expect-resolves.test.ts b/src/rules/__tests__/prefer-expect-resolves.test.ts index 8f7b6589b..37176df2f 100644 --- a/src/rules/__tests__/prefer-expect-resolves.test.ts +++ b/src/rules/__tests__/prefer-expect-resolves.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-expect-resolves'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/prefer-hooks-in-order.test.ts b/src/rules/__tests__/prefer-hooks-in-order.test.ts index ca55d2e22..6dfc03219 100644 --- a/src/rules/__tests__/prefer-hooks-in-order.test.ts +++ b/src/rules/__tests__/prefer-hooks-in-order.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-hooks-in-order'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-hooks-on-top.test.ts b/src/rules/__tests__/prefer-hooks-on-top.test.ts index e8dc3f859..54e7267ec 100644 --- a/src/rules/__tests__/prefer-hooks-on-top.test.ts +++ b/src/rules/__tests__/prefer-hooks-on-top.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-hooks-on-top'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-lowercase-title.test.ts b/src/rules/__tests__/prefer-lowercase-title.test.ts index f745885d3..d8d94d11f 100644 --- a/src/rules/__tests__/prefer-lowercase-title.test.ts +++ b/src/rules/__tests__/prefer-lowercase-title.test.ts @@ -1,10 +1,9 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-lowercase-title'; import { DescribeAlias, TestCaseName } from '../utils'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-mock-promise-shorthand.test.ts b/src/rules/__tests__/prefer-mock-promise-shorthand.test.ts index c5d94af1f..d04d9a86c 100644 --- a/src/rules/__tests__/prefer-mock-promise-shorthand.test.ts +++ b/src/rules/__tests__/prefer-mock-promise-shorthand.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-mock-promise-shorthand'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 6, diff --git a/src/rules/__tests__/prefer-snapshot-hint.test.ts b/src/rules/__tests__/prefer-snapshot-hint.test.ts index dad2b6cde..e38985524 100644 --- a/src/rules/__tests__/prefer-snapshot-hint.test.ts +++ b/src/rules/__tests__/prefer-snapshot-hint.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-snapshot-hint'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-spy-on.test.ts b/src/rules/__tests__/prefer-spy-on.test.ts index fd847b100..69d4a0c75 100644 --- a/src/rules/__tests__/prefer-spy-on.test.ts +++ b/src/rules/__tests__/prefer-spy-on.test.ts @@ -1,8 +1,8 @@ -import { AST_NODE_TYPES, TSESLint } from '@typescript-eslint/utils'; +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import rule from '../prefer-spy-on'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/prefer-strict-equal.test.ts b/src/rules/__tests__/prefer-strict-equal.test.ts index 670a5c12b..cc245dbad 100644 --- a/src/rules/__tests__/prefer-strict-equal.test.ts +++ b/src/rules/__tests__/prefer-strict-equal.test.ts @@ -1,7 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../prefer-strict-equal'; +import { FlatCompatRuleTester } from './test-utils'; -const ruleTester = new TSESLint.RuleTester(); +const ruleTester = new FlatCompatRuleTester(); ruleTester.run('prefer-strict-equal', rule, { valid: [ diff --git a/src/rules/__tests__/prefer-to-be.test.ts b/src/rules/__tests__/prefer-to-be.test.ts index 86ac70558..5cf0b0f36 100644 --- a/src/rules/__tests__/prefer-to-be.test.ts +++ b/src/rules/__tests__/prefer-to-be.test.ts @@ -1,8 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../prefer-to-be'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, @@ -317,7 +316,7 @@ ruleTester.run('prefer-to-be: undefined vs defined', rule, { ], }); -new TSESLint.RuleTester({ +new FlatCompatRuleTester({ parser: require.resolve('@typescript-eslint/parser'), }).run('prefer-to-be: typescript edition', rule, { valid: [ diff --git a/src/rules/__tests__/prefer-to-contain.test.ts b/src/rules/__tests__/prefer-to-contain.test.ts index 458e5d62a..4ff45cd30 100644 --- a/src/rules/__tests__/prefer-to-contain.test.ts +++ b/src/rules/__tests__/prefer-to-contain.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-to-contain'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, @@ -212,7 +211,7 @@ ruleTester.run('prefer-to-contain', rule, { ], }); -new TSESLint.RuleTester({ +new FlatCompatRuleTester({ parser: require.resolve('@typescript-eslint/parser'), }).run('prefer-to-be-null: typescript edition', rule, { valid: [ diff --git a/src/rules/__tests__/prefer-to-have-length.test.ts b/src/rules/__tests__/prefer-to-have-length.test.ts index a7f0807d4..2389d3024 100644 --- a/src/rules/__tests__/prefer-to-have-length.test.ts +++ b/src/rules/__tests__/prefer-to-have-length.test.ts @@ -1,8 +1,7 @@ -import { TSESLint } from '@typescript-eslint/utils'; import rule from '../prefer-to-have-length'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2020, diff --git a/src/rules/__tests__/prefer-todo.test.ts b/src/rules/__tests__/prefer-todo.test.ts index e36b3a5b1..e5c288247 100644 --- a/src/rules/__tests__/prefer-todo.test.ts +++ b/src/rules/__tests__/prefer-todo.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../prefer-todo'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015 }, }); diff --git a/src/rules/__tests__/require-hook.test.ts b/src/rules/__tests__/require-hook.test.ts index e952739cc..49f00ec6a 100644 --- a/src/rules/__tests__/require-hook.test.ts +++ b/src/rules/__tests__/require-hook.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../require-hook'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, @@ -408,7 +407,7 @@ ruleTester.run('require-hook', rule, { ], }); -new TSESLint.RuleTester({ +new FlatCompatRuleTester({ parser: require.resolve('@typescript-eslint/parser'), }).run('require-hook: typescript edition', rule, { valid: [ diff --git a/src/rules/__tests__/require-to-throw-message.test.ts b/src/rules/__tests__/require-to-throw-message.test.ts index 39b7deba9..695f36c0c 100644 --- a/src/rules/__tests__/require-to-throw-message.test.ts +++ b/src/rules/__tests__/require-to-throw-message.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../require-to-throw-message'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/require-top-level-describe.test.ts b/src/rules/__tests__/require-top-level-describe.test.ts index be01704f7..34f80fd4a 100644 --- a/src/rules/__tests__/require-top-level-describe.test.ts +++ b/src/rules/__tests__/require-top-level-describe.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../require-top-level-describe'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, diff --git a/src/rules/__tests__/test-utils.ts b/src/rules/__tests__/test-utils.ts index f21066c16..398b502f1 100644 --- a/src/rules/__tests__/test-utils.ts +++ b/src/rules/__tests__/test-utils.ts @@ -1,6 +1,83 @@ import { createRequire } from 'module'; +import { TSESLint } from '@typescript-eslint/utils'; +import { version as eslintVersion } from 'eslint/package.json'; +import * as semver from 'semver'; const require = createRequire(__filename); const eslintRequire = createRequire(require.resolve('eslint')); export const espreeParser = eslintRequire.resolve('espree'); + +export const usingFlatConfig = semver.major(eslintVersion) >= 9; + +export class FlatCompatRuleTester extends TSESLint.RuleTester { + public constructor(testerConfig?: TSESLint.RuleTesterConfig) { + super(FlatCompatRuleTester._flatCompat(testerConfig)); + } + + public override run< + TMessageIds extends string, + TOptions extends Readonly, + >( + ruleName: string, + rule: TSESLint.RuleModule, + tests: TSESLint.RunTests, + ) { + super.run(ruleName, rule, { + valid: tests.valid.map(t => FlatCompatRuleTester._flatCompat(t)), + invalid: tests.invalid.map(t => FlatCompatRuleTester._flatCompat(t)), + }); + } + + /* istanbul ignore next */ + private static _flatCompat< + T extends + | undefined + | TSESLint.RuleTesterConfig + | string + | TSESLint.ValidTestCase + | TSESLint.InvalidTestCase, + >(config: T): T { + if (!config || !usingFlatConfig || typeof config === 'string') { + return config; + } + + const obj: TSESLint.FlatConfig.Config & { + languageOptions: TSESLint.FlatConfig.LanguageOptions & { + parserOptions: TSESLint.FlatConfig.ParserOptions; + }; + } = { + languageOptions: { parserOptions: {} }, + }; + + for (const [key, value] of Object.entries(config)) { + if (key === 'parser') { + obj.languageOptions.parser = require(value); + + continue; + } + + if (key === 'parserOptions') { + for (const [option, val] of Object.entries(value)) { + if (option === 'ecmaVersion' || option === 'sourceType') { + // @ts-expect-error: TS thinks the value could the opposite type of whatever option is + obj.languageOptions[option] = + val as TSESLint.FlatConfig.LanguageOptions[ + | 'ecmaVersion' + | 'sourceType']; + + continue; + } + + obj.languageOptions.parserOptions[option] = val; + } + + continue; + } + + obj[key as keyof typeof obj] = value; + } + + return obj as unknown as T; + } +} diff --git a/src/rules/__tests__/unbound-method.test.ts b/src/rules/__tests__/unbound-method.test.ts index c3484049d..934f29fa6 100644 --- a/src/rules/__tests__/unbound-method.test.ts +++ b/src/rules/__tests__/unbound-method.test.ts @@ -1,7 +1,8 @@ import path from 'path'; -import { ESLintUtils, type TSESLint } from '@typescript-eslint/utils'; +import type { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import type { MessageIds, Options } from '../unbound-method'; +import { FlatCompatRuleTester } from './test-utils'; function getFixturesRootDir(): string { return path.join(__dirname, 'fixtures'); @@ -9,8 +10,8 @@ function getFixturesRootDir(): string { const rootPath = getFixturesRootDir(); -const ruleTester = new ESLintUtils.RuleTester({ - parser: '@typescript-eslint/parser', +const ruleTester = new FlatCompatRuleTester({ + parser: require.resolve('@typescript-eslint/parser'), parserOptions: { sourceType: 'module', tsconfigRootDir: rootPath, @@ -18,6 +19,26 @@ const ruleTester = new ESLintUtils.RuleTester({ }, }); +const fixtureFilename = path.join(rootPath, 'file.ts'); + +const withFixtureFilename = < + T extends Array< + | (TSESLint.ValidTestCase | string) + | TSESLint.InvalidTestCase + >, +>( + cases: T, +): T extends Array> + ? Array> + : Array> => { + // @ts-expect-error this is fine, and will go away later once we upgrade + return cases.map(code => { + const test = typeof code === 'string' ? { code } : code; + + return { filename: fixtureFilename, ...test }; + }); +}; + const ConsoleClassAndVariableCode = dedent` class Console { log(str) { @@ -164,8 +185,8 @@ describe('error handling', () => { }); describe('when @typescript-eslint/eslint-plugin is not available', () => { - const ruleTester = new ESLintUtils.RuleTester({ - parser: '@typescript-eslint/parser', + const ruleTester = new FlatCompatRuleTester({ + parser: require.resolve('@typescript-eslint/parser'), parserOptions: { sourceType: 'module', tsconfigRootDir: rootPath, @@ -177,7 +198,9 @@ describe('error handling', () => { 'unbound-method jest edition without type service', requireRule(true), { - valid: validTestCases.concat(invalidTestCases.map(({ code }) => code)), + valid: withFixtureFilename( + validTestCases.concat(invalidTestCases.map(({ code }) => code)), + ), invalid: [], }, ); @@ -185,8 +208,8 @@ describe('error handling', () => { }); ruleTester.run('unbound-method jest edition', requireRule(false), { - valid: validTestCases, - invalid: invalidTestCases, + valid: withFixtureFilename(validTestCases), + invalid: withFixtureFilename(invalidTestCases), }); function addContainsMethodsClass(code: string): string { @@ -225,11 +248,12 @@ function addContainsMethodsClassInvalid( } ruleTester.run('unbound-method', requireRule(false), { - valid: [ + valid: withFixtureFilename([ 'Promise.resolve().then(console.log);', "['1', '2', '3'].map(Number.parseInt);", '[5.2, 7.1, 3.6].map(Math.floor);', 'const x = console.log;', + 'const x = Object.defineProperty;', ...[ 'instance.bound();', 'instance.unbound();', @@ -455,8 +479,8 @@ class OtherClass extends BaseClass { const oc = new OtherClass(); oc.superLogThis(); `, - ], - invalid: [ + ]), + invalid: withFixtureFilename([ { code: ` class Console { @@ -762,5 +786,59 @@ class OtherClass extends BaseClass { }, ], }, - ], + { + code: ` +const values = { + a() {}, + b: () => {}, +}; + +const { a, b } = values; + `, + errors: [ + { + line: 7, + column: 9, + endColumn: 10, + messageId: 'unboundWithoutThisAnnotation', + }, + ], + }, + { + code: ` +const values = { + a() {}, + b: () => {}, +}; + +const { a: c } = values; + `, + errors: [ + { + line: 7, + column: 9, + endColumn: 10, + messageId: 'unboundWithoutThisAnnotation', + }, + ], + }, + { + code: ` +const values = { + a() {}, + b: () => {}, +}; + +const { b, a } = values; + `, + errors: [ + { + line: 7, + column: 12, + endColumn: 13, + messageId: 'unboundWithoutThisAnnotation', + }, + ], + }, + ]), }); diff --git a/src/rules/__tests__/valid-describe-callback.test.ts b/src/rules/__tests__/valid-describe-callback.test.ts index 83526a4b7..6fb15bb16 100644 --- a/src/rules/__tests__/valid-describe-callback.test.ts +++ b/src/rules/__tests__/valid-describe-callback.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../valid-describe-callback'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/valid-expect-in-promise.test.ts b/src/rules/__tests__/valid-expect-in-promise.test.ts index 8337c88af..efab56c14 100644 --- a/src/rules/__tests__/valid-expect-in-promise.test.ts +++ b/src/rules/__tests__/valid-expect-in-promise.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../valid-expect-in-promise'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/valid-expect.test.ts b/src/rules/__tests__/valid-expect.test.ts index bb503d825..9a4b5c1a0 100644 --- a/src/rules/__tests__/valid-expect.test.ts +++ b/src/rules/__tests__/valid-expect.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../valid-expect'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/__tests__/valid-title.test.ts b/src/rules/__tests__/valid-title.test.ts index 181ef8cc5..8c8f26465 100644 --- a/src/rules/__tests__/valid-title.test.ts +++ b/src/rules/__tests__/valid-title.test.ts @@ -1,9 +1,8 @@ -import { TSESLint } from '@typescript-eslint/utils'; import dedent from 'dedent'; import rule from '../valid-title'; -import { espreeParser } from './test-utils'; +import { FlatCompatRuleTester, espreeParser } from './test-utils'; -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2017, diff --git a/src/rules/consistent-test-it.ts b/src/rules/consistent-test-it.ts index 3fcd254e4..e0a68daaf 100644 --- a/src/rules/consistent-test-it.ts +++ b/src/rules/consistent-test-it.ts @@ -35,9 +35,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Enforce `test` and `it` usage conventions', - recommended: false, }, fixable: 'code', messages: { @@ -51,9 +49,11 @@ export default createRule< type: 'object', properties: { fn: { + type: 'string', enum: [TestCaseName.it, TestCaseName.test], }, withinDescribe: { + type: 'string', enum: [TestCaseName.it, TestCaseName.test], }, }, diff --git a/src/rules/expect-expect.ts b/src/rules/expect-expect.ts index 4bdd815cd..c4ec8198e 100644 --- a/src/rules/expect-expect.ts +++ b/src/rules/expect-expect.ts @@ -54,9 +54,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Enforce assertion to be made in a test body', - recommended: 'warn', }, messages: { noAssertions: 'Test has no assertions', diff --git a/src/rules/max-expects.ts b/src/rules/max-expects.ts index 3cc20e105..ce62a2bc1 100644 --- a/src/rules/max-expects.ts +++ b/src/rules/max-expects.ts @@ -10,9 +10,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Enforces a maximum number assertion calls in a test body', - recommended: false, }, messages: { exceededMaxAssertion: diff --git a/src/rules/max-nested-describe.ts b/src/rules/max-nested-describe.ts index b807a4591..31f603704 100644 --- a/src/rules/max-nested-describe.ts +++ b/src/rules/max-nested-describe.ts @@ -5,9 +5,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Enforces a maximum depth to nested describe calls', - recommended: false, }, messages: { exceededMaxDepth: diff --git a/src/rules/no-alias-methods.ts b/src/rules/no-alias-methods.ts index dfd4a9629..e8c9f3b0f 100644 --- a/src/rules/no-alias-methods.ts +++ b/src/rules/no-alias-methods.ts @@ -9,9 +9,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow alias methods', - recommended: 'error', }, messages: { replaceAlias: `Replace {{ alias }}() with its canonical name of {{ canonical }}()`, diff --git a/src/rules/no-commented-out-tests.ts b/src/rules/no-commented-out-tests.ts index 1949c3fc4..cf09618f6 100644 --- a/src/rules/no-commented-out-tests.ts +++ b/src/rules/no-commented-out-tests.ts @@ -11,9 +11,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow commented out tests', - recommended: 'warn', }, messages: { commentedTests: 'Some tests seem to be commented', diff --git a/src/rules/no-conditional-expect.ts b/src/rules/no-conditional-expect.ts index 519c23523..31e7d3ada 100644 --- a/src/rules/no-conditional-expect.ts +++ b/src/rules/no-conditional-expect.ts @@ -20,8 +20,6 @@ export default createRule({ meta: { docs: { description: 'Disallow calling `expect` conditionally', - category: 'Best Practices', - recommended: 'error', }, messages: { conditionalExpect: 'Avoid calling `expect` conditionally`', diff --git a/src/rules/no-conditional-in-test.ts b/src/rules/no-conditional-in-test.ts index 6a58a4f77..0338fdf37 100644 --- a/src/rules/no-conditional-in-test.ts +++ b/src/rules/no-conditional-in-test.ts @@ -6,8 +6,6 @@ export default createRule({ meta: { docs: { description: 'Disallow conditional logic in tests', - category: 'Best Practices', - recommended: false, }, messages: { conditionalInTest: 'Avoid having conditionals in tests', diff --git a/src/rules/no-confusing-set-timeout.ts b/src/rules/no-confusing-set-timeout.ts index 52bb29606..f295a36fb 100644 --- a/src/rules/no-confusing-set-timeout.ts +++ b/src/rules/no-confusing-set-timeout.ts @@ -18,9 +18,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow confusing usages of jest.setTimeout', - recommended: false, }, messages: { globalSetTimeout: '`jest.setTimeout` should be call in `global` scope', diff --git a/src/rules/no-deprecated-functions.ts b/src/rules/no-deprecated-functions.ts index f41d65513..d83323d47 100644 --- a/src/rules/no-deprecated-functions.ts +++ b/src/rules/no-deprecated-functions.ts @@ -28,9 +28,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow use of deprecated functions', - recommended: 'error', }, messages: { deprecatedFunction: diff --git a/src/rules/no-disabled-tests.ts b/src/rules/no-disabled-tests.ts index af0c7547e..70d3ef180 100644 --- a/src/rules/no-disabled-tests.ts +++ b/src/rules/no-disabled-tests.ts @@ -10,9 +10,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow disabled tests', - recommended: 'warn', }, messages: { missingFunction: 'Test is missing function argument', diff --git a/src/rules/no-done-callback.ts b/src/rules/no-done-callback.ts index a227987c4..c7a43d34e 100644 --- a/src/rules/no-done-callback.ts +++ b/src/rules/no-done-callback.ts @@ -5,6 +5,7 @@ import { } from '@typescript-eslint/utils'; import { createRule, + getFilename, getNodeName, getSourceCode, isFunction, @@ -37,9 +38,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow using a callback in asynchronous tests and hooks', - recommended: 'error', }, messages: { noDoneCallback: @@ -134,7 +133,7 @@ export default createRule({ !tokenAfterLastParam ) { throw new Error( - `Unexpected null when attempting to fix ${context.getFilename()} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`, + `Unexpected null when attempting to fix ${getFilename(context)} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`, ); } diff --git a/src/rules/no-duplicate-hooks.ts b/src/rules/no-duplicate-hooks.ts index b47db957b..7305ad459 100644 --- a/src/rules/no-duplicate-hooks.ts +++ b/src/rules/no-duplicate-hooks.ts @@ -4,9 +4,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow duplicate setup and teardown hooks', - recommended: false, }, messages: { noDuplicateHook: 'Duplicate {{hook}} in describe block', diff --git a/src/rules/no-export.ts b/src/rules/no-export.ts index bd94acfbd..c1cbe0a80 100644 --- a/src/rules/no-export.ts +++ b/src/rules/no-export.ts @@ -5,9 +5,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow using `exports` in files containing tests', - recommended: 'error', }, messages: { unexpectedExport: `Do not export from a test file`, diff --git a/src/rules/no-focused-tests.ts b/src/rules/no-focused-tests.ts index 0f740d94c..3d7d2ffd3 100644 --- a/src/rules/no-focused-tests.ts +++ b/src/rules/no-focused-tests.ts @@ -5,9 +5,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow focused tests', - recommended: 'error', }, messages: { focusedTest: 'Unexpected focused test', diff --git a/src/rules/no-hooks.ts b/src/rules/no-hooks.ts index 7b08ef71c..88ddfae4d 100644 --- a/src/rules/no-hooks.ts +++ b/src/rules/no-hooks.ts @@ -7,9 +7,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow setup and teardown hooks', - recommended: false, }, messages: { unexpectedHook: "Unexpected '{{ hookName }}' hook", @@ -20,6 +18,7 @@ export default createRule< properties: { allow: { type: 'array', + // @ts-expect-error https://github.com/eslint/eslint/discussions/17573 contains: ['beforeAll', 'beforeEach', 'afterAll', 'afterEach'], }, }, diff --git a/src/rules/no-identical-title.ts b/src/rules/no-identical-title.ts index b8d6f7227..b2f26629e 100644 --- a/src/rules/no-identical-title.ts +++ b/src/rules/no-identical-title.ts @@ -21,9 +21,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow identical titles', - recommended: 'error', }, messages: { multipleTestTitle: diff --git a/src/rules/no-if.ts b/src/rules/no-if.ts deleted file mode 100644 index 880c44b1c..000000000 --- a/src/rules/no-if.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AST_NODE_TYPES, type TSESTree } from '@typescript-eslint/utils'; -import { - TestCaseName, - createRule, - getAccessorValue, - getDeclaredVariables, - getNodeName, - getTestCallExpressionsFromDeclaredVariables, - parseJestFnCall, -} from './utils'; - -const testCaseNames = new Set([ - ...Object.keys(TestCaseName), - 'it.only', - 'it.only', - 'it.skip', - 'it.skip', - 'test.only', - 'test.only', - 'test.skip', - 'test.skip', - 'fit.concurrent', -]); - -const isTestFunctionExpression = ( - node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression, -) => - node.parent !== undefined && - node.parent.type === AST_NODE_TYPES.CallExpression && - testCaseNames.has(getNodeName(node.parent.callee)); - -const conditionName = { - [AST_NODE_TYPES.ConditionalExpression]: 'conditional', - [AST_NODE_TYPES.SwitchStatement]: 'switch', - [AST_NODE_TYPES.IfStatement]: 'if', -}; - -export default createRule({ - name: __filename, - meta: { - docs: { - description: 'Disallow conditional logic', - category: 'Best Practices', - recommended: false, - }, - messages: { - conditionalInTest: 'Test should not contain {{ condition }} statements', - }, - deprecated: true, - replacedBy: ['no-conditional-in-test'], - schema: [], - type: 'suggestion', - }, - defaultOptions: [], - create(context) { - const stack: boolean[] = []; - - function validate( - node: - | TSESTree.ConditionalExpression - | TSESTree.SwitchStatement - | TSESTree.IfStatement, - ) { - const lastElementInStack = stack[stack.length - 1]; - - if (stack.length === 0 || !lastElementInStack) { - return; - } - - context.report({ - data: { condition: conditionName[node.type] }, - messageId: 'conditionalInTest', - node, - }); - } - - return { - CallExpression(node) { - const jestFnCall = parseJestFnCall(node, context); - - if (jestFnCall?.type === 'test') { - stack.push(true); - - if (jestFnCall.members.some(s => getAccessorValue(s) === 'each')) { - stack.push(true); - } - } - }, - FunctionExpression(node) { - stack.push(isTestFunctionExpression(node)); - }, - FunctionDeclaration(node) { - const declaredVariables = getDeclaredVariables(context, node); - const testCallExpressions = getTestCallExpressionsFromDeclaredVariables( - declaredVariables, - context, - ); - - stack.push(testCallExpressions.length > 0); - }, - ArrowFunctionExpression(node) { - stack.push(isTestFunctionExpression(node)); - }, - IfStatement: validate, - SwitchStatement: validate, - ConditionalExpression: validate, - 'CallExpression:exit'() { - stack.pop(); - }, - 'FunctionExpression:exit'() { - stack.pop(); - }, - 'FunctionDeclaration:exit'() { - stack.pop(); - }, - 'ArrowFunctionExpression:exit'() { - stack.pop(); - }, - }; - }, -}); diff --git a/src/rules/no-interpolation-in-snapshots.ts b/src/rules/no-interpolation-in-snapshots.ts index 4b7d87daf..1961d0db4 100644 --- a/src/rules/no-interpolation-in-snapshots.ts +++ b/src/rules/no-interpolation-in-snapshots.ts @@ -5,9 +5,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow string interpolation inside snapshots', - recommended: 'error', }, messages: { noInterpolation: 'Do not use string interpolation inside of snapshots', diff --git a/src/rules/no-jasmine-globals.ts b/src/rules/no-jasmine-globals.ts index 89c51ba30..6d0d122dd 100644 --- a/src/rules/no-jasmine-globals.ts +++ b/src/rules/no-jasmine-globals.ts @@ -11,9 +11,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow Jasmine globals', - recommended: 'error', }, messages: { illegalGlobal: diff --git a/src/rules/no-large-snapshots.ts b/src/rules/no-large-snapshots.ts index 0f28dcfba..a33484628 100644 --- a/src/rules/no-large-snapshots.ts +++ b/src/rules/no-large-snapshots.ts @@ -54,11 +54,11 @@ const reportOnViolation = ( const snapshotName = getAccessorValue(node.expression.left.property); isAllowed = allowedSnapshotsInFile.some(name => { - if (name instanceof RegExp) { - return name.test(snapshotName); + if (typeof name === 'string') { + return snapshotName === name; } - return snapshotName === name; + return name.test(snapshotName); }); } } @@ -76,9 +76,7 @@ export default createRule<[RuleOptions], MessageId>({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow large snapshots', - recommended: false, }, messages: { noSnapshot: '`{{ lineCount }}`s should begin with lowercase', @@ -107,7 +105,7 @@ export default createRule<[RuleOptions], MessageId>({ }, defaultOptions: [{}], create(context, [options]) { - if (context.getFilename().endsWith('.snap')) { + if (getFilename(context).endsWith('.snap')) { return { ExpressionStatement(node) { reportOnViolation(context, node, options); diff --git a/src/rules/no-mocks-import.ts b/src/rules/no-mocks-import.ts index 5fac9172e..69e54571b 100644 --- a/src/rules/no-mocks-import.ts +++ b/src/rules/no-mocks-import.ts @@ -17,9 +17,7 @@ export default createRule({ meta: { type: 'problem', docs: { - category: 'Best Practices', description: 'Disallow manually importing from `__mocks__`', - recommended: 'error', }, messages: { noManualImport: `Mocks should not be manually imported from a ${mocksDirName} directory. Instead use \`jest.mock\` and import from the original module path`, diff --git a/src/rules/no-restricted-jest-methods.ts b/src/rules/no-restricted-jest-methods.ts index 37947fce5..b50bf40e6 100644 --- a/src/rules/no-restricted-jest-methods.ts +++ b/src/rules/no-restricted-jest-methods.ts @@ -12,9 +12,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow specific `jest.` methods', - recommended: false, }, type: 'suggestion', schema: [ diff --git a/src/rules/no-restricted-matchers.ts b/src/rules/no-restricted-matchers.ts index f05cd4367..528704be4 100644 --- a/src/rules/no-restricted-matchers.ts +++ b/src/rules/no-restricted-matchers.ts @@ -23,9 +23,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow specific matchers & modifiers', - recommended: false, }, type: 'suggestion', schema: [ diff --git a/src/rules/no-standalone-expect.ts b/src/rules/no-standalone-expect.ts index 5afcc977c..bb5c43fdc 100644 --- a/src/rules/no-standalone-expect.ts +++ b/src/rules/no-standalone-expect.ts @@ -60,9 +60,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow using `expect` outside of `it` or `test` blocks', - recommended: 'error', }, messages: { unexpectedExpect: 'Expect must be inside of a test block', @@ -70,6 +68,7 @@ export default createRule< type: 'suggestion', schema: [ { + type: 'object', properties: { additionalTestBlockFunctions: { type: 'array', diff --git a/src/rules/no-test-prefixes.ts b/src/rules/no-test-prefixes.ts index 64b5cc03f..f0a38ef8f 100644 --- a/src/rules/no-test-prefixes.ts +++ b/src/rules/no-test-prefixes.ts @@ -5,9 +5,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Require using `.only` and `.skip` over `f` and `x`', - recommended: 'error', }, messages: { usePreferredName: 'Use "{{ preferredNodeName }}" instead', diff --git a/src/rules/no-test-return-statement.ts b/src/rules/no-test-return-statement.ts index 252c76e67..6cde8e75d 100644 --- a/src/rules/no-test-return-statement.ts +++ b/src/rules/no-test-return-statement.ts @@ -25,9 +25,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow explicitly returning from tests', - recommended: false, }, messages: { noReturnValue: 'Jest tests should not return a value', diff --git a/src/rules/no-untyped-mock-factory.ts b/src/rules/no-untyped-mock-factory.ts index a3abe55cc..4f0448696 100644 --- a/src/rules/no-untyped-mock-factory.ts +++ b/src/rules/no-untyped-mock-factory.ts @@ -21,10 +21,8 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Disallow using `jest.mock()` factories without an explicit type parameter', - recommended: false, }, messages: { addTypeParameterToModuleMock: @@ -38,7 +36,7 @@ export default createRule({ create(context) { return { CallExpression(node: TSESTree.CallExpression): void { - const { callee, typeParameters } = node; + const { callee, typeArguments } = node; if (callee.type !== AST_NODE_TYPES.MemberExpression) { return; @@ -55,7 +53,7 @@ export default createRule({ const [nameNode, factoryNode] = node.arguments; const hasTypeParameter = - typeParameters !== undefined && typeParameters.params.length > 0; + typeArguments !== undefined && typeArguments.params.length > 0; const hasReturnType = isFunction(factoryNode) && factoryNode.returnType !== undefined; diff --git a/src/rules/prefer-called-with.ts b/src/rules/prefer-called-with.ts index b4b6709a2..646309cd2 100644 --- a/src/rules/prefer-called-with.ts +++ b/src/rules/prefer-called-with.ts @@ -4,10 +4,8 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `toBeCalledWith()` or `toHaveBeenCalledWith()`', - recommended: false, }, messages: { preferCalledWith: 'Prefer {{ matcherName }}With(/* expected args */)', diff --git a/src/rules/prefer-comparison-matcher.ts b/src/rules/prefer-comparison-matcher.ts index 17b87ac4a..ec356f656 100644 --- a/src/rules/prefer-comparison-matcher.ts +++ b/src/rules/prefer-comparison-matcher.ts @@ -57,9 +57,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using the built-in comparison matchers', - recommended: false, }, messages: { useToBeComparison: 'Prefer using `{{ preferredMatcher }}` instead', diff --git a/src/rules/prefer-each.ts b/src/rules/prefer-each.ts index c337d71cc..141a9175b 100644 --- a/src/rules/prefer-each.ts +++ b/src/rules/prefer-each.ts @@ -5,9 +5,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Prefer using `.each` rather than manual loops', - recommended: false, }, messages: { preferEach: 'prefer using `{{ fn }}.each` rather than a manual loop', diff --git a/src/rules/prefer-equality-matcher.ts b/src/rules/prefer-equality-matcher.ts index 18ed9abb1..02932692e 100644 --- a/src/rules/prefer-equality-matcher.ts +++ b/src/rules/prefer-equality-matcher.ts @@ -14,9 +14,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using the built-in equality matchers', - recommended: false, }, messages: { useEqualityMatcher: 'Prefer using one of the equality matchers instead', diff --git a/src/rules/prefer-expect-assertions.ts b/src/rules/prefer-expect-assertions.ts index d7d3be5a0..8ec38c92d 100644 --- a/src/rules/prefer-expect-assertions.ts +++ b/src/rules/prefer-expect-assertions.ts @@ -64,10 +64,8 @@ export default createRule<[RuleOptions], MessageIds>({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `expect.assertions()` OR `expect.hasAssertions()`', - recommended: false, }, messages: { hasAssertionsTakesNoArguments: diff --git a/src/rules/prefer-expect-resolves.ts b/src/rules/prefer-expect-resolves.ts index cc9b09605..0c4719dc1 100644 --- a/src/rules/prefer-expect-resolves.ts +++ b/src/rules/prefer-expect-resolves.ts @@ -5,10 +5,8 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Prefer `await expect(...).resolves` over `expect(await ...)` syntax', - recommended: false, }, fixable: 'code', messages: { diff --git a/src/rules/prefer-hooks-in-order.ts b/src/rules/prefer-hooks-in-order.ts index 3f1f626d1..a5544db90 100644 --- a/src/rules/prefer-hooks-in-order.ts +++ b/src/rules/prefer-hooks-in-order.ts @@ -6,9 +6,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Prefer having hooks in a consistent order', - recommended: false, }, messages: { reorderHooks: `\`{{ currentHook }}\` hooks should be before any \`{{ previousHook }}\` hooks`, diff --git a/src/rules/prefer-hooks-on-top.ts b/src/rules/prefer-hooks-on-top.ts index 433e20a9b..0b68cd0ed 100644 --- a/src/rules/prefer-hooks-on-top.ts +++ b/src/rules/prefer-hooks-on-top.ts @@ -4,9 +4,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest having hooks before any test cases', - recommended: false, }, messages: { noHookOnTop: 'Hooks should come before test cases', diff --git a/src/rules/prefer-lowercase-title.ts b/src/rules/prefer-lowercase-title.ts index cf9a4f6bf..b87b72581 100644 --- a/src/rules/prefer-lowercase-title.ts +++ b/src/rules/prefer-lowercase-title.ts @@ -56,8 +56,6 @@ export default createRule< type: 'suggestion', docs: { description: 'Enforce lowercase test names', - category: 'Best Practices', - recommended: false, }, fixable: 'code', messages: { @@ -70,11 +68,14 @@ export default createRule< ignore: { type: 'array', items: { + type: 'string', + // for some reason TypeScript thinks this _must_ be a read-only + // array, so we have to explicitly cast it as a mutable array enum: [ DescribeAlias.describe, TestCaseName.test, TestCaseName.it, - ], + ] as string[], }, additionalItems: false, }, diff --git a/src/rules/prefer-mock-promise-shorthand.ts b/src/rules/prefer-mock-promise-shorthand.ts index 7007d816e..c32a456b7 100644 --- a/src/rules/prefer-mock-promise-shorthand.ts +++ b/src/rules/prefer-mock-promise-shorthand.ts @@ -32,9 +32,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Prefer mock resolved/rejected shorthands for promises', - recommended: false, }, messages: { useMockShorthand: 'Prefer {{ replacement }}', diff --git a/src/rules/prefer-snapshot-hint.ts b/src/rules/prefer-snapshot-hint.ts index 67621c101..b1882e298 100644 --- a/src/rules/prefer-snapshot-hint.ts +++ b/src/rules/prefer-snapshot-hint.ts @@ -43,9 +43,7 @@ export default createRule<[('always' | 'multi')?], keyof typeof messages>({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Prefer including a hint with external snapshots', - recommended: false, }, messages, type: 'suggestion', diff --git a/src/rules/prefer-spy-on.ts b/src/rules/prefer-spy-on.ts index ae1648bf6..c01ae1157 100644 --- a/src/rules/prefer-spy-on.ts +++ b/src/rules/prefer-spy-on.ts @@ -68,9 +68,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `jest.spyOn()`', - recommended: false, }, messages: { useJestSpyOn: 'Use jest.spyOn() instead', diff --git a/src/rules/prefer-strict-equal.ts b/src/rules/prefer-strict-equal.ts index 6586fddca..9fb594610 100644 --- a/src/rules/prefer-strict-equal.ts +++ b/src/rules/prefer-strict-equal.ts @@ -10,9 +10,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `toStrictEqual()`', - recommended: false, }, messages: { useToStrictEqual: 'Use `toStrictEqual()` instead', diff --git a/src/rules/prefer-to-be.ts b/src/rules/prefer-to-be.ts index f3fc235a0..7479d51e9 100644 --- a/src/rules/prefer-to-be.ts +++ b/src/rules/prefer-to-be.ts @@ -93,9 +93,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `toBe()` for primitive literals', - recommended: false, }, messages: { useToBe: 'Use `toBe` when expecting primitive literals', diff --git a/src/rules/prefer-to-contain.ts b/src/rules/prefer-to-contain.ts index 2e4f7e0ca..b062e1f8b 100644 --- a/src/rules/prefer-to-contain.ts +++ b/src/rules/prefer-to-contain.ts @@ -39,9 +39,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `toContain()`', - recommended: false, }, messages: { useToContain: 'Use toContain() instead', diff --git a/src/rules/prefer-to-have-length.ts b/src/rules/prefer-to-have-length.ts index a39fa47ce..683f5bb8f 100644 --- a/src/rules/prefer-to-have-length.ts +++ b/src/rules/prefer-to-have-length.ts @@ -11,9 +11,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `toHaveLength()`', - recommended: false, }, messages: { useToHaveLength: 'Use toHaveLength() instead', diff --git a/src/rules/prefer-todo.ts b/src/rules/prefer-todo.ts index 8e675e1e0..12df97844 100644 --- a/src/rules/prefer-todo.ts +++ b/src/rules/prefer-todo.ts @@ -55,9 +55,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Suggest using `test.todo`', - recommended: false, }, messages: { emptyTest: 'Prefer todo test case over empty test case', diff --git a/src/rules/require-hook.ts b/src/rules/require-hook.ts index 3eb0cbd9c..a60b8e2ee 100644 --- a/src/rules/require-hook.ts +++ b/src/rules/require-hook.ts @@ -65,9 +65,7 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Require setup and teardown code to be within a hook', - recommended: false, }, messages: { useHook: 'This should be done within a hook', diff --git a/src/rules/require-to-throw-message.ts b/src/rules/require-to-throw-message.ts index 9fdd6707c..e80c2f5c3 100644 --- a/src/rules/require-to-throw-message.ts +++ b/src/rules/require-to-throw-message.ts @@ -4,9 +4,7 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Require a message for `toThrow()`', - recommended: false, }, messages: { addErrorMessage: 'Add an error message to {{ matcherName }}()', diff --git a/src/rules/require-top-level-describe.ts b/src/rules/require-top-level-describe.ts index 876881e2b..d0b30cba3 100644 --- a/src/rules/require-top-level-describe.ts +++ b/src/rules/require-top-level-describe.ts @@ -15,10 +15,8 @@ export default createRule< name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Require test cases and hooks to be inside a `describe` block', - recommended: false, }, messages, type: 'suggestion', diff --git a/src/rules/unbound-method.ts b/src/rules/unbound-method.ts index 515c88258..eea17ccce 100644 --- a/src/rules/unbound-method.ts +++ b/src/rules/unbound-method.ts @@ -60,12 +60,12 @@ export default createRule({ type: 'problem', ...baseRule?.meta, docs: { - category: 'Best Practices', description: 'Enforce unbound methods are called with their expected scope', requiresTypeChecking: true, ...baseRule?.meta.docs, - recommended: false, + // mark this as not recommended + recommended: undefined, }, }, create(context) { diff --git a/src/rules/utils/__tests__/parseJestFnCall.test.ts b/src/rules/utils/__tests__/parseJestFnCall.test.ts index cdb3511b3..28c59abe9 100644 --- a/src/rules/utils/__tests__/parseJestFnCall.test.ts +++ b/src/rules/utils/__tests__/parseJestFnCall.test.ts @@ -1,7 +1,7 @@ import type { JSONSchemaForNPMPackageJsonFiles } from '@schemastore/package'; -import { TSESLint, type TSESTree } from '@typescript-eslint/utils'; +import type { TSESTree } from '@typescript-eslint/utils'; import dedent from 'dedent'; -import { espreeParser } from '../../__tests__/test-utils'; +import { FlatCompatRuleTester, espreeParser } from '../../__tests__/test-utils'; import { type ParsedJestFnCall, type ResolvedJestFnWithNode, @@ -29,7 +29,7 @@ const findESLintVersion = (): number => { const eslintVersion = findESLintVersion(); -const ruleTester = new TSESLint.RuleTester({ +const ruleTester = new FlatCompatRuleTester({ parser: espreeParser, parserOptions: { ecmaVersion: 2015, @@ -48,9 +48,7 @@ const rule = createRule({ name: __filename, meta: { docs: { - category: 'Possible Errors', description: 'Fake rule for testing parseJestFnCall', - recommended: false, }, messages: { details: '{{ data }}', diff --git a/src/rules/utils/misc.ts b/src/rules/utils/misc.ts index 9e025fcf5..15c886487 100644 --- a/src/rules/utils/misc.ts +++ b/src/rules/utils/misc.ts @@ -137,18 +137,14 @@ export const getTestCallExpressionsFromDeclaredVariables = ( declaredVariables: readonly TSESLint.Scope.Variable[], context: TSESLint.RuleContext, ): TSESTree.CallExpression[] => { - return declaredVariables.reduce( - (acc, { references }) => - acc.concat( - references - .map(({ identifier }) => identifier.parent) - .filter( - (node): node is TSESTree.CallExpression => - node?.type === AST_NODE_TYPES.CallExpression && - isTypeOfJestFnCall(node, context, ['test']), - ), + return declaredVariables.flatMap(({ references }) => + references + .map(({ identifier }) => identifier.parent) + .filter( + (node): node is TSESTree.CallExpression => + node?.type === AST_NODE_TYPES.CallExpression && + isTypeOfJestFnCall(node, context, ['test']), ), - [], ); }; @@ -234,18 +230,14 @@ export const getFirstMatcherArg = ( export const getFilename = ( context: TSESLint.RuleContext, ) => { - return 'filename' in context - ? (context.filename as string) - : context.getFilename(); + return context.filename ?? context.getFilename(); }; /* istanbul ignore next */ export const getSourceCode = ( context: TSESLint.RuleContext, ) => { - return 'sourceCode' in context - ? (context.sourceCode as TSESLint.SourceCode) - : context.getSourceCode(); + return context.sourceCode ?? context.getSourceCode(); }; /* istanbul ignore next */ @@ -253,13 +245,7 @@ export const getScope = ( context: TSESLint.RuleContext, node: TSESTree.Node, ) => { - const sourceCode = getSourceCode(context); - - if ('getScope' in sourceCode) { - return sourceCode.getScope(node); - } - - return context.getScope(); + return getSourceCode(context).getScope?.(node) ?? context.getScope(); }; /* istanbul ignore next */ @@ -267,13 +253,7 @@ export const getAncestors = ( context: TSESLint.RuleContext, node: TSESTree.Node, ) => { - const sourceCode = getSourceCode(context); - - if ('getAncestors' in sourceCode) { - return sourceCode.getAncestors(node); - } - - return context.getAncestors(); + return getSourceCode(context).getAncestors?.(node) ?? context.getAncestors(); }; /* istanbul ignore next */ @@ -281,11 +261,8 @@ export const getDeclaredVariables = ( context: TSESLint.RuleContext, node: TSESTree.Node, ) => { - const sourceCode = getSourceCode(context); - - if ('getDeclaredVariables' in sourceCode) { - return sourceCode.getDeclaredVariables(node); - } - - return context.getDeclaredVariables(node); + return ( + getSourceCode(context).getDeclaredVariables?.(node) ?? + context.getDeclaredVariables(node) + ); }; diff --git a/src/rules/utils/parseJestFnCall.ts b/src/rules/utils/parseJestFnCall.ts index d05531248..0f5d65ebf 100644 --- a/src/rules/utils/parseJestFnCall.ts +++ b/src/rules/utils/parseJestFnCall.ts @@ -183,20 +183,21 @@ const ValidJestFnCallChains = [ 'xtest.failing.each', ]; -declare module '@typescript-eslint/utils/dist/ts-eslint' { - export interface SharedConfigurationSettings { - jest?: { - globalAliases?: Record; - version?: number | string; - }; - } +// todo: switch back to using declaration merging once https://github.com/typescript-eslint/typescript-eslint/pull/8485 +// is landed +interface SharedConfigurationSettings { + jest?: { + globalAliases?: Record; + version?: number | string; + }; } const resolvePossibleAliasedGlobal = ( global: string, context: TSESLint.RuleContext, ) => { - const globalAliases = context.settings.jest?.globalAliases ?? {}; + const globalAliases = + (context.settings as SharedConfigurationSettings).jest?.globalAliases ?? {}; const alias = Object.entries(globalAliases).find(([, aliases]) => aliases.includes(global), diff --git a/src/rules/valid-describe-callback.ts b/src/rules/valid-describe-callback.ts index 08eb70a00..874511b4c 100644 --- a/src/rules/valid-describe-callback.ts +++ b/src/rules/valid-describe-callback.ts @@ -23,9 +23,7 @@ export default createRule({ meta: { type: 'problem', docs: { - category: 'Possible Errors', description: 'Enforce valid `describe()` callback', - recommended: 'error', }, messages: { nameAndCallback: 'Describe requires name and callback arguments', diff --git a/src/rules/valid-expect-in-promise.ts b/src/rules/valid-expect-in-promise.ts index 04bf86c8e..8570f8ed5 100644 --- a/src/rules/valid-expect-in-promise.ts +++ b/src/rules/valid-expect-in-promise.ts @@ -344,10 +344,8 @@ export default createRule({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Require promises that have expectations in their chain to be valid', - recommended: 'error', }, messages: { expectInFloatingPromise: diff --git a/src/rules/valid-expect.ts b/src/rules/valid-expect.ts index 93b3ef20f..e5b30ea2f 100644 --- a/src/rules/valid-expect.ts +++ b/src/rules/valid-expect.ts @@ -115,9 +115,7 @@ export default createRule<[Options], MessageIds>({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Enforce valid `expect()` usage', - recommended: 'error', }, messages: { tooManyArgs: 'Expect takes at most {{ amount }} argument{{ s }}', diff --git a/src/rules/valid-title.ts b/src/rules/valid-title.ts index 9ed6c7441..43dc09c95 100644 --- a/src/rules/valid-title.ts +++ b/src/rules/valid-title.ts @@ -74,7 +74,7 @@ const compileMatcherPatterns = ( type CompiledMatcherAndMessage = [matcher: RegExp, message?: string]; type MatcherAndMessage = [matcher: string, message?: string]; -const MatcherAndMessageSchema: JSONSchema.JSONSchema7 = { +const MatcherAndMessageSchema: JSONSchema.JSONSchema4 = { type: 'array', items: { type: 'string' }, minItems: 1, @@ -114,9 +114,7 @@ export default createRule<[Options], MessageIds>({ name: __filename, meta: { docs: { - category: 'Best Practices', description: 'Enforce valid titles', - recommended: 'error', }, messages: { titleMustBeString: 'Title must be a string', @@ -158,6 +156,7 @@ export default createRule<[Options], MessageIds>({ MatcherAndMessageSchema, { type: 'object', + // @ts-expect-error https://github.com/eslint/eslint/discussions/17573 propertyNames: { enum: ['describe', 'test', 'it'] }, additionalProperties: { oneOf: [{ type: 'string' }, MatcherAndMessageSchema], diff --git a/tsconfig.json b/tsconfig.json index 49d5cfe4e..6993dce26 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@tsconfig/node14/tsconfig.json", + "extends": "@tsconfig/node16/tsconfig.json", "compilerOptions": { "noEmit": true, "stripInternal": true, @@ -12,11 +12,9 @@ "noFallthroughCasesInSwitch": true, "strict": true, - "esModuleInterop": true, "resolveJsonModule": true, "isolatedModules": true, - "skipLibCheck": false, - "forceConsistentCasingInFileNames": true + "skipLibCheck": false }, "files": ["eslint-remote-tester.config.ts"], "include": ["src/**/*", "tools/**/*"], diff --git a/yarn.lock b/yarn.lock index e0935b0bf..aaa62090f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -59,24 +59,24 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/compat-data@npm:7.24.1" - checksum: e14e94b00c3ac57bba929a87da8edb6c6a99d0051c54bf49591a5481440dd4d3ac7b4e4a93b81b54e45c2bca55e538aa1e1ad8281b083440a1598bfa8c8df03a +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/compat-data@npm:7.24.4" + checksum: 52ce371658dc7796c9447c9cb3b9c0659370d141b76997f21c5e0028cca4d026ca546b84bc8d157ce7ca30bd353d89f9238504eb8b7aefa9b1f178b4c100c2d4 languageName: node linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.4.4": - version: 7.24.3 - resolution: "@babel/core@npm:7.24.3" + version: 7.24.4 + resolution: "@babel/core@npm:7.24.4" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.24.2 - "@babel/generator": ^7.24.1 + "@babel/generator": ^7.24.4 "@babel/helper-compilation-targets": ^7.23.6 "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.24.1 - "@babel/parser": ^7.24.1 + "@babel/helpers": ^7.24.4 + "@babel/parser": ^7.24.4 "@babel/template": ^7.24.0 "@babel/traverse": ^7.24.1 "@babel/types": ^7.24.0 @@ -85,19 +85,19 @@ __metadata: gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 1a33460794f4122cf255b656f4d6586913f41078a1afdf1bcf0365ddbd99c1ddb68f904062f9079445ab26b507c36bc297055192bc26e5c8e6e3def42195f9ab + checksum: 15ecad7581f3329995956ba461961b1af7bed48901f14fe962ccd3217edca60049e9e6ad4ce48134618397e6c90230168c842e2c28e47ef1f16c97dbbf663c61 languageName: node linkType: hard -"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/generator@npm:7.24.1" +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4, @babel/generator@npm:^7.7.2": + version: 7.24.4 + resolution: "@babel/generator@npm:7.24.4" dependencies: "@babel/types": ^7.24.0 "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^2.5.1 - checksum: 98c6ce5ec7a1cba2bdf35cdf607273b90cf7cf82bbe75cd0227363fb84d7e1bd8efa74f40247d5900c8c009123f10132ad209a05283757698de918278c3c6700 + checksum: 1b6146c31386c9df3eb594a2c36b5c98da4f67f7c06edb3d68a442b92516b21bb5ba3ad7dbe0058fe76625ed24d66923e15c95b0df75ef1907d4068921a699b8 languageName: node linkType: hard @@ -132,9 +132,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.1" +"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.20 @@ -147,7 +147,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 310d063eafbd2a777609770c1aa7b24e43f375122fd84031c45edc512686000197da1cf450b48eca266489131bc06dbaa35db2afed8b7213c9bcfa8c89b82c4d + checksum: 75b0a51ae1f7232932559779b78711c271404d02d069156d1bd9a7982c165c5134058d2ec2d8b5f2e42026ee4f52ba2a30c86a7aa3bce6b5fd0991eb721abc8c languageName: node linkType: hard @@ -339,14 +339,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" +"@babel/helpers@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/helpers@npm:7.24.4" dependencies: "@babel/template": ^7.24.0 "@babel/traverse": ^7.24.1 "@babel/types": ^7.24.0 - checksum: 0643b8ccf3358682303aea65f0798e482b2c3642040d32ffe130a245f4a46d0d23fe575a5e06e3cda4e8ec4af89d52b94ff1c444a74465d47ccc27da6ddbbb9f + checksum: ecd2dc0b3b32e24b97fa3bcda432dd3235b77c2be1e16eafc35b8ef8f6c461faa99796a8bc2431a408c98b4aabfd572c160e2b67ecea4c5c9dd3a8314a97994a languageName: node linkType: hard @@ -362,12 +362,24 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/parser@npm:7.24.1" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/parser@npm:7.24.4" bin: parser: ./bin/babel-parser.js - checksum: a1068941dddf82ffdf572565b8b7b2cddb963ff9ddf97e6e28f50e843d820b4285e6def8f59170104a94e2a91ae2e3b326489886d77a57ea29d468f6a5e79bf9 + checksum: 94c9e3e592894cd6fc57c519f4e06b65463df9be5f01739bb0d0bfce7ffcf99b3c2fdadd44dc59cc858ba2739ce6e469813a941c2f2dfacf333a3b2c9c5c8465 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4" + dependencies: + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-plugin-utils": ^7.24.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 0be3f41b1b865d7a4ed1a432337be48de67989d0b4e47def34a05097a804b6fc193115f97c954fd757339e0b80030ecf1d0a3d3fd6e7e91718644de0a5aae3d3 languageName: node linkType: hard @@ -697,14 +709,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.1" +"@babel/plugin-transform-block-scoping@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4" dependencies: "@babel/helper-plugin-utils": ^7.24.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 65423ee83dba4e84c357f34e0970a96d0f5e727fad327cc7bdb0e1492243eb9c72b95d3c649dc0b488b9b4774dadef5662fed0bf66717b59673ff6d4ffbd6441 + checksum: 5229ffe1c55744b96f791521e2876b01ed05c81df67488a7453ce66c2faceb9d1d653089ce6f0abf512752e15e9acac0e75a797a860f24e05b4d36497c7c3183 languageName: node linkType: hard @@ -720,16 +732,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.1" +"@babel/plugin-transform-class-static-block@npm:^7.24.4": + version: 7.24.4 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.24.1 + "@babel/helper-create-class-features-plugin": ^7.24.4 "@babel/helper-plugin-utils": ^7.24.0 "@babel/plugin-syntax-class-static-block": ^7.14.5 peerDependencies: "@babel/core": ^7.12.0 - checksum: 253c627c11d9df79e3b32e78bfa1fe0dd1f91c3579da52bf73f76c83de53b140dcb1c9cc5f4c65ff1505754a01b59bc83987c35bcc8f89492b63dae46adef78f + checksum: 3b1db3308b57ba21d47772a9f183804234c23fd64c9ca40915d2d65c5dc7a48b49a6de16b8b90b7a354eacbb51232a862f0fca3dbd23e27d34641f511decddab languageName: node linkType: hard @@ -1181,16 +1193,16 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-transform-typescript@npm:7.24.1" + version: 7.24.4 + resolution: "@babel/plugin-transform-typescript@npm:7.24.4" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-create-class-features-plugin": ^7.24.1 + "@babel/helper-create-class-features-plugin": ^7.24.4 "@babel/helper-plugin-utils": ^7.24.0 "@babel/plugin-syntax-typescript": ^7.24.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1a37fa55ab176b11c3763da4295651b3db38f0a7f3d47b5cd5ab1e33cbcbbf2b471c4bdb7b24f39392d4660409209621c8d11c521de2deffddc3d876a1b60482 + checksum: 57a9a776b1910c706d28972e4b056ced3af8fc59c29b2a6205c2bb2a408141ddb59a8f2f6041f8467a7b260942818767f4ecabb9f63adf7fddf2afa25e774dfc languageName: node linkType: hard @@ -1242,13 +1254,14 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.4.4": - version: 7.24.3 - resolution: "@babel/preset-env@npm:7.24.3" + version: 7.24.4 + resolution: "@babel/preset-env@npm:7.24.4" dependencies: - "@babel/compat-data": ^7.24.1 + "@babel/compat-data": ^7.24.4 "@babel/helper-compilation-targets": ^7.23.6 "@babel/helper-plugin-utils": ^7.24.0 "@babel/helper-validator-option": ^7.23.5 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.24.4 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.24.1 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.24.1 "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.24.1 @@ -1275,9 +1288,9 @@ __metadata: "@babel/plugin-transform-async-generator-functions": ^7.24.3 "@babel/plugin-transform-async-to-generator": ^7.24.1 "@babel/plugin-transform-block-scoped-functions": ^7.24.1 - "@babel/plugin-transform-block-scoping": ^7.24.1 + "@babel/plugin-transform-block-scoping": ^7.24.4 "@babel/plugin-transform-class-properties": ^7.24.1 - "@babel/plugin-transform-class-static-block": ^7.24.1 + "@babel/plugin-transform-class-static-block": ^7.24.4 "@babel/plugin-transform-classes": ^7.24.1 "@babel/plugin-transform-computed-properties": ^7.24.1 "@babel/plugin-transform-destructuring": ^7.24.1 @@ -1327,7 +1340,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4f3376444f938b3884fddd3cded86cfda97a1fb4bccc93b49fb4593a63f79d9b20e6fb0e1a0934736cea6205df3998c752b248c5f5ec398162fbe165c8e69c5c + checksum: 5a057a6463f92b02bfe66257d3f2c76878815bc7847f2a716b0539d9f547eae2a9d1f0fc62a5c0eff6ab0504bb52e815829ef893e4586b641f8dd6a609d114f3 languageName: node linkType: hard @@ -1367,11 +1380,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.8.4": - version: 7.24.1 - resolution: "@babel/runtime@npm:7.24.1" + version: 7.24.4 + resolution: "@babel/runtime@npm:7.24.4" dependencies: regenerator-runtime: ^0.14.0 - checksum: 5c8f3b912ba949865f03b3cf8395c60e1f4ebd1033fbd835bdfe81b6cac8a87d85bc3c7aded5fcdf07be044c9ab8c818f467abe0deca50020c72496782639572 + checksum: 2f27d4c0ffac7ae7999ac0385e1106f2a06992a8bdcbf3da06adcac7413863cd08c198c2e4e970041bbea849e17f02e1df18875539b6afba76c781b6b59a07c3 languageName: node linkType: hard @@ -1635,7 +1648,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -1646,45 +1659,45 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/eslintrc@npm:^3.0.2": + version: 3.0.2 + resolution: "@eslint/eslintrc@npm:3.0.2" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 + espree: ^10.0.1 + globals: ^14.0.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 + checksum: 05bf516b60fbb1c1bdc264e081118b2172c5feb071cd665976482c5614b8e7950991175fea3ca6b1f482ced7cb0d0aa34ceab3a508d6bf1ff17b4efc0911e293 languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb +"@eslint/js@npm:9.0.0": + version: 9.0.0 + resolution: "@eslint/js@npm:9.0.0" + checksum: bd8692d68fc79306ad44999fdec9c1ab39c72c3947034f5a251a9148bc175f1d831b54cbbe522d69d88d9d4f1b9e85a1495513553b8528fd8b107d77eadb713f languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.12.3": + version: 0.12.3 + resolution: "@humanwhocodes/config-array@npm:0.12.3" dependencies: - "@humanwhocodes/object-schema": ^2.0.2 + "@humanwhocodes/object-schema": ^2.0.3 debug: ^4.3.1 minimatch: ^3.0.5 - checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 + checksum: 4212cf12567538675f45f09dae9715978fac805fbc6f194ce31e62dbbe01ca286b87478463c042883bf4451998be737012dd0882530f55ad0c0e901d963b5123 languageName: node linkType: hard @@ -1695,10 +1708,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 2fc11503361b5fb4f14714c700c02a3f4c7c93e9acd6b87a29f62c522d90470f364d6161b03d1cc618b979f2ae02aed1106fd29d302695d8927e2fc8165ba8ee +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 languageName: node linkType: hard @@ -2076,21 +2089,21 @@ __metadata: linkType: hard "@npmcli/agent@npm:^2.0.0": - version: 2.2.1 - resolution: "@npmcli/agent@npm:2.2.1" + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" dependencies: agent-base: ^7.1.0 http-proxy-agent: ^7.0.0 https-proxy-agent: ^7.0.1 lru-cache: ^10.0.1 - socks-proxy-agent: ^8.0.1 - checksum: c69aca42dbba393f517bc5777ee872d38dc98ea0e5e93c1f6d62b82b8fecdc177a57ea045f07dda1a770c592384b2dd92a5e79e21e2a7cf51c9159466a8f9c9b + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 languageName: node linkType: hard "@npmcli/arborist@npm:^7.2.1": - version: 7.4.0 - resolution: "@npmcli/arborist@npm:7.4.0" + version: 7.4.1 + resolution: "@npmcli/arborist@npm:7.4.1" dependencies: "@isaacs/string-locale-compare": ^1.1.0 "@npmcli/fs": ^3.1.0 @@ -2108,12 +2121,12 @@ __metadata: hosted-git-info: ^7.0.1 json-parse-even-better-errors: ^3.0.0 json-stringify-nice: ^1.1.4 - minimatch: ^9.0.0 + minimatch: ^9.0.4 nopt: ^7.0.0 npm-install-checks: ^6.2.0 npm-package-arg: ^11.0.1 npm-pick-manifest: ^9.0.0 - npm-registry-fetch: ^16.0.0 + npm-registry-fetch: ^16.2.0 npmlog: ^7.0.1 pacote: ^17.0.4 parse-conflict-json: ^3.0.0 @@ -2127,23 +2140,23 @@ __metadata: walk-up-path: ^3.0.1 bin: arborist: bin/index.js - checksum: 9590c77e28c441a917c00de6422a73c74285e28d87f06fb36a36331d7fb969cb68ee04da16174c207c6587c4eaeedf12a50a7718493e4f3f5079b53520314976 + checksum: c0ef7ee7f722849664348d1376d03aa270fd03b6fa9cf3c3a59144c60e57f632652c902757dcdf0a6436e01e85b2d80f8ecd66ec44955eb61e75a9d819250f3b languageName: node linkType: hard "@npmcli/config@npm:^8.0.2": - version: 8.2.0 - resolution: "@npmcli/config@npm:8.2.0" + version: 8.2.1 + resolution: "@npmcli/config@npm:8.2.1" dependencies: "@npmcli/map-workspaces": ^3.0.2 ci-info: ^4.0.0 - ini: ^4.1.0 + ini: ^4.1.2 nopt: ^7.0.0 proc-log: ^3.0.0 read-package-json-fast: ^3.0.2 semver: ^7.3.5 walk-up-path: ^3.0.1 - checksum: 53e5f555bce6eb251cf15b929355f2cb3d75281914edfe9fe6fe6d35127b57e376b17239a28cf389980fc60731c7640edb6277dc6d84c7cb237f6bdd17ad17f3 + checksum: 8e42e609668461a2e940067ec284463bd72b7ab1091ac5f5d9e9ccf8dcebc6059906cc543cde431084acdc07f5adf2e42f324aa46f88ef3040b65dbc3b11836d languageName: node linkType: hard @@ -2264,6 +2277,13 @@ __metadata: languageName: node linkType: hard +"@npmcli/redact@npm:^1.1.0": + version: 1.1.0 + resolution: "@npmcli/redact@npm:1.1.0" + checksum: f200d40c485aea6fdf0487ddfed258ec13a217701261d9115f9c82b65f341403b3dfc7aaa1f5bd0b51b09f7dee03d89b86d99314356faed370bada8d0f000836 + languageName: node + linkType: hard + "@npmcli/run-script@npm:^7.0.0, @npmcli/run-script@npm:^7.0.2, @npmcli/run-script@npm:^7.0.4": version: 7.0.4 resolution: "@npmcli/run-script@npm:7.0.4" @@ -2278,45 +2298,45 @@ __metadata: linkType: hard "@octokit/auth-token@npm:^5.0.0": - version: 5.0.1 - resolution: "@octokit/auth-token@npm:5.0.1" - checksum: b888db9289065dce83235714695f2649ff0ded2cf429fb167fedd058ffd4dd2824aa24b355d71eea334c65e847de2a443dc93efff1b1f53dfbdc3b93a2690f0f + version: 5.1.0 + resolution: "@octokit/auth-token@npm:5.1.0" + checksum: a479e629ceccd8610fdde41236df4fb42ff27c3f7b4133e13fd847e884d987262679dd43aadffcd16869404914ccb33658566260050f5db9fbe0f33065ff7139 languageName: node linkType: hard "@octokit/core@npm:^6.0.0": - version: 6.0.1 - resolution: "@octokit/core@npm:6.0.1" + version: 6.1.1 + resolution: "@octokit/core@npm:6.1.1" dependencies: "@octokit/auth-token": ^5.0.0 "@octokit/graphql": ^8.0.0 "@octokit/request": ^9.0.0 "@octokit/request-error": ^6.0.1 - "@octokit/types": ^12.0.0 + "@octokit/types": ^13.0.0 before-after-hook: ^3.0.2 universal-user-agent: ^7.0.0 - checksum: 542fbe53991f006223794011eb53768ea090f8513dc2aa6d0400d2d05fb2a86d36c57e4fddc21ac95d94fe8f022ec70593471070d324d941dc7c3c27c559e9b7 + checksum: d94c482376e6cd96de96a01c3fa83bc599b34a58820a37c5d4545aac1e959a46b0661fdc390d730685e87af2a2f33759d30ff1aa467fe068eb249518969b765c languageName: node linkType: hard "@octokit/endpoint@npm:^10.0.0": - version: 10.0.0 - resolution: "@octokit/endpoint@npm:10.0.0" + version: 10.1.0 + resolution: "@octokit/endpoint@npm:10.1.0" dependencies: - "@octokit/types": ^12.0.0 + "@octokit/types": ^13.0.0 universal-user-agent: ^7.0.2 - checksum: 56649b117d04f7a2d4e30d78ea4127f5595e22babdb983942d07164ccc34cb449be5699b1af354fc0b9edf2f57e5aefc6daaeb7b213eaf34c8166ea250bc4b54 + checksum: db5b949014acc8a064343a9c765207e55f393379f68e53abdab24523d2e533320a860d9a11300cd8cea86bdf7f4f909c43b6c04534cea5593ee19165669cbd28 languageName: node linkType: hard "@octokit/graphql@npm:^8.0.0": - version: 8.0.1 - resolution: "@octokit/graphql@npm:8.0.1" + version: 8.1.0 + resolution: "@octokit/graphql@npm:8.1.0" dependencies: "@octokit/request": ^9.0.0 - "@octokit/types": ^12.0.0 + "@octokit/types": ^13.0.0 universal-user-agent: ^7.0.0 - checksum: f5c24032631f3dc251562eb7cdb5fb7abca729ca2e98010aa3b9aebd500b0d534da01dc3e66438b5db0df1cfcd3f16905666f986742f1a6321cc8747b2291fcf + checksum: ee711c66f5259f8073ef39a68a3822bea161b4322b64088069b219aa505e1c48da31db71643ccfa8d713f035b21f3daa4cf31ac33af9343661cf20aeec20d284 languageName: node linkType: hard @@ -2327,48 +2347,55 @@ __metadata: languageName: node linkType: hard +"@octokit/openapi-types@npm:^21.0.0": + version: 21.2.0 + resolution: "@octokit/openapi-types@npm:21.2.0" + checksum: d0d461f50b66b0919c679d58349dfcf3e5fd3a9476af4fcfa69b09dd832b267154bcf356615af81ae3f86747a54a57708790a986c9f7bd4016d861feb85b899c + languageName: node + linkType: hard + "@octokit/plugin-paginate-rest@npm:^10.0.0": - version: 10.0.0 - resolution: "@octokit/plugin-paginate-rest@npm:10.0.0" + version: 10.1.0 + resolution: "@octokit/plugin-paginate-rest@npm:10.1.0" dependencies: "@octokit/types": ^12.6.0 peerDependencies: "@octokit/core": ">=6" - checksum: cbe3c7e518df8c536c454e71de9456fd242d106bd9ee4b483bfe4bda18db859aaf011826416a57a44dd15bb70de4cde26abe086a09587ee78adc73c80469d44c + checksum: 44bd3149ed5990eab94f9fa605f66c034fb25a693ac46b9c8ef03300bd10565bcde7c0835e1031704e062be0b6b3254010243c596f64ab0f29cdc64b8ba1e1f2 languageName: node linkType: hard "@octokit/plugin-retry@npm:^7.0.0": - version: 7.0.3 - resolution: "@octokit/plugin-retry@npm:7.0.3" + version: 7.1.0 + resolution: "@octokit/plugin-retry@npm:7.1.0" dependencies: "@octokit/request-error": ^6.0.0 - "@octokit/types": ^12.0.0 + "@octokit/types": ^13.0.0 bottleneck: ^2.15.3 peerDependencies: "@octokit/core": ">=6" - checksum: ebb090070327b81c55a3f35857d3f83a3329813045ef9e291daf11ae1b9e3b445bde4d9e66102d8c4d21ed9547cd021b774ce6131206a9f50f45f3c4825807f0 + checksum: 34be69315482640fad553c8c090c628126751cfcf84d930c6426b5d6b4feac724c3330792e91b49d7be710e46be34192b6b71374bd478114de42033e338da92c languageName: node linkType: hard "@octokit/plugin-throttling@npm:^9.0.0": - version: 9.0.3 - resolution: "@octokit/plugin-throttling@npm:9.0.3" + version: 9.1.0 + resolution: "@octokit/plugin-throttling@npm:9.1.0" dependencies: - "@octokit/types": ^12.6.0 + "@octokit/types": ^13.0.0 bottleneck: ^2.15.3 peerDependencies: "@octokit/core": ^6.0.0 - checksum: 8e14eb98372c3673e9890de2f6e70842794595085e804535494cacd457e9641f4d9d281eaa4457372ba22da353fb0751a5e41524f8d37e7ef6f062a696a01d81 + checksum: 88434bbcfeabff9cc0a686eb63a8d2a458642dbb83850f747ebf10151b833d79be27fdbbe6c6bc2a3ed945b4bd7147b014a41f253a5365815d9e24cf7f5eea3b languageName: node linkType: hard "@octokit/request-error@npm:^6.0.0, @octokit/request-error@npm:^6.0.1": - version: 6.0.2 - resolution: "@octokit/request-error@npm:6.0.2" + version: 6.1.0 + resolution: "@octokit/request-error@npm:6.1.0" dependencies: - "@octokit/types": ^12.0.0 - checksum: ad2567500dccd14b42af02531812b63104e33fabd84de577005eed5104ca90b91d02456548b523c4b53b15bc12fb9e82e574f8fba993b93e7542dc80412f93eb + "@octokit/types": ^13.0.0 + checksum: dc481d1f2c29afac21e60dd0c5b7a6ce21ceefa43768dd371aaa20f75923424aba0981ed804d3d45ccef392f4d8b15a9506cfc80476cdd044922536c9170e84c languageName: node linkType: hard @@ -2393,6 +2420,15 @@ __metadata: languageName: node linkType: hard +"@octokit/types@npm:^13.0.0": + version: 13.1.0 + resolution: "@octokit/types@npm:13.1.0" + dependencies: + "@octokit/openapi-types": ^21.0.0 + checksum: 205a190af4d02a31545ea22e1c4d75213d016eb32fba0e82baac06672f7d6fb65c045ca8ff5e4646095b6649d10f09e8734e7034585751ebbe32988be3426828 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2573,12 +2609,12 @@ __metadata: languageName: node linkType: hard -"@sigstore/bundle@npm:^2.2.0": - version: 2.2.0 - resolution: "@sigstore/bundle@npm:2.2.0" +"@sigstore/bundle@npm:^2.3.0, @sigstore/bundle@npm:^2.3.1": + version: 2.3.1 + resolution: "@sigstore/bundle@npm:2.3.1" dependencies: - "@sigstore/protobuf-specs": ^0.3.0 - checksum: 08f71c19b5223694e4915dd1ada9dcae66637051cbb7ac3968122bd38e8a2078e52d28ed6b18f1dbe2408740304cf76675180fdc51cbd74b167200a47d4a325b + "@sigstore/protobuf-specs": ^0.3.1 + checksum: 435c39af6d2ac3c8623bbfc71693971b4fb567e6f7917eacec21088b078dacbf2ddb3427298c833aaa20e037deaa2870df7000d1346b18c8f3f0976be1f45f40 languageName: node linkType: hard @@ -2589,26 +2625,26 @@ __metadata: languageName: node linkType: hard -"@sigstore/protobuf-specs@npm:^0.3.0": - version: 0.3.0 - resolution: "@sigstore/protobuf-specs@npm:0.3.0" - checksum: 584ea2888aede7124c747a343ab09dd5234195973f15169b6afff19f87347c2e29a2e688298dba87827883c704096fc31a8a0748049dde0b85fbec2cf922a350 +"@sigstore/protobuf-specs@npm:^0.3.0, @sigstore/protobuf-specs@npm:^0.3.1": + version: 0.3.1 + resolution: "@sigstore/protobuf-specs@npm:0.3.1" + checksum: 9677089ad2d08ca92063597c3aacb22335100f5e47cff3b8b6692ba61d2650e612001943583113af852a22407de1927b4f6dc05e3bd7773a1050ad1249dff531 languageName: node linkType: hard -"@sigstore/sign@npm:^2.2.3": - version: 2.2.3 - resolution: "@sigstore/sign@npm:2.2.3" +"@sigstore/sign@npm:^2.3.0": + version: 2.3.0 + resolution: "@sigstore/sign@npm:2.3.0" dependencies: - "@sigstore/bundle": ^2.2.0 + "@sigstore/bundle": ^2.3.0 "@sigstore/core": ^1.0.0 - "@sigstore/protobuf-specs": ^0.3.0 + "@sigstore/protobuf-specs": ^0.3.1 make-fetch-happen: ^13.0.0 - checksum: 191a74d6bfa4d8c8fafeebc07f871145a1f883a832a763f27ec1973f182f713fce07828d98d6052a96277a4ac4dd0f915adac4cf33bcde6737c905b43304be9e + checksum: 28256686a11fff070fc8abf8ab79b1b40632c762ca1700e32ab6d6eca65b7a2ebb0ae3b864ab683a26ca0b4ad5a5fc7dfb7bbec86f357a093e355840eb277919 languageName: node linkType: hard -"@sigstore/tuf@npm:^2.3.1": +"@sigstore/tuf@npm:^2.3.1, @sigstore/tuf@npm:^2.3.2": version: 2.3.2 resolution: "@sigstore/tuf@npm:2.3.2" dependencies: @@ -2618,14 +2654,14 @@ __metadata: languageName: node linkType: hard -"@sigstore/verify@npm:^1.1.0": - version: 1.1.1 - resolution: "@sigstore/verify@npm:1.1.1" +"@sigstore/verify@npm:^1.2.0": + version: 1.2.0 + resolution: "@sigstore/verify@npm:1.2.0" dependencies: - "@sigstore/bundle": ^2.2.0 + "@sigstore/bundle": ^2.3.1 "@sigstore/core": ^1.1.0 - "@sigstore/protobuf-specs": ^0.3.0 - checksum: df864d20539dcc1c9b36871133362d331dfebd68f35e78cbf8499ed2f0804ec8d6c21b0123843c5f6b9a1bbe8f5aa03afd0f2b5648b610b87da8557d81874733 + "@sigstore/protobuf-specs": ^0.3.1 + checksum: 8b3d64423664759d47bc4158f85f7cb62bf5972429967c514bb44642e637ce6acc85d6dd668195b9cec032a852d3ca8a9e5ba34711655c7d446c181716850e3e languageName: node linkType: hard @@ -2696,13 +2732,6 @@ __metadata: languageName: node linkType: hard -"@tsconfig/node14@npm:^14.1.0": - version: 14.1.2 - resolution: "@tsconfig/node14@npm:14.1.2" - checksum: f5934cebc6c8790b28a145d8abbafcb0bd23a405ebcb790bd9f524a2750757d5675b418583bddaed760894a18a0a59a8cbfec1979c90e388d7ad784a9519193f - languageName: node - linkType: hard - "@tsconfig/node16@npm:^1.0.2": version: 1.0.4 resolution: "@tsconfig/node16@npm:1.0.4" @@ -2710,6 +2739,13 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node16@npm:^16.0.0": + version: 16.1.3 + resolution: "@tsconfig/node16@npm:16.1.3" + checksum: 097f33cb7fe9577cc3c4b7a8d26c7e8b6c45c868d3bda1e2cd120111693b98f88a5138e643e7a6f79d53d94717c3624dc33398804647bf6e0e8782604bbfad53 + languageName: node + linkType: hard + "@tufjs/canonical-json@npm:2.0.0": version: 2.0.0 resolution: "@tufjs/canonical-json@npm:2.0.0" @@ -2769,12 +2805,12 @@ __metadata: linkType: hard "@types/eslint@npm:^8.4.6": - version: 8.56.6 - resolution: "@types/eslint@npm:8.56.6" + version: 8.56.7 + resolution: "@types/eslint@npm:8.56.7" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 960996940c8702c6e9bf221f2927f088d8f6463ad21ae1eb8260c62642ce48097a79a4277d99cb7cafde6939beadbd79610015fdd08b18679e565bcad5fcd36f + checksum: 26b036e27e369981843585248591b15068f1ba3ac44a01c09c34717f0b57cbb422a7ed2b497b51093b0ead97739e187dde65bbd5893ec901672dac39f41c8038 languageName: node linkType: hard @@ -2829,7 +2865,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -2851,11 +2887,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.12.2 - resolution: "@types/node@npm:20.12.2" + version: 20.12.5 + resolution: "@types/node@npm:20.12.5" dependencies: undici-types: ~5.26.4 - checksum: 3242ab04fe69ae32a2da29a7a2fce41fccb370bc1189de43d2dfbb491bd3253d3ee2070cbb5613061148e4862fdaa9cf62722c43128ce5c7d33fe83750956613 + checksum: 38358c091392bb3def1136772ada4ccd39a9429d459160b5ab728b690d2f15f2212eafd9e65ce716e270f70a4e6927ebffccfefc08dabdf68f4016c1fc8a7938 languageName: node linkType: hard @@ -2887,7 +2923,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 @@ -2924,44 +2960,46 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.0.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" +"@typescript-eslint/eslint-plugin@npm:^6.0.0": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/type-utils": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 graphemer: ^1.4.0 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.0.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" +"@typescript-eslint/parser@npm:^6.0.0": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" dependencies: - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 languageName: node linkType: hard @@ -2975,20 +3013,30 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 debug: ^4.3.4 - tsutils: ^3.21.0 + ts-api-utils: ^1.0.1 peerDependencies: - eslint: "*" + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc languageName: node linkType: hard @@ -2999,6 +3047,32 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:^5.62.0": version: 5.62.0 resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" @@ -3035,7 +3109,24 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.38.1": +"@typescript-eslint/utils@npm:6.21.0, @typescript-eslint/utils@npm:^6.0.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^5.38.1": version: 5.62.0 resolution: "@typescript-eslint/utils@npm:5.62.0" dependencies: @@ -3063,10 +3154,13 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 languageName: node linkType: hard @@ -3105,7 +3199,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.11.3, acorn@npm:^8.4.1": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -3596,7 +3690,7 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0, binary-extensions@npm:^2.2.0": +"binary-extensions@npm:^2.0.0, binary-extensions@npm:^2.3.0": version: 2.3.0 resolution: "binary-extensions@npm:2.3.0" checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 @@ -3757,9 +3851,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001603 - resolution: "caniuse-lite@npm:1.0.30001603" - checksum: e66e0d24b899c2ed3fdcc2dd44df29c4fc06d74fa8f43abe81fc7cff4a72b092d438e0fb5b7daeb252ee267519f32c6c7d229a15e7a4f4263afef6ea3832b661 + version: 1.0.30001606 + resolution: "caniuse-lite@npm:1.0.30001606" + checksum: fcf2d799d8cb159f4f5b44cd9d2171b18df4bcfdf2770cc8a79c4bb0bc5fd19ed089854223865ced32eacffb60a0a9257c8a1d0ef239e9dc3909f587727e9bb5 languageName: node linkType: hard @@ -3957,7 +4051,7 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:^0.6.3": +"cli-table3@npm:^0.6.3, cli-table3@npm:^0.6.4": version: 0.6.4 resolution: "cli-table3@npm:0.6.4" dependencies: @@ -4247,6 +4341,13 @@ __metadata: languageName: node linkType: hard +"convert-hrtime@npm:^5.0.0": + version: 5.0.0 + resolution: "convert-hrtime@npm:5.0.0" + checksum: 5245ad1ac6dd57b2d87624ae0eeac1d2a74812a6631208c09368bef787a28e7dbfa736cddaa9c8a0c425cb240437ea506afec7b9684ff617004d06a551f26c87 + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -4636,15 +4737,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -4727,9 +4819,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.668": - version: 1.4.722 - resolution: "electron-to-chromium@npm:1.4.722" - checksum: 613c8d015246857028e6ee6adf14fe8fcf8f03c99a77ddae40df12d62a9164421276acc0ed34e59a4fbe1e3fdb2c197bd534066f6a8e4d7d86eb19f9c361cb57 + version: 1.4.729 + resolution: "electron-to-chromium@npm:1.4.729" + checksum: fc7d28957d2aa72c57220e8b60e86f523d782a413440d2a8f38563844343b62e6caee9bf866019ba0839eb6e0c247297c6057d86152fa45855f32da88c44bd90 languageName: node linkType: hard @@ -5056,14 +5148,14 @@ __metadata: linkType: hard "eslint-plugin-eslint-plugin@npm:^5.0.6": - version: 5.4.1 - resolution: "eslint-plugin-eslint-plugin@npm:5.4.1" + version: 5.5.0 + resolution: "eslint-plugin-eslint-plugin@npm:5.5.0" dependencies: eslint-utils: ^3.0.0 estraverse: ^5.3.0 peerDependencies: eslint: ">=7.0.0" - checksum: 1b1effed2ba4d6881cb5cedd030c96df555150216e1434687a46f5e4fad76c7dae1c28ae7c0c7ae0cc17b16f709b8d65b827a18236069c048ae630ee22290e6b + checksum: 8b803a2ab180a0e6e5ec755b6129504d78ac46cc69347ed6fc1d0a4da22e8161a897310ea6e74835220066e0d5bb4bf91230c9c387f2c0b8d99d86f641eb3870 languageName: node linkType: hard @@ -5107,17 +5199,17 @@ __metadata: "@schemastore/package": ^0.0.10 "@semantic-release/changelog": ^6.0.0 "@semantic-release/git": ^10.0.0 - "@tsconfig/node14": ^14.1.0 + "@tsconfig/node16": ^16.0.0 "@types/eslint": ^8.4.6 "@types/jest": ^29.0.0 "@types/node": ^14.18.26 - "@typescript-eslint/eslint-plugin": ^5.0.0 - "@typescript-eslint/parser": ^5.0.0 - "@typescript-eslint/utils": ^5.10.0 + "@typescript-eslint/eslint-plugin": ^6.0.0 + "@typescript-eslint/parser": ^6.0.0 + "@typescript-eslint/utils": ^6.0.0 babel-jest: ^29.0.0 babel-plugin-replace-ts-export-assignment: ^0.0.2 dedent: ^1.5.0 - eslint: ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint-config-prettier: ^9.0.0 eslint-doc-generator: ^1.0.0 eslint-plugin-eslint-comments: ^3.1.2 @@ -5142,8 +5234,8 @@ __metadata: ts-node: ^10.2.1 typescript: ^5.0.4 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 jest: "*" peerDependenciesMeta: "@typescript-eslint/eslint-plugin": @@ -5231,13 +5323,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.0.1": + version: 8.0.1 + resolution: "eslint-scope@npm:8.0.1" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + checksum: 67a5a39312dadb8c9a677df0f2e8add8daf15280b08bfe07f898d5347ee2d7cd2a1f5c2760f34e46e8f5f13f7192f47c2c10abe676bfa4173ae5539365551940 languageName: node linkType: hard @@ -5275,47 +5367,50 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 languageName: node linkType: hard -"eslint@npm:^7.0.0 || ^8.0.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint-visitor-keys@npm:^4.0.0": + version: 4.0.0 + resolution: "eslint-visitor-keys@npm:4.0.0" + checksum: 5c09f89cf29d87cdbfbac38802a880d3c2e65f8cb61c689888346758f1e24a4c7f6caefeac9474dfa52058a99920623599bdb00516976a30134abeba91275aa2 + languageName: node + linkType: hard + +"eslint@npm:^7.0.0 || ^8.0.0 || ^9.0.0": + version: 9.0.0 + resolution: "eslint@npm:9.0.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.57.0 - "@humanwhocodes/config-array": ^0.11.14 + "@eslint/eslintrc": ^3.0.2 + "@eslint/js": 9.0.0 + "@humanwhocodes/config-array": ^0.12.3 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 - doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 + eslint-scope: ^8.0.1 + eslint-visitor-keys: ^4.0.0 + espree: ^10.0.1 esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 + file-entry-cache: ^8.0.0 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.19.0 graphemer: ^1.4.0 ignore: ^5.2.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 levn: ^0.4.1 lodash.merge: ^4.6.2 @@ -5326,18 +5421,18 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 + checksum: 3f20468cfd0f5affadf0f307e3af5b8f9ed19feaabccc3b4ed7548d40727d3f5dea4138db1ec287ca5a6152e164a051450604d47186b5fb28bb158a40937cf60 languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1": + version: 10.0.1 + resolution: "espree@npm:10.0.1" dependencies: - acorn: ^8.9.0 + acorn: ^8.11.3 acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + eslint-visitor-keys: ^4.0.0 + checksum: 62c9242a84c6741cebd35ede6574131d0419be7e5559566403e384087d99c4ddb2ced44e32acd44a4c3d8a8a84997cf8d78810c4e46b3fe25a804f1a92dc6b9d languageName: node linkType: hard @@ -5559,12 +5654,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + flat-cache: ^4.0.0 + checksum: f67802d3334809048c69b3d458f672e1b6d26daefda701761c81f203b80149c35dea04d78ea4238969dd617678e530876722a0634c43031a0957f10cc3ed190f languageName: node linkType: hard @@ -5613,23 +5708,23 @@ __metadata: languageName: node linkType: hard -"find-versions@npm:^5.1.0": - version: 5.1.0 - resolution: "find-versions@npm:5.1.0" +"find-versions@npm:^6.0.0": + version: 6.0.0 + resolution: "find-versions@npm:6.0.0" dependencies: semver-regex: ^4.0.5 - checksum: 680bdb0081f631f7bfb6f0f8edcfa0b74ab8cabc82097a4527a37b0d042aabc56685bf459ff27991eab0baddc04eb8e3bba8a2869f5004ecf7cdd2779b6e51de + super-regex: ^1.0.0 + checksum: d622e711bd17099015506bafd18b13e51fcc54f80ad073cf819ce4598d6b485774f55708ca356235770bed0148ae55a7daf3ef6deb72730c5b1e2f32b432fed5 languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec + keyv: ^4.5.4 + checksum: 899fc86bf6df093547d76e7bfaeb900824b869d7d457d02e9b8aae24836f0a99fbad79328cfd6415ee8908f180699bf259dc7614f793447cb14f707caf5996f6 languageName: node linkType: hard @@ -5738,6 +5833,13 @@ __metadata: languageName: node linkType: hard +"function-timeout@npm:^1.0.1": + version: 1.0.1 + resolution: "function-timeout@npm:1.0.1" + checksum: 7933ff6590018364482e9db28952dae8f24b6af69ed88b5f2cb34da0a5669c27991fdf6bc89acaea04bc0a9b60904735413d0d609ce0544ecbc9ea4363cdcbc7 + languageName: node + linkType: hard + "function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" @@ -5898,7 +6000,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.12, glob@npm:^10.3.7": version: 10.3.12 resolution: "glob@npm:10.3.12" dependencies: @@ -5943,12 +6045,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: ^0.20.2 - checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 534b8216736a5425737f59f6e6a5c7f386254560c9f41d24a9227d60ee3ad4a9e82c5b85def0e212e9d92162f83a92544be4c7fd4c902cb913736c10e08237ac languageName: node linkType: hard @@ -6353,14 +6453,14 @@ __metadata: languageName: node linkType: hard -"ini@npm:^4.1.0, ini@npm:^4.1.1": +"ini@npm:^4.1.2": version: 4.1.2 resolution: "ini@npm:4.1.2" checksum: 07e2e216dc3d4452f784ef35fe3e304a755bbafbbce725c7894d44b4c0a88c471f5fab58244a261eb351c931df34ac1a9a0914a64055ff8d4b458cfd97c78983 languageName: node linkType: hard -"init-package-json@npm:^6.0.0": +"init-package-json@npm:^6.0.2": version: 6.0.2 resolution: "init-package-json@npm:6.0.2" dependencies: @@ -7530,7 +7630,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -7571,35 +7671,35 @@ __metadata: linkType: hard "libnpmaccess@npm:^8.0.1": - version: 8.0.2 - resolution: "libnpmaccess@npm:8.0.2" + version: 8.0.3 + resolution: "libnpmaccess@npm:8.0.3" dependencies: npm-package-arg: ^11.0.1 - npm-registry-fetch: ^16.0.0 - checksum: 20113f2fe4e32e3aaaa04f89cf2a7c1c907f847e274cc81d16617e5e5d5be4f801cd5709fe978bd9f9c0f6983d2cd941933a3c59393b63f7f2283bafb6a31659 + npm-registry-fetch: ^16.2.0 + checksum: 119afc9d7a7bafc971e9fdf4ef078c21ba2ea8de5b8ffb87298182e4f2c7915a06199f3f316abecb7c41ac97216dbf72e87e28fb5a4708af109a16ea5dedcdb0 languageName: node linkType: hard "libnpmdiff@npm:^6.0.3": - version: 6.0.7 - resolution: "libnpmdiff@npm:6.0.7" + version: 6.0.8 + resolution: "libnpmdiff@npm:6.0.8" dependencies: "@npmcli/arborist": ^7.2.1 "@npmcli/disparity-colors": ^3.0.0 "@npmcli/installed-package-contents": ^2.0.2 - binary-extensions: ^2.2.0 + binary-extensions: ^2.3.0 diff: ^5.1.0 - minimatch: ^9.0.0 + minimatch: ^9.0.4 npm-package-arg: ^11.0.1 pacote: ^17.0.4 - tar: ^6.2.0 - checksum: 925eb2ba9695a3a608aef3ef901b79b4f68ff0024edbed0f6beb121fbc037b57c5373980984eceabc745969e7b0d27513b65a50273c98624cbcad43f334b4fe2 + tar: ^6.2.1 + checksum: 95db07661ecabd1a0373f3e59868dd2f173083edfc082220038ee12e4421ae8350661664d275a4cb903a0f9dc3506abd598e1ac44b7b24dac3b6d7972642f997 languageName: node linkType: hard "libnpmexec@npm:^7.0.4": - version: 7.0.8 - resolution: "libnpmexec@npm:7.0.8" + version: 7.0.9 + resolution: "libnpmexec@npm:7.0.9" dependencies: "@npmcli/arborist": ^7.2.1 "@npmcli/run-script": ^7.0.2 @@ -7608,87 +7708,87 @@ __metadata: npmlog: ^7.0.1 pacote: ^17.0.4 proc-log: ^3.0.0 - read: ^2.0.0 + read: ^3.0.1 read-package-json-fast: ^3.0.2 semver: ^7.3.7 walk-up-path: ^3.0.1 - checksum: 16cf2194933e9cb9117b442110639a3ae7120772d1f9fda532c452bc8ecda3882994ae1321cb48d7f2c3449cb919598341a0e04c86e7636a7cb785981b1aef4d + checksum: e962925b03a6b4440bb0022e6d62f618b9f49701441f7d98678ca341b2af4b27c3c4966b077f1002712e9dde79ee1d045dbaa3b48962867ee0f278ed1320d47f languageName: node linkType: hard "libnpmfund@npm:^5.0.1": - version: 5.0.5 - resolution: "libnpmfund@npm:5.0.5" + version: 5.0.6 + resolution: "libnpmfund@npm:5.0.6" dependencies: "@npmcli/arborist": ^7.2.1 - checksum: 54f3d4b9b7be615bd3fbaac6a7f6abff5c2800174a24d9c73c2a3a99f71fc944ebcab1b5cd203f1829d05898c13c505c46c290a4f69cacd998e46d8957a72356 + checksum: efee2e0c4b98b1df1c8482a6fa627488bf057bd3143b1479b65f26945f6f8ef3fe57c2dc142c21cb570636484ff27b7490b180580d17f132003384c7cfa0680e languageName: node linkType: hard "libnpmhook@npm:^10.0.0": - version: 10.0.1 - resolution: "libnpmhook@npm:10.0.1" + version: 10.0.2 + resolution: "libnpmhook@npm:10.0.2" dependencies: aproba: ^2.0.0 - npm-registry-fetch: ^16.0.0 - checksum: 041415cd92e41e90dded6a74863ce8f23053b8e6bbf6751d20ad107225b2a6b5c5c07eade370ba888cbe687fffc8ff2450bc0dcb0cfd998bb43cc984bb7a3101 + npm-registry-fetch: ^16.2.0 + checksum: 6c358e7b0223ec6e9c0980642a4e5437ab80729df0191ec2d4e7b21b3e56e0edb1c1ebb3f6a45c488a4fa5d3c40a4fe41fc6432f9fd0325b38085712e0f59a6b languageName: node linkType: hard "libnpmorg@npm:^6.0.1": - version: 6.0.2 - resolution: "libnpmorg@npm:6.0.2" + version: 6.0.3 + resolution: "libnpmorg@npm:6.0.3" dependencies: aproba: ^2.0.0 - npm-registry-fetch: ^16.0.0 - checksum: 041e0d61a21bc1977380d41ba35b6e2b840c73e247b99fc8e15ccfcd10c711e1a87cee40cc0e06cf7bef96593c56447754b04b2da40461c26a28eb9d0bfa0454 + npm-registry-fetch: ^16.2.0 + checksum: 0d5e3e26544a1246e9fb21b1ec283674bd369ce6318d409d18cc03efb13828e7b9a86b390a7b10a2463b11f92576bb4f67d02eda48090ca62dca75a6cf3472f7 languageName: node linkType: hard "libnpmpack@npm:^6.0.3": - version: 6.0.7 - resolution: "libnpmpack@npm:6.0.7" + version: 6.0.8 + resolution: "libnpmpack@npm:6.0.8" dependencies: "@npmcli/arborist": ^7.2.1 "@npmcli/run-script": ^7.0.2 npm-package-arg: ^11.0.1 pacote: ^17.0.4 - checksum: 503c2ee0bf7e75d4563da967c3e25a52be6d28e586dc0558648b15979ad57d49155b53823d5d1a69d6006f536f12cc012483dae8d7aaa5f1026924f794b4a509 + checksum: e1e259f956892ba8a1027078c56260f843b10d7a14da2fb71dc62f00749519c2745ebed50e386bc220fbda3e6f081452062356e811c7175df826e71d29185d97 languageName: node linkType: hard "libnpmpublish@npm:^9.0.2": - version: 9.0.4 - resolution: "libnpmpublish@npm:9.0.4" + version: 9.0.5 + resolution: "libnpmpublish@npm:9.0.5" dependencies: ci-info: ^4.0.0 normalize-package-data: ^6.0.0 npm-package-arg: ^11.0.1 - npm-registry-fetch: ^16.0.0 + npm-registry-fetch: ^16.2.0 proc-log: ^3.0.0 semver: ^7.3.7 sigstore: ^2.2.0 ssri: ^10.0.5 - checksum: 0f7341b222cfd7d60721804cf2e1468fe4315e7ce77389ecc475d5b3b380dc8fdf13de40a8116e3da6a1d8544cbd467545227d4f62e5a2bc1637e110c80bbf6e + checksum: d004cae73ffc302469a72346989b3707b9f9825813192e735ef168a04767ad72c452830beee921e99a3f1f7f4321379281013bb07f046f7b2c97df3fe58cb448 languageName: node linkType: hard "libnpmsearch@npm:^7.0.0": - version: 7.0.1 - resolution: "libnpmsearch@npm:7.0.1" + version: 7.0.2 + resolution: "libnpmsearch@npm:7.0.2" dependencies: - npm-registry-fetch: ^16.0.0 - checksum: 97a12306a4f4c8c15eef574b2cf95f3c556c751a7cdf6f7fb9a62bacd79ff1f70300e5bde0c652b4d5e67ae6516ca41b9c43783cafa2c1c4dad6818463cd58a2 + npm-registry-fetch: ^16.2.0 + checksum: bcc993dacd61ad032fb0d720c19a08ee93c0d2a2fa1396ed219edb29a30ba2851464850f7475de450abd1fb0d7a338d0332510f184cf16a0d9f42527672b5287 languageName: node linkType: hard "libnpmteam@npm:^6.0.0": - version: 6.0.1 - resolution: "libnpmteam@npm:6.0.1" + version: 6.0.2 + resolution: "libnpmteam@npm:6.0.2" dependencies: aproba: ^2.0.0 - npm-registry-fetch: ^16.0.0 - checksum: c49183978c793a6bf8b1d1f4ed729b93172d2ed15129d812d351c55adb2e40fdbe4ceacfc53b5a0ff5d7a9129e5ba3fd7db2a081837e53a8505f0ff60b62c9b4 + npm-registry-fetch: ^16.2.0 + checksum: c92dfa4d3b916644ee8e29642609eb9f304b593faaa3ec5636fc467d6aa59c5df8dfa15bde9f127b18b0a1f5645c9e7deb1d31bba4501500c36ff20179825e7e languageName: node linkType: hard @@ -8204,6 +8304,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -8213,7 +8322,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": version: 9.0.4 resolution: "minimatch@npm:9.0.4" dependencies: @@ -8357,7 +8466,7 @@ __metadata: languageName: node linkType: hard -"mute-stream@npm:^1.0.0, mute-stream@npm:~1.0.0": +"mute-stream@npm:^1.0.0": version: 1.0.0 resolution: "mute-stream@npm:1.0.0" checksum: 36fc968b0e9c9c63029d4f9dc63911950a3bdf55c9a87f58d3a266289b67180201cade911e7699f8b2fa596b34c9db43dad37649e3f7fdd13c3bb9edb0017ee7 @@ -8375,13 +8484,6 @@ __metadata: languageName: node linkType: hard -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -8451,7 +8553,7 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^10.0.0, node-gyp@npm:^10.0.1, node-gyp@npm:latest": +"node-gyp@npm:^10.0.0, node-gyp@npm:^10.1.0, node-gyp@npm:latest": version: 10.1.0 resolution: "node-gyp@npm:10.1.0" dependencies: @@ -8621,10 +8723,11 @@ __metadata: languageName: node linkType: hard -"npm-registry-fetch@npm:^16.0.0, npm-registry-fetch@npm:^16.1.0": - version: 16.1.0 - resolution: "npm-registry-fetch@npm:16.1.0" +"npm-registry-fetch@npm:^16.0.0, npm-registry-fetch@npm:^16.2.0": + version: 16.2.0 + resolution: "npm-registry-fetch@npm:16.2.0" dependencies: + "@npmcli/redact": ^1.1.0 make-fetch-happen: ^13.0.0 minipass: ^7.0.2 minipass-fetch: ^3.0.0 @@ -8632,7 +8735,7 @@ __metadata: minizlib: ^2.1.2 npm-package-arg: ^11.0.0 proc-log: ^3.0.0 - checksum: 6aa8483973aaf8c8543753d415983eb6722ecba0703030f3b152074eaa1106df75ffd084e483f30a33c81203c7ec07555bcc9e45fc07f7c0904501506c0929a2 + checksum: 04d9442f274dd584617f199285431fa27dd36372c69ed0f9c79b5f6acd73633ba282fc1e57789b2538893132826f8319463c8b0fe18246b5e4fe556cf04225c3 languageName: node linkType: hard @@ -8662,8 +8765,8 @@ __metadata: linkType: hard "npm@npm:^10.5.0": - version: 10.5.0 - resolution: "npm@npm:10.5.0" + version: 10.5.1 + resolution: "npm@npm:10.5.1" dependencies: "@isaacs/string-locale-compare": ^1.1.0 "@npmcli/arborist": ^7.2.1 @@ -8672,23 +8775,24 @@ __metadata: "@npmcli/map-workspaces": ^3.0.4 "@npmcli/package-json": ^5.0.0 "@npmcli/promise-spawn": ^7.0.1 + "@npmcli/redact": ^1.1.0 "@npmcli/run-script": ^7.0.4 - "@sigstore/tuf": ^2.3.1 + "@sigstore/tuf": ^2.3.2 abbrev: ^2.0.0 archy: ~1.0.0 cacache: ^18.0.2 chalk: ^5.3.0 ci-info: ^4.0.0 cli-columns: ^4.0.0 - cli-table3: ^0.6.3 + cli-table3: ^0.6.4 columnify: ^1.6.0 fastest-levenshtein: ^1.0.16 fs-minipass: ^3.0.3 - glob: ^10.3.10 + glob: ^10.3.12 graceful-fs: ^4.2.11 hosted-git-info: ^7.0.1 - ini: ^4.1.1 - init-package-json: ^6.0.0 + ini: ^4.1.2 + init-package-json: ^6.0.2 is-cidr: ^5.0.3 json-parse-even-better-errors: ^3.0.1 libnpmaccess: ^8.0.1 @@ -8703,11 +8807,11 @@ __metadata: libnpmteam: ^6.0.0 libnpmversion: ^5.0.1 make-fetch-happen: ^13.0.0 - minimatch: ^9.0.3 + minimatch: ^9.0.4 minipass: ^7.0.4 minipass-pipeline: ^1.2.4 ms: ^2.1.2 - node-gyp: ^10.0.1 + node-gyp: ^10.1.0 nopt: ^7.2.0 normalize-package-data: ^6.0.0 npm-audit-report: ^5.0.0 @@ -8715,7 +8819,7 @@ __metadata: npm-package-arg: ^11.0.1 npm-pick-manifest: ^9.0.0 npm-profile: ^9.0.0 - npm-registry-fetch: ^16.1.0 + npm-registry-fetch: ^16.2.0 npm-user-validate: ^2.0.0 npmlog: ^7.0.1 p-map: ^4.0.0 @@ -8723,12 +8827,12 @@ __metadata: parse-conflict-json: ^3.0.1 proc-log: ^3.0.0 qrcode-terminal: ^0.12.0 - read: ^2.1.0 + read: ^3.0.1 semver: ^7.6.0 spdx-expression-parse: ^3.0.1 ssri: ^10.0.5 supports-color: ^9.4.0 - tar: ^6.2.0 + tar: ^6.2.1 text-table: ~0.2.0 tiny-relative-date: ^1.3.0 treeverse: ^3.0.0 @@ -8738,7 +8842,7 @@ __metadata: bin: npm: bin/npm-cli.js npx: bin/npx-cli.js - checksum: f9f2a9980df45fcf2b124929682bcd7ff2e7bffe0d47debdf46167d31733348cb790663dd28cbba312e6150a973572e1f8bb4dc834ec4bd1637812b708378882 + checksum: 0872c0f2e5d4c155215a9a21968bea50124651c9bc73da2723e05afc0fc7c660651cb9a30d5ebdde40fb8034c65a935139da69d011d97365fc0a4381e0f44936 languageName: node linkType: hard @@ -8965,9 +9069,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.1": - version: 7.0.1 - resolution: "p-map@npm:7.0.1" - checksum: 553c218f582b9c7f96159dd55d082fc6df386ea86a78a3798b768f87f761d6f01ea52dd76225e69199720fa0684901d38353cd0978a39ef4f7f4fd287c4e9262 + version: 7.0.2 + resolution: "p-map@npm:7.0.2" + checksum: bc128c2b244ef5d4619392b2247d718a3fe471d5fa4a73834fd96182a237f460ec7e0ad0f95139ef7103a6b50ed164228c62e2f8e41ba2b15360fe1c20d13563 languageName: node linkType: hard @@ -9409,11 +9513,11 @@ __metadata: linkType: hard "promzard@npm:^1.0.0": - version: 1.0.0 - resolution: "promzard@npm:1.0.0" + version: 1.0.1 + resolution: "promzard@npm:1.0.1" dependencies: - read: ^2.0.0 - checksum: c06948827171612faae321ebaf23ff8bd9ebb3e1e0f37616990bc4b81c663b192e447b3fe3b424211beb0062cec0cfe6ba3ce70c8b448b4aa59752b765dbb302 + read: ^3.0.1 + checksum: 1618e5e8e02f88d2ba6dce01152dbbdbc32f9978267814e9fd68fb594a858ecb189915366b2cc32f7c950dbe1aba542b4e67875d169ed69ff2eb63a5a745f7e9 languageName: node linkType: hard @@ -9614,15 +9718,6 @@ __metadata: languageName: node linkType: hard -"read@npm:^2.0.0, read@npm:^2.1.0": - version: 2.1.0 - resolution: "read@npm:2.1.0" - dependencies: - mute-stream: ~1.0.0 - checksum: e745999138022b56d32daf7cce9b7552b2ec648e4e2578d076a410575a0a400faf74f633dd74ef1b1c42563397d322c1ad5a0068471c38978b02ef97056c2991 - languageName: node - linkType: hard - "read@npm:^3.0.1": version: 3.0.1 resolution: "read@npm:3.0.1" @@ -9882,17 +9977,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - "rimraf@npm:^5.0.0": version: 5.0.5 resolution: "rimraf@npm:5.0.5" @@ -9975,8 +10059,8 @@ __metadata: linkType: hard "semantic-release@npm:^23.0.0": - version: 23.0.6 - resolution: "semantic-release@npm:23.0.6" + version: 23.0.7 + resolution: "semantic-release@npm:23.0.7" dependencies: "@semantic-release/commit-analyzer": ^12.0.0 "@semantic-release/error": ^4.0.0 @@ -9989,7 +10073,7 @@ __metadata: env-ci: ^11.0.0 execa: ^8.0.0 figures: ^6.0.0 - find-versions: ^5.1.0 + find-versions: ^6.0.0 get-stream: ^6.0.0 git-log-parser: ^1.2.0 hook-std: ^3.0.0 @@ -10009,7 +10093,7 @@ __metadata: yargs: ^17.5.1 bin: semantic-release: bin/semantic-release.js - checksum: f1232ffaeac4c37abde17affa9a981a014f78cab666073adaa41a58eb947ad6b1a508f03412998ce0ca3ffb619ccb26091420f983ea339804766c873cefadd63 + checksum: b466be299b6931ad8dd58968200520c87a2756376938cb032ebd546147b20cdbc995e3dafada97a1846cc5a692a917eb2c0107e9ddcd41b8e4a0d81533af1036 languageName: node linkType: hard @@ -10163,16 +10247,16 @@ __metadata: linkType: hard "sigstore@npm:^2.2.0": - version: 2.2.2 - resolution: "sigstore@npm:2.2.2" + version: 2.3.0 + resolution: "sigstore@npm:2.3.0" dependencies: - "@sigstore/bundle": ^2.2.0 + "@sigstore/bundle": ^2.3.1 "@sigstore/core": ^1.0.0 - "@sigstore/protobuf-specs": ^0.3.0 - "@sigstore/sign": ^2.2.3 + "@sigstore/protobuf-specs": ^0.3.1 + "@sigstore/sign": ^2.3.0 "@sigstore/tuf": ^2.3.1 - "@sigstore/verify": ^1.1.0 - checksum: 7bb2bd0a971246bbd1d1cfb749404a4a1700dfdd4ea288e922b167af3643d2f2e0e5c25b6b1701701c66f086a8138097c7572a59e288a0b0e4e4e28e5df4f16c + "@sigstore/verify": ^1.2.0 + checksum: 98a279851b43546f3f7153e0cee5029801a2c68c64971f6ec861257fc7692244a90c7158ea1f69069cdee2133643fd26cafae6e103979cdd9a2f10bd77c0ac85 languageName: node linkType: hard @@ -10252,7 +10336,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2": +"socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.3": version: 8.0.3 resolution: "socks-proxy-agent@npm:8.0.3" dependencies: @@ -10558,6 +10642,16 @@ __metadata: languageName: node linkType: hard +"super-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "super-regex@npm:1.0.0" + dependencies: + function-timeout: ^1.0.1 + time-span: ^5.1.0 + checksum: d99e90ee0950356b86b01ad327605080e72ee0712c7e5c66335e7e4e3bd2919206caea929fa2d5ca97c2afc1d1ab91466d09eadcf1101196edcfb94bebfea388 + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -10619,7 +10713,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.0": +"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -10735,6 +10829,15 @@ __metadata: languageName: node linkType: hard +"time-span@npm:^5.1.0": + version: 5.1.0 + resolution: "time-span@npm:5.1.0" + dependencies: + convert-hrtime: ^5.0.0 + checksum: 949c45fcb873f2d26fda3db1b7f7161ce65206f6e94a7c6c9bf3a5a07a373570dba57ca5c1f816efa6326adbc3f9e93bb6ef19a7a220f4259a917e1192d49418 + languageName: node + linkType: hard + "tiny-relative-date@npm:^1.3.0": version: 1.3.0 resolution: "tiny-relative-date@npm:1.3.0" @@ -10786,6 +10889,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.0.1": + version: 1.3.0 + resolution: "ts-api-utils@npm:1.3.0" + peerDependencies: + typescript: ">=4.2.0" + checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 + languageName: node + linkType: hard + "ts-node@npm:^10.2.1, ts-node@npm:^10.8.1": version: 10.9.2 resolution: "ts-node@npm:10.9.2" @@ -10902,13 +11014,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -10952,9 +11057,9 @@ __metadata: linkType: hard "type-fest@npm:^4.6.0, type-fest@npm:^4.7.1": - version: 4.14.0 - resolution: "type-fest@npm:4.14.0" - checksum: c4e2377112a9311430863d5d4eb778c242570a535f0a2bd648da31ecb1013c71affcbdfc5bfcddc8cd13cf821103ee9df4f2e5804a5a7bca8028aab7f7232f73 + version: 4.15.0 + resolution: "type-fest@npm:4.15.0" + checksum: 8da2b8c4556a6bbafd79c0d50b4f3ba6526942aead9c1687038980276eee72b95a1d195bc6f1408e0ebf96ebfbe9d33436b506b35ed4b68f14f8b3ff56753850 languageName: node linkType: hard @@ -11011,22 +11116,22 @@ __metadata: linkType: hard "typescript@npm:^4.6.4 || ^5.2.2, typescript@npm:^5.0.4": - version: 5.4.3 - resolution: "typescript@npm:5.4.3" + version: 5.4.4 + resolution: "typescript@npm:5.4.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: d74d731527e35e64d8d2dcf2f897cf8cfbc3428be0ad7c48434218ba4ae41239f53be7c90714089db1068c05cae22436af2ecba71fd36ecc5e7a9118af060198 + checksum: a7b54515d2adfc75c8d14188af0216b6b9ae3c192c9732797c24b1d14608eac1c83be7b1c65ce6f4ced0f2c40583f11b495fe1ba3d982afadbcc523517d183c8 languageName: node linkType: hard "typescript@patch:typescript@^4.6.4 || ^5.2.2#~builtin, typescript@patch:typescript@^5.0.4#~builtin": - version: 5.4.3 - resolution: "typescript@patch:typescript@npm%3A5.4.3#~builtin::version=5.4.3&hash=5adc0c" + version: 5.4.4 + resolution: "typescript@patch:typescript@npm%3A5.4.4#~builtin::version=5.4.4&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 523ec29bc308b4ca0cec9a139ac08a27939891d8ad620d249cf5e1a35454e37cd7bb52613a1884f1206aa11d2fb1c4c83fb9e939bde542aaa8527ba818cb8177 + checksum: f64e07e11f787a18b5b98cbe7506465a5a92f56bbd4691977cc9c690f4ec49ebce51dfac77728dc792b743f8d89e8d99004370f5c96f7f56947c25c3f90f9350 languageName: node linkType: hard