66 type NormalizedModuleRunnerTransport ,
77 normalizeModuleRunnerTransport ,
88} from '../shared/moduleRunnerTransport'
9+ import { createIsBuiltin } from '../shared/builtin'
910import type { EvaluatedModuleNode } from './evaluatedModules'
1011import { EvaluatedModules } from './evaluatedModules'
1112import type {
@@ -44,6 +45,8 @@ export class ModuleRunner {
4445 string ,
4546 Promise < EvaluatedModuleNode >
4647 > ( )
48+ private isBuiltin ?: ( id : string ) => boolean
49+ private builtinsPromise ?: Promise < void >
4750
4851 private closed = false
4952
@@ -238,6 +241,23 @@ export class ModuleRunner {
238241 return cached
239242 }
240243
244+ private ensureBuiltins ( ) : Promise < void > | undefined {
245+ if ( this . isBuiltin ) return
246+
247+ this . builtinsPromise ??= ( async ( ) => {
248+ try {
249+ this . debug ?.( '[module runner] fetching builtins from server' )
250+ const builtins = await this . transport . invoke ( 'getBuiltins' , [ ] )
251+ this . isBuiltin = createIsBuiltin ( builtins )
252+ this . debug ?.( '[module runner] builtins loaded:' , builtins )
253+ } finally {
254+ this . builtinsPromise = undefined
255+ }
256+ } ) ( )
257+
258+ return this . builtinsPromise
259+ }
260+
241261 private async getModuleInformation (
242262 url : string ,
243263 importer : string | undefined ,
@@ -247,13 +267,15 @@ export class ModuleRunner {
247267 throw new Error ( `Vite module runner has been closed.` )
248268 }
249269
270+ await this . ensureBuiltins ( )
271+
250272 this . debug ?.( '[module runner] fetching' , url )
251273
252274 const isCached = ! ! ( typeof cachedModule === 'object' && cachedModule . meta )
253275
254276 const fetchedModule = // fast return for established externalized pattern
255277 (
256- url . startsWith ( 'data:' )
278+ url . startsWith ( 'data:' ) || this . isBuiltin ?. ( url )
257279 ? { externalize : url , type : 'builtin' }
258280 : await this . transport . invoke ( 'fetchModule' , [
259281 url ,
0 commit comments