diff --git a/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts b/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts index cd43599c85b..3a70101eb7d 100644 --- a/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts +++ b/packages/eslint-plugin-internal/tests/rules/no-poorly-typed-ts-props.test.ts @@ -8,6 +8,7 @@ const ruleTester = new RuleTester({ languageOptions: { parserOptions: { project: './tsconfig.json', + projectService: false, tsconfigRootDir: getFixturesRootDir(), }, }, diff --git a/packages/eslint-plugin-internal/tests/rules/plugin-test-formatting.test.ts b/packages/eslint-plugin-internal/tests/rules/plugin-test-formatting.test.ts index 6ec2ce42a6a..084eadd9b6c 100644 --- a/packages/eslint-plugin-internal/tests/rules/plugin-test-formatting.test.ts +++ b/packages/eslint-plugin-internal/tests/rules/plugin-test-formatting.test.ts @@ -7,6 +7,7 @@ const ruleTester = new RuleTester({ languageOptions: { parserOptions: { project: './tsconfig.json', + projectService: false, tsconfigRootDir: getFixturesRootDir(), }, }, diff --git a/packages/eslint-plugin/tests/RuleTester.ts b/packages/eslint-plugin/tests/RuleTester.ts index 4cb13dad0dc..c2e314860ae 100644 --- a/packages/eslint-plugin/tests/RuleTester.ts +++ b/packages/eslint-plugin/tests/RuleTester.ts @@ -1,5 +1,37 @@ +import type { ParserOptions } from '@typescript-eslint/utils/ts-eslint'; + +import { RuleTester } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; +export function createRuleTesterWithTypes( + providedParserOptions: ParserOptions | undefined = {}, +): RuleTester { + const parserOptions = { + ...providedParserOptions, + tsconfigRootDir: + providedParserOptions.tsconfigRootDir ?? getFixturesRootDir(), + }; + + // If the test has requested a specific project, disable projectService + // (regardless of whether it's being switched to by TYPESCRIPT_ESLINT_PROJECT_SERVICE) + if (parserOptions.project) { + parserOptions.projectService = false; + } + // Otherwise, use the project service for types if requested in the env + else if (process.env.TYPESCRIPT_ESLINT_PROJECT_SERVICE) { + parserOptions.projectService = true; + } + // Finally, default to project: true as the standard (legacy) behavior + // See: https://github.com/typescript-eslint/typescript-eslint/issues/11676 + else { + parserOptions.project = true; + } + + return new RuleTester({ + languageOptions: { parserOptions }, + }); +} + export function getFixturesRootDir(): string { return path.join(__dirname, 'fixtures'); } diff --git a/packages/eslint-plugin/tests/docs.test.mts b/packages/eslint-plugin/tests/docs.test.mts index ea12c3e0217..20693dd2176 100644 --- a/packages/eslint-plugin/tests/docs.test.mts +++ b/packages/eslint-plugin/tests/docs.test.mts @@ -428,6 +428,7 @@ describe('Validating rule docs', () => { parserOptions: { disallowAutomaticSingleRunInference: true, project: './tsconfig.json', + projectService: false, tsconfigRootDir: FIXTURES_DIR, }, rules: Object.fromEntries(ruleEntries), diff --git a/packages/eslint-plugin/tests/rules/await-thenable.test.ts b/packages/eslint-plugin/tests/rules/await-thenable.test.ts index 0556ce4803d..f0dca2e02f5 100644 --- a/packages/eslint-plugin/tests/rules/await-thenable.test.ts +++ b/packages/eslint-plugin/tests/rules/await-thenable.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/await-thenable'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('await-thenable', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/consistent-return.test.ts b/packages/eslint-plugin/tests/rules/consistent-return.test.ts index 89574197c9f..0ee2908ef5b 100644 --- a/packages/eslint-plugin/tests/rules/consistent-return.test.ts +++ b/packages/eslint-plugin/tests/rules/consistent-return.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/consistent-return'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('consistent-return', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/consistent-type-exports.test.ts b/packages/eslint-plugin/tests/rules/consistent-type-exports.test.ts index b513411d676..6226405f4eb 100644 --- a/packages/eslint-plugin/tests/rules/consistent-type-exports.test.ts +++ b/packages/eslint-plugin/tests/rules/consistent-type-exports.test.ts @@ -1,18 +1,11 @@ /* eslint-disable @typescript-eslint/internal/plugin-test-formatting -- Prettier doesn't yet support TS 5.6 string literal module identifiers */ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/consistent-type-exports'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.json', }); ruleTester.run('consistent-type-exports', rule, { diff --git a/packages/eslint-plugin/tests/rules/dot-notation.test.ts b/packages/eslint-plugin/tests/rules/dot-notation.test.ts index 0a14e103638..1a077b1b052 100644 --- a/packages/eslint-plugin/tests/rules/dot-notation.test.ts +++ b/packages/eslint-plugin/tests/rules/dot-notation.test.ts @@ -1,18 +1,10 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/dot-notation'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const rootDir = getFixturesRootDir(); +const ruleTester = createRuleTesterWithTypes(); /** * Quote a string in "double quotes" because it’s painful @@ -163,7 +155,7 @@ foo['key_baz']; parserOptions: { project: './tsconfig.noPropertyAccessFromIndexSignature.json', projectService: false, - tsconfigRootDir: rootPath, + tsconfigRootDir: rootDir, }, }, }, @@ -181,7 +173,7 @@ foo['bar']; parserOptions: { project: './tsconfig.noPropertyAccessFromIndexSignature.json', projectService: false, - tsconfigRootDir: rootPath, + tsconfigRootDir: rootDir, }, }, }, @@ -202,7 +194,7 @@ function f(x: T) { parserOptions: { project: './tsconfig.noPropertyAccessFromIndexSignature.json', projectService: false, - tsconfigRootDir: rootPath, + tsconfigRootDir: rootDir, }, }, }, diff --git a/packages/eslint-plugin/tests/rules/naming-convention/naming-convention.test.ts b/packages/eslint-plugin/tests/rules/naming-convention/naming-convention.test.ts index 07653464540..9f6e6dfafba 100644 --- a/packages/eslint-plugin/tests/rules/naming-convention/naming-convention.test.ts +++ b/packages/eslint-plugin/tests/rules/naming-convention/naming-convention.test.ts @@ -11,6 +11,7 @@ const ruleTester = new RuleTester(); const rootDir = getFixturesRootDir(); const parserOptions = { project: './tsconfig.json', + projectService: false, tsconfigRootDir: rootDir, }; diff --git a/packages/eslint-plugin/tests/rules/no-array-delete.test.ts b/packages/eslint-plugin/tests/rules/no-array-delete.test.ts index be9700385a9..c8d25e7ebf8 100644 --- a/packages/eslint-plugin/tests/rules/no-array-delete.test.ts +++ b/packages/eslint-plugin/tests/rules/no-array-delete.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-array-delete'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-array-delete', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts b/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts index a75e9130b92..cab11e9ce5e 100644 --- a/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts +++ b/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts @@ -1,17 +1,8 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-base-to-string'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); /** * ref: https://github.com/typescript-eslint/typescript-eslint/issues/11043 @@ -1382,6 +1373,7 @@ declare const foo: Bar & Foo; languageOptions: { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', + projectService: false, tsconfigRootDir: rootDir, }, }, @@ -1632,6 +1624,7 @@ declare const foo: Bar & Foo; languageOptions: { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', + projectService: false, tsconfigRootDir: rootDir, }, }, @@ -1882,6 +1875,7 @@ declare const foo: Bar & Foo; languageOptions: { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', + projectService: false, tsconfigRootDir: rootDir, }, }, @@ -2132,6 +2126,7 @@ declare const foo: Bar & Foo; languageOptions: { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', + projectService: false, tsconfigRootDir: rootDir, }, }, diff --git a/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts b/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts index 9adc9e2403b..6e63c73be46 100644 --- a/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts +++ b/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts @@ -1,17 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-confusing-void-expression'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-confusing-void-expression', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-deprecated.test.ts b/packages/eslint-plugin/tests/rules/no-deprecated.test.ts index b40eb26fb97..529d6e999cf 100644 --- a/packages/eslint-plugin/tests/rules/no-deprecated.test.ts +++ b/packages/eslint-plugin/tests/rules/no-deprecated.test.ts @@ -1,19 +1,12 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-deprecated'; -import { getFixturesRootDir } from '../RuleTester'; +import { getFixturesRootDir, createRuleTesterWithTypes } from '../RuleTester'; const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, +const ruleTester = createRuleTesterWithTypes({ + ecmaFeatures: { + jsx: true, }, + project: './tsconfig.json', }); ruleTester.run('no-deprecated', rule, { diff --git a/packages/eslint-plugin/tests/rules/no-duplicate-type-constituents.test.ts b/packages/eslint-plugin/tests/rules/no-duplicate-type-constituents.test.ts index 90d32bf0010..7cbae0db756 100644 --- a/packages/eslint-plugin/tests/rules/no-duplicate-type-constituents.test.ts +++ b/packages/eslint-plugin/tests/rules/no-duplicate-type-constituents.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-duplicate-type-constituents'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-duplicate-type-constituents', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-dynamic-delete.test.ts b/packages/eslint-plugin/tests/rules/no-dynamic-delete.test.ts index 09fc5af480d..00e32626e2b 100644 --- a/packages/eslint-plugin/tests/rules/no-dynamic-delete.test.ts +++ b/packages/eslint-plugin/tests/rules/no-dynamic-delete.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-dynamic-delete'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-dynamic-delete', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-floating-promises.test.ts b/packages/eslint-plugin/tests/rules/no-floating-promises.test.ts index 87ead2f2b19..0ed85d5b7ce 100644 --- a/packages/eslint-plugin/tests/rules/no-floating-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-floating-promises.test.ts @@ -1,19 +1,10 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; import rule from '../../src/rules/no-floating-promises'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-floating-promises', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-for-in-array.test.ts b/packages/eslint-plugin/tests/rules/no-for-in-array.test.ts index 7721006b1d7..f781d049ebf 100644 --- a/packages/eslint-plugin/tests/rules/no-for-in-array.test.ts +++ b/packages/eslint-plugin/tests/rules/no-for-in-array.test.ts @@ -1,17 +1,10 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-for-in-array'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-for-in-array', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts index 5ba0001aaa7..19cb5297a85 100644 --- a/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts +++ b/packages/eslint-plugin/tests/rules/no-implied-eval.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-implied-eval'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +import { createRuleTesterWithTypes } from '../RuleTester'; + +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-implied-eval', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-meaningless-void-operator.test.ts b/packages/eslint-plugin/tests/rules/no-meaningless-void-operator.test.ts index 38c5a239740..15c6d69a34d 100644 --- a/packages/eslint-plugin/tests/rules/no-meaningless-void-operator.test.ts +++ b/packages/eslint-plugin/tests/rules/no-meaningless-void-operator.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-meaningless-void-operator'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootDir = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-meaningless-void-operator', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts index fd908d416c0..0d16dd05263 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-promises.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-misused-promises'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootDir = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-misused-promises', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-misused-spread.test.ts b/packages/eslint-plugin/tests/rules/no-misused-spread.test.ts index e187a85a197..3a7f950fd8e 100644 --- a/packages/eslint-plugin/tests/rules/no-misused-spread.test.ts +++ b/packages/eslint-plugin/tests/rules/no-misused-spread.test.ts @@ -1,17 +1,10 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-misused-spread'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig-with-dom.json', - tsconfigRootDir: rootPath, - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig-with-dom.json', }); ruleTester.run('no-misused-spread', rule, { diff --git a/packages/eslint-plugin/tests/rules/no-mixed-enums.test.ts b/packages/eslint-plugin/tests/rules/no-mixed-enums.test.ts index 603afa4fc0d..4bd17db5e28 100644 --- a/packages/eslint-plugin/tests/rules/no-mixed-enums.test.ts +++ b/packages/eslint-plugin/tests/rules/no-mixed-enums.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-mixed-enums'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-mixed-enums', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-redundant-type-constituents.test.ts b/packages/eslint-plugin/tests/rules/no-redundant-type-constituents.test.ts index 96afce33ac4..ce51eb30804 100644 --- a/packages/eslint-plugin/tests/rules/no-redundant-type-constituents.test.ts +++ b/packages/eslint-plugin/tests/rules/no-redundant-type-constituents.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-redundant-type-constituents'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-redundant-type-constituents', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-boolean-literal-compare.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-boolean-literal-compare.test.ts index ef3107357a7..5f27869ee7a 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-boolean-literal-compare.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-boolean-literal-compare.test.ts @@ -1,18 +1,11 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; import rule from '../../src/rules/no-unnecessary-boolean-literal-compare'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unnecessary-boolean-literal-compare', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts index 22bb2f46c15..80d81bce079 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-condition.test.ts @@ -1,6 +1,6 @@ import type { InvalidTestCase } from '@typescript-eslint/rule-tester'; -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; import type { @@ -9,28 +9,21 @@ import type { } from '../../src/rules/no-unnecessary-condition'; import rule from '../../src/rules/no-unnecessary-condition'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const rootDir = getFixturesRootDir(); +const ruleTester = createRuleTesterWithTypes(); const optionsWithExactOptionalPropertyTypes = { project: './tsconfig.exactOptionalPropertyTypes.json', - tsconfigRootDir: rootPath, + projectService: false, + tsconfigRootDir: rootDir, }; const optionsWithNoUncheckedIndexedAccess = { project: './tsconfig.noUncheckedIndexedAccess.json', projectService: false, - tsconfigRootDir: getFixturesRootDir(), + tsconfigRootDir: rootDir, }; const necessaryConditionTest = (condition: string): string => ` @@ -883,7 +876,7 @@ if (x) { `, languageOptions: { parserOptions: { - tsconfigRootDir: path.join(rootPath, 'unstrict'), + tsconfigRootDir: path.join(rootDir, 'unstrict'), }, }, options: [ @@ -3059,7 +3052,7 @@ if (x) { ], languageOptions: { parserOptions: { - tsconfigRootDir: path.join(rootPath, 'unstrict'), + tsconfigRootDir: path.join(rootDir, 'unstrict'), }, }, }, diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-qualifier.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-qualifier.test.ts index 8bbc814fd31..27bf0da8852 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-qualifier.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-qualifier.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unnecessary-qualifier'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unnecessary-qualifier', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-template-expression.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-template-expression.test.ts index 907cf64f776..693d55ae690 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-template-expression.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-template-expression.test.ts @@ -1,20 +1,11 @@ import type { InvalidTestCase } from '@typescript-eslint/rule-tester'; -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-unnecessary-template-expression'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); const invalidCases = [ { diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts index 9c2ab4fe84e..84e90c9f95f 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-arguments.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unnecessary-type-arguments'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unnecessary-type-arguments', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts index 16bfe40b7eb..b2ef78d4500 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-assertion.test.ts @@ -1,17 +1,12 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; -import path from 'node:path'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-unnecessary-type-assertion'; +import { getFixturesRootDir, createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = path.join(__dirname, '..', 'fixtures'); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - projectService: false, - tsconfigRootDir: rootDir, - }, - }, +const rootDir = getFixturesRootDir(); + +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.json', }); const optionsWithOnUncheckedIndexedAccess = { diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts index 71f5e56e0d1..1bf2ae83cb1 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-conversion.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unnecessary-type-conversion'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootDir = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unnecessary-type-conversion', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts b/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts index 9f8f05479c9..0b98cbd20dd 100644 --- a/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unnecessary-type-parameters.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-unnecessary-type-parameters'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unnecessary-type-parameters', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-argument.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-argument.test.ts index 9669d9c3b04..46fc5f32118 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-argument.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-argument.test.ts @@ -1,16 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unsafe-argument'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: getFixturesRootDir(), - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unsafe-argument', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-assignment.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-assignment.test.ts index e744d560218..537ce85284e 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-assignment.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-assignment.test.ts @@ -1,16 +1,10 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-unsafe-assignment'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.noImplicitThis.json', - projectService: false, - tsconfigRootDir: getFixturesRootDir(), - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.noImplicitThis.json', }); ruleTester.run('no-unsafe-assignment', rule, { diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-call.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-call.test.ts index 279534b83f9..8522ecca83b 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-call.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-call.test.ts @@ -1,16 +1,10 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/no-unsafe-call'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.noImplicitThis.json', - projectService: false, - tsconfigRootDir: getFixturesRootDir(), - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.noImplicitThis.json', }); ruleTester.run('no-unsafe-call', rule, { diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-declaration-merging.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-declaration-merging.test.ts index fbaadb553e6..3837b38eb49 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-declaration-merging.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-declaration-merging.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unsafe-declaration-merging'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unsafe-declaration-merging', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts index b10f3cc6ee5..c1e84f7c588 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unsafe-enum-comparison'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootDir = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unsafe-enum-comparison', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-type-assertion.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-type-assertion.test.ts index 0c40f299667..0b0815f3725 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-type-assertion.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-type-assertion.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unsafe-type-assertion'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); describe('basic assertions', () => { ruleTester.run('no-unsafe-type-assertion', rule, { diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-unary-minus.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-unary-minus.test.ts index 0aea759ca37..28ab97b62b4 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-unary-minus.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-unary-minus.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/no-unsafe-unary-minus'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('no-unsafe-unary-minus', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/non-nullable-type-assertion-style.test.ts b/packages/eslint-plugin/tests/rules/non-nullable-type-assertion-style.test.ts index 500fe0e5a1d..6c02bb0b187 100644 --- a/packages/eslint-plugin/tests/rules/non-nullable-type-assertion-style.test.ts +++ b/packages/eslint-plugin/tests/rules/non-nullable-type-assertion-style.test.ts @@ -1,16 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/non-nullable-type-assertion-style'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: getFixturesRootDir(), - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('non-nullable-type-assertion-style', rule, { valid: [ @@ -244,15 +235,8 @@ const b = (a || undefined)!; ], }); -const ruleTesterWithNoUncheckedIndexAccess = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.noUncheckedIndexedAccess.json', - projectService: false, - sourceType: 'module', - tsconfigRootDir: getFixturesRootDir(), - }, - }, +const ruleTesterWithNoUncheckedIndexAccess = createRuleTesterWithTypes({ + project: './tsconfig.noUncheckedIndexedAccess.json', }); ruleTesterWithNoUncheckedIndexAccess.run( diff --git a/packages/eslint-plugin/tests/rules/only-throw-error.test.ts b/packages/eslint-plugin/tests/rules/only-throw-error.test.ts index 500454d0a9c..aeaf3f39222 100644 --- a/packages/eslint-plugin/tests/rules/only-throw-error.test.ts +++ b/packages/eslint-plugin/tests/rules/only-throw-error.test.ts @@ -1,16 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/only-throw-error'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: getFixturesRootDir(), - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('only-throw-error', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-destructuring.test.ts b/packages/eslint-plugin/tests/rules/prefer-destructuring.test.ts index 3c4b0fa576a..66c0097daf7 100644 --- a/packages/eslint-plugin/tests/rules/prefer-destructuring.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-destructuring.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/prefer-destructuring'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-destructuring', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-find.test.ts b/packages/eslint-plugin/tests/rules/prefer-find.test.ts index 0c17c69dd5f..5c88cb62000 100644 --- a/packages/eslint-plugin/tests/rules/prefer-find.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-find.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/prefer-find'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-find', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-includes.test.ts b/packages/eslint-plugin/tests/rules/prefer-includes.test.ts index 35830c45ad9..a56cd9ded45 100644 --- a/packages/eslint-plugin/tests/rules/prefer-includes.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-includes.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/prefer-includes'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-includes', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-nullish-coalescing.test.ts b/packages/eslint-plugin/tests/rules/prefer-nullish-coalescing.test.ts index e2c5f17c8e5..26de3997046 100644 --- a/packages/eslint-plugin/tests/rules/prefer-nullish-coalescing.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-nullish-coalescing.test.ts @@ -3,7 +3,7 @@ import type { ValidTestCase, } from '@typescript-eslint/rule-tester'; -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; import type { @@ -12,18 +12,10 @@ import type { } from '../../src/rules/prefer-nullish-coalescing'; import rule from '../../src/rules/prefer-nullish-coalescing'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const rootDir = getFixturesRootDir(); +const ruleTester = createRuleTesterWithTypes(); const types = ['string', 'number', 'boolean', 'object']; const nullishTypes = ['null', 'undefined', 'null | undefined']; @@ -2495,7 +2487,7 @@ if (x) { ], languageOptions: { parserOptions: { - tsconfigRootDir: path.join(rootPath, 'unstrict'), + tsconfigRootDir: path.join(rootDir, 'unstrict'), }, }, output: null, diff --git a/packages/eslint-plugin/tests/rules/prefer-optional-chain/prefer-optional-chain.test.ts b/packages/eslint-plugin/tests/rules/prefer-optional-chain/prefer-optional-chain.test.ts index 52c59b479b6..6639951b66e 100644 --- a/packages/eslint-plugin/tests/rules/prefer-optional-chain/prefer-optional-chain.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-optional-chain/prefer-optional-chain.test.ts @@ -1,18 +1,11 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../../src/rules/prefer-optional-chain'; import { dedupeTestCases } from '../../dedupeTestCases'; -import { getFixturesRootDir } from '../../RuleTester'; +import { createRuleTesterWithTypes } from '../../RuleTester'; import { BaseCases, identity } from './base-cases'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: getFixturesRootDir(), - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); describe('|| {}', () => { ruleTester.run('prefer-optional-chain', rule, { diff --git a/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts b/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts index d8edf4fb9c4..a2ba8d12c80 100644 --- a/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-promise-reject-errors.test.ts @@ -1,17 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/prefer-promise-reject-errors'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-promise-reject-errors', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index 94381614160..4cc30efb6b2 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -1,20 +1,11 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; import rule from '../../src/rules/prefer-readonly-parameter-types'; import { readonlynessOptionsDefaults } from '../../src/util'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-readonly-parameter-types', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts index 1e2289d65d1..4b85f6ae724 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/prefer-readonly'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-readonly', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-reduce-type-parameter.test.ts b/packages/eslint-plugin/tests/rules/prefer-reduce-type-parameter.test.ts index f26ccb53350..a158bfa685f 100644 --- a/packages/eslint-plugin/tests/rules/prefer-reduce-type-parameter.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-reduce-type-parameter.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/prefer-reduce-type-parameter'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-reduce-type-parameter', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-regexp-exec.test.ts b/packages/eslint-plugin/tests/rules/prefer-regexp-exec.test.ts index e107208a9a3..c5a501f6988 100644 --- a/packages/eslint-plugin/tests/rules/prefer-regexp-exec.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-regexp-exec.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/prefer-regexp-exec'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-regexp-exec', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-return-this-type.test.ts b/packages/eslint-plugin/tests/rules/prefer-return-this-type.test.ts index d0ed5d1a9c9..df31a2c9f98 100644 --- a/packages/eslint-plugin/tests/rules/prefer-return-this-type.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-return-this-type.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/prefer-return-this-type'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-return-this-type', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts b/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts index 798d26cb391..1b6a91ea03b 100644 --- a/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/prefer-string-starts-ends-with'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('prefer-string-starts-ends-with', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/promise-function-async.test.ts b/packages/eslint-plugin/tests/rules/promise-function-async.test.ts index 4807d8a1c97..c922c0f1024 100644 --- a/packages/eslint-plugin/tests/rules/promise-function-async.test.ts +++ b/packages/eslint-plugin/tests/rules/promise-function-async.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/promise-function-async'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('promise-function-async', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/related-getter-setter-pairs.test.ts b/packages/eslint-plugin/tests/rules/related-getter-setter-pairs.test.ts index ec7e2238505..e31e9b1cde0 100644 --- a/packages/eslint-plugin/tests/rules/related-getter-setter-pairs.test.ts +++ b/packages/eslint-plugin/tests/rules/related-getter-setter-pairs.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/related-getter-setter-pairs'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('related-getter-setter-pairs', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/require-array-sort-compare.test.ts b/packages/eslint-plugin/tests/rules/require-array-sort-compare.test.ts index d4735efe231..786c321194f 100644 --- a/packages/eslint-plugin/tests/rules/require-array-sort-compare.test.ts +++ b/packages/eslint-plugin/tests/rules/require-array-sort-compare.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/require-array-sort-compare'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('require-array-sort-compare', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/require-await.test.ts b/packages/eslint-plugin/tests/rules/require-await.test.ts index d9fca8c12f6..4fc229f2729 100644 --- a/packages/eslint-plugin/tests/rules/require-await.test.ts +++ b/packages/eslint-plugin/tests/rules/require-await.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/require-await'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('require-await', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/restrict-plus-operands.test.ts b/packages/eslint-plugin/tests/rules/restrict-plus-operands.test.ts index d1bf99b3480..a60f49e09f8 100644 --- a/packages/eslint-plugin/tests/rules/restrict-plus-operands.test.ts +++ b/packages/eslint-plugin/tests/rules/restrict-plus-operands.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/restrict-plus-operands'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('restrict-plus-operands', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/restrict-template-expressions.test.ts b/packages/eslint-plugin/tests/rules/restrict-template-expressions.test.ts index e43335aecd0..aa88c8276cd 100644 --- a/packages/eslint-plugin/tests/rules/restrict-template-expressions.test.ts +++ b/packages/eslint-plugin/tests/rules/restrict-template-expressions.test.ts @@ -1,18 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/restrict-template-expressions'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('restrict-template-expressions', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/return-await.test.ts b/packages/eslint-plugin/tests/rules/return-await.test.ts index 9a44a5954d6..33f3f330e92 100644 --- a/packages/eslint-plugin/tests/rules/return-await.test.ts +++ b/packages/eslint-plugin/tests/rules/return-await.test.ts @@ -1,20 +1,11 @@ import type { InvalidTestCase } from '@typescript-eslint/rule-tester'; -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/return-await'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); // default rule is in-try-catch ruleTester.run('return-await', rule, { diff --git a/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts b/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts index 77d8a00e67f..5f451c3f07e 100644 --- a/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts +++ b/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts @@ -1,18 +1,11 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import * as path from 'node:path'; import rule from '../../src/rules/strict-boolean-expressions'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes, getFixturesRootDir } from '../RuleTester'; -const rootPath = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const rootDir = getFixturesRootDir(); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('strict-boolean-expressions', rule, { valid: [ @@ -385,7 +378,7 @@ if (x) { `, languageOptions: { parserOptions: { - tsconfigRootDir: path.join(rootPath, 'unstrict'), + tsconfigRootDir: path.join(rootDir, 'unstrict'), }, }, options: [ @@ -3270,7 +3263,7 @@ if (x) { ], languageOptions: { parserOptions: { - tsconfigRootDir: path.join(rootPath, 'unstrict'), + tsconfigRootDir: path.join(rootDir, 'unstrict'), }, }, output: null, diff --git a/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts b/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts index b18e91e4872..11392f2ca35 100644 --- a/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts +++ b/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts @@ -1,18 +1,10 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; -import path from 'node:path'; +import { noFormat } from '@typescript-eslint/rule-tester'; import switchExhaustivenessCheck from '../../src/rules/switch-exhaustiveness-check'; +import { getFixturesRootDir, createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = path.join(__dirname, '..', 'fixtures'); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const rootDir = getFixturesRootDir(); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('switch-exhaustiveness-check', switchExhaustivenessCheck, { valid: [ @@ -928,7 +920,7 @@ function foo(x: string[]) { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', projectService: false, - tsconfigRootDir: rootPath, + tsconfigRootDir: rootDir, }, }, }, @@ -951,7 +943,7 @@ function foo(x: string[], y: string | undefined) { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', projectService: false, - tsconfigRootDir: rootPath, + tsconfigRootDir: rootDir, }, }, }, @@ -2802,7 +2794,7 @@ function foo(x: string[]) { parserOptions: { project: './tsconfig.noUncheckedIndexedAccess.json', projectService: false, - tsconfigRootDir: rootPath, + tsconfigRootDir: rootDir, }, }, }, diff --git a/packages/eslint-plugin/tests/rules/typedef.test.ts b/packages/eslint-plugin/tests/rules/typedef.test.ts index 129fcc5320c..152cc1beeec 100644 --- a/packages/eslint-plugin/tests/rules/typedef.test.ts +++ b/packages/eslint-plugin/tests/rules/typedef.test.ts @@ -1,17 +1,7 @@ -import { RuleTester } from '@typescript-eslint/rule-tester'; - import rule from '../../src/rules/typedef'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('typedef', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/rules/unbound-method.test.ts b/packages/eslint-plugin/tests/rules/unbound-method.test.ts index aeca1a171d5..92fc2cc4818 100644 --- a/packages/eslint-plugin/tests/rules/unbound-method.test.ts +++ b/packages/eslint-plugin/tests/rules/unbound-method.test.ts @@ -1,22 +1,11 @@ import type { InvalidTestCase } from '@typescript-eslint/rule-tester'; -import { RuleTester } from '@typescript-eslint/rule-tester'; - import type { MessageIds, Options } from '../../src/rules/unbound-method'; import rule from '../../src/rules/unbound-method'; -import { getFixturesRootDir } from '../RuleTester'; - -const rootPath = getFixturesRootDir(); +import { createRuleTesterWithTypes } from '../RuleTester'; -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); function addContainsMethodsClass(code: string): string { return ` diff --git a/packages/eslint-plugin/tests/rules/use-unknown-in-catch-callback-variable.test.ts b/packages/eslint-plugin/tests/rules/use-unknown-in-catch-callback-variable.test.ts index 4100fba8b70..e0ba5f76d4f 100644 --- a/packages/eslint-plugin/tests/rules/use-unknown-in-catch-callback-variable.test.ts +++ b/packages/eslint-plugin/tests/rules/use-unknown-in-catch-callback-variable.test.ts @@ -1,18 +1,9 @@ -import { noFormat, RuleTester } from '@typescript-eslint/rule-tester'; +import { noFormat } from '@typescript-eslint/rule-tester'; import rule from '../../src/rules/use-unknown-in-catch-callback-variable'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootDir = getFixturesRootDir(); - -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootDir, - }, - }, -}); +const ruleTester = createRuleTesterWithTypes(); ruleTester.run('use-unknown-in-catch-callback-variable', rule, { valid: [ diff --git a/packages/eslint-plugin/tests/util/getConstraintInfo.test.ts b/packages/eslint-plugin/tests/util/getConstraintInfo.test.ts index 332b0373c09..c491a3a1a8e 100644 --- a/packages/eslint-plugin/tests/util/getConstraintInfo.test.ts +++ b/packages/eslint-plugin/tests/util/getConstraintInfo.test.ts @@ -14,6 +14,7 @@ const DEFAULT_PARSER_OPTIONS = { disallowAutomaticSingleRunInference: true, filePath: path.join(FIXTURES_DIR, 'file.ts'), project: './tsconfig.json', + projectService: false, tsconfigRootDir: FIXTURES_DIR, } as const satisfies ParserOptions; diff --git a/packages/eslint-plugin/tests/util/getWrappedCode.test.ts b/packages/eslint-plugin/tests/util/getWrappedCode.test.ts index c22f9f9a321..ecfada71d23 100644 --- a/packages/eslint-plugin/tests/util/getWrappedCode.test.ts +++ b/packages/eslint-plugin/tests/util/getWrappedCode.test.ts @@ -1,6 +1,5 @@ import type { TSESTree } from '@typescript-eslint/utils'; -import { RuleTester } from '@typescript-eslint/rule-tester'; import * as ts from 'typescript'; import { @@ -9,16 +8,10 @@ import { getParserServices, } from '../../src/util'; import { getWrappedCode } from '../../src/util/getWrappedCode'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.json', }); const removeFunctionRule = createRule({ diff --git a/packages/eslint-plugin/tests/util/getWrappingFixer.test.ts b/packages/eslint-plugin/tests/util/getWrappingFixer.test.ts index 1dd7a2b929e..e04a8725b65 100644 --- a/packages/eslint-plugin/tests/util/getWrappingFixer.test.ts +++ b/packages/eslint-plugin/tests/util/getWrappingFixer.test.ts @@ -1,18 +1,10 @@ import type { TSESTree } from '@typescript-eslint/utils'; -import { RuleTester } from '@typescript-eslint/rule-tester'; - import { createRule, getWrappingFixer } from '../../src/util'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; -const rootPath = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.json', }); const voidEverythingRule = createRule({ diff --git a/packages/eslint-plugin/tests/util/isNodeEqual.test.ts b/packages/eslint-plugin/tests/util/isNodeEqual.test.ts index 1177b1ac44b..2ff8cd2baa7 100644 --- a/packages/eslint-plugin/tests/util/isNodeEqual.test.ts +++ b/packages/eslint-plugin/tests/util/isNodeEqual.test.ts @@ -1,9 +1,7 @@ import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; -import { RuleTester } from '@typescript-eslint/rule-tester'; - import { createRule, isNodeEqual } from '../../src/util'; -import { getFixturesRootDir } from '../RuleTester'; +import { createRuleTesterWithTypes } from '../RuleTester'; const rule = createRule({ create(context) { @@ -43,14 +41,8 @@ const rule = createRule({ name: 'no-useless-expression', }); -const rootPath = getFixturesRootDir(); -const ruleTester = new RuleTester({ - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: rootPath, - }, - }, +const ruleTester = createRuleTesterWithTypes({ + project: './tsconfig.json', }); ruleTester.run('isNodeEqual', rule, { diff --git a/packages/typescript-estree/src/parseSettings/createParseSettings.ts b/packages/typescript-estree/src/parseSettings/createParseSettings.ts index e393686e0af..15bd7840a4e 100644 --- a/packages/typescript-estree/src/parseSettings/createParseSettings.ts +++ b/packages/typescript-estree/src/parseSettings/createParseSettings.ts @@ -180,6 +180,19 @@ export function createParseSettings( tsconfigRootDir, }; + // TODO: Eventually, parse settings will be validated more thoroughly. + // https://github.com/typescript-eslint/typescript-eslint/issues/6403 + if ( + parseSettings.projectService && + tsestreeOptions.project && + process.env.TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR !== + 'true' + ) { + throw new Error( + 'Enabling "project" does nothing when "projectService" is enabled. You can remove the "project" setting.', + ); + } + // debug doesn't support multiple `enable` calls, so have to do it all at once if (parseSettings.debugLevel.size > 0) { const namespaces = []; diff --git a/packages/typescript-estree/tests/lib/createParseSettings.test.ts b/packages/typescript-estree/tests/lib/createParseSettings.test.ts index b1f33f9304d..ddb9c17cbc2 100644 --- a/packages/typescript-estree/tests/lib/createParseSettings.test.ts +++ b/packages/typescript-estree/tests/lib/createParseSettings.test.ts @@ -26,6 +26,10 @@ describe(createParseSettings, () => { it('is created when options.projectService is undefined, options.project is true, and process.env.TYPESCRIPT_ESLINT_PROJECT_SERVICE is true', () => { vi.stubEnv('TYPESCRIPT_ESLINT_PROJECT_SERVICE', 'true'); + vi.stubEnv( + 'TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR', + 'true', + ); const parseSettings = createParseSettings('', { project: true, @@ -35,6 +39,17 @@ describe(createParseSettings, () => { expect(parseSettings.projectService).toBe(projectService); }); + it('complains when options.projectService is true, options.project is true, and process.env.TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR is not set', () => { + expect(() => + createParseSettings('', { + project: true, + projectService: true, + }), + ).toThrowErrorMatchingInlineSnapshot( + `[Error: Enabling "project" does nothing when "projectService" is enabled. You can remove the "project" setting.]`, + ); + }); + it('is not created when options.projectService is undefined, options.project is falsy, and process.env.TYPESCRIPT_ESLINT_PROJECT_SERVICE is true', () => { vi.stubEnv('TYPESCRIPT_ESLINT_PROJECT_SERVICE', 'true'); diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index c371a6e9e7a..421287ff182 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -68,6 +68,10 @@ describe(parser.parseAndGenerateServices, () => { beforeEach(() => { vi.clearAllMocks(); clearGlobResolutionCache(); + vi.stubEnv( + 'TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR', + 'true', + ); }); afterAll(() => { diff --git a/packages/typescript-estree/tests/lib/persistentParse.test.ts b/packages/typescript-estree/tests/lib/persistentParse.test.ts index d7283f41233..b8916bb6eb0 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.test.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.test.ts @@ -38,6 +38,13 @@ afterEach(() => { process.chdir(cwdCopy); }); +beforeEach(() => { + vi.stubEnv( + 'TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR', + 'true', + ); +}); + beforeAll(async () => { await fs.mkdir(tmpDirsParentDirectory, { recursive: true, diff --git a/packages/typescript-estree/tests/lib/semanticInfo-singleRun.test.ts b/packages/typescript-estree/tests/lib/semanticInfo-singleRun.test.ts index 69789fa2dc3..f63aa80c1bf 100644 --- a/packages/typescript-estree/tests/lib/semanticInfo-singleRun.test.ts +++ b/packages/typescript-estree/tests/lib/semanticInfo-singleRun.test.ts @@ -114,6 +114,11 @@ describe('semanticInfo - singleRun', () => { createProgramFromConfigFile.mockClear(); // Do not track invocations per file across tests clearParseAndGenerateServicesCalls(); + + vi.stubEnv( + 'TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR', + 'true', + ); }); it('should not create any programs ahead of time by default when there is no way to infer singleRun=true', () => { diff --git a/packages/typescript-estree/tests/lib/semanticInfo.test.ts b/packages/typescript-estree/tests/lib/semanticInfo.test.ts index 9f4aa21fbd5..0d4285e396d 100644 --- a/packages/typescript-estree/tests/lib/semanticInfo.test.ts +++ b/packages/typescript-estree/tests/lib/semanticInfo.test.ts @@ -41,8 +41,17 @@ describe('semanticInfo', async () => { clearCaches(); vi.stubEnv('TSESTREE_SINGLE_RUN', ''); + vi.stubEnv( + 'TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR', + 'true', + ); }); + vi.stubEnv( + 'TYPESCRIPT_ESLINT_IGNORE_PROJECT_AND_PROJECT_SERVICE_ERROR', + 'true', + ); + // test all AST snapshots const testCases = await Promise.all( testFiles.map(async filename => {