From 5a83ec62c4db52b11c88a18baa5c16bca3f71b4f Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Fri, 6 May 2022 14:31:07 +0200 Subject: [PATCH] fix: support fallback for `import.meta` per chunk (non lazy) chunks are evaluated even before entry. this adds a temporary fallback value for `globalThis._importMeta_` for chunks --- src/rollup/config.ts | 16 ++-------------- src/rollup/plugins/import-meta.ts | 28 ++++++++++++++++++++++++++++ src/rollup/plugins/public-assets.ts | 4 ++-- 3 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 src/rollup/plugins/import-meta.ts diff --git a/src/rollup/config.ts b/src/rollup/config.ts index 1cfd1d9910..4a197d9522 100644 --- a/src/rollup/config.ts +++ b/src/rollup/config.ts @@ -30,6 +30,7 @@ import { handlers } from './plugins/handlers' import { esbuild } from './plugins/esbuild' import { raw } from './plugins/raw' import { storage } from './plugins/storage' +import { importMeta } from './plugins/import-meta' export type RollupConfig = InputOptions & { output: OutputOptions } @@ -143,20 +144,7 @@ export const getRollupConfig = (nitro: Nitro) => { } // Universal import.meta - rollupConfig.plugins.push({ - name: 'import-meta', - renderChunk (code, chunk) { - if (!chunk.isEntry) { - return - } - const url = nitro.options.node ? '_import_meta_url_' : '"file://_entry.js"' - const env = nitro.options.node ? 'process.env' : '{}' - return { - code: `globalThis._importMeta_={url:${url},env:${env}};` + code, - map: null - } - } - }) + rollupConfig.plugins.push(importMeta(nitro)) // https://github.com/rollup/plugins/tree/master/packages/replace rollupConfig.plugins.push(replace({ diff --git a/src/rollup/plugins/import-meta.ts b/src/rollup/plugins/import-meta.ts new file mode 100644 index 0000000000..cb19c42789 --- /dev/null +++ b/src/rollup/plugins/import-meta.ts @@ -0,0 +1,28 @@ +import type { Plugin } from 'rollup' +import { Nitro } from '../../types' + +export function importMeta (nitro: Nitro): Plugin { + const ImportMetaRe = /import\.meta|globalThis._importMeta_/ + + return { + name: 'import-meta', + renderChunk (code, chunk) { + const isEntry = chunk.isEntry + if (!isEntry && (!ImportMetaRe.test(code) || code.includes('ROLLUP_NO_REPLACE'))) { + return + } + const url = (nitro.options.node && isEntry) ? '_import_meta_url_' : '"file:///_entry.js"' + const env = nitro.options.node ? 'process.env' : '{}' + const ref = 'globalThis._importMeta_' + const stub = `{url:${url},env:${env}}` + const stubInit = isEntry + ? `${ref}=${stub};` + : `${ref}=${ref}||${stub};` + + return { + code: stubInit + code, + map: null + } + } + } +} diff --git a/src/rollup/plugins/public-assets.ts b/src/rollup/plugins/public-assets.ts index c1ed3e9ef2..01a0d62038 100644 --- a/src/rollup/plugins/public-assets.ts +++ b/src/rollup/plugins/public-assets.ts @@ -40,9 +40,9 @@ import { resolve } from 'pathe' import { dirname } from 'pathe' import { fileURLToPath } from 'url' import assets from '#internal/nitro/virtual/public-assets-data' -const mainDir = dirname(fileURLToPath(import.meta.url)) export function readAsset (id) { - return fsp.readFile(resolve(mainDir, assets[id].path)).catch(() => {}) + const serverDir = dirname(fileURLToPath(import.meta.url)) + return fsp.readFile(resolve(serverDir, assets[id].path)) }`, '#internal/nitro/virtual/public-assets': ` import assets from '#internal/nitro/virtual/public-assets-data'