Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: introduce server option #3725

Merged
merged 18 commits into from Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 4 additions & 2 deletions examples/vue-jsx/vite.config.ts
Expand Up @@ -7,8 +7,10 @@ export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
transformMode: {
web: [/.[tj]sx$/],
server: {
transformMode: {
web: [/.[tj]sx$/],
},
},
},
})
22 changes: 13 additions & 9 deletions packages/vitest/src/node/config.ts
Expand Up @@ -123,24 +123,26 @@ export function resolveConfig(
if (resolved.coverage.provider === 'v8' && resolved.coverage.enabled && isBrowserEnabled(resolved))
throw new Error('@vitest/coverage-v8 does not work with --browser. Use @vitest/coverage-istanbul instead')

resolved.deps = resolved.deps || {}
resolved.server ??= {}
resolved.server.deps ??= {}

// vitenode will try to import such file with native node,
// but then our mocker will not work properly
if (resolved.deps.inline !== true) {
if (resolved.server.deps.inline !== true) {
// eslint-disable-next-line @typescript-eslint/prefer-ts-expect-error
// @ts-ignore ssr is not typed in Vite 2, but defined in Vite 3, so we can't use expect-error
const ssrOptions = viteConfig.ssr

if (ssrOptions?.noExternal === true && resolved.deps.inline == null) {
resolved.deps.inline = true
if (ssrOptions?.noExternal === true && resolved.server.deps.inline == null) {
resolved.server.deps.inline = true
}
else {
resolved.deps.inline ??= []
resolved.deps.inline.push(...extraInlineDeps)
resolved.server.deps.inline ??= []
resolved.server.deps.inline.push(...extraInlineDeps)
}
}
resolved.deps.moduleDirectories ??= ['/node_modules/']
resolved.deps.moduleDirectories = resolved.deps.moduleDirectories.map((dir) => {

resolved.server.deps.moduleDirectories ??= ['/node_modules/']
resolved.server.deps.moduleDirectories = resolved.server.deps.moduleDirectories.map((dir) => {
if (!dir.startsWith('/'))
dir = `/${dir}`
if (!dir.endsWith('/'))
Expand All @@ -153,6 +155,8 @@ export function resolveConfig(
?? resolve(resolved.root, resolved.runner)
}

resolved.deps ??= {}

// disable loader for Yarn PnP until Node implements chain loader
// https://github.com/nodejs/node/pull/43772
resolved.deps.registerNodeLoader ??= false
Expand Down
2 changes: 1 addition & 1 deletion packages/vitest/src/node/core.ts
Expand Up @@ -89,7 +89,7 @@ export class Vitest {
if (this.config.watch && this.mode !== 'typecheck')
this.registerWatcher()

this.vitenode = new ViteNodeServer(server, this.config)
this.vitenode = new ViteNodeServer(server, this.config.server)
const node = this.vitenode
this.runner = new ViteNodeRunner({
root: server.config.root,
Expand Down
17 changes: 17 additions & 0 deletions packages/vitest/src/types/config.ts
Expand Up @@ -2,6 +2,7 @@ import type { AliasOptions, CommonServerOptions, DepOptimizationConfig } from 'v
import type { PrettyFormatOptions } from 'pretty-format'
import type { FakeTimerInstallOpts } from '@sinonjs/fake-timers'
import type { SequenceHooks, SequenceSetupFiles } from '@vitest/runner'
import type { ViteNodeServerOptions } from 'vite-node'
import type { BuiltinReporters } from '../node/reporters'
import type { TestSequencerConstructor } from '../node/sequencers/types'
import type { ChaiConfig } from '../integrations/chai'
Expand Down Expand Up @@ -94,6 +95,8 @@ interface DepsOptions {
* And does not support HMR on reload.
*
* Typically, packages under `node_modules` are externalized.
*
* @deprecated Use `server.deps.external` instead
sheremet-va marked this conversation as resolved.
Show resolved Hide resolved
*/
external?: (string | RegExp)[]
/**
Expand All @@ -102,6 +105,8 @@ interface DepsOptions {
* This could be helpful to handle packages that ship `.js` in ESM format (that Node can't handle).
*
* If `true`, every dependency will be inlined
*
* @deprecated Use `server.deps.inline` instead
*/
inline?: (string | RegExp)[] | true

Expand All @@ -118,6 +123,8 @@ interface DepsOptions {
* cause some misalignment if a package have different logic in ESM and CJS mode.
*
* @default false
*
* @deprecated Use `server.deps.fallbackCJS` instead
*/
fallbackCJS?: boolean

Expand All @@ -131,6 +138,8 @@ interface DepsOptions {
* A list of directories relative to the config file that should be treated as module directories.
*
* @default ['node_modules']
*
* @deprecated Use `server.deps.moduleDirectories` instead
*/
moduleDirectories?: string[]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moduleDiretories is not strictly server option, it's also reused in mocking. Maybe we can even move it our if deps into a root config, and duplicate in server if needed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated. It will duplicate deps.moduleDiretories in server.

}
Expand Down Expand Up @@ -170,9 +179,15 @@ export interface InlineConfig {

/**
* Handling for dependencies inlining or externalizing
*
*/
deps?: DepsOptions

/**
* Vite-node server options
*/
server?: ViteNodeServerOptions

/**
* Base directory to scan for the test files
*
Expand Down Expand Up @@ -450,6 +465,8 @@ export interface InlineConfig {

/**
* Determine the transform method of modules
*
* @deprecated Use `server.transformMode` instead
*/
transformMode?: {
/**
Expand Down
10 changes: 6 additions & 4 deletions test/core/vitest.config.ts
Expand Up @@ -65,10 +65,12 @@ export default defineConfig({
sequence: {
seed: 101,
},
deps: {
external: ['tinyspy', /src\/external/],
inline: ['inline-lib'],
moduleDirectories: ['node_modules', 'projects', 'packages'],
server: {
deps: {
external: ['tinyspy', /src\/external/],
inline: ['inline-lib'],
moduleDirectories: ['node_modules', 'projects', 'packages'],
},
},
alias: [
{
Expand Down
14 changes: 8 additions & 6 deletions test/resolve/vitest.config.ts
Expand Up @@ -2,12 +2,14 @@ import { defineConfig } from 'vite'

export default defineConfig({
test: {
transformMode: {
web: [/web\.test\.ts/],
ssr: [/ssr\.test\.ts/],
},
deps: {
external: [/pkg-/],
server: {
transformMode: {
web: [/web\.test\.ts/],
ssr: [/ssr\.test\.ts/],
},
deps: {
external: [/pkg-/],
},
},
},
})