Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
81aae0e
feat: auto-populating d1 cache data
james-elicx Mar 3, 2025
c19f43f
checks for output directory / enabled
james-elicx Mar 4, 2025
697e2f8
Update packages/cloudflare/src/cli/build/utils/populate-cache.ts
james-elicx Mar 4, 2025
87b39b0
add suggestions
james-elicx Mar 8, 2025
76e2c5d
rename onlyPopulate to onlyPopulateWithoutBuilding
james-elicx Mar 8, 2025
46d8047
feat: r2 adapter for the incremental cache
james-elicx Mar 9, 2025
ecc83aa
directory -> prefix
james-elicx Mar 12, 2025
c13ca95
split r2 cache and regional cache into separate things
james-elicx Mar 13, 2025
28c27a9
add timeout in revalidate path test as it runs too fast locally
james-elicx Mar 13, 2025
e018c71
incorporate suggestions
james-elicx Mar 13, 2025
a2b2667
lazily update the regional cache in the background via option
james-elicx Mar 13, 2025
03ffc01
add comments and make the lazy boolean non-optional
james-elicx Mar 13, 2025
3c3b7f3
add warning comment
james-elicx Mar 13, 2025
d676d1d
add comments to env vars
james-elicx Mar 13, 2025
0c1887e
change lazy update defaults
james-elicx Mar 14, 2025
5ff320b
change fallback ttl to 30 mins
james-elicx Mar 20, 2025
0da9705
move opennext setup to be universal and add commands
james-elicx Mar 20, 2025
497855a
move populate cache location
james-elicx Mar 20, 2025
3484a59
cleanup and move around some utils
james-elicx Mar 20, 2025
5ad723e
add other commands
james-elicx Mar 20, 2025
1aafacd
update command usage
james-elicx Mar 20, 2025
655d460
changeset
james-elicx Mar 20, 2025
64baa1a
fix import
james-elicx Mar 20, 2025
2247ed4
add missing passthrough args
james-elicx Mar 20, 2025
bf9d7da
resolve conflicts manually
james-elicx Mar 21, 2025
631ce29
update projects
james-elicx Mar 21, 2025
a147d77
Update examples/e2e/app-router/wrangler.jsonc
james-elicx Mar 21, 2025
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
12 changes: 12 additions & 0 deletions .changeset/silly-jokes-hammer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@opennextjs/cloudflare": minor
---

feat: commands for cli actions

The OpenNext Cloudflare CLI now uses the following commands;

- `build`: build the application
- `populateCache`: populate either the local or remote cache
- `preview`: populate the local cache and start a dev server
- `deploy`: populate the remote cache and deploy to production
5 changes: 3 additions & 2 deletions examples/bugs/gh-119/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "pnpm opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts",
"cf-typegen": "wrangler types --env-interface CloudflareEnv"
},
Expand Down
5 changes: 3 additions & 2 deletions examples/bugs/gh-219/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm run build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts",
"deploy:worker": "pnpm run build:worker && pnpm wrangler deploy"
},
Expand Down
5 changes: 3 additions & 2 deletions examples/bugs/gh-223/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm run build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts",
"deploy:worker": "pnpm run build:worker && pnpm wrangler deploy"
},
Expand Down
4 changes: 2 additions & 2 deletions examples/common/config-e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ export function configurePlaywright(
if (isWorker) {
if (isCI) {
// Do not build on CI - there is a preceding build step
command = `pnpm wrangler dev --port ${port} --inspector-port ${inspectorPort}`;
command = `pnpm preview:worker -- --port ${port} --inspector-port ${inspectorPort}`;
timeout = 100_000;
} else {
timeout = 500_000;
command = `pnpm preview --port ${port} --inspector-port ${inspectorPort}`;
command = `pnpm preview -- --port ${port} --inspector-port ${inspectorPort}`;
}
} else {
timeout = 100_000;
Expand Down
5 changes: 3 additions & 2 deletions examples/create-next-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/e2e/app-pages-router/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
"start": "next start --port 3003",
"lint": "next lint",
"clean": "rm -rf .turbo node_modules .next .open-next",
"build:worker": "pnpm opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/e2e/app-router/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
"lint": "next lint",
"clean": "rm -rf .turbo node_modules .next .open-next",
"d1:clean": "wrangler d1 execute NEXT_CACHE_D1 --command \"DROP TABLE IF EXISTS tags; DROP TABLE IF EXISTS revalidations\"",
"build:worker": "pnpm d1:clean && pnpm opennextjs-cloudflare --populateCache=local",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm d1:clean && pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/e2e/pages-router/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
"start": "next start --port 3002",
"lint": "next lint",
"clean": "rm -rf .turbo node_modules .next .open-next",
"build:worker": "pnpm opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/middleware/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "pnpm opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts",
"e2e:dev": "playwright test -c e2e/playwright.dev.config.ts"
},
Expand Down
5 changes: 3 additions & 2 deletions examples/next-partial-prerendering/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
"build": "next build",
"dev": "next dev --turbo",
"start": "next start",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev"
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker"
},
"dependencies": {
"@heroicons/react": "2.1.5",
Expand Down
5 changes: 3 additions & 2 deletions examples/overrides/d1-tag-next/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
"lint": "next lint",
"d1:clean": "wrangler d1 execute NEXT_CACHE_D1 --command \"DROP TABLE IF EXISTS revalidations\"",
"d1:setup": "wrangler d1 execute NEXT_CACHE_D1 --command \"CREATE TABLE IF NOT EXISTS revalidations (tag TEXT NOT NULL, revalidatedAt INTEGER NOT NULL, UNIQUE(tag) ON CONFLICT REPLACE);\"",
"build:worker": "opennextjs-cloudflare && pnpm d1:clean && pnpm d1:setup",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm d1:clean && pnpm opennextjs-cloudflare build && pnpm d1:setup",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/overrides/memory-queue/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/overrides/r2-incremental-cache/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
"start": "next start",
"lint": "next lint",
"d1:clean": "wrangler d1 execute NEXT_CACHE_D1 --command \"DROP TABLE IF EXISTS tags; DROP TABLE IF EXISTS revalidations\"",
"build:worker": "pnpm d1:clean && pnpm opennextjs-cloudflare --populateCache=local",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm d1:clean && pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/playground14/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "pnpm opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts",
"e2e:dev": "playwright test -c e2e/playwright.dev.config.ts",
"cf-typegen": "wrangler types --env-interface CloudflareEnv"
Expand Down
5 changes: 3 additions & 2 deletions examples/playground15/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "pnpm opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts",
"e2e:dev": "playwright test -c e2e/playwright.dev.config.ts",
"cf-typegen": "wrangler types --env-interface CloudflareEnv"
Expand Down
5 changes: 3 additions & 2 deletions examples/ssg-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev",
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker",
"e2e": "playwright test -c e2e/playwright.config.ts"
},
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions examples/vercel-blog-starter/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
"dev": "next",
"build": "next build",
"start": "next start",
"build:worker": "opennextjs-cloudflare",
"preview": "pnpm build:worker && pnpm wrangler dev"
"build:worker": "pnpm opennextjs-cloudflare build",
"preview:worker": "pnpm opennextjs-cloudflare preview",
"preview": "pnpm build:worker && pnpm preview:worker"
},
"dependencies": {
"classnames": "^2.5.1",
Expand Down
5 changes: 3 additions & 2 deletions examples/vercel-commerce/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
"prettier": "prettier --write --ignore-unknown .",
"prettier:check": "prettier --check --ignore-unknown .",
"test": "pnpm prettier:check",
"tofix-build:worker": "opennextjs-cloudflare",
"tofix-preview": "pnpm build:worker && pnpm wrangler dev"
"tofix-build:worker": "pnpm opennextjs-cloudflare build",
"tofix-preview:worker": "pnpm opennextjs-cloudflare preview",
"tofix-preview": "pnpm build:worker && pnpm preview:worker"
},
"dependencies": {
"@headlessui/react": "^2.1.2",
Expand Down
16 changes: 8 additions & 8 deletions packages/cloudflare/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ Run the following commands to preview the production build of your application l
- build the app and adapt it for Cloudflare

```bash
npx opennextjs-cloudflare
npx opennextjs-cloudflare build
# or
pnpm opennextjs-cloudflare
pnpm opennextjs-cloudflare build
# or
yarn opennextjs-cloudflare
yarn opennextjs-cloudflare build
# or
bun opennextjs-cloudflare
bun opennextjs-cloudflare build
```

- Preview the app in Wrangler
Expand All @@ -47,11 +47,11 @@ Deploy your application to production with the following:
- build the app and adapt it for Cloudflare

```bash
npx opennextjs-cloudflare && npx wrangler deploy
npx opennextjs-cloudflare build && npx opennextjs-cloudflare deploy
# or
pnpm opennextjs-cloudflare && pnpm wrangler deploy
pnpm opennextjs-cloudflare build && pnpm opennextjs-cloudflare deploy
# or
yarn opennextjs-cloudflare && yarn wrangler deploy
yarn opennextjs-cloudflare build && yarn opennextjs-cloudflare deploy
# or
bun opennextjs-cloudflare && bun wrangler deploy
bun opennextjs-cloudflare build && bun opennextjs-cloudflare deploy
```
108 changes: 49 additions & 59 deletions packages/cloudflare/src/cli/args.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,71 +2,61 @@ import { mkdirSync, type Stats, statSync } from "node:fs";
import { resolve } from "node:path";
import { parseArgs } from "node:util";

import type { CacheBindingMode } from "./build/utils/index.js";
import { isCacheBindingMode } from "./build/utils/index.js";
import { isWranglerTarget, WranglerTarget } from "./utils/run-wrangler.js";

export function getArgs(): {
skipNextBuild: boolean;
skipWranglerConfigCheck: boolean;
outputDir?: string;
minify: boolean;
populateCache?: { mode: CacheBindingMode; onlyPopulateWithoutBuilding: boolean };
} {
const { skipBuild, skipWranglerConfigCheck, output, noMinify, populateCache, onlyPopulateCache } =
parseArgs({
options: {
skipBuild: {
type: "boolean",
short: "s",
default: false,
},
output: {
type: "string",
short: "o",
},
noMinify: {
type: "boolean",
default: false,
},
skipWranglerConfigCheck: {
type: "boolean",
default: false,
},
populateCache: {
type: "string",
},
onlyPopulateCache: {
type: "boolean",
default: false,
},
},
allowPositionals: false,
}).values;
export type Arguments = (
| {
command: "build";
skipNextBuild: boolean;
skipWranglerConfigCheck: boolean;
minify: boolean;
}
| { command: "preview" | "deploy"; passthroughArgs: string[] }
| { command: "populateCache"; target: WranglerTarget }
) & { outputDir?: string };

const outputDir = output ? resolve(output) : undefined;
export function getArgs(): Arguments {
const { positionals, values } = parseArgs({
options: {
skipBuild: { type: "boolean", short: "s", default: false },
output: { type: "string", short: "o" },
noMinify: { type: "boolean", default: false },
skipWranglerConfigCheck: { type: "boolean", default: false },
},
allowPositionals: true,
});

if (outputDir) {
assertDirArg(outputDir, "output", true);
}
const outputDir = values.output ? resolve(values.output) : undefined;
if (outputDir) assertDirArg(outputDir, "output", true);

if (
(populateCache !== undefined || onlyPopulateCache) &&
(!populateCache?.length || !isCacheBindingMode(populateCache))
) {
throw new Error(`Error: missing mode for populate cache flag, expected 'local' | 'remote'`);
switch (positionals[0]) {
case "build":
return {
command: "build",
outputDir,
skipNextBuild:
values.skipBuild || ["1", "true", "yes"].includes(String(process.env.SKIP_NEXT_APP_BUILD)),
skipWranglerConfigCheck:
values.skipWranglerConfigCheck ||
["1", "true", "yes"].includes(String(process.env.SKIP_WRANGLER_CONFIG_CHECK)),
minify: !values.noMinify,
};
case "preview":
case "deploy":
return { command: positionals[0], outputDir, passthroughArgs: getPassthroughArgs() };
case "populateCache":
if (!isWranglerTarget(positionals[1])) {
throw new Error(`Error: invalid target for populating the cache, expected 'local' | 'remote'`);
}
return { command: "populateCache", outputDir, target: positionals[1] };
default:
throw new Error("Error: invalid command, expected 'build' | 'preview' | 'deploy' | 'populateCache'");
}
}

return {
outputDir,
skipNextBuild: skipBuild || ["1", "true", "yes"].includes(String(process.env.SKIP_NEXT_APP_BUILD)),
skipWranglerConfigCheck:
skipWranglerConfigCheck ||
["1", "true", "yes"].includes(String(process.env.SKIP_WRANGLER_CONFIG_CHECK)),
minify: !noMinify,
populateCache: populateCache
? { mode: populateCache, onlyPopulateWithoutBuilding: !!onlyPopulateCache }
: undefined,
};
function getPassthroughArgs() {
const passthroughPos = process.argv.indexOf("--");
return passthroughPos === -1 ? [] : process.argv.slice(passthroughPos + 1);
}

function assertDirArg(path: string, argName?: string, make?: boolean) {
Expand Down
Loading