diff --git a/src/rules/enforce-effect-naming-convention/enforce-effect-naming-convention.test.ts b/src/rules/enforce-effect-naming-convention/enforce-effect-naming-convention.test.ts index 84f7093..1d7f1ea 100644 --- a/src/rules/enforce-effect-naming-convention/enforce-effect-naming-convention.test.ts +++ b/src/rules/enforce-effect-naming-convention/enforce-effect-naming-convention.test.ts @@ -1,20 +1,11 @@ import path from "path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./enforce-effect-naming-convention" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/enforce-exhaustive-useUnit-destructuring/enforce-exhaustive-useUnit-destructuring.test.ts b/src/rules/enforce-exhaustive-useUnit-destructuring/enforce-exhaustive-useUnit-destructuring.test.ts index ea3a4fb..ec91c9b 100644 --- a/src/rules/enforce-exhaustive-useUnit-destructuring/enforce-exhaustive-useUnit-destructuring.test.ts +++ b/src/rules/enforce-exhaustive-useUnit-destructuring/enforce-exhaustive-useUnit-destructuring.test.ts @@ -1,19 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { tsx } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./enforce-exhaustive-useUnit-destructuring" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.tsx"], defaultProject: "tsconfig.fixture.json" }, - ecmaFeatures: { jsx: true }, - }, - }, -}) +const ruleTester = createRuleTester({ jsx: true }) ruleTester.run("enforce-exhaustive-useUnit-destructuring", rule, { valid: [ diff --git a/src/rules/enforce-gate-naming-convention/enforce-gate-naming-convention.test.ts b/src/rules/enforce-gate-naming-convention/enforce-gate-naming-convention.test.ts index d0be2f0..28b3210 100644 --- a/src/rules/enforce-gate-naming-convention/enforce-gate-naming-convention.test.ts +++ b/src/rules/enforce-gate-naming-convention/enforce-gate-naming-convention.test.ts @@ -1,20 +1,11 @@ import path from "path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./enforce-gate-naming-convention" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/enforce-store-naming-convention/enforce-store-naming-convention.test.ts b/src/rules/enforce-store-naming-convention/enforce-store-naming-convention.test.ts index 84c1593..775f724 100644 --- a/src/rules/enforce-store-naming-convention/enforce-store-naming-convention.test.ts +++ b/src/rules/enforce-store-naming-convention/enforce-store-naming-convention.test.ts @@ -1,20 +1,11 @@ import path from "path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./enforce-store-naming-convention" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/keep-options-order/keep-options-order.test.ts b/src/rules/keep-options-order/keep-options-order.test.ts index 527a8fb..8fd5b51 100644 --- a/src/rules/keep-options-order/keep-options-order.test.ts +++ b/src/rules/keep-options-order/keep-options-order.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./keep-options-order" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("keep-options-order", rule, { valid: [ diff --git a/src/rules/mandatory-scope-binding/mandatory-scope-binding.test.ts b/src/rules/mandatory-scope-binding/mandatory-scope-binding.test.ts index 167896e..1ce8541 100644 --- a/src/rules/mandatory-scope-binding/mandatory-scope-binding.test.ts +++ b/src/rules/mandatory-scope-binding/mandatory-scope-binding.test.ts @@ -1,21 +1,11 @@ import path from "path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { tsx } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./mandatory-scope-binding" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.tsx"], defaultProject: "tsconfig.fixture.json" }, - ecmaFeatures: { jsx: true }, - }, - }, -}) +const ruleTester = createRuleTester({ jsx: true }) const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/no-ambiguity-target/no-ambiguity-target.test.ts b/src/rules/no-ambiguity-target/no-ambiguity-target.test.ts index 4c26d1a..e7017ba 100644 --- a/src/rules/no-ambiguity-target/no-ambiguity-target.test.ts +++ b/src/rules/no-ambiguity-target/no-ambiguity-target.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-ambiguity-target" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-ambiguity-target", rule, { valid: [ diff --git a/src/rules/no-domain-unit-creators/no-domain-unit-creators.test.ts b/src/rules/no-domain-unit-creators/no-domain-unit-creators.test.ts index c814b9c..5ea33fd 100644 --- a/src/rules/no-domain-unit-creators/no-domain-unit-creators.test.ts +++ b/src/rules/no-domain-unit-creators/no-domain-unit-creators.test.ts @@ -1,20 +1,11 @@ import path from "node:path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-domain-unit-creators" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/no-duplicate-clock-or-source-array-values/no-duplicate-clock-or-source-array-values.test.ts b/src/rules/no-duplicate-clock-or-source-array-values/no-duplicate-clock-or-source-array-values.test.ts index 6879155..4196e4f 100644 --- a/src/rules/no-duplicate-clock-or-source-array-values/no-duplicate-clock-or-source-array-values.test.ts +++ b/src/rules/no-duplicate-clock-or-source-array-values/no-duplicate-clock-or-source-array-values.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-duplicate-clock-or-source-array-values" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-duplicate-clock-or-source-array-values", rule, { valid: [ diff --git a/src/rules/no-duplicate-on/no-duplicate-on.test.ts b/src/rules/no-duplicate-on/no-duplicate-on.test.ts index ad8cdff..69b461b 100644 --- a/src/rules/no-duplicate-on/no-duplicate-on.test.ts +++ b/src/rules/no-duplicate-on/no-duplicate-on.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-duplicate-on" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-duplicate-on", rule, { valid: [ diff --git a/src/rules/no-forward/no-forward.test.ts b/src/rules/no-forward/no-forward.test.ts index e4332c0..d789004 100644 --- a/src/rules/no-forward/no-forward.test.ts +++ b/src/rules/no-forward/no-forward.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-forward" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-forward", rule, { valid: [ diff --git a/src/rules/no-getState/no-getState.test.ts b/src/rules/no-getState/no-getState.test.ts index b24bc1e..a9a2aad 100644 --- a/src/rules/no-getState/no-getState.test.ts +++ b/src/rules/no-getState/no-getState.test.ts @@ -1,20 +1,11 @@ import path from "node:path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-getState" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/no-guard/no-guard.test.ts b/src/rules/no-guard/no-guard.test.ts index bb530ef..74ed637 100644 --- a/src/rules/no-guard/no-guard.test.ts +++ b/src/rules/no-guard/no-guard.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-guard" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-guard", rule, { valid: [ diff --git a/src/rules/no-patronum-debug/no-patronum-debug.test.ts b/src/rules/no-patronum-debug/no-patronum-debug.test.ts index 1eaf5e4..bb9b06d 100644 --- a/src/rules/no-patronum-debug/no-patronum-debug.test.ts +++ b/src/rules/no-patronum-debug/no-patronum-debug.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-patronum-debug" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-patronum-debug", rule, { valid: [ diff --git a/src/rules/no-units-spawn-in-render/no-units-spawn-in-render.test.ts b/src/rules/no-units-spawn-in-render/no-units-spawn-in-render.test.ts index 3cfd6d6..b691b7b 100644 --- a/src/rules/no-units-spawn-in-render/no-units-spawn-in-render.test.ts +++ b/src/rules/no-units-spawn-in-render/no-units-spawn-in-render.test.ts @@ -1,21 +1,11 @@ import path from "path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { tsx } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-units-spawn-in-render" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.tsx"], defaultProject: "tsconfig.fixture.json" }, - ecmaFeatures: { jsx: true }, - }, - }, -}) +const ruleTester = createRuleTester({ jsx: true }) const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/no-unnecessary-combination/no-unnecessary-combination.test.ts b/src/rules/no-unnecessary-combination/no-unnecessary-combination.test.ts index 9bb3355..2e01031 100644 --- a/src/rules/no-unnecessary-combination/no-unnecessary-combination.test.ts +++ b/src/rules/no-unnecessary-combination/no-unnecessary-combination.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-unnecessary-combination" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-unnecessary-combination", rule, { valid: [ diff --git a/src/rules/no-unnecessary-duplication/no-unnecessary-duplication.test.ts b/src/rules/no-unnecessary-duplication/no-unnecessary-duplication.test.ts index 0bf5779..63d59cd 100644 --- a/src/rules/no-unnecessary-duplication/no-unnecessary-duplication.test.ts +++ b/src/rules/no-unnecessary-duplication/no-unnecessary-duplication.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-unnecessary-duplication" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-unnecessary-duplication", rule, { valid: [ diff --git a/src/rules/no-useless-methods/no-useless-methods.test.ts b/src/rules/no-useless-methods/no-useless-methods.test.ts index 0929e74..99aec7d 100644 --- a/src/rules/no-useless-methods/no-useless-methods.test.ts +++ b/src/rules/no-useless-methods/no-useless-methods.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-useless-methods" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("no-useless-methods", rule, { valid: [ diff --git a/src/rules/no-watch/no-watch.test.ts b/src/rules/no-watch/no-watch.test.ts index d15cb57..59ba713 100644 --- a/src/rules/no-watch/no-watch.test.ts +++ b/src/rules/no-watch/no-watch.test.ts @@ -1,20 +1,11 @@ import path from "node:path" -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./no-watch" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() const fixture = (file: string) => path.resolve(__dirname, "fixtures", file) diff --git a/src/rules/prefer-useUnit/prefer-useUnit.test.ts b/src/rules/prefer-useUnit/prefer-useUnit.test.ts index 51c5202..9be07e5 100644 --- a/src/rules/prefer-useUnit/prefer-useUnit.test.ts +++ b/src/rules/prefer-useUnit/prefer-useUnit.test.ts @@ -1,19 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { tsx } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./prefer-useUnit" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.tsx"], defaultProject: "tsconfig.fixture.json" }, - ecmaFeatures: { jsx: true }, - }, - }, -}) +const ruleTester = createRuleTester({ jsx: true }) ruleTester.run("prefer-useUnit", rule, { valid: [ diff --git a/src/rules/require-pickup-in-persist/require-pickup-in-persist.test.ts b/src/rules/require-pickup-in-persist/require-pickup-in-persist.test.ts index 9a2e836..c6ada8b 100644 --- a/src/rules/require-pickup-in-persist/require-pickup-in-persist.test.ts +++ b/src/rules/require-pickup-in-persist/require-pickup-in-persist.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./require-pickup-in-persist" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("require-pickup-in-persist", rule, { valid: [ diff --git a/src/rules/strict-effect-handlers/strict-effect-handlers.test.ts b/src/rules/strict-effect-handlers/strict-effect-handlers.test.ts index ca58941..c13db15 100644 --- a/src/rules/strict-effect-handlers/strict-effect-handlers.test.ts +++ b/src/rules/strict-effect-handlers/strict-effect-handlers.test.ts @@ -1,18 +1,9 @@ -import { RuleTester } from "@typescript-eslint/rule-tester" -import { parser } from "typescript-eslint" - import { ts } from "@/shared/tag" +import { createRuleTester } from "@/testing/rule-tester" import rule from "./strict-effect-handlers" -const ruleTester = new RuleTester({ - languageOptions: { - parser, - parserOptions: { - projectService: { allowDefaultProject: ["*.ts"], defaultProject: "tsconfig.fixture.json" }, - }, - }, -}) +const ruleTester = createRuleTester() ruleTester.run("strict-effect-handlers", rule, { valid: [ diff --git a/src/testing/fixture/file.ts b/src/testing/fixture/file.ts new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/src/testing/fixture/file.ts @@ -0,0 +1 @@ +export {} diff --git a/src/testing/fixture/react.tsx b/src/testing/fixture/react.tsx new file mode 100644 index 0000000..336ce12 --- /dev/null +++ b/src/testing/fixture/react.tsx @@ -0,0 +1 @@ +export {} diff --git a/tsconfig.fixture.json b/src/testing/fixture/tsconfig.json similarity index 72% rename from tsconfig.fixture.json rename to src/testing/fixture/tsconfig.json index 546ccd7..f145d2c 100644 --- a/tsconfig.fixture.json +++ b/src/testing/fixture/tsconfig.json @@ -20,5 +20,8 @@ "lib": ["ESNext"], "types": ["node"] - } + }, + + // stubs for RuleTester test files, which need to be on-disk for projectService to type-check them for some reason + "include": ["file.ts", "react.tsx"] } diff --git a/src/testing/rule-tester.ts b/src/testing/rule-tester.ts new file mode 100644 index 0000000..deb5925 --- /dev/null +++ b/src/testing/rule-tester.ts @@ -0,0 +1,16 @@ +import path from "node:path" + +import { RuleTester } from "@typescript-eslint/rule-tester" +import { parser } from "typescript-eslint" + +const tsconfigRootDir = path.resolve(__dirname, "fixture") + +type RuleTesterOptions = { jsx?: boolean } + +export const createRuleTester = ({ jsx = false }: RuleTesterOptions = {}) => + new RuleTester({ + languageOptions: { + parser, + parserOptions: { projectService: true, tsconfigRootDir, ecmaFeatures: { jsx } }, + }, + }) diff --git a/vitest.config.ts b/vitest.config.ts index 0da8ab0..2a38ded 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,6 +5,8 @@ const resolve = (segment: string) => path.resolve(__dirname, segment) export default defineConfig({ test: { + isolate: false, + setupFiles: ["src/setup.ts"], testTimeout: 10_000, // account for long first ast parse },