diff --git a/src/core/index.ts b/src/core/index.ts index 05a7487..b606d79 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -38,7 +38,7 @@ type Macro = CallMacro | IdentifierMacro export async function transformMacros( code: string, id: string, - runner: ViteNodeRunner, + getRunner: () => Promise, deps: Map> ) { const program = babelParse(code, getLang(id), { @@ -120,6 +120,8 @@ export async function transformMacros( return } + const runner = await getRunner() + deps.set(id, new Set()) for (const macro of macros) { const { diff --git a/src/index.ts b/src/index.ts index f5c7332..6a6e88f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ export default createUnplugin((rawOptions = {}) => { const deps: Map> = new Map() + let initPromise: Promise | undefined async function initServer() { server = await createServer({ ...options.viteConfig, @@ -29,7 +30,6 @@ export default createUnplugin((rawOptions = {}) => { }) await server.pluginContainer.buildStart({}) } - function initRunner() { // create vite-node server node = new ViteNodeServer(server) @@ -54,19 +54,26 @@ export default createUnplugin((rawOptions = {}) => { }, }) } + function init() { + if (initPromise) return initPromise + return (initPromise = (async () => { + server || (await initServer()) + initRunner() + })()) + } + + async function getRunner() { + await init() + return runner + } const name = 'unplugin-macros' return { name, enforce: options.enforce, - async buildStart() { - server || (await initServer()) - initRunner() - }, - buildEnd() { - if (builtInServer) + if (builtInServer && server) // close the built-in vite server return server.close() }, @@ -76,7 +83,7 @@ export default createUnplugin((rawOptions = {}) => { }, transform(code, id) { - return transformMacros(code, id, runner, deps) + return transformMacros(code, id, getRunner, deps) }, vite: {