From 73551f876ad2d3851eca5a6554fdc8cfb8b96087 Mon Sep 17 00:00:00 2001 From: Yannick Meine Date: Mon, 28 Apr 2025 18:03:17 +0200 Subject: [PATCH] fix(config): provide an unaltered/corrected import.meta object in vite.config.ts and imported files (#19730) --- packages/vite/src/node/config.ts | 12 ++--- .../vite/src/node/config/importMetaShim.ts | 53 +++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 packages/vite/src/node/config/importMetaShim.ts diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index bca15149ec57cd..c2d263fbf6366c 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -103,6 +103,7 @@ import { PartialEnvironment } from './baseEnvironment' import { createIdResolver } from './idResolver' import { runnerImport } from './ssr/runnerImport' import { getAdditionalAllowedHosts } from './server/middlewares/hostCheck' +import { ImportMetaShim } from './config/importMetaShim' const debug = createDebugger('vite:config', { depth: 10 }) const promisifiedRealpath = promisify(fs.realpath) @@ -1863,7 +1864,7 @@ async function bundleConfigFile( const dirnameVarName = '__vite_injected_original_dirname' const filenameVarName = '__vite_injected_original_filename' - const importMetaUrlVarName = '__vite_injected_original_import_meta_url' + const result = await build({ absWorkingDir: process.cwd(), entryPoints: [fileName], @@ -1880,9 +1881,7 @@ async function bundleConfigFile( define: { __dirname: dirnameVarName, __filename: filenameVarName, - 'import.meta.url': importMetaUrlVarName, - 'import.meta.dirname': dirnameVarName, - 'import.meta.filename': filenameVarName, + ...ImportMetaShim.getCodeReplacementDefinitions(), }, plugins: [ { @@ -1976,14 +1975,13 @@ async function bundleConfigFile( setup(build) { build.onLoad({ filter: /\.[cm]?[jt]s$/ }, async (args) => { const contents = await fsp.readFile(args.path, 'utf-8') + const importMeta = new ImportMetaShim(args.path) const injectValues = `const ${dirnameVarName} = ${JSON.stringify( path.dirname(args.path), )};` + `const ${filenameVarName} = ${JSON.stringify(args.path)};` + - `const ${importMetaUrlVarName} = ${JSON.stringify( - pathToFileURL(args.path).href, - )};` + importMeta.getCode() return { loader: args.path.endsWith('ts') ? 'ts' : 'js', diff --git a/packages/vite/src/node/config/importMetaShim.ts b/packages/vite/src/node/config/importMetaShim.ts new file mode 100644 index 00000000000000..3ddad57a9fa7cc --- /dev/null +++ b/packages/vite/src/node/config/importMetaShim.ts @@ -0,0 +1,53 @@ +import path from 'node:path' +import { pathToFileURL } from 'node:url' + +class VariableFactory { + static readonly guid = '5aa6825e_dad8_4150_85cf_cc17535c2a89' + make(name: string) { + return `${name}_${VariableFactory.guid}` + } +} +const variableFactory = new VariableFactory() + +const VAR_IMPORT_META = variableFactory.make('importMeta') + +export class ImportMetaShim { + static getCodeReplacementDefinitions(): Record { + return { + 'import.meta': VAR_IMPORT_META, + } + } + + constructor(readonly filePath: string) {} + + getCode(): string { + const dirname = JSON.stringify(path.dirname(this.filePath)) + const filePath = JSON.stringify(this.filePath) + const fileBasename = JSON.stringify(path.basename(this.filePath)) + const fileUrl = JSON.stringify(pathToFileURL(this.filePath).href) + + const varProcess = variableFactory.make('process') + const varModule = variableFactory.make('module') + const varRequire = variableFactory.make('require') + + return ` + import * as ${varProcess} from 'node:process' + import * as ${varModule} from 'node:module' + const ${varRequire} = ${varModule}.createRequire(${filePath}) + + const ${VAR_IMPORT_META} = { + dir: ${dirname}, + dirname: ${dirname}, + filename: ${filePath}, + path: ${filePath}, + file: ${fileBasename}, + url: ${fileUrl}, + get env() { return ${varProcess}.env }, + resolve(...args) { return ${varRequire}.resolve(...args) }, + resolveSync(...args) { return ${varRequire}.resolveSync(...args) }, + require(...args) { return ${varRequire}(...args) }, + main: false, + } + ` + } +}