From 5deb2463613bc587843cac2e9f8587ee3de14a40 Mon Sep 17 00:00:00 2001 From: Antoine Rey Date: Sun, 29 May 2022 10:25:00 +0200 Subject: [PATCH] feat(vite-node): options via CLI (fixes #1208) (#1215) --- packages/vite-node/README.md | 10 ++++++++ packages/vite-node/src/cli.ts | 48 ++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/packages/vite-node/README.md b/packages/vite-node/README.md index 675044253369..9f24d4833232 100644 --- a/packages/vite-node/README.md +++ b/packages/vite-node/README.md @@ -27,6 +27,16 @@ Options: npx vite-node -h ``` +### Options via CLI + +[All `ViteNodeServer` options](https://github.com/vitest-dev/vitest/blob/main/packages/vite-node/src/types.ts#L61-L78) are supported by the CLI. They may be defined through the dot syntax, as shown below: + +```bash +npx vite-node --options.deps.inline="module-name" --options.deps.external="/module-regexp/" index.ts +``` + +Note that for options supporting RegExps, strings passed to the CLI must start _and_ end with a `/`; + ## Programmatic Usage In Vite Node, the server and runner (client) are separated, so you can integrate them in different contexts (workers, cross-process, or remote) if needed. The demo below shows a simple example of having both (server and runner) running in the same context diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index 210c8b3d6e00..37dfff78123a 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -4,6 +4,7 @@ import { createServer } from 'vite' import { version } from '../package.json' import { ViteNodeServer } from './server' import { ViteNodeRunner } from './client' +import type { ViteNodeServerOptions } from './types' const cli = cac('vite-node') @@ -12,6 +13,7 @@ cli .option('-r, --root ', 'Use specified root directory') .option('-c, --config ', 'Use specified config file') .option('-w, --watch', 'Restart on file changes, similar to "nodemon"') + .option('--options ', 'Use specified Vite server options') .help() cli @@ -24,6 +26,7 @@ export interface CliOptions { root?: string config?: string watch?: boolean + options?: ViteNodeServerOptionsCLI '--'?: string[] } @@ -37,6 +40,10 @@ async function run(files: string[], options: CliOptions = {}) { // forward argv process.argv = [...process.argv.slice(0, 2), ...(options['--'] || [])] + const parsedServerOptions = options.options + ? parseServerOptions(options.options) + : undefined + const server = await createServer({ logLevel: 'error', configFile: options.config, @@ -44,7 +51,7 @@ async function run(files: string[], options: CliOptions = {}) { }) await server.pluginContainer.buildStart({}) - const node = new ViteNodeServer(server) + const node = new ViteNodeServer(server, parsedServerOptions) const runner = new ViteNodeRunner({ root: server.config.root, @@ -81,3 +88,42 @@ async function run(files: string[], options: CliOptions = {}) { await runner.executeFile(file) }) } + +function parseServerOptions(serverOptions: ViteNodeServerOptionsCLI): ViteNodeServerOptions { + return { + ...serverOptions, + deps: { + ...serverOptions.deps, + inline: serverOptions.deps?.inline?.map((dep) => { + return dep.startsWith('/') && dep.endsWith('/') + ? new RegExp(dep) + : dep + }), + external: serverOptions.deps?.external?.map((dep) => { + return dep.startsWith('/') && dep.endsWith('/') + ? new RegExp(dep) + : dep + }), + }, + + transformMode: { + ...serverOptions.transformMode, + + ssr: serverOptions.transformMode?.ssr?.map(dep => new RegExp(dep)), + web: serverOptions.transformMode?.ssr?.map(dep => new RegExp(dep)), + }, + } +} + +type Optional = T | undefined +type ComputeViteNodeServerOptionsCLI> = { + [K in keyof T]: T[K] extends Optional + ? string[] + : T[K] extends Optional<(string | RegExp)[]> + ? string[] + : T[K] extends Optional> + ? ComputeViteNodeServerOptionsCLI + : T[K] +} + +export type ViteNodeServerOptionsCLI = ComputeViteNodeServerOptionsCLI