Skip to content

Commit

Permalink
Feat: Compute CLI types dynamically
Browse files Browse the repository at this point in the history
  • Loading branch information
antoinerey committed May 16, 2022
1 parent f1e8323 commit 444c806
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 21 deletions.
52 changes: 31 additions & 21 deletions packages/vite-node/src/cli.ts
Expand Up @@ -4,7 +4,7 @@ import { createServer } from 'vite'
import { version } from '../package.json'
import { ViteNodeServer } from './server'
import { ViteNodeRunner } from './client'
import type { ViteNodeServerOptions } from './types'
import type { ViteNodeServerOptions, ViteNodeServerOptionsCLI } from './types'

const cli = cac('vite-node')

Expand All @@ -28,7 +28,7 @@ export interface CliOptions {
root?: string
config?: string
watch?: boolean
serverOptions?: ViteNodeServerOptions
serverOptions?: ViteNodeServerOptionsCLI
'--'?: string[]
}

Expand All @@ -42,8 +42,9 @@ async function run(files: string[], options: CliOptions = {}) {
// forward argv
process.argv = [...process.argv.slice(0, 2), ...(options['--'] || [])]

if (options.serverOptions)
parseServerOptions(options.serverOptions)
const parsedServerOptions = options.serverOptions
? parseServerOptions(options.serverOptions)
: undefined

const server = await createServer({
logLevel: 'error',
Expand All @@ -52,7 +53,7 @@ async function run(files: string[], options: CliOptions = {}) {
})
await server.pluginContainer.buildStart({})

const node = new ViteNodeServer(server, options.serverOptions)
const node = new ViteNodeServer(server, parsedServerOptions)

const runner = new ViteNodeRunner({
root: server.config.root,
Expand Down Expand Up @@ -90,22 +91,31 @@ async function run(files: string[], options: CliOptions = {}) {
})
}

function parseServerOptions(serverOptions: ViteNodeServerOptions) {
if (serverOptions.deps && serverOptions.deps.inline) {
serverOptions.deps.inline = serverOptions.deps.inline.map((dep) => {
return typeof dep === 'string' && dep.startsWith('/') && dep.endsWith('/')
? new RegExp(dep)
: dep
})
}
function parseServerOptions(serverOptions: ViteNodeServerOptionsCLI): ViteNodeServerOptions {
return {
...serverOptions,

if (serverOptions.deps && serverOptions.deps.external) {
serverOptions.deps.external = serverOptions.deps.external.map((dep) => {
return typeof dep === 'string' && dep.startsWith('/') && dep.endsWith('/')
? new RegExp(dep)
: dep
})
}
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,

// TODO: Handle serverOptions.transformMode.
ssr: serverOptions.transformMode?.ssr?.map(dep => new RegExp(dep)),
web: serverOptions.transformMode?.ssr?.map(dep => new RegExp(dep)),
},
}
}
13 changes: 13 additions & 0 deletions packages/vite-node/src/types.ts
Expand Up @@ -77,4 +77,17 @@ export interface ViteNodeServerOptions {
}
}

type Optional<T> = T | undefined
type ComputeViteNodeServerOptionsCLI<T extends Record<string, any>> = {
[K in keyof T]: T[K] extends Optional<RegExp[]>
? string[]
: T[K] extends Optional<(string | RegExp)[]>
? string[]
: T[K] extends Optional<Record<string, any>>
? ComputeViteNodeServerOptionsCLI<T[K]>
: T[K]
}

export type ViteNodeServerOptionsCLI = ComputeViteNodeServerOptionsCLI<ViteNodeServerOptions>

export type { ModuleCacheMap }

0 comments on commit 444c806

Please sign in to comment.