Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
fa74e70
refactor: remove createServerBundle.ts and integrate its functionalit…
conico974 Jun 27, 2026
33a6eff
feat: implement default overrides for bundle configurations and add t…
conico974 Jun 27, 2026
fe002e1
format
conico974 Jun 27, 2026
9ee9515
fix ts issue
conico974 Jun 27, 2026
6fad0c6
feat: add default overrides for AWS adapter and integrate Cloudflare …
conico974 Jun 27, 2026
84397ab
Revert "feat: add default overrides for AWS adapter and integrate Clo…
conico974 Jun 27, 2026
f22d37f
feat: enhance AWS adapter with default overrides and improve middlewa…
conico974 Jun 27, 2026
a3165f0
refactor(core): return ValidateConfigResult from validateConfig inste…
conico974 Jun 28, 2026
6296e94
refactor(core): extract buildOpenNextOutput, export OpenNextOutput type
conico974 Jun 28, 2026
4e82821
refactor(core): branch on ValidateConfigResult in compileOpenNextConfig
conico974 Jun 28, 2026
0af2e73
feat(core): overridable validateConfig and generic generateOutput on …
conico974 Jun 28, 2026
bab47f1
fix(core): use require.resolve for full-path overrides in resolve plugin
conico974 Jun 28, 2026
51b5e3b
format
conico974 Jun 28, 2026
a437de1
feat(core): enforce mandatory externals in serverBundle and update re…
conico974 Aug 1, 2026
cd8f83e
refactor(core): enhance resolve plugin to support dynamic override re…
conico974 Aug 1, 2026
a63c22b
wip
conico974 Jul 15, 2026
607ce77
fix issue
conico974 Aug 1, 2026
9dd1ad8
feat(routing): add restoreNullOrigin middleware to handle null host h…
conico974 Aug 1, 2026
e9a508b
feat(middleware): add getMiddlewareMatchPath function and update shou…
conico974 Aug 1, 2026
ab7a53e
feat(routing): add ISR support for prerendered routes and update rela…
conico974 Aug 1, 2026
16aae78
refactor(headers): simplify test descriptions and remove deprecated c…
conico974 Aug 1, 2026
5b562ef
feat(routing): ensure single redirect target in response headers
conico974 Aug 1, 2026
65a1153
feat(routing): add support for trailing slash variants in routing con…
conico974 Aug 1, 2026
76c9df5
feat(routing): implement prerender route resolution and update relate…
conico974 Aug 1, 2026
2da77c9
feat(routing): add priority route handling and related tests for redi…
conico974 Aug 1, 2026
c5833a3
feat(routing): implement routing normalization and add related tests
conico974 Aug 2, 2026
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
2 changes: 1 addition & 1 deletion create-cloudflare/next/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
},
"dependencies": {
"@opennextjs/cloudflare": "^1.17.1",
"next": "16.1.4",
"next": "16.2.1",
"react": "19.1.4",
"react-dom": "19.1.4"
},
Expand Down
2 changes: 1 addition & 1 deletion examples-cloudflare/e2e/app-router/e2e/headers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ test("Headers", async ({ page }) => {
expect(headers["x-opennext-requestid"]).not.toBeFalsy();
});
/**
* Tests that the middleware headers are applied after next.config.js headers. Requires 'dangerous.middlewareHeadersOverrideNextConfigHeaders' to be set.
* Tests that the middleware headers are applied after next.config.js headers.
*/
test("Middleware headers override next.config.js headers", async ({ page }) => {
const responsePromise = page.waitForResponse((response) => {
Expand Down
2 changes: 1 addition & 1 deletion examples-cloudflare/e2e/app-router/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export function middleware(request: NextRequest) {
// Response headers should show up in the client's response headers
responseHeaders.set("response-header", "response-header");

// For dangerous.middlewareHeadersOverrideNextConfigHeaders we need to verify that middleware headers override next.config.js headers.
// We need to verify that middleware headers override next.config.js headers.
if (path === "/headers/override-from-middleware") {
responseHeaders.set("e2e-headers", "middleware");
return NextResponse.json({}, { headers: responseHeaders });
Expand Down
8 changes: 1 addition & 7 deletions examples-cloudflare/e2e/app-router/open-next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,4 @@ const baseConfig = defineCloudflareConfig({
queue: queueCache(doQueue),
});

export default {
...baseConfig,
dangerous: {
...baseConfig.dangerous,
middlewareHeadersOverrideNextConfigHeaders: true,
},
};
export default baseConfig;
2 changes: 1 addition & 1 deletion examples-cloudflare/playground16/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"cf-typegen": "wrangler types --env-interface CloudflareEnv"
},
"dependencies": {
"next": "16.1.4",
"next": "16.2.1",
"react": "19.2.3",
"react-dom": "19.2.3"
},
Expand Down
4 changes: 0 additions & 4 deletions examples/app-router/open-next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ export default {
},
},

dangerous: {
middlewareHeadersOverrideNextConfigHeaders: true,
},

imageOptimization: {
override: {
wrapper: "dummy",
Expand Down
2 changes: 1 addition & 1 deletion examples/app-router/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export default function proxy(request: NextRequest) {
// Response headers should show up in the client's response headers
responseHeaders.set("response-header", "response-header");

// For dangerous.middlewareHeadersOverrideNextConfigHeaders we need to verify that middleware headers override next.config.js headers.
// We need to verify that middleware headers override next.config.js headers.
if (path === "/headers/override-from-middleware") {
responseHeaders.set("e2e-headers", "middleware");
return NextResponse.json({}, { headers: responseHeaders });
Expand Down
2 changes: 1 addition & 1 deletion packages/aws/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,6 @@
"typescript": "catalog:"
},
"peerDependencies": {
"next": "^16.0.10"
"next": "16.2.1"
}
}
183 changes: 41 additions & 142 deletions packages/aws/src/adapter.ts
Original file line number Diff line number Diff line change
@@ -1,147 +1,46 @@
import fs from "node:fs";
import { createRequire } from "node:module";
import path from "node:path";

import { compileCache } from "@opennextjs/core/build/compileCache.js";
import { compileOpenNextConfig } from "@opennextjs/core/build/compileConfig.js";
import { compileTagCacheProvider } from "@opennextjs/core/build/compileTagCacheProvider.js";
import { createCacheAssets, createStaticAssets } from "@opennextjs/core/build/createAssets.js";
import { createImageOptimizationBundle } from "@opennextjs/core/build/createImageOptimizationBundle.js";
import { createMiddleware } from "@opennextjs/core/build/createMiddleware.js";
import { createRevalidationBundle } from "@opennextjs/core/build/createRevalidationBundle.js";
import { createServerBundle } from "@opennextjs/core/build/createServerBundle.js";
import { createWarmerBundle } from "@opennextjs/core/build/createWarmerBundle.js";
import { generateOutput } from "@opennextjs/core/build/generateOutput.js";
import { buildAdapter } from "@opennextjs/core/build/adapter.js";
import type { BuildOptions } from "@opennextjs/core/build/helper.js";
import * as buildHelper from "@opennextjs/core/build/helper.js";
import { addDebugFile } from "@opennextjs/core/debug.js";
import type { ContentUpdater } from "@opennextjs/core/plugins/content-updater.js";
import { externalChunksPlugin, inlineRouteHandler } from "@opennextjs/core/plugins/inlineRouteHandlers.js";
import type { NextConfig } from "@opennextjs/core/types/next-types.js";

export type NextAdapterOutput = {
pathname: string;
filePath: string;
assets: Record<string, unknown>;
};

export type NextAdapterOutputs = {
pages: NextAdapterOutput[];
pagesApi: NextAdapterOutput[];
appPages: NextAdapterOutput[];
appRoutes: NextAdapterOutput[];
middleware?: NextAdapterOutput;
};

type NextAdapter = {
name: string;
modifyConfig: (config: NextConfig, { phase }: { phase: string }) => Promise<NextConfig>;
onBuildComplete: (props: {
routes: unknown;
outputs: NextAdapterOutputs;
projectDir: string;
repoRoot: string;
distDir: string;
config: NextConfig;
nextVersion: string;
}) => Promise<void>;
}; //TODO: use the one provided by Next

let buildOpts: buildHelper.BuildOptions;

export default {
name: "OpenNext",
async modifyConfig(nextConfig, { phase }) {
// We have to precompile the cache here, probably compile OpenNext config as well
const { config, buildDir } = await compileOpenNextConfig("open-next.config.ts", {
nodeExternals: undefined,
});

const require = createRequire(import.meta.url);
//TODO: change that
const openNextDistDir = path.dirname(require.resolve("@opennextjs/core/debug.js"));

buildOpts = buildHelper.normalizeOptions(config, openNextDistDir, buildDir);

buildHelper.initOutputDir(buildOpts);

const cache = compileCache(buildOpts);

const packagePath = buildHelper.getPackagePath(buildOpts);

// We then have to copy the cache files to the .next dir so that they are available at runtime
//TODO: use a better path, this one is temporary just to make it work
const tempCachePath = path.join(
buildOpts.outputDir,
"server-functions/default",
packagePath,
".open-next/.build"
);
fs.mkdirSync(tempCachePath, { recursive: true });
fs.copyFileSync(cache.cache, path.join(tempCachePath, "cache.cjs"));
fs.copyFileSync(cache.composableCache, path.join(tempCachePath, "composable-cache.cjs"));

//TODO: We should check the version of Next here, below 16 we'd throw or show a warning
return {
...nextConfig,
cacheHandler: cache.cache, //TODO: compute that here,
cacheHandlers: {
default: cache.composableCache,
remote: cache.composableCache,
},
cacheMaxMemorySize: 0,
experimental: {
...nextConfig.experimental,
trustHostHeader: true,
},
};
import type { NextAdapterOutputs } from "@opennextjs/core/types/adapter.js";

export default buildAdapter((_config, buildOpts: BuildOptions) => ({
defaultOverrides: {
server: {
wrapper: "@opennextjs/aws/overrides/wrappers/aws-lambda-streaming.js",
converter: "@opennextjs/aws/overrides/converters/aws-apigw-v2.js",
incrementalCache: "@opennextjs/aws/overrides/incrementalCache/s3.js",
tagCache: "@opennextjs/aws/overrides/tagCache/dynamodb.js",
queue: "@opennextjs/aws/overrides/queue/sqs.js",
},
revalidation: {
wrapper: "@opennextjs/aws/overrides/wrappers/aws-lambda.js",
converter: "@opennextjs/aws/overrides/converters/sqs-revalidate.js",
},
imageOptimization: {
wrapper: "@opennextjs/aws/overrides/wrappers/aws-lambda.js",
converter: "@opennextjs/aws/overrides/converters/aws-apigw-v2.js",
imageLoader: "@opennextjs/aws/overrides/imageLoader/s3.js",
},
warmer: { wrapper: "@opennextjs/aws/overrides/wrappers/aws-lambda.js" },
tagCache: {
wrapper: "@opennextjs/aws/overrides/wrappers/aws-lambda.js",
tagCache: "@opennextjs/aws/overrides/tagCache/dynamodb.js",
},
middleware: {
wrapper: "@opennextjs/aws/overrides/wrappers/aws-lambda.js",
converter: "@opennextjs/aws/overrides/converters/aws-cloudfront.js",
incrementalCache: "@opennextjs/aws/overrides/incrementalCache/s3-lite.js",
tagCache: "@opennextjs/aws/overrides/tagCache/dynamodb-lite.js",
queue: "@opennextjs/aws/overrides/queue/sqs-lite.js",
},
},
async onBuildComplete(outputs) {
console.log("OpenNext build will start now");

// TODO(vicb): save outputs
addDebugFile(buildOpts, "outputs.json", outputs);

// Compile middleware
await createMiddleware(buildOpts);
console.log("Middleware created");

createStaticAssets(buildOpts);
console.log("Static assets created");

if (buildOpts.config.dangerous?.disableIncrementalCache !== true) {
const { useTagCache } = createCacheAssets(buildOpts);
console.log("Cache assets created");
if (useTagCache) {
await compileTagCacheProvider(buildOpts);
console.log("Tag cache provider compiled");
}
}

await createServerBundle(
buildOpts,
{
additionalPlugins: getAdditionalPluginsFactory(buildOpts, outputs.outputs),
},
outputs.outputs
);

console.log("Server bundle created");
await createRevalidationBundle(buildOpts);
console.log("Revalidation bundle created");
await createImageOptimizationBundle(buildOpts);
console.log("Image optimization bundle created");
await createWarmerBundle(buildOpts);
console.log("Warmer bundle created");
await generateOutput(buildOpts);
console.log("Output generated");
serverBundle: {
externals: ["./middleware.mjs"],
additionalPlugins: (updater: ContentUpdater, outputs: NextAdapterOutputs) => {
const packagePath = buildHelper.getPackagePath(buildOpts);
return [inlineRouteHandler(updater, outputs, packagePath), externalChunksPlugin(outputs, packagePath)];
},
},
} satisfies NextAdapter;

function getAdditionalPluginsFactory(buildOpts: buildHelper.BuildOptions, outputs: NextAdapterOutputs) {
//TODO: we should make this a property of buildOpts
const packagePath = buildHelper.getPackagePath(buildOpts);
return (updater: ContentUpdater) => [
inlineRouteHandler(updater, outputs, packagePath),
externalChunksPlugin(outputs, packagePath),
];
}
}));
10 changes: 0 additions & 10 deletions packages/aws/src/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,8 @@ import path from "node:path";
import url from "node:url";

import { buildNextjsApp, setStandaloneBuildMode } from "@opennextjs/core/build/buildNextApp.js";
import { compileCache } from "@opennextjs/core/build/compileCache.js";
import { compileOpenNextConfig } from "@opennextjs/core/build/compileConfig.js";
import { compileTagCacheProvider } from "@opennextjs/core/build/compileTagCacheProvider.js";
import { createCacheAssets, createStaticAssets } from "@opennextjs/core/build/createAssets.js";
import { createImageOptimizationBundle } from "@opennextjs/core/build/createImageOptimizationBundle.js";
import { createMiddleware } from "@opennextjs/core/build/createMiddleware.js";
import { createRevalidationBundle } from "@opennextjs/core/build/createRevalidationBundle.js";
import { createServerBundle } from "@opennextjs/core/build/createServerBundle.js";
import { createWarmerBundle } from "@opennextjs/core/build/createWarmerBundle.js";
import { generateOutput } from "@opennextjs/core/build/generateOutput.js";
import * as buildHelper from "@opennextjs/core/build/helper.js";
import { patchOriginalNextConfig } from "@opennextjs/core/build/patch/patches/index.js";
import { printHeader, showWarningOnWindows } from "@opennextjs/core/build/utils.js";
import logger from "@opennextjs/core/logger.js";

Expand Down
4 changes: 2 additions & 2 deletions packages/cloudflare/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,14 @@
"esbuild": "catalog:",
"globals": "catalog:",
"mock-fs": "catalog:",
"next": "catalog:",
"next": "catalog:aws",
"picomatch": "^4.0.2",
"rimraf": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:"
},
"peerDependencies": {
"next": "^16.0.10",
"next": "16.2.1",
"wrangler": "catalog:"
}
}
Loading
Loading