{"id":"d777f9b4c2f3d5ce","repo":"vitejs/vite","slug":"module-runner-import-meta-resolve-is-not-suppo","errorCode":null,"errorMessage":"[module runner] \"import.meta.resolve\" is not supported.","messagePattern":"\\[module runner\\] \"import\\.meta\\.resolve\" is not supported\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vite/src/module-runner/createImportMeta.ts","lineNumber":26,"sourceCode":"    throw new Error(\n      `[module runner] Dynamic access of \"import.meta.env\" is not supported. Please, use \"import.meta.env.${String(p)}\" instead.`,\n    )\n  },\n})\n\nexport function createDefaultImportMeta(\n  modulePath: string,\n): ModuleRunnerImportMeta {\n  const href = posixPathToFileHref(modulePath)\n  const filename = modulePath\n  const dirname = posixDirname(modulePath)\n  return {\n    filename: isWindows ? toWindowsPath(filename) : filename,\n    dirname: isWindows ? toWindowsPath(dirname) : dirname,\n    url: href,\n    env: envProxy,\n    resolve(_id: string, _parent?: string) {\n      throw new Error('[module runner] \"import.meta.resolve\" is not supported.')\n    },\n    // should be replaced during transformation\n    glob() {\n      throw new Error(\n        `[module runner] \"import.meta.glob\" is statically replaced during ` +\n          `file transformation. Make sure to reference it by the full name.`,\n      )\n    },\n  }\n}\n\n/**\n * Create import.meta object for Node.js.\n */\nexport function createNodeImportMeta(\n  modulePath: string,\n): ModuleRunnerImportMeta {\n  const defaultMeta = createDefaultImportMeta(modulePath)","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/vitejs/vite/blob/89620f09afcfef6b35e7bb8660132ab5b4d0cd3b/packages/vite/src/module-runner/createImportMeta.ts#L8-L44","documentation":"Thrown by the default import.meta.resolve() implementation in the module runner. createDefaultImportMeta provides a resolve function that always throws because import.meta.resolve requires module resolution infrastructure that the default module runner doesn't have. Only createNodeImportMeta (used when the runner has Node.js access) provides a functional resolve via createImportMetaResolver.","triggerScenarios":"Code running in a module runner instance that uses the default import meta (not the Node variant) calls import.meta.resolve('./some-module'). This happens when the ModuleRunner is constructed without a custom createImportMeta option that returns a Node-capable meta, or when running in a non-Node environment (e.g., a custom runtime, worker, or sandboxed SSR).","commonSituations":"Using Vite's module runner in a non-standard environment (e.g., workerd, Deno, or a sandboxed eval context) where Node's require.resolve isn't available. SSR code that calls import.meta.resolve to find a file path at runtime. Libraries that use import.meta.resolve for asset resolution.","solutions":["If running in Node.js, ensure the module runner uses createNodeImportMeta by passing it as the createImportMeta option: new ModuleRunner({ ..., createImportMeta: createNodeImportMeta }).","Avoid calling import.meta.resolve in code that runs in the module runner; pre-resolve paths at build time instead.","If you need resolve functionality in a custom environment, provide a custom createImportMeta function that implements resolve with your runtime's resolution mechanism."],"exampleFix":"// before — default import meta doesn't support resolve\nimport { ModuleRunner } from 'vite/module-runner'\nconst runner = new ModuleRunner({ transport, /* no createImportMeta */ })\n// after — use Node import meta which supports resolve\nimport { ModuleRunner } from 'vite/module-runner'\nimport { createNodeImportMeta } from 'vite/module-runner'\nconst runner = new ModuleRunner({\n  transport,\n  createImportMeta: createNodeImportMeta\n})","handlingStrategy":"validation","validationCode":"// Check if the runner environment supports resolve before calling\nfunction runnerSupportsResolve(runner) {\n  // createNodeImportMeta provides a working resolve; default does not\n  return runner.options.createImportMeta?.name === 'createNodeImportMeta'\n}\n\n// Or check at setup time\nimport { isBuiltin } from 'util'\nconst canResolve = typeof process !== 'undefined' && !!process.versions.node","typeGuard":"function hasResolveSupport(meta: ModuleRunnerImportMeta): boolean {\n  try {\n    // can't call it without throwing — check environment instead\n    return typeof process !== 'undefined'\n  } catch {\n    return false\n  }\n}","tryCatchPattern":"// Wrap import.meta.resolve calls in user code\nfunction safeResolve(id, parent) {\n  try {\n    return import.meta.resolve(id, parent)\n  } catch (e) {\n    if (e.message.includes('import.meta.resolve')) {\n      // fallback: manual resolution\n      return null\n    }\n    throw e\n  }\n}","preventionTips":["Pass createNodeImportMeta to ModuleRunner when running in Node.js environments.","Avoid import.meta.resolve in SSR code; pre-resolve paths at build time.","Provide a custom createImportMeta implementation for non-Node runtimes that need resolve."],"tags":["module-runner","import-meta-resolve","ssr","node-environment"],"analyzedSha":"89620f09afcfef6b35e7bb8660132ab5b4d0cd3b","analyzedAt":"2026-08-03T19:28:02.920Z","schemaVersion":2}