diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index 05da28f7673a..47c47bddf7ff 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -5,6 +5,7 @@ import { version } from '../package.json' import { ViteNodeServer } from './server' import { ViteNodeRunner } from './client' import type { ViteNodeServerOptions } from './types' +import { toArray } from './utils' const cli = cac('vite-node') @@ -93,12 +94,12 @@ function parseServerOptions(serverOptions: ViteNodeServerOptionsCLI): ViteNodeSe ...serverOptions, deps: { ...serverOptions.deps, - inline: serverOptions.deps?.inline?.map((dep) => { + inline: toArray(serverOptions.deps?.inline).map((dep) => { return dep.startsWith('/') && dep.endsWith('/') ? new RegExp(dep) : dep }), - external: serverOptions.deps?.external?.map((dep) => { + external: toArray(serverOptions.deps?.external).map((dep) => { return dep.startsWith('/') && dep.endsWith('/') ? new RegExp(dep) : dep @@ -108,8 +109,8 @@ function parseServerOptions(serverOptions: ViteNodeServerOptionsCLI): ViteNodeSe transformMode: { ...serverOptions.transformMode, - ssr: serverOptions.transformMode?.ssr?.map(dep => new RegExp(dep)), - web: serverOptions.transformMode?.ssr?.map(dep => new RegExp(dep)), + ssr: toArray(serverOptions.transformMode?.ssr).map(dep => new RegExp(dep)), + web: toArray(serverOptions.transformMode?.web).map(dep => new RegExp(dep)), }, } } @@ -117,9 +118,9 @@ function parseServerOptions(serverOptions: ViteNodeServerOptionsCLI): ViteNodeSe type Optional = T | undefined type ComputeViteNodeServerOptionsCLI> = { [K in keyof T]: T[K] extends Optional - ? string[] + ? string | string[] : T[K] extends Optional<(string | RegExp)[]> - ? string[] + ? string | string[] : T[K] extends Optional> ? ComputeViteNodeServerOptionsCLI : T[K] diff --git a/packages/vite-node/src/types.ts b/packages/vite-node/src/types.ts index 06666b4c2cb6..0a4defce4fe5 100644 --- a/packages/vite-node/src/types.ts +++ b/packages/vite-node/src/types.ts @@ -1,5 +1,8 @@ import type { ModuleCacheMap } from './client' +export type Nullable = T | null | undefined +export type Arrayable = T | Array + export interface DepsHandlingOptions { external?: (string | RegExp)[] inline?: (string | RegExp)[] diff --git a/packages/vite-node/src/utils.ts b/packages/vite-node/src/utils.ts index 54fbcc696121..2157a594e3d9 100644 --- a/packages/vite-node/src/utils.ts +++ b/packages/vite-node/src/utils.ts @@ -1,6 +1,7 @@ import { fileURLToPath, pathToFileURL } from 'url' import { dirname, resolve } from 'pathe' import type { TransformResult } from 'vite' +import type { Arrayable, Nullable } from './types' export const isWindows = process.platform === 'win32' @@ -74,3 +75,18 @@ export async function withInlineSourcemap(result: TransformResult) { return result } + +/** + * Convert `Arrayable` to `Array` + * + * @category Array + */ +export function toArray(array?: Nullable>): Array { + if (array === null || array === undefined) + array = [] + + if (Array.isArray(array)) + return array + + return [array] +}