Skip to content
Source
Sign inSign up

vitest.config.ts

235 lines8.0 KB

1import * as os from "node:os"
2import * as path from "node:path"
3import { defineConfig, mergeConfig, type ViteUserConfig } from "vitest/config"
4​
5const isDeno = process.versions.deno !== undefined
6const isBun = process.versions.bun !== undefined
7const isNode = typeof process !== "undefined" &&
8 process.release.name === "node" &&
9 !isDeno &&
10 !isBun
11const integrationTestsEnabled = process.env.EFFECT_INTEGRATION_TESTS === "1"
12// Set EFFECT_MSSQL_INTEGRATION_TESTS=0 to skip only the MSSQL integration tests.
13const mssqlIntegrationTestsDisabled = integrationTestsEnabled && process.env.EFFECT_MSSQL_INTEGRATION_TESTS === "0"
14const clusterTestsEnabled = process.env.EFFECT_CLUSTER_TESTS === "1"
15​
16const project = (
17 name: string,
18 directory: string,
19 include: boolean = true,
20 config: ViteUserConfig = {},
21 projectExclude?: ReadonlyArray<string>,
22 projectInclude?: ReadonlyArray<string>
23) => {
24 if (!include) {
25 return []
26 }
27​
28 const cfg = mergeConfig({
29 root: directory,
30 test: { name }
31 }, config)
32​
33 const merged = mergeConfig(shared, cfg)
34 if (projectExclude !== undefined) {
35 merged.test!.exclude = [...projectExclude]
36 }
37 if (projectInclude !== undefined) {
38 merged.test!.include = [...projectInclude]
39 }
40 return [merged]
42​
43export const exclude = [
44 "**/.*/**",
45 "**/node_modules/**",
46 "**/dist/**",
47 "**/benchmark/**",
48 "**/bundle/**",
49 "**/typetest/**",
50 "**/coverage/**",
51 "**/test/utils/**",
52 "**/test/cluster-integration/**",
53 ...(!integrationTestsEnabled ? ["**/*.integration.test.{ts,tsx}"] : []),
54 "**/*.d.ts",
55 "**/*.config.*",
56 "**/vitest.*"
58​
59const shared: ViteUserConfig = {
60 optimizeDeps: {
61 exclude: ["bun:sqlite"]
62 },
63 server: {
64 watch: {
65 ignored: exclude
66 }
67 },
68 resolve: {
69 tsconfigPaths: true
70 },
71 test: {
72 exclude,
73 passWithNoTests: true,
74 setupFiles: [path.join(import.meta.dirname, "vitest.setup.ts")],
75 sequence: {
76 concurrent: true
77 },
78 include: ["test/**/*.test.{ts,tsx}"],
79 coverage: {
80 provider: "v8",
81 reporter: ["html"],
82 reportsDirectory: "coverage",
83 exclude
84 }
85 }
87​
88export default defineConfig({
89 test: {
90 passWithNoTests: true,
91 // The shared cluster storage suite runs MSSQL alongside the other databases.
92 ...(mssqlIntegrationTestsDisabled ? { testNamePattern: /^(?!.*SqlMessageStorage > mssql > )/ } : {}),
93 projects: [
94 ...project("scripts", "scripts", true, {}, undefined, ["codemods/jsdoc.test.ts"]),
95 ...project(
96 "effect",
97 "packages/effect",
98 true,
99 {},
100 isBun
101 ? [
102 ...exclude,
103 // These tests assert Node-specific Web API or stack trace behavior.
104 "test/reactivity/Atom.test.ts",
105 "test/schema/Schema.test.ts",
106 "test/schema/SchemaGetter.test.ts",
107 "test/schema/toCodec.test.ts",
108 "test/schema/toDifferJsonPatch.test.ts",
109 "test/http/HttpEffect.test.ts",
110 "test/http/HttpServerRequest.test.ts"
111 ]
112 : undefined
113 ),
114 ...project("@effect/ai-anthropic", "packages/ai/anthropic"),
115 ...project("@effect/ai-cloudflare", "packages/ai/cloudflare"),
116 ...project("@effect/ai-openai", "packages/ai/openai"),
117 ...project("@effect/ai-typesafe", "packages/ai/typesafe"),
118 ...project("@effect/ai-openai-compat", "packages/ai/openai-compat"),
119 ...project("@effect/ai-openrouter", "packages/ai/openrouter"),
120 ...project("@effect/atom-react", "packages/atom/react", true, {
121 test: {
122 environment: "jsdom",
123 setupFiles: [path.join(import.meta.dirname, "packages/atom/react/vitest.setup.ts")]
124 }
125 }),
126 ...project("@effect/atom-solid", "packages/atom/solid", true, {
127 resolve: {
128 conditions: ["browser"]
129 },
130 test: {
131 environment: "jsdom",
132 setupFiles: [path.join(import.meta.dirname, "packages/atom/solid/vitest.setup.ts")]
133 }
134 }),
135 ...project("@effect/atom-vue", "packages/atom/vue", true, {
136 test: {
137 environment: "happy-dom"
138 }
139 }),
140 ...project("@effect/opentelemetry", "packages/opentelemetry"),
141 ...project("@effect/platform-browser", "packages/platform/browser", true, {
142 test: {
143 environment: "happy-dom",
144 // Bun interprets Node's --localstorage-file value as a module path.
145 execArgv: isBun
146 ? []
147 : [
148 "--localstorage-file",
149 path.resolve(os.tmpdir(), `vitest-${process.pid}.localstorage`)
150 ],
151 setupFiles: [path.join(import.meta.dirname, "packages/platform/browser/vitest.setup.ts")]
152 }
153 }),
154 ...project("@effect/platform-bun", "packages/platform/bun", isBun),
155 ...project("@effect/platform-deno", "packages/platform/deno", isDeno),
156 ...project("@effect/platform-node", "packages/platform/node", isNode),
157 ...project(
158 "cluster-integration",
159 "packages/platform/node",
160 isNode && clusterTestsEnabled,
161 {
162 test: {
163 globalSetup: [
164 path.join(import.meta.dirname, "packages/platform/node/test/cluster-integration/globalSetup.ts")
165 ],
166 include: ["test/cluster-integration/**/*.test.ts"],
167 retry: 0,
168 sequence: {
169 concurrent: false
170 },
171 testTimeout: 60_000
172 }
173 },
174 exclude.filter((path) => path !== "**/test/cluster-integration/**"),
175 [
176 "test/cluster-integration/**/*.test.ts"
177 ]
178 ),
179 ...project("@effect/platform-node-shared", "packages/platform/node-shared", isNode),
180 ...project("@effect/vitest", "packages/vitest"),
181 ...project("@effect/sql-clickhouse", "packages/sql/clickhouse"),
182 ...project("@effect/sql-d1", "packages/sql/d1", !isDeno),
183 ...project("@effect/sql-libsql", "packages/sql/libsql"),
184 ...project(
185 "@effect/sql-mssql",
186 "packages/sql/mssql",
187 true,
188 {},
189 mssqlIntegrationTestsDisabled ? [...exclude, "**/*.integration.test.{ts,tsx}"] : undefined
190 ),
191 // MySQL starts a fresh container per integration test suite, so avoid competing
192 // with the other container-backed projects on integration-test runners.
193 ...project(
194 "@effect/sql-mysql2",
195 "packages/sql/mysql2",
196 true,
197 integrationTestsEnabled
198 ? {
199 test: {
200 fileParallelism: false,
201 sequence: {
202 groupOrder: 1
203 }
204 }
205 }
206 : {}
207 ),
208 ...project("@effect/sql-pg", "packages/sql/pg"),
209 ...project("@effect/sql-pglite", "packages/sql/pglite"),
210 ...project("@effect/sql-sqlite-bun", "packages/sql/sqlite-bun"),
211 ...project(
212 "@effect/sql-sqlite-do",
213 "packages/sql/sqlite-do",
214 true,
215 {},
216 // Miniflare needs Node/Bun; keep the in-process client tests on Deno.
217 isDeno ? [...exclude, "test/Miniflare.test.ts"] : undefined
218 ),
219 ...project("@effect/sql-sqlite-node", "packages/sql/sqlite-node", isNode || isDeno),
220 ...project("@effect/sql-sqlite-react-native", "packages/sql/sqlite-react-native"),
221 ...project("@effect/sql-sqlite-wasm", "packages/sql/sqlite-wasm"),
222 ...project("@effect/ai-codegen", "packages/tools/ai-codegen", isNode),
223 ...project("@effect/api-diff", "packages/tools/api-diff"),
224 ...project("@effect/bundle", "packages/tools/bundle"),
225 ...project("@effect/doctest", "packages/tools/doctest"),
226 ...project("@effect/docgen", "packages/tools/docgen"),
227 ...project("@effect/jsdocs", "packages/tools/jsdocs"),
228 ...project("@effect/npm-promote", "packages/tools/npm-promote"),
229 ...project("@effect/openapi-generator", "packages/tools/openapi-generator"),
230 ...project("@effect/graphql-generator", "packages/tools/graphql-generator"),
231 ...project("@effect/utils", "packages/tools/utils", isNode),
232 ...project("@effect/oxc", "packages/tools/oxc")
233 ]
234 }
235})