import type { LabelColor } from 'vitest' import type { Pool } from 'vitest/node' import { basename, dirname, join, resolve } from 'pathe' import { defaultExclude, defineConfig } from 'vitest/config' import { rolldownVersion } from 'vitest/node' export default defineConfig({ // tests should not fail when base is set base: '/some-url/', plugins: [ { name: 'example', resolveId(source) { if ( source === 'virtual-module' || source === 'virtual-module-direct' || source === 'virtual-module-indirect' ) { return source } }, load(id) { if (id === 'virtual-module') { return ` export const value = 'original'; ` } if (id === 'virtual-module-direct') { return ` export const value = 'original-direct'; ` } if (id === 'virtual-module-indirect') { return ` export const value = 'original-indirect'; ` } }, }, // Use babel plugin since Oxc (Vite 8) doesn't support ecma decorators out of the box // https://github.com/oxc-project/oxc/issues/9170#issuecomment-4072166491 !!rolldownVersion && (import('@rolldown/plugin-babel').then(({ default: babel }) => babel({ presets: [ { preset: () => ({ plugins: [['@babel/plugin-proposal-decorators', { version: '2023-11' }]], }), rolldown: { filter: { id: ['**/esnext-decorator.test.ts'], }, }, }, ], }), ) as any), ], define: { process: {}, global: {}, 'import.meta.env.TEST_NAME': '"hello world"', 'process.env.HELLO_PROCESS': '"hello process"', // can reassign __DEFINE__: '"defined"', __JSON__: JSON.stringify({ hello: 'world' }), // edge cases // evaluated once when the worker starts __MODE__: 'process.env.MODE', 'SOME.VARIABLE': '"variable"', 'SOME.SOME.VARIABLE': '"nested variable"', __UNDEFINED__: undefined, __NULL__: null, __ZERO__: 0, __FALSE__: false, 'import.meta.vitest': false, }, resolve: { alias: [ { find: /^#/, replacement: resolve(import.meta.dirname, 'src') }, { find: /^custom-lib$/, replacement: resolve(import.meta.dirname, 'projects', 'custom-lib') }, { find: /^inline-lib$/, replacement: resolve(import.meta.dirname, 'projects', 'inline-lib') }, ], noExternal: [/projects\/vite-external/], }, environments: { ssr: { resolve: { noExternal: [/projects\/vite-environment-external/], }, }, }, server: { port: 3022, }, test: { api: { port: 3023, allowExec: false, allowWrite: false, }, name: 'core', includeSource: ['src/in-source/*.ts'], exclude: ['**/fixtures/**', ...defaultExclude], slowTestThreshold: 1000, testTimeout: process.env.CI ? 10_000 : 5_000, setupFiles: ['./test/setup.ts'], server: { deps: { external: [ 'tinyspy', /src\/external/, /esm\/esm/, /packages\/web-worker/, /\.wasm$/, /\/wasm-bindgen-no-cyclic\/index_bg.js/, /dep-esm-non-existing/, ], inline: ['inline-lib'], }, }, includeTaskLocation: true, reporters: [ ...(process.env.GITHUB_ACTIONS ? [['minimal'], ['github-actions', { displayAnnotations: false }] as any] : [['default', { summary: true }], ['hanging-process']]), ...(process.env.VITEST_CI_BLOB_LABEL ? [['blob', { label: process.env.VITEST_CI_BLOB_LABEL }]] : []), process.env.VITEST_CI_MERGE_REPORTS ? ['html', { singleFile: true }] : {}, ], testNamePattern: '^((?!does not include test that).)*$', coverage: { provider: 'istanbul', reporter: ['text', 'html'], }, typecheck: { enabled: true, tsconfig: './tsconfig.typecheck.json', }, environmentOptions: { custom: { option: 'config-option', }, }, execArgv: ['--experimental-wasm-modules'], env: { CUSTOM_ENV: 'foo', }, resolveSnapshotPath: (path, extension) => { if (path.includes('moved-snapshot')) { return path + extension } return join(dirname(path), '__snapshots__', `${basename(path)}${extension}`) }, sequence: { seed: 101, }, allowOnly: true, deps: { moduleDirectories: ['node_modules', 'projects', 'packages'], }, alias: [ { find: 'test-alias', replacement: resolve(import.meta.dirname, 'src', 'aliased-mod.ts'), }, ], onConsoleLog(log) { if (log.includes('Failed to load url') && log.includes('web-worker')) { return false } if (log.includes('Importing WebAssembly ')) { return false } if (log.includes('run [...filters]')) { return false } if (log.includes('Cannot find module') && log.includes('/web-worker/some-invalid-path')) { return false } if (log.includes('Cannot find module') && log.includes('/web-worker/workerInvalid-path.ts')) { return false } if ( log.startsWith(`[vitest]`) && log.includes(`did not use 'function' or 'class' in its implementation`) ) { return false } if (log.startsWith('Importing from') && log.includes('is deprecated since Vitest 4.1')) { return false } }, projects: [project('threads', 'red'), project('forks', 'green'), project('vmThreads', 'blue')], }, }) function project(pool: Pool, color: LabelColor) { return { extends: './vite.config.ts', test: { name: { label: pool, color }, pool, }, } }