Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -57,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"
},
Expand Down
4 changes: 4 additions & 0 deletions scripts/build-ssg.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { runNuxtBuild, runRedirectArtifactGeneration } from './utils/run-nuxt-build'

runNuxtBuild('generate')
runRedirectArtifactGeneration()
9 changes: 9 additions & 0 deletions scripts/build-ssr-cloudflare.ts
Original file line number Diff line number Diff line change
@@ -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}`)
3 changes: 3 additions & 0 deletions scripts/build-ssr.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { runNuxtBuild } from './utils/run-nuxt-build'

runNuxtBuild('build')
82 changes: 82 additions & 0 deletions scripts/utils/run-nuxt-build.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { execFileSync } from 'node:child_process'
import { resolveBuildReleaseMetadata } from '../../server/utils/build-release-metadata'

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([
'run',
'redirects:generate',
], buildEnv)

runVpCommand([
'run',
'redirects: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}".`,
)
}