Home / Function/ buildTimeImportMetaUrlPlugin() — vite Function Reference

buildTimeImportMetaUrlPlugin() — vite Function Reference

Architecture documentation for the buildTimeImportMetaUrlPlugin() function in rolldown.config.ts from the vite codebase.

Entity Profile

Dependency Diagram

graph TD
  155ba343_789d_d2df_e14f_933b0ec9e2f5["buildTimeImportMetaUrlPlugin()"]
  095867e3_0044_bba5_61f7_c60c3c9e56ce["rolldown.config.ts"]
  155ba343_789d_d2df_e14f_933b0ec9e2f5 -->|defined in| 095867e3_0044_bba5_61f7_c60c3c9e56ce
  style 155ba343_789d_d2df_e14f_933b0ec9e2f5 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/vite/rolldown.config.ts lines 293–370

function buildTimeImportMetaUrlPlugin(): Plugin {
  const idMap: Record<string, number> = {}
  let lastIndex = 0

  const prefix = `__vite_buildTimeImportMetaUrl_`
  const keepCommentRE = /\/\*\*\s*[#@]__KEEP__\s*\*\/\s*$/

  return {
    name: 'import-meta-current-dirname',
    transform: {
      filter: {
        code: 'import.meta.url',
      },
      async handler(code, id) {
        const relativeId = path.relative(dirname, id).replaceAll('\\', '/')
        // only replace import.meta.url in src/
        if (!relativeId.startsWith('src/')) return

        let index: number
        if (idMap[id]) {
          index = idMap[id]
        } else {
          index = idMap[id] = lastIndex
          lastIndex++
        }

        await init

        const s = new MagicString(code)
        const [imports] = parse(code)
        for (const { t, ss, se } of imports) {
          if (t === 3 && code.slice(se, se + 4) === '.url') {
            // ignore import.meta.url with /** #__KEEP__ */ comment
            if (keepCommentRE.test(code.slice(0, ss))) {
              keepCommentRE.lastIndex = 0
              continue
            }

            // import.meta.url
            s.overwrite(ss, se + 4, `${prefix}${index}`)
          }
        }
        return s.hasChanged() ? s.toString() : undefined
      },
    },
    renderChunk(code, chunk, outputOptions) {
      if (!code.includes(prefix)) return

      return code.replace(
        /__vite_buildTimeImportMetaUrl_(\d+)/g,
        (_, index) => {
          const originalFile = Object.keys(idMap).find(
            (key) => idMap[key] === +index,
          )
          if (!originalFile) {
            throw new Error(
              `Could not find original file for ${prefix}${index} in ${chunk.fileName}`,
            )
          }
          const outputFile = path.resolve(outputOptions.dir!, chunk.fileName)
          const relativePath = path
            .relative(path.dirname(outputFile), originalFile)
            .replaceAll('\\', '/')

          if (outputOptions.format === 'es') {
            return `new URL(${JSON.stringify(relativePath)}, import.meta.url)`
          } else if (outputOptions.format === 'cjs') {
            return `new URL(${JSON.stringify(
              relativePath,
            )}, require('node:url').pathToFileURL(__filename))`
          } else {
            throw new Error(`Unsupported output format ${outputOptions.format}`)
          }
        },
      )
    },
  }
}

Domain

Subdomains

Frequently Asked Questions

What does buildTimeImportMetaUrlPlugin() do?
buildTimeImportMetaUrlPlugin() is a function in the vite codebase, defined in packages/vite/rolldown.config.ts.
Where is buildTimeImportMetaUrlPlugin() defined?
buildTimeImportMetaUrlPlugin() is defined in packages/vite/rolldown.config.ts at line 293.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free