Skip to content

Commit 33dab58

Browse files
authored
server: do not override default alias for older Next.js versions (#124)
1 parent 7a4b8d0 commit 33dab58

File tree

3 files changed

+58
-33
lines changed

3 files changed

+58
-33
lines changed

.changeset/shy-beers-melt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"open-next": patch
3+
---
4+
5+
server: do not override default alias for older Next.js versions

packages/open-next/src/adapters/require-hooks.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,20 @@ export function addHookAliases(
2323
}
2424

2525
// Add default aliases
26-
addHookAliases(
27-
[
28-
// Use `require.resolve` explicitly to make them statically analyzable
29-
// styled-jsx needs to be resolved as the external dependency.
30-
["styled-jsx", require.resolve("styled-jsx")],
31-
["styled-jsx/style", require.resolve("styled-jsx/style")],
32-
["styled-jsx/style", require.resolve("styled-jsx/style")],
33-
["server-only", require.resolve("next/dist/compiled/server-only")],
34-
["client-only", require.resolve("next/dist/compiled/client-only")],
35-
],
36-
"app"
37-
);
26+
export function overrideDefault() {
27+
addHookAliases(
28+
[
29+
// Use `require.resolve` explicitly to make them statically analyzable
30+
// styled-jsx needs to be resolved as the external dependency.
31+
["styled-jsx", require.resolve("styled-jsx")],
32+
["styled-jsx/style", require.resolve("styled-jsx/style")],
33+
["styled-jsx/style", require.resolve("styled-jsx/style")],
34+
["server-only", require.resolve("next/dist/compiled/server-only")],
35+
["client-only", require.resolve("next/dist/compiled/client-only")],
36+
],
37+
"app"
38+
);
39+
}
3840

3941
// Override built-in React packages if necessary
4042
export function overrideReact(config: NextConfig) {

packages/open-next/src/adapters/server-adapter.ts

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,20 @@ import { isBinaryContentType } from "./binary.js";
1616
import { debug } from "./logger.js";
1717
import type { PublicFiles } from "../build.js";
1818
import { convertFrom, convertTo } from "./event-mapper.js";
19-
import { overrideReact } from "./require-hooks.js";
20-
import { WarmerEvent, WarmerResponse } from "./warmer-function.js";
19+
import { overrideDefault, overrideReact } from "./require-hooks.js";
20+
import type { WarmerEvent, WarmerResponse } from "./warmer-function.js";
21+
22+
const NEXT_DIR = path.join(__dirname, ".next");
23+
const OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
24+
const NODE_MODULES_DIR = path.join(__dirname, "node_modules");
25+
debug({ NEXT_DIR, OPEN_NEXT_DIR });
2126

2227
setNodeEnv();
2328
setNextjsServerWorkingDirectory();
24-
const nextDir = path.join(__dirname, ".next");
25-
const openNextDir = path.join(__dirname, ".open-next");
26-
const config = loadConfig(nextDir);
29+
const config = loadConfig(NEXT_DIR);
2730
const htmlPages = loadHtmlPages();
2831
const publicAssets = loadPublicAssets();
2932
initializeNextjsRequireHooks(config);
30-
debug({ nextDir });
3133

3234
// Generate a 6 letter unique server ID
3335
const serverId = `server-${generateUniqueId()}`;
@@ -127,6 +129,8 @@ function setNextjsServerWorkingDirectory() {
127129

128130
function initializeNextjsRequireHooks(config: any) {
129131
// WORKAROUND: Set `__NEXT_PRIVATE_PREBUNDLED_REACT` to use prebundled React — https://github.com/serverless-stack/open-next#workaround-set-__next_private_prebundled_react-to-use-prebundled-react
132+
if (!isNextjsVersionAtLeast("13.1.3")) return;
133+
overrideDefault();
130134
overrideReact(config);
131135
}
132136

@@ -141,7 +145,7 @@ function setNextjsPrebundledReact(req: IncomingMessage, config: any) {
141145
}
142146

143147
// pages route => use node_modules React
144-
if (getMaybePagePath(req.url, nextDir, config.i18n?.locales, false)) {
148+
if (getMaybePagePath(req.url, NEXT_DIR, config.i18n?.locales, false)) {
145149
process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = undefined;
146150
return;
147151
}
@@ -153,20 +157,6 @@ function setNextjsPrebundledReact(req: IncomingMessage, config: any) {
153157
: "next";
154158
}
155159

156-
function loadHtmlPages() {
157-
const filePath = path.join(nextDir, "server", "pages-manifest.json");
158-
const json = fs.readFileSync(filePath, "utf-8");
159-
return Object.entries(JSON.parse(json))
160-
.filter(([_, value]) => (value as string).endsWith(".html"))
161-
.map(([key]) => key);
162-
}
163-
164-
function loadPublicAssets() {
165-
const filePath = path.join(openNextDir, "public-files.json");
166-
const json = fs.readFileSync(filePath, "utf-8");
167-
return JSON.parse(json) as PublicFiles;
168-
}
169-
170160
async function processRequest(req: IncomingMessage, res: ServerResponse) {
171161
// @ts-ignore
172162
// Next.js doesn't parse body if the property exists
@@ -207,3 +197,31 @@ function formatWarmerResponse(event: WarmerEvent) {
207197
}, event.delay);
208198
});
209199
}
200+
201+
function isNextjsVersionAtLeast(required: `${number}.${number}.${number}`) {
202+
const filePath = path.join(NODE_MODULES_DIR, "next", "package.json");
203+
const json = fs.readFileSync(filePath, "utf-8");
204+
const version = JSON.parse(json).version;
205+
206+
const [major, minor, patch] = version.split("-")[0].split(".").map(Number);
207+
const [reqMajor, reqMinor, reqPatch] = required.split(".").map(Number);
208+
return (
209+
major > reqMajor ||
210+
(major === reqMajor && minor > reqMinor) ||
211+
(major === reqMajor && minor === reqMinor && patch >= reqPatch)
212+
);
213+
}
214+
215+
function loadHtmlPages() {
216+
const filePath = path.join(NEXT_DIR, "server", "pages-manifest.json");
217+
const json = fs.readFileSync(filePath, "utf-8");
218+
return Object.entries(JSON.parse(json))
219+
.filter(([_, value]) => (value as string).endsWith(".html"))
220+
.map(([key]) => key);
221+
}
222+
223+
function loadPublicAssets() {
224+
const filePath = path.join(OPEN_NEXT_DIR, "public-files.json");
225+
const json = fs.readFileSync(filePath, "utf-8");
226+
return JSON.parse(json) as PublicFiles;
227+
}

0 commit comments

Comments
 (0)