From dbf7a901909164c82b664222078064a7ff7854cd Mon Sep 17 00:00:00 2001 From: pooya parsa Date: Wed, 21 Jun 2023 17:28:09 +0200 Subject: [PATCH] feat: provide static `process.*` and `import.meta.*` build flags (#1331) --- src/rollup/config.ts | 28 +++++++++++++++++++++++++++- src/types/global.ts | 24 ++++++++++++++++++++++++ src/types/index.ts | 1 + test/fixture/routes/static-flags.ts | 13 +++++++++++++ test/tests.ts | 17 +++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/types/global.ts create mode 100644 test/fixture/routes/static-flags.ts diff --git a/src/rollup/config.ts b/src/rollup/config.ts index acdde87472..01a65a3685 100644 --- a/src/rollup/config.ts +++ b/src/rollup/config.ts @@ -18,9 +18,10 @@ import type { Preset } from "unenv"; import { sanitizeFilePath, resolvePath } from "mlly"; import unimportPlugin from "unimport/unplugin"; import { hash } from "ohash"; -import type { Nitro } from "../types"; +import type { Nitro, NitroStaticBuildFlags } from "../types"; import { resolveAliases } from "../utils"; import { runtimeDir } from "../dirs"; +import { version } from "../../package.json"; import { replace } from "./plugins/replace"; import { virtual } from "./plugins/virtual"; import { dynamicRequire } from "./plugins/dynamic-require"; @@ -163,6 +164,7 @@ export const getRollupConfig = (nitro: Nitro): RollupConfig => { if (nitro.options.preset === "nitro-prerender") { NODE_ENV = "prerender"; } + const buildEnvVars = { NODE_ENV, prerender: nitro.options.preset === "nitro-prerender", @@ -172,6 +174,18 @@ export const getRollupConfig = (nitro: Nitro): RollupConfig => { DEBUG: nitro.options.dev, }; + const staticFlags: NitroStaticBuildFlags = { + dev: nitro.options.dev, + preset: nitro.options.preset, + prerender: nitro.options.preset === "nitro-prerender", + server: true, + client: false, + nitro: true, + // @ts-expect-error + "versions.nitro": version, + "versions?.nitro": version, + }; + // Universal import.meta rollupConfig.plugins.push(importMeta(nitro)); @@ -208,6 +222,18 @@ export const getRollupConfig = (nitro: Nitro): RollupConfig => { JSON.stringify(val), ]) ), + ...Object.fromEntries( + Object.entries(staticFlags).map(([key, val]) => [ + `process.${key}`, + JSON.stringify(val), + ]) + ), + ...Object.fromEntries( + Object.entries(staticFlags).map(([key, val]) => [ + `import.meta.${key}`, + JSON.stringify(val), + ]) + ), ...nitro.options.replace, }, }) diff --git a/src/types/global.ts b/src/types/global.ts new file mode 100644 index 0000000000..d4f69f64e5 --- /dev/null +++ b/src/types/global.ts @@ -0,0 +1,24 @@ +import type { NitroOptions } from "./nitro"; + +export interface NitroStaticBuildFlags { + dev?: boolean; + client?: boolean; + nitro?: boolean; + prerender?: boolean; + preset?: NitroOptions["preset"]; + server?: boolean; + versions?: { + nitro?: string; + }; +} + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace NodeJS { + interface Process extends NitroStaticBuildFlags {} + } + + interface ImportMeta extends NitroStaticBuildFlags {} +} + +export {}; diff --git a/src/types/index.ts b/src/types/index.ts index b0fedf12fb..4e8cf44199 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,4 +1,5 @@ export * from "./fetch"; +export * from "./global"; export * from "./serialize"; export * from "./nitro"; export * from "./handler"; diff --git a/test/fixture/routes/static-flags.ts b/test/fixture/routes/static-flags.ts new file mode 100644 index 0000000000..3a502d450f --- /dev/null +++ b/test/fixture/routes/static-flags.ts @@ -0,0 +1,13 @@ +// eslint-disable-next-line require-await +export default eventHandler(async (event) => { + return { + dev: [process.dev, import.meta.dev], + preset: [process.preset, import.meta.preset], + prerender: [process.prerender, import.meta.prerender], + server: [process.server, import.meta.server], + client: [process.client, import.meta.client], + nitro: [process.nitro, import.meta.nitro], + "versions.nitro": [process.versions.nitro, import.meta.versions.nitro], + "versions?.nitro": [process.versions?.nitro, import.meta.versions?.nitro], + }; +}); diff --git a/test/tests.ts b/test/tests.ts index 591f613692..db7f382a2b 100644 --- a/test/tests.ts +++ b/test/tests.ts @@ -371,4 +371,21 @@ export function testNitro( expect(headers["server-timing"]).toMatch(/-;dur=\d+;desc="Generate"/); }); } + + it("static build flags", async () => { + const { data } = await callHandler({ url: "/static-flags" }); + expect(data).toMatchObject({ + dev: [ctx.isDev, ctx.isDev], + preset: [ctx.preset, ctx.preset], + prerender: [ + ctx.preset === "nitro-prerenderer", + ctx.preset === "nitro-prerenderer", + ], + client: [false, false], + nitro: [true, true], + server: [true, true], + "versions.nitro": [expect.any(String), expect.any(String)], + "versions?.nitro": [expect.any(String), expect.any(String)], + }); + }); }