From ad32b13bb0a7ff9d047249872a39eb1bf0be10bd Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Thu, 18 Sep 2025 16:25:20 +0800 Subject: [PATCH 1/2] add a vitest workspace config --- package.json | 3 ++- pnpm-lock.yaml | 3 +++ tsconfig.json | 2 +- vitest.config.js | 19 +++++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 vitest.config.js diff --git a/package.json b/package.json index 91d85fd0a072..2ecfbf098d3a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "eslint": "^9.34.0", "prettier": "^3.6.0", "prettier-plugin-svelte": "^3.4.0", - "typescript-eslint": "^8.43.0" + "typescript-eslint": "^8.43.0", + "vitest": "catalog:" }, "packageManager": "pnpm@10.17.0", "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 775f6c9859d5..873e917c06b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: typescript-eslint: specifier: ^8.43.0 version: 8.43.0(eslint@9.34.0(jiti@2.4.2))(typescript@5.8.3) + vitest: + specifier: 'catalog:' + version: 3.2.4(@types/node@18.19.119)(@vitest/browser@3.2.4)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) packages/adapter-auto: devDependencies: diff --git a/tsconfig.json b/tsconfig.json index 8f262e2da415..11c91a4847e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,5 +3,5 @@ "checkJs": true, "noEmit": true }, - "include": ["eslint.config.js"] + "include": ["eslint.config.js", "vitest.config.js"] } diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 000000000000..500f949f4a6e --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,19 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + projects: [ + 'packages/adapter-auto', + 'packages/adapter-cloudflare', + 'packages/adapter-netlify', + 'packages/adapter-node', + 'packages/adapter-vercel', + 'packages/enhanced-img', + 'packages/package', + 'packages/kit/kit.vitest.config.js', + 'packages/kit/test/apps/basics', + 'packages/kit/test/build-errors', + 'packages/kit/test/prerendering/basics' + ] + } +}); From c83f4c99b8b1ffda1f4c6661bc4d9e800b812a83 Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Thu, 18 Sep 2025 18:58:26 +0800 Subject: [PATCH 2/2] fixes --- packages/adapter-auto/test/adapters.spec.js | 2 +- packages/kit/test/apps/basics/vite.config.js | 27 ++---- packages/kit/test/build-errors/env.spec.js | 19 +++-- .../kit/test/build-errors/prerender.spec.js | 14 ++-- .../kit/test/build-errors/server-only.spec.js | 15 ++-- .../test/build-errors/syntax-error.spec.js | 10 ++- .../test/prerendering/basics/vite.config.js | 18 ++-- vitest.config.js | 82 ++++++++++++++++--- 8 files changed, 126 insertions(+), 61 deletions(-) diff --git a/packages/adapter-auto/test/adapters.spec.js b/packages/adapter-auto/test/adapters.spec.js index abb873fa6a78..89b98c0bbbfb 100644 --- a/packages/adapter-auto/test/adapters.spec.js +++ b/packages/adapter-auto/test/adapters.spec.js @@ -1,5 +1,5 @@ import { assert, test } from 'vitest'; -import { adapters } from 'adapters.js'; +import { adapters } from '../adapters.js'; import { existsSync, readFileSync } from 'node:fs'; test('adapter versions are up to date', () => { diff --git a/packages/kit/test/apps/basics/vite.config.js b/packages/kit/test/apps/basics/vite.config.js index 77931e9344b0..1812d8a71f58 100644 --- a/packages/kit/test/apps/basics/vite.config.js +++ b/packages/kit/test/apps/basics/vite.config.js @@ -1,4 +1,4 @@ -import * as path from 'node:path'; +import path from 'node:path'; import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vitest/config'; @@ -20,22 +20,13 @@ export default defineConfig({ }, test: { expect: { requireAssertions: true }, - projects: [ - { - extends: './vite.config.js', - test: { - name: 'client', - environment: 'browser', - browser: { - enabled: true, - provider: 'playwright', - instances: [{ browser: 'chromium' }], - headless: true - }, - include: ['unit-test/**/*.spec.js'], - setupFiles: ['./vitest-setup-client.ts'] - } - } - ] + browser: { + enabled: true, + provider: 'playwright', + instances: [{ browser: 'chromium' }], + headless: true + }, + include: ['unit-test/**/*.spec.js'], + setupFiles: ['vitest-setup-client.ts'], } }); diff --git a/packages/kit/test/build-errors/env.spec.js b/packages/kit/test/build-errors/env.spec.js index aa41d4db6545..9f6019255e04 100644 --- a/packages/kit/test/build-errors/env.spec.js +++ b/packages/kit/test/build-errors/env.spec.js @@ -1,10 +1,13 @@ -import { assert, test } from 'vitest'; -import { execSync } from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; +import { execSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { assert, test } from 'vitest'; const timeout = 60_000; +const dir = path.dirname(fileURLToPath(import.meta.url)); + // ordinarily server-only modules are allowed during testing, since Vitest can't differentiate /** @type {Record} */ const env = { ...process.env, TEST: false }; @@ -13,7 +16,7 @@ test('$env/dynamic/private is not statically importable from the client', { time assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/private-dynamic-env'), + cwd: path.join(dir, 'apps/private-dynamic-env'), stdio: 'pipe', timeout, env @@ -26,7 +29,7 @@ test('$env/dynamic/private is not dynamically importable from the client', { tim assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/private-dynamic-env-dynamic-import'), + cwd: path.join(dir, 'apps/private-dynamic-env-dynamic-import'), stdio: 'pipe', timeout, env @@ -39,7 +42,7 @@ test('$env/static/private is not statically importable from the client', { timeo assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/private-static-env'), + cwd: path.join(dir, 'apps/private-static-env'), stdio: 'pipe', timeout, env @@ -52,7 +55,7 @@ test('$env/static/private is not dynamically importable from the client', { time assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/private-static-env-dynamic-import'), + cwd: path.join(dir, 'apps/private-static-env-dynamic-import'), stdio: 'pipe', timeout, env @@ -65,7 +68,7 @@ test('$env/dynamic/private is not importable from the service worker', { timeout assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/service-worker-private-env'), + cwd: path.join(dir, 'apps/service-worker-private-env'), stdio: 'pipe', timeout, env @@ -78,7 +81,7 @@ test('$env/dynamic/public is not importable from the service worker', { timeout assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/service-worker-dynamic-public-env'), + cwd: path.join(dir, 'apps/service-worker-dynamic-public-env'), stdio: 'pipe', timeout, env diff --git a/packages/kit/test/build-errors/prerender.spec.js b/packages/kit/test/build-errors/prerender.spec.js index 903d2491e858..541c0b88325b 100644 --- a/packages/kit/test/build-errors/prerender.spec.js +++ b/packages/kit/test/build-errors/prerender.spec.js @@ -1,16 +1,18 @@ -import { assert, test } from 'vitest'; -import { execSync } from 'node:child_process'; import path from 'node:path'; +import { execSync } from 'node:child_process'; import { EOL } from 'node:os'; -import process from 'node:process'; +import { fileURLToPath } from 'node:url'; +import { assert, test } from 'vitest'; const timeout = 60_000; +const dir = path.dirname(fileURLToPath(import.meta.url)); + test('prerenderable routes must be prerendered', { timeout }, () => { assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/prerenderable-not-prerendered'), + cwd: path.join(dir, 'apps/prerenderable-not-prerendered'), stdio: 'pipe', timeout }), @@ -22,7 +24,7 @@ test('entry generators should match their own route', { timeout }, () => { assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/prerender-entry-generator-mismatch'), + cwd: path.join(dir, 'apps/prerender-entry-generator-mismatch'), stdio: 'pipe', timeout }), @@ -34,7 +36,7 @@ test('an error in a `prerender` function should fail the build', { timeout }, () assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/prerender-remote-function-error'), + cwd: path.join(dir, 'apps/prerender-remote-function-error'), stdio: 'pipe', timeout }), diff --git a/packages/kit/test/build-errors/server-only.spec.js b/packages/kit/test/build-errors/server-only.spec.js index 67bccd96afd3..0a12fd4cf967 100644 --- a/packages/kit/test/build-errors/server-only.spec.js +++ b/packages/kit/test/build-errors/server-only.spec.js @@ -1,10 +1,13 @@ -import { assert, test } from 'vitest'; -import { execSync } from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; +import { execSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { assert, test } from 'vitest'; const timeout = 60_000; +const dir = path.dirname(fileURLToPath(import.meta.url)); + // ordinarily server-only modules are allowed during testing, since Vitest can't differentiate /** @type {Record} */ const env = { ...process.env, TEST: false }; @@ -13,7 +16,7 @@ test('$lib/*.server.* is not statically importable from the client', { timeout } assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/server-only-module'), + cwd: path.join(dir, 'apps/server-only-module'), stdio: 'pipe', timeout, env @@ -26,7 +29,7 @@ test('$lib/*.server.* is not dynamically importable from the client', { timeout assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/server-only-module-dynamic-import'), + cwd: path.join(dir, 'apps/server-only-module-dynamic-import'), stdio: 'pipe', timeout, env @@ -39,7 +42,7 @@ test('$lib/server/* is not statically importable from the client', { timeout }, assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/server-only-folder'), + cwd: path.join(dir, 'apps/server-only-folder'), stdio: 'pipe', timeout, env @@ -52,7 +55,7 @@ test('$lib/server/* is not dynamically importable from the client', { timeout }, assert.throws( () => execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/server-only-folder-dynamic-import'), + cwd: path.join(dir, 'apps/server-only-folder-dynamic-import'), stdio: 'pipe', timeout, env diff --git a/packages/kit/test/build-errors/syntax-error.spec.js b/packages/kit/test/build-errors/syntax-error.spec.js index 9abc21f59ba2..ed140c4e2249 100644 --- a/packages/kit/test/build-errors/syntax-error.spec.js +++ b/packages/kit/test/build-errors/syntax-error.spec.js @@ -1,14 +1,16 @@ -import { assert, test } from 'vitest'; -import { execSync } from 'node:child_process'; import path from 'node:path'; -import process from 'node:process'; +import { execSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { assert, test } from 'vitest'; const timeout = 60_000; +const dir = path.dirname(fileURLToPath(import.meta.url)); + test('$lib/*.server.* is not statically importable from the client', { timeout }, () => { try { execSync('pnpm build', { - cwd: path.join(process.cwd(), 'apps/syntax-error'), + cwd: path.join(dir, 'apps/syntax-error'), stdio: 'pipe', timeout }); diff --git a/packages/kit/test/prerendering/basics/vite.config.js b/packages/kit/test/prerendering/basics/vite.config.js index 7901f06832d7..b4eb26217636 100644 --- a/packages/kit/test/prerendering/basics/vite.config.js +++ b/packages/kit/test/prerendering/basics/vite.config.js @@ -1,8 +1,13 @@ -import * as path from 'node:path'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vitest/config'; -/** @type {import('vitest/config').UserConfig} */ -const config = { +// we need to append the current directory because Vitest's workspace config +// doesn't correctly resolve relative paths in `include` +const dir = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ build: { minify: false }, @@ -24,8 +29,7 @@ const config = { }, test: { - globalSetup: './globalSetup.js' + globalSetup: `${dir}/globalSetup.js`, + include: [`${dir}/test/**/*.spec.js`] } -}; - -export default config; +}); diff --git a/vitest.config.js b/vitest.config.js index 500f949f4a6e..92966429c064 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -3,17 +3,77 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { projects: [ - 'packages/adapter-auto', - 'packages/adapter-cloudflare', - 'packages/adapter-netlify', - 'packages/adapter-node', - 'packages/adapter-vercel', - 'packages/enhanced-img', - 'packages/package', - 'packages/kit/kit.vitest.config.js', - 'packages/kit/test/apps/basics', - 'packages/kit/test/build-errors', - 'packages/kit/test/prerendering/basics' + { + test: { + root: 'packages/adapter-auto', + name: 'adapter-auto', + } + }, + { + test: { + root: 'packages/adapter-cloudflare', + name: 'adapter-cloudflare', + } + }, + { + test: { + root: 'packages/adapter-netlify', + name: 'adapter-netlify', + } + }, + { + test: { + root: 'packages/adapter-node', + name: 'adapter-node', + } + }, + { + test: { + root: 'packages/adapter-vercel', + name: 'adapter-vercel', + } + }, + { + test: { + root: 'packages/enhanced-img', + name: 'enhanced-img', + } + }, + { + test: { + root: 'packages/package', + name: 'package' + } + }, + // TODO: 'Creates correct $types' test in write_types/index.spec.js does not work because of the wrong cwd + { + extends: 'packages/kit/kit.vitest.config.js', + test: { + root: 'packages/kit', + name: 'kit', + } + }, + // TODO: uncomment this when cwd is set correctly + // { + // extends: 'packages/kit/test/apps/basics/vite.config.js', + // test: { + // root: 'packages/kit/test/apps/basics', + // name: 'kit-apps-basics', + // } + // }, + { + test: { + root: 'packages/kit/test/build-errors', + name: 'kit-build-errors', + } + }, + { + extends: 'packages/kit/test/prerendering/basics/vite.config.js', + test: { + root:'packages/kit/test/prerendering/basics', + name: 'kit-prerendering-basics', + } + } ] } });