Skip to content

Commit f55af26

Browse files
create an open-next.config.ts file for the user in case one is not already present
1 parent 4341c70 commit f55af26

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

packages/cloudflare/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@
6666
"dependencies": {
6767
"@opennextjs/aws": "https://pkg.pr.new/@opennextjs/aws@678",
6868
"ts-morph": "catalog:",
69-
"@dotenvx/dotenvx": "catalog:"
69+
"@dotenvx/dotenvx": "catalog:",
70+
"enquirer": "^2.4.1"
7071
},
7172
"peerDependencies": {
7273
"wrangler": "catalog:"

packages/cloudflare/src/cli/build/index.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { cpSync } from "node:fs";
1+
import { cpSync, existsSync } from "node:fs";
22
import { createRequire } from "node:module";
33
import { dirname, join } from "node:path";
44

@@ -11,6 +11,7 @@ import * as buildHelper from "@opennextjs/aws/build/helper.js";
1111
import { printHeader, showWarningOnWindows } from "@opennextjs/aws/build/utils.js";
1212
import logger from "@opennextjs/aws/logger.js";
1313
import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
14+
import Enquirer from "enquirer";
1415

1516
import type { ProjectOptions } from "../config";
1617
import { containsDotNextDir, getConfig } from "../config";
@@ -34,6 +35,8 @@ export async function build(projectOpts: ProjectOptions): Promise<void> {
3435
const require = createRequire(import.meta.url);
3536
const openNextDistDir = dirname(require.resolve("@opennextjs/aws/index.js"));
3637

38+
await createOpenNextConfigIfNotExistent(baseDir);
39+
3740
const { config, buildDir } = await compileOpenNextConfig(baseDir);
3841

3942
ensureCloudflareConfig(config);
@@ -94,6 +97,34 @@ export async function build(projectOpts: ProjectOptions): Promise<void> {
9497
logger.info("OpenNext build complete.");
9598
}
9699

100+
/**
101+
* Creates a `open-next.config.ts` file for the user if it doesn't exist, but only after getting the user's confirmation.
102+
*
103+
* If the users refuses an error is thrown (since the file is mandatory).
104+
*
105+
* @param baseDir the Next.js app root folder
106+
*/
107+
async function createOpenNextConfigIfNotExistent(baseDir: string): Promise<void> {
108+
const openNextConfigPath = join(baseDir, "open-next.config.ts");
109+
110+
if (!existsSync(openNextConfigPath)) {
111+
const questionName = "create-open-next-config";
112+
const answer = (
113+
(await Enquirer.prompt({
114+
name: "create-open-next-config",
115+
message: "Missing required `open-next.config.ts` file, do you want to create one?",
116+
type: "confirm",
117+
initial: "y",
118+
})) as { [questionName]: boolean }
119+
)[questionName];
120+
if (!answer) {
121+
throw new Error("A `open-next.config.ts` file is mandatory, aborting!");
122+
}
123+
124+
cpSync(`${import.meta.dirname}/templates/defaults/open-next.config.ts`, openNextConfigPath);
125+
}
126+
}
127+
97128
/**
98129
* Ensures open next is configured for cloudflare.
99130
*
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const config = {
2+
default: {
3+
override: {
4+
wrapper: "cloudflare-node",
5+
converter: "edge",
6+
incrementalCache: "dummy",
7+
tagCache: "dummy",
8+
queue: "dummy",
9+
},
10+
},
11+
12+
middleware: {
13+
external: true,
14+
override: {
15+
wrapper: "cloudflare-edge",
16+
converter: "edge",
17+
proxyExternalRequest: "fetch",
18+
},
19+
},
20+
21+
dangerous: {
22+
enableCacheInterception: false,
23+
},
24+
};
25+
26+
export default config;

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)