diff --git a/packages/vitest/src/node/pools/typecheck.ts b/packages/vitest/src/node/pools/typecheck.ts index 19f811c1f596..e9a173f8f4a8 100644 --- a/packages/vitest/src/node/pools/typecheck.ts +++ b/packages/vitest/src/node/pools/typecheck.ts @@ -20,7 +20,7 @@ export function createTypecheckPool(ctx: Vitest): ProcessPool { if (!project.config.typecheck.ignoreSourceErrors) sourceErrors.forEach(error => ctx.state.catchError(error, 'Unhandled Source Error')) - const processError = !hasFailed(files) && checker.getExitCode() + const processError = !hasFailed(files) && !sourceErrors.length && checker.getExitCode() if (processError) { const error = new Error(checker.getOutput()) error.stack = '' diff --git a/test/typescript/fixtures/source-error/src/not-ok.ts b/test/typescript/fixtures/source-error/src/not-ok.ts new file mode 100644 index 000000000000..588f1015a51e --- /dev/null +++ b/test/typescript/fixtures/source-error/src/not-ok.ts @@ -0,0 +1 @@ +thisIsSourceError diff --git a/test/typescript/fixtures/source-error/test/ok.test-d.ts b/test/typescript/fixtures/source-error/test/ok.test-d.ts new file mode 100644 index 000000000000..a1b5e2c51c19 --- /dev/null +++ b/test/typescript/fixtures/source-error/test/ok.test-d.ts @@ -0,0 +1,5 @@ +import { expectTypeOf, test } from 'vitest' + +test('ok', () => { + expectTypeOf(1).toEqualTypeOf(2) +}) diff --git a/test/typescript/fixtures/source-error/tsconfig.json b/test/typescript/fixtures/source-error/tsconfig.json new file mode 100644 index 000000000000..ce6d85859d1b --- /dev/null +++ b/test/typescript/fixtures/source-error/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "noEmit": true, + "target": "es2020", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "verbatimModuleSyntax": true + }, + "include": ["src", "test"], + "exclude": ["node_modules"] +} diff --git a/test/typescript/fixtures/source-error/vite.config.ts b/test/typescript/fixtures/source-error/vite.config.ts new file mode 100644 index 000000000000..4428598a2299 --- /dev/null +++ b/test/typescript/fixtures/source-error/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + typecheck: { + enabled: true, + }, + }, +}) diff --git a/test/typescript/test/runner.test.ts b/test/typescript/test/runner.test.ts index 518a23fc1728..096c18c8bf64 100644 --- a/test/typescript/test/runner.test.ts +++ b/test/typescript/test/runner.test.ts @@ -97,3 +97,30 @@ describe('should fail', async () => { expect(stderr.replace(resolve(__dirname, '..'), '')).toMatchSnapshot() }) }) + +describe('ignoreSourceErrors', () => { + it('disabled', async () => { + const vitest = await runVitestCli( + { + cwd: resolve(__dirname, '../fixtures/source-error'), + }, + '--run', + ) + expect(vitest.stdout).toContain('Unhandled Errors') + expect(vitest.stderr).toContain('Unhandled Source Error') + expect(vitest.stderr).toContain('TypeCheckError: Cannot find name \'thisIsSourceError\'') + }) + + it('enabled', async () => { + const vitest = await runVitestCli( + { + cwd: resolve(__dirname, '../fixtures/source-error'), + }, + '--run', + '--typecheck.ignoreSourceErrors', + ) + expect(vitest.stdout).not.toContain('Unhandled Errors') + expect(vitest.stderr).not.toContain('Unhandled Source Error') + expect(vitest.stderr).not.toContain('TypeCheckError: Cannot find name \'thisIsSourceError\'') + }) +}) diff --git a/test/typescript/tsconfig.json b/test/typescript/tsconfig.json index 824464b4032e..403b1ee01c57 100644 --- a/test/typescript/tsconfig.json +++ b/test/typescript/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.base.json", "exclude": [ - "**/dist/**" + "**/dist/**", + "**/fixtures/**" ] }