From 99d65c0d934368b60037d68b5e2b3ce2a80ebe72 Mon Sep 17 00:00:00 2001 From: Thorsten Seyschab Date: Sat, 23 May 2026 17:02:20 +0200 Subject: [PATCH 1/3] refactor: add shared nuxt build runner --- scripts/utils/run-nuxt-build.ts | 87 +++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 scripts/utils/run-nuxt-build.ts diff --git a/scripts/utils/run-nuxt-build.ts b/scripts/utils/run-nuxt-build.ts new file mode 100644 index 0000000..273c6c8 --- /dev/null +++ b/scripts/utils/run-nuxt-build.ts @@ -0,0 +1,87 @@ +import { execFileSync } from 'node:child_process' +import { resolveBuildReleaseMetadata } from '../../server/utils/build-release-metadata' + +const TSX_PACKAGE = 'tsx@4.21.0' + +const cloudflareNitroPresets = [ + 'cloudflare_module', + 'cloudflare_pages', +] as const + +type CloudflareNitroPreset = typeof cloudflareNitroPresets[number] +type NuxtBuildCommand = 'build' | 'generate' + +/** Resolves the shared build-time environment for Nuxt CLI commands. */ +function createBuildEnv(extraEnv: NodeJS.ProcessEnv = {}): NodeJS.ProcessEnv { + const buildReleaseMetadata = resolveBuildReleaseMetadata() + const nodeOptions = [ + process.env.NODE_OPTIONS, + '--max-old-space-size=8192', + ].filter(Boolean).join(' ') + const buildEnv = { + ...process.env, + BUILD_RELEASE_COMMIT_SHORT: buildReleaseMetadata.commitShort, + BUILD_RELEASE_DATE: buildReleaseMetadata.buildDateIso, + NODE_OPTIONS: nodeOptions, + ...extraEnv, + } + + delete buildEnv.VP_COMMAND + delete buildEnv.VP_PACKAGE_NAME + + return buildEnv +} + +/** Runs the Vite+ CLI with repo-safe environment defaults. */ +function runVpCommand(args: string[], env: NodeJS.ProcessEnv): void { + execFileSync(process.env.VP_CLI_BIN ?? 'vp', args, { + env, + shell: process.platform === 'win32', + stdio: 'inherit', + }) +} + +/** Runs the Nuxt build or generate command with shared build metadata. */ +export function runNuxtBuild(command: NuxtBuildCommand, extraEnv: NodeJS.ProcessEnv = {}): void { + runVpCommand([ + 'exec', + 'nuxt', + command, + ], createBuildEnv(extraEnv)) +} + +/** Regenerates and verifies the Cloudflare Pages redirects artifact. */ +export function runRedirectArtifactGeneration(): void { + const buildEnv = createBuildEnv() + + runVpCommand([ + 'dlx', + TSX_PACKAGE, + 'scripts/generate-redirects.ts', + ], buildEnv) + + runVpCommand([ + 'dlx', + TSX_PACKAGE, + 'scripts/generate-redirects.ts', + '--check', + ], buildEnv) +} + +/** Resolves the future Cloudflare Nitro preset for SSR worker or pages builds. */ +export function resolveCloudflareNitroPreset(value: string | undefined): CloudflareNitroPreset { + const normalizedValue = value?.trim() + + if (!normalizedValue) { + return 'cloudflare_pages' + } + + if (cloudflareNitroPresets.some(preset => preset === normalizedValue)) { + return normalizedValue as CloudflareNitroPreset + } + + throw new Error( + 'Invalid CLOUDFLARE_NITRO_PRESET. ' + + `Expected one of ${cloudflareNitroPresets.join(', ')}, got "${normalizedValue}".`, + ) +} From d3bd63fddeb70d56895680a6ba3362feec03aafc Mon Sep 17 00:00:00 2001 From: Thorsten Seyschab Date: Sat, 23 May 2026 17:02:31 +0200 Subject: [PATCH 2/3] refactor: move build scripts to ts entrypoints --- package.json | 5 +++-- scripts/build-ssg.ts | 4 ++++ scripts/build-ssr-cloudflare.ts | 9 +++++++++ scripts/build-ssr.ts | 3 +++ 4 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 scripts/build-ssg.ts create mode 100644 scripts/build-ssr-cloudflare.ts create mode 100644 scripts/build-ssr.ts diff --git a/package.json b/package.json index 7372e40..0e0dbad 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,9 @@ "pnpm": "10.x" }, "scripts": { - "build:ssg": "cross-env NODE_OPTIONS=--max-old-space-size=8192 nuxt generate && vp dlx tsx@4.21.0 scripts/generate-redirects.ts && vp dlx tsx@4.21.0 scripts/generate-redirects.ts --check", - "build:ssr": "cross-env NODE_OPTIONS=--max-old-space-size=8192 nuxt build", + "build:ssg": "vp dlx tsx@4.21.0 scripts/build-ssg.ts", + "build:ssr": "vp dlx tsx@4.21.0 scripts/build-ssr.ts", + "build:ssr:cloudflare": "vp dlx tsx@4.21.0 scripts/build-ssr-cloudflare.ts", "dev": "nuxt dev", "dev:preset": "nuxt dev --port 3000 --public", "deploy:cloudflare:page": "vp dlx tsx@4.21.0 scripts/deploy-cloudflare.ts", diff --git a/scripts/build-ssg.ts b/scripts/build-ssg.ts new file mode 100644 index 0000000..7153a89 --- /dev/null +++ b/scripts/build-ssg.ts @@ -0,0 +1,4 @@ +import { runNuxtBuild, runRedirectArtifactGeneration } from './utils/run-nuxt-build' + +runNuxtBuild('generate') +runRedirectArtifactGeneration() diff --git a/scripts/build-ssr-cloudflare.ts b/scripts/build-ssr-cloudflare.ts new file mode 100644 index 0000000..8e585a1 --- /dev/null +++ b/scripts/build-ssr-cloudflare.ts @@ -0,0 +1,9 @@ +import { resolveCloudflareNitroPreset, runNuxtBuild } from './utils/run-nuxt-build' + +const nitroPreset = resolveCloudflareNitroPreset(process.env.CLOUDFLARE_NITRO_PRESET) + +runNuxtBuild('build', { + NITRO_PRESET: nitroPreset, +}) + +console.log(`Built SSR artifact with Nitro preset: ${nitroPreset}`) diff --git a/scripts/build-ssr.ts b/scripts/build-ssr.ts new file mode 100644 index 0000000..8d62179 --- /dev/null +++ b/scripts/build-ssr.ts @@ -0,0 +1,3 @@ +import { runNuxtBuild } from './utils/run-nuxt-build' + +runNuxtBuild('build') From 07f5b22ffe29a7323b6b5794cbbd1b19e98ebad8 Mon Sep 17 00:00:00 2001 From: Thorsten Seyschab Date: Sat, 23 May 2026 17:07:11 +0200 Subject: [PATCH 3/3] refactor: centralize redirects script commands --- package.json | 4 +++- scripts/utils/run-nuxt-build.ts | 13 ++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 0e0dbad..c00a2fe 100644 --- a/package.json +++ b/package.json @@ -58,10 +58,12 @@ "prepare": "nuxt prepare", "preview:ssg": "pnpm exec serve .output/public", "preview:ssr": "nuxt preview", + "redirects:check": "vp dlx tsx@4.21.0 scripts/generate-redirects.ts --check", + "redirects:generate": "vp dlx tsx@4.21.0 scripts/generate-redirects.ts", "reset": "rimraf node_modules .nuxt .output dist .data", "test": "run-s test:*", "test:lint": "eslint .", - "test:redirects": "vp dlx tsx@4.21.0 scripts/generate-redirects.ts && vp dlx tsx@4.21.0 scripts/generate-redirects.ts --check", + "test:redirects": "vp run redirects:generate && vp run redirects:check", "test:types": "nuxt typecheck", "verify:cloudflare:smoke": "vp dlx tsx@4.21.0 scripts/check-cloudflare-smoke.ts" }, diff --git a/scripts/utils/run-nuxt-build.ts b/scripts/utils/run-nuxt-build.ts index 273c6c8..1fe3686 100644 --- a/scripts/utils/run-nuxt-build.ts +++ b/scripts/utils/run-nuxt-build.ts @@ -1,8 +1,6 @@ import { execFileSync } from 'node:child_process' import { resolveBuildReleaseMetadata } from '../../server/utils/build-release-metadata' -const TSX_PACKAGE = 'tsx@4.21.0' - const cloudflareNitroPresets = [ 'cloudflare_module', 'cloudflare_pages', @@ -55,16 +53,13 @@ export function runRedirectArtifactGeneration(): void { const buildEnv = createBuildEnv() runVpCommand([ - 'dlx', - TSX_PACKAGE, - 'scripts/generate-redirects.ts', + 'run', + 'redirects:generate', ], buildEnv) runVpCommand([ - 'dlx', - TSX_PACKAGE, - 'scripts/generate-redirects.ts', - '--check', + 'run', + 'redirects:check', ], buildEnv) }