From 68ccc714c2e4c857daf881f60259296ac8f63fad Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 12:34:34 +0200 Subject: [PATCH 1/8] chore: make dev overrides work in monorepo --- packages/open-next/src/build/createServerBundle.ts | 14 +++++++++++++- .../src/overrides/incrementalCache/fs-dev.ts | 2 +- .../open-next/src/overrides/tagCache/fs-dev.ts | 8 +++++--- .../src/overrides/wrappers/express-dev.ts | 9 +++++++-- packages/open-next/src/types/global.ts | 5 +++++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/packages/open-next/src/build/createServerBundle.ts b/packages/open-next/src/build/createServerBundle.ts index 3582f5549..4d4446083 100644 --- a/packages/open-next/src/build/createServerBundle.ts +++ b/packages/open-next/src/build/createServerBundle.ts @@ -302,7 +302,9 @@ async function generateBundle( outfile: path.join(outputPath, packagePath, `index.${outfileExt}`), banner: { js: [ - `globalThis.monorepoPackagePath = "${packagePath}";`, + needsGlobalOutputDir(options) + ? `globalThis.outputDir = "${outputDir}"` + : "", "import process from 'node:process';", "import { Buffer } from 'node:buffer';", "import { createRequire as topLevelCreateRequire } from 'module';", @@ -395,3 +397,13 @@ async function minifyServerBundle(outputDir: string) { mangle: true, }); } + +// Check if we need the outputDir in any dev override +// Remember to update this if you add a new override that needs the outputDir +function needsGlobalOutputDir(options: buildHelper.BuildOptions) { + return ( + options.config.default?.override?.wrapper === "express-dev" || + options.config.default.override?.incrementalCache === "fs-dev" || + options.config.default.override?.tagCache === "fs-dev" + ); +} diff --git a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts index f24c31014..726fc001e 100644 --- a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts +++ b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts @@ -4,7 +4,7 @@ import fs from "node:fs/promises"; import path from "node:path"; const buildId = process.env.NEXT_BUILD_ID; -const basePath = path.resolve(process.cwd(), `../../cache/${buildId}`); +const basePath = path.join(globalThis.outputDir, `cache/${buildId}`); const getCacheKey = (key: string) => { return path.join(basePath, `${key}.cache`); diff --git a/packages/open-next/src/overrides/tagCache/fs-dev.ts b/packages/open-next/src/overrides/tagCache/fs-dev.ts index f6f61e992..c2c40cdef 100644 --- a/packages/open-next/src/overrides/tagCache/fs-dev.ts +++ b/packages/open-next/src/overrides/tagCache/fs-dev.ts @@ -1,10 +1,12 @@ import type { TagCache } from "types/overrides"; import fs from "node:fs"; +import path from "node:path"; -// TODO: fix this for monorepo -const tagFile = "../../dynamodb-provider/dynamodb-cache.json"; - +const tagFile = path.join( + globalThis.outputDir, + "dynamodb-provider/dynamodb-cache.json", +); const tagContent = fs.readFileSync(tagFile, "utf-8"); let tags = JSON.parse(tagContent) as { diff --git a/packages/open-next/src/overrides/wrappers/express-dev.ts b/packages/open-next/src/overrides/wrappers/express-dev.ts index 9eb00dea3..a6de8fb64 100644 --- a/packages/open-next/src/overrides/wrappers/express-dev.ts +++ b/packages/open-next/src/overrides/wrappers/express-dev.ts @@ -1,3 +1,4 @@ +import path from "node:path"; import express from "express"; import type { StreamCreator } from "types/open-next.js"; @@ -6,9 +7,13 @@ import type { WrapperHandler } from "types/overrides.js"; const wrapper: WrapperHandler = async (handler, converter) => { const app = express(); // To serve static assets - app.use(express.static("../../assets")); + app.use(express.static(path.join(globalThis.outputDir, "assets"))); + + const imageHandlerPath = path.join( + globalThis.outputDir, + "image-optimization-function/index.mjs", + ); - const imageHandlerPath = "../../image-optimization-function/index.mjs"; const imageHandler = await import(imageHandlerPath).then((m) => m.handler); app.all("/_next/image", async (req, res) => { diff --git a/packages/open-next/src/types/global.ts b/packages/open-next/src/types/global.ts index d8669a542..22fa5e74e 100644 --- a/packages/open-next/src/types/global.ts +++ b/packages/open-next/src/types/global.ts @@ -220,4 +220,9 @@ declare global { var __next_route_preloader: ( stage: "waitUntil" | "start" | "warmerEvent" | "onDemand", ) => Promise; + + /** + * This is for dev overrides that needs the output directory. + */ + var outputDir: string; } From 57360379661ba4a586a490db4b44316a82d43325 Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 13:53:02 +0200 Subject: [PATCH 2/8] semicolon --- packages/open-next/src/build/createServerBundle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/open-next/src/build/createServerBundle.ts b/packages/open-next/src/build/createServerBundle.ts index 4d4446083..c1ff37678 100644 --- a/packages/open-next/src/build/createServerBundle.ts +++ b/packages/open-next/src/build/createServerBundle.ts @@ -303,7 +303,7 @@ async function generateBundle( banner: { js: [ needsGlobalOutputDir(options) - ? `globalThis.outputDir = "${outputDir}"` + ? `globalThis.outputDir = "${outputDir}";` : "", "import process from 'node:process';", "import { Buffer } from 'node:buffer';", From 443a4c5b2643896127f082cd22f3768735029e52 Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 16:10:10 +0200 Subject: [PATCH 3/8] review --- packages/open-next/src/build/createServerBundle.ts | 14 +------------- .../src/overrides/incrementalCache/fs-dev.ts | 9 ++++++++- .../open-next/src/overrides/tagCache/fs-dev.ts | 8 ++++++-- .../src/overrides/wrappers/express-dev.ts | 13 +++++++++++-- packages/open-next/src/types/global.ts | 5 +++-- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/packages/open-next/src/build/createServerBundle.ts b/packages/open-next/src/build/createServerBundle.ts index c1ff37678..3582f5549 100644 --- a/packages/open-next/src/build/createServerBundle.ts +++ b/packages/open-next/src/build/createServerBundle.ts @@ -302,9 +302,7 @@ async function generateBundle( outfile: path.join(outputPath, packagePath, `index.${outfileExt}`), banner: { js: [ - needsGlobalOutputDir(options) - ? `globalThis.outputDir = "${outputDir}";` - : "", + `globalThis.monorepoPackagePath = "${packagePath}";`, "import process from 'node:process';", "import { Buffer } from 'node:buffer';", "import { createRequire as topLevelCreateRequire } from 'module';", @@ -397,13 +395,3 @@ async function minifyServerBundle(outputDir: string) { mangle: true, }); } - -// Check if we need the outputDir in any dev override -// Remember to update this if you add a new override that needs the outputDir -function needsGlobalOutputDir(options: buildHelper.BuildOptions) { - return ( - options.config.default?.override?.wrapper === "express-dev" || - options.config.default.override?.incrementalCache === "fs-dev" || - options.config.default.override?.tagCache === "fs-dev" - ); -} diff --git a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts index 726fc001e..a53b3c56c 100644 --- a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts +++ b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts @@ -4,7 +4,14 @@ import fs from "node:fs/promises"; import path from "node:path"; const buildId = process.env.NEXT_BUILD_ID; -const basePath = path.join(globalThis.outputDir, `cache/${buildId}`); +const basePath = path.join( + globalThis.monorepoPackagePath + .split("/") + .filter(Boolean) + .map(() => "../") + .join(""), + `../../cache/${buildId}`, +); const getCacheKey = (key: string) => { return path.join(basePath, `${key}.cache`); diff --git a/packages/open-next/src/overrides/tagCache/fs-dev.ts b/packages/open-next/src/overrides/tagCache/fs-dev.ts index c2c40cdef..e6350f4dd 100644 --- a/packages/open-next/src/overrides/tagCache/fs-dev.ts +++ b/packages/open-next/src/overrides/tagCache/fs-dev.ts @@ -4,8 +4,12 @@ import fs from "node:fs"; import path from "node:path"; const tagFile = path.join( - globalThis.outputDir, - "dynamodb-provider/dynamodb-cache.json", + globalThis.monorepoPackagePath + .split("/") + .filter(Boolean) + .map(() => "../") + .join(""), + "../../dynamodb-provider/dynamodb-cache.json", ); const tagContent = fs.readFileSync(tagFile, "utf-8"); diff --git a/packages/open-next/src/overrides/wrappers/express-dev.ts b/packages/open-next/src/overrides/wrappers/express-dev.ts index a6de8fb64..332f48d97 100644 --- a/packages/open-next/src/overrides/wrappers/express-dev.ts +++ b/packages/open-next/src/overrides/wrappers/express-dev.ts @@ -4,13 +4,22 @@ import express from "express"; import type { StreamCreator } from "types/open-next.js"; import type { WrapperHandler } from "types/overrides.js"; +const outputDir = path.join( + globalThis.monorepoPackagePath + .split("/") + .filter(Boolean) + .map(() => "../") + .join(""), + "../../", +); + const wrapper: WrapperHandler = async (handler, converter) => { const app = express(); // To serve static assets - app.use(express.static(path.join(globalThis.outputDir, "assets"))); + app.use(express.static(path.join(outputDir, "assets"))); const imageHandlerPath = path.join( - globalThis.outputDir, + outputDir, "image-optimization-function/index.mjs", ); diff --git a/packages/open-next/src/types/global.ts b/packages/open-next/src/types/global.ts index 22fa5e74e..085acae8d 100644 --- a/packages/open-next/src/types/global.ts +++ b/packages/open-next/src/types/global.ts @@ -222,7 +222,8 @@ declare global { ) => Promise; /** - * This is for dev overrides that needs the output directory. + * This is the relative package path of the monorepo. It will be an empty string "" in normal repos. + * ex. `packages/web` */ - var outputDir: string; + var monorepoPackagePath: string; } From 71a1f910265db07d9312113e3808c822db9fae6b Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 16:40:39 +0200 Subject: [PATCH 4/8] review --- .../src/overrides/incrementalCache/fs-dev.ts | 14 ++++---------- .../open-next/src/overrides/tagCache/fs-dev.ts | 11 ++++------- .../src/overrides/wrappers/express-dev.ts | 16 ++++------------ packages/open-next/src/utils/normalize-path.ts | 12 ++++++++++++ 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts index a53b3c56c..ef23a1341 100644 --- a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts +++ b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts @@ -1,17 +1,11 @@ -import type { IncrementalCache } from "types/overrides.js"; - import fs from "node:fs/promises"; import path from "node:path"; +import type { IncrementalCache } from "types/overrides.js"; +import { getOutputDir } from "utils/normalize-path"; + const buildId = process.env.NEXT_BUILD_ID; -const basePath = path.join( - globalThis.monorepoPackagePath - .split("/") - .filter(Boolean) - .map(() => "../") - .join(""), - `../../cache/${buildId}`, -); +const basePath = path.join(getOutputDir(), `../../cache/${buildId}`); const getCacheKey = (key: string) => { return path.join(basePath, `${key}.cache`); diff --git a/packages/open-next/src/overrides/tagCache/fs-dev.ts b/packages/open-next/src/overrides/tagCache/fs-dev.ts index e6350f4dd..326d78c83 100644 --- a/packages/open-next/src/overrides/tagCache/fs-dev.ts +++ b/packages/open-next/src/overrides/tagCache/fs-dev.ts @@ -1,14 +1,11 @@ -import type { TagCache } from "types/overrides"; - import fs from "node:fs"; import path from "node:path"; +import type { TagCache } from "types/overrides"; +import { getOutputDir } from "utils/normalize-path"; + const tagFile = path.join( - globalThis.monorepoPackagePath - .split("/") - .filter(Boolean) - .map(() => "../") - .join(""), + getOutputDir(), "../../dynamodb-provider/dynamodb-cache.json", ); const tagContent = fs.readFileSync(tagFile, "utf-8"); diff --git a/packages/open-next/src/overrides/wrappers/express-dev.ts b/packages/open-next/src/overrides/wrappers/express-dev.ts index 332f48d97..2ea8a0a06 100644 --- a/packages/open-next/src/overrides/wrappers/express-dev.ts +++ b/packages/open-next/src/overrides/wrappers/express-dev.ts @@ -3,24 +3,16 @@ import express from "express"; import type { StreamCreator } from "types/open-next.js"; import type { WrapperHandler } from "types/overrides.js"; - -const outputDir = path.join( - globalThis.monorepoPackagePath - .split("/") - .filter(Boolean) - .map(() => "../") - .join(""), - "../../", -); +import { getOutputDir } from "utils/normalize-path"; const wrapper: WrapperHandler = async (handler, converter) => { const app = express(); // To serve static assets - app.use(express.static(path.join(outputDir, "assets"))); + app.use(express.static(path.join(getOutputDir(), "../../assets"))); const imageHandlerPath = path.join( - outputDir, - "image-optimization-function/index.mjs", + getOutputDir(), + "../../image-optimization-function/index.mjs", ); const imageHandler = await import(imageHandlerPath).then((m) => m.handler); diff --git a/packages/open-next/src/utils/normalize-path.ts b/packages/open-next/src/utils/normalize-path.ts index 020135b5e..3527d58aa 100644 --- a/packages/open-next/src/utils/normalize-path.ts +++ b/packages/open-next/src/utils/normalize-path.ts @@ -1,3 +1,15 @@ +import path from "node:path"; + export function normalizePath(path: string) { return path.replace(/\\/g, "/"); } + +export function getOutputDir() { + return path.join( + globalThis.monorepoPackagePath + .split("/") + .filter(Boolean) + .map(() => "..") + .join("/"), + ); +} From ca791c39c44659565f601068f37f87bd99e59bb5 Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 16:48:29 +0200 Subject: [PATCH 5/8] refactor --- packages/open-next/src/overrides/incrementalCache/fs-dev.ts | 2 +- packages/open-next/src/overrides/tagCache/fs-dev.ts | 2 +- packages/open-next/src/overrides/wrappers/express-dev.ts | 4 ++-- packages/open-next/src/utils/normalize-path.ts | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts index ef23a1341..680227461 100644 --- a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts +++ b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts @@ -5,7 +5,7 @@ import type { IncrementalCache } from "types/overrides.js"; import { getOutputDir } from "utils/normalize-path"; const buildId = process.env.NEXT_BUILD_ID; -const basePath = path.join(getOutputDir(), `../../cache/${buildId}`); +const basePath = path.join(getOutputDir(), `cache/${buildId}`); const getCacheKey = (key: string) => { return path.join(basePath, `${key}.cache`); diff --git a/packages/open-next/src/overrides/tagCache/fs-dev.ts b/packages/open-next/src/overrides/tagCache/fs-dev.ts index 326d78c83..5bb24e69f 100644 --- a/packages/open-next/src/overrides/tagCache/fs-dev.ts +++ b/packages/open-next/src/overrides/tagCache/fs-dev.ts @@ -6,7 +6,7 @@ import { getOutputDir } from "utils/normalize-path"; const tagFile = path.join( getOutputDir(), - "../../dynamodb-provider/dynamodb-cache.json", + "dynamodb-provider/dynamodb-cache.json", ); const tagContent = fs.readFileSync(tagFile, "utf-8"); diff --git a/packages/open-next/src/overrides/wrappers/express-dev.ts b/packages/open-next/src/overrides/wrappers/express-dev.ts index 2ea8a0a06..559dd0e5e 100644 --- a/packages/open-next/src/overrides/wrappers/express-dev.ts +++ b/packages/open-next/src/overrides/wrappers/express-dev.ts @@ -8,11 +8,11 @@ import { getOutputDir } from "utils/normalize-path"; const wrapper: WrapperHandler = async (handler, converter) => { const app = express(); // To serve static assets - app.use(express.static(path.join(getOutputDir(), "../../assets"))); + app.use(express.static(path.join(getOutputDir(), "assets"))); const imageHandlerPath = path.join( getOutputDir(), - "../../image-optimization-function/index.mjs", + "image-optimization-function/index.mjs", ); const imageHandler = await import(imageHandlerPath).then((m) => m.handler); diff --git a/packages/open-next/src/utils/normalize-path.ts b/packages/open-next/src/utils/normalize-path.ts index 3527d58aa..0ab141796 100644 --- a/packages/open-next/src/utils/normalize-path.ts +++ b/packages/open-next/src/utils/normalize-path.ts @@ -11,5 +11,6 @@ export function getOutputDir() { .filter(Boolean) .map(() => "..") .join("/"), + "../../", ); } From f7a95b000d3517dd5a93202e5aeb6c38524d88a0 Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 19:54:06 +0200 Subject: [PATCH 6/8] rename function --- packages/open-next/src/overrides/incrementalCache/fs-dev.ts | 4 ++-- packages/open-next/src/overrides/tagCache/fs-dev.ts | 4 ++-- packages/open-next/src/overrides/wrappers/express-dev.ts | 6 +++--- packages/open-next/src/utils/normalize-path.ts | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts index 680227461..6fe772f24 100644 --- a/packages/open-next/src/overrides/incrementalCache/fs-dev.ts +++ b/packages/open-next/src/overrides/incrementalCache/fs-dev.ts @@ -2,10 +2,10 @@ import fs from "node:fs/promises"; import path from "node:path"; import type { IncrementalCache } from "types/overrides.js"; -import { getOutputDir } from "utils/normalize-path"; +import { getMonorepoRelativePath } from "utils/normalize-path"; const buildId = process.env.NEXT_BUILD_ID; -const basePath = path.join(getOutputDir(), `cache/${buildId}`); +const basePath = path.join(getMonorepoRelativePath(), `cache/${buildId}`); const getCacheKey = (key: string) => { return path.join(basePath, `${key}.cache`); diff --git a/packages/open-next/src/overrides/tagCache/fs-dev.ts b/packages/open-next/src/overrides/tagCache/fs-dev.ts index 5bb24e69f..d5706ccec 100644 --- a/packages/open-next/src/overrides/tagCache/fs-dev.ts +++ b/packages/open-next/src/overrides/tagCache/fs-dev.ts @@ -2,10 +2,10 @@ import fs from "node:fs"; import path from "node:path"; import type { TagCache } from "types/overrides"; -import { getOutputDir } from "utils/normalize-path"; +import { getMonorepoRelativePath } from "utils/normalize-path"; const tagFile = path.join( - getOutputDir(), + getMonorepoRelativePath(), "dynamodb-provider/dynamodb-cache.json", ); const tagContent = fs.readFileSync(tagFile, "utf-8"); diff --git a/packages/open-next/src/overrides/wrappers/express-dev.ts b/packages/open-next/src/overrides/wrappers/express-dev.ts index 559dd0e5e..f381f7e6c 100644 --- a/packages/open-next/src/overrides/wrappers/express-dev.ts +++ b/packages/open-next/src/overrides/wrappers/express-dev.ts @@ -3,15 +3,15 @@ import express from "express"; import type { StreamCreator } from "types/open-next.js"; import type { WrapperHandler } from "types/overrides.js"; -import { getOutputDir } from "utils/normalize-path"; +import { getMonorepoRelativePath } from "utils/normalize-path"; const wrapper: WrapperHandler = async (handler, converter) => { const app = express(); // To serve static assets - app.use(express.static(path.join(getOutputDir(), "assets"))); + app.use(express.static(path.join(getMonorepoRelativePath(), "assets"))); const imageHandlerPath = path.join( - getOutputDir(), + getMonorepoRelativePath(), "image-optimization-function/index.mjs", ); diff --git a/packages/open-next/src/utils/normalize-path.ts b/packages/open-next/src/utils/normalize-path.ts index 0ab141796..6532253ad 100644 --- a/packages/open-next/src/utils/normalize-path.ts +++ b/packages/open-next/src/utils/normalize-path.ts @@ -4,13 +4,13 @@ export function normalizePath(path: string) { return path.replace(/\\/g, "/"); } -export function getOutputDir() { +export function getMonorepoRelativePath(relativePath = "../../"): string { return path.join( globalThis.monorepoPackagePath .split("/") .filter(Boolean) .map(() => "..") .join("/"), - "../../", + relativePath, ); } From 8a6f0e9f59ab7388ecc554607c254b579306d6c2 Mon Sep 17 00:00:00 2001 From: magnus Date: Wed, 7 May 2025 20:05:38 +0200 Subject: [PATCH 7/8] beautify --- packages/open-next/src/utils/normalize-path.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/open-next/src/utils/normalize-path.ts b/packages/open-next/src/utils/normalize-path.ts index 6532253ad..f90030a73 100644 --- a/packages/open-next/src/utils/normalize-path.ts +++ b/packages/open-next/src/utils/normalize-path.ts @@ -4,7 +4,7 @@ export function normalizePath(path: string) { return path.replace(/\\/g, "/"); } -export function getMonorepoRelativePath(relativePath = "../../"): string { +export function getMonorepoRelativePath(relativePath = "../.."): string { return path.join( globalThis.monorepoPackagePath .split("/") From 3a1ca1a9f1ce0633e4b72d5f231fb621254d4f83 Mon Sep 17 00:00:00 2001 From: conico974 Date: Thu, 8 May 2025 20:10:22 +0200 Subject: [PATCH 8/8] Create weak-swans-grin.md --- .changeset/weak-swans-grin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/weak-swans-grin.md diff --git a/.changeset/weak-swans-grin.md b/.changeset/weak-swans-grin.md new file mode 100644 index 000000000..3a5baf500 --- /dev/null +++ b/.changeset/weak-swans-grin.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +fix: make dev overrides work in monorepo