diff --git a/.changeset/thick-windows-fetch.md b/.changeset/thick-windows-fetch.md new file mode 100644 index 000000000..973afa7e1 --- /dev/null +++ b/.changeset/thick-windows-fetch.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +Make `NEXT_BUILD_ID` and `NEXT_PREVIEW_MODE_ID` always available on `process.env` diff --git a/packages/open-next/src/adapters/config/index.ts b/packages/open-next/src/adapters/config/index.ts index a9653c6b7..257d435f7 100644 --- a/packages/open-next/src/adapters/config/index.ts +++ b/packages/open-next/src/adapters/config/index.ts @@ -40,3 +40,6 @@ export const AppPathRoutesManifest = export const FunctionsConfigManifest = /* @__PURE__ */ loadFunctionsConfigManifest(NEXT_DIR); + +process.env.NEXT_BUILD_ID = BuildId; +process.env.NEXT_PREVIEW_MODE_ID = PrerenderManifest?.preview?.previewModeId; diff --git a/packages/open-next/src/adapters/config/util.ts b/packages/open-next/src/adapters/config/util.ts index cf39f4f43..eadbbb7ab 100644 --- a/packages/open-next/src/adapters/config/util.ts +++ b/packages/open-next/src/adapters/config/util.ts @@ -76,10 +76,15 @@ export function loadConfigHeaders(nextDir: string) { return routesManifest.headers; } -export function loadPrerenderManifest(nextDir: string) { +export function loadPrerenderManifest( + nextDir: string, +): PrerenderManifest | undefined { const filePath = path.join(nextDir, "prerender-manifest.json"); + if (!fs.existsSync(filePath)) { + return undefined; + } const json = fs.readFileSync(filePath, "utf-8"); - return JSON.parse(json) as PrerenderManifest; + return JSON.parse(json); } export function loadAppPathsManifest(nextDir: string) { diff --git a/packages/open-next/src/adapters/server-adapter.ts b/packages/open-next/src/adapters/server-adapter.ts index 46d2269db..eac285741 100644 --- a/packages/open-next/src/adapters/server-adapter.ts +++ b/packages/open-next/src/adapters/server-adapter.ts @@ -1,14 +1,9 @@ -// We load every config here so that they are only loaded once -// and during cold starts -import { BuildId } from "config/index.js"; - import { createMainHandler } from "../core/createMainHandler.js"; import { setNodeEnv } from "./util.js"; // We load every config here so that they are only loaded once // and during cold starts setNodeEnv(); -setBuildIdEnv(); setNextjsServerWorkingDirectory(); // Because next is messing with fetch, we have to make sure that we use an untouched version of fetch @@ -29,9 +24,3 @@ function setNextjsServerWorkingDirectory() { // See https://opennext.js.org/aws/v2/advanced/workaround#workaround-set-nextserver-working-directory-aws-specific process.chdir(__dirname); } - -function setBuildIdEnv() { - // This allows users to access the CloudFront invalidating path when doing on-demand - // invalidations. ie. `/_next/data/${process.env.NEXT_BUILD_ID}/foo.json` - process.env.NEXT_BUILD_ID = BuildId; -} diff --git a/packages/open-next/src/build/copyTracedFiles.ts b/packages/open-next/src/build/copyTracedFiles.ts index cbad19efe..e5525a778 100644 --- a/packages/open-next/src/build/copyTracedFiles.ts +++ b/packages/open-next/src/build/copyTracedFiles.ts @@ -362,7 +362,7 @@ File ${serverPath} does not exist const staticFiles: Array = Object.values(pagesManifest); // Then we need to get all fallback: true dynamic routes html const locales = config.i18n?.locales; - Object.values(prerenderManifest.dynamicRoutes).forEach((route) => { + Object.values(prerenderManifest?.dynamicRoutes ?? {}).forEach((route) => { if (typeof route.fallback === "string") { if (locales) { locales.forEach((locale) => { diff --git a/packages/open-next/src/core/routing/cacheInterceptor.ts b/packages/open-next/src/core/routing/cacheInterceptor.ts index 28577db1e..08d308749 100644 --- a/packages/open-next/src/core/routing/cacheInterceptor.ts +++ b/packages/open-next/src/core/routing/cacheInterceptor.ts @@ -42,7 +42,7 @@ async function computeCacheControl( ) { let finalRevalidate = CACHE_ONE_YEAR; - const existingRoute = Object.entries(PrerenderManifest.routes).find( + const existingRoute = Object.entries(PrerenderManifest?.routes ?? {}).find( (p) => p[0] === path, )?.[1]; if (revalidate === undefined && existingRoute) { @@ -259,8 +259,10 @@ export async function cacheInterceptor( debug("Checking cache for", localizedPath, PrerenderManifest); const isISR = - Object.keys(PrerenderManifest.routes).includes(localizedPath ?? "/") || - Object.values(PrerenderManifest.dynamicRoutes).some((dr) => + Object.keys(PrerenderManifest?.routes ?? {}).includes( + localizedPath ?? "/", + ) || + Object.values(PrerenderManifest?.dynamicRoutes ?? {}).some((dr) => new RegExp(dr.routeRegex).test(localizedPath), ); debug("isISR", isISR); diff --git a/packages/open-next/src/core/routing/matcher.ts b/packages/open-next/src/core/routing/matcher.ts index 89d7de7d7..59e315afd 100644 --- a/packages/open-next/src/core/routing/matcher.ts +++ b/packages/open-next/src/core/routing/matcher.ts @@ -422,10 +422,10 @@ export function fixDataPage( export function handleFallbackFalse( internalEvent: InternalEvent, - prerenderManifest: PrerenderManifest, + prerenderManifest?: PrerenderManifest, ): { event: InternalEvent; isISR: boolean } { const { rawPath } = internalEvent; - const { dynamicRoutes, routes } = prerenderManifest; + const { dynamicRoutes = {}, routes = {} } = prerenderManifest ?? {}; const prerenderedFallbackRoutes = Object.entries(dynamicRoutes).filter( ([, { fallback }]) => fallback === false, ); diff --git a/packages/open-next/src/core/routing/middleware.ts b/packages/open-next/src/core/routing/middleware.ts index 4b42bd912..5c0eb9390 100644 --- a/packages/open-next/src/core/routing/middleware.ts +++ b/packages/open-next/src/core/routing/middleware.ts @@ -60,7 +60,7 @@ export async function handleMiddleware( if ( headers["x-isr"] && headers["x-prerender-revalidate"] === - PrerenderManifest.preview.previewModeId + PrerenderManifest?.preview?.previewModeId ) return internalEvent; diff --git a/packages/open-next/src/plugins/edge.ts b/packages/open-next/src/plugins/edge.ts index 26efa9c0f..7c6fd66dc 100644 --- a/packages/open-next/src/plugins/edge.ts +++ b/packages/open-next/src/plugins/edge.ts @@ -194,8 +194,8 @@ ${contents} export const FunctionsConfigManifest = ${JSON.stringify(FunctionsConfigManifest)}; export const PagesManifest = ${JSON.stringify(PagesManifest)}; - process.env.NEXT_BUILD_ID = BuildId; + process.env.NEXT_PREVIEW_MODE_ID = PrerenderManifest?.preview?.previewModeId; `; return { contents }; },