Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
173 commits
Select commit Hold shift + click to select a range
8b0f70a
docs: add immutable static assets plan
bestickley Sep 21, 2026
b58e1ea
docs: restructure adapter runtime plan for implementation
bestickley Sep 21, 2026
1b854e5
chore: install deps on worktree entry
bestickley Sep 21, 2026
d231bc5
chore: sync app-playground next-env.d.ts with next build output
bestickley Sep 21, 2026
137ccdc
feat: stage the adapter manifest and deployment root at build time
bestickley Sep 21, 2026
20c092a
feat: resolve requests through @next/routing
bestickley Sep 21, 2026
437ad69
feat: run built middleware through the routing callback
bestickley Sep 21, 2026
5986ba8
feat: serve requests from one runtime core behind two shells
bestickley Sep 21, 2026
9c2f18e
fix: resolve next out of the staged app, not next to the shell
bestickley Sep 21, 2026
e944d0c
fix: render a 404 as the path that was requested
bestickley Sep 21, 2026
3e0f14d
fix: consume the middleware rewrite instead of forwarding it
bestickley Sep 21, 2026
cfa8b6b
feat: deploy the staged adapter tree from all four constructs
bestickley Sep 21, 2026
cb7cf2a
fix: unlink dangling sharp symlinks instead of rmSync-ing them
bestickley Sep 21, 2026
3806ab7
refactor: drop output: "standalone" and the dedicated image function
bestickley Sep 21, 2026
e8eba70
feat: package declared route groups into separate functions
bestickley Sep 21, 2026
23d0fea
fix: build image S3 keys from the asset key prefix, not basePath
bestickley Sep 21, 2026
f5a8367
fix: forward conditional GETs to S3 through API Gateway
bestickley Sep 21, 2026
f6de741
fix: seed the init cache under the route, not the served URL
bestickley Sep 21, 2026
ff5eb24
test: e2e coverage for splitting, middleware on images, and headers
bestickley Sep 21, 2026
092671f
test: e2e coverage for Partial Prerendering
bestickley Sep 21, 2026
6f26429
fix: run Next.js's node-environment bootstrap before any entrypoint
bestickley Sep 21, 2026
85bf9b8
test: official Next.js compatibility harness on regional functions
bestickley Sep 21, 2026
f202afe
refactor: one shared harness stack on NextjsGlobalFunctions
bestickley Sep 22, 2026
97ed7a9
chore: fix worktree hook event name in .claude/settings.json
bestickley Sep 22, 2026
92f8cb6
fix: blame middleware, not `/`, for edge-runtime middleware
bestickley Sep 22, 2026
5b3f04b
test: warm the shared harness stack and run only verified test files
bestickley Sep 22, 2026
02b94d8
docs: record the adapter runtime branch against its exit criteria
bestickley Sep 22, 2026
881817a
Merge remote-tracking branch 'origin/main' into docs/adapter-runtime-…
bestickley Sep 22, 2026
d6ac7fc
chore: self mutation
github-actions[bot] Sep 22, 2026
41f0d20
feat: make adapterPath optional via NEXT_ADAPTER_PATH, reconcile docs
bestickley Sep 22, 2026
2490c2e
chore: fix worktree dependency-install hook
bestickley Sep 22, 2026
b87f91a
fix: keep adapterPath in the examples, document when it's still needed
bestickley Sep 22, 2026
94e85b9
test: widen the compatibility harness manifest to 15 files
bestickley Sep 22, 2026
3989821
fix: patch client fetch even when skipBuild is set
bestickley Sep 22, 2026
d035e3d
test: widen the harness manifest to 17 files, add a coverage record
bestickley Sep 22, 2026
07ddebf
fix: pad empty streamed bodies on Lambda Function URLs too
bestickley Sep 22, 2026
bab4dbc
fix: stop seeding presentational headers into APP_PAGE cache entries
bestickley Sep 22, 2026
6d2f7d1
fix: group the root route's .rsc and segment prerenders with its HTML
bestickley Sep 22, 2026
a469a3f
docs: record every screened harness file, its outcome and its verdict
bestickley Sep 22, 2026
39f6823
docs: record the harness screening funnel in the manifest, and measur…
bestickley Sep 22, 2026
acaf372
fix: give a route param whose name prefixes another its own value
bestickley Sep 22, 2026
9171856
fix: resolve the canonical URL of a `trailingSlash` app
bestickley Sep 22, 2026
65ec780
fix: read back build-time cache entries so `cacheComponents` can prer…
bestickley Sep 22, 2026
ee282b3
docs: record the screening funnel and batch 1's three defects in the …
bestickley Sep 22, 2026
5c024a2
docs: measure the harness's deploy paths, and require a 240s hook tim…
bestickley Sep 22, 2026
47354d2
fix: make tag revalidation reach build-time prerenders
bestickley Sep 22, 2026
c5e8495
fix: invalidate the CDN copy of a revalidated prerender
bestickley Sep 22, 2026
8ae467d
test: screen out `skipDeployment`, which never ran a third of the pool
bestickley Sep 22, 2026
81b398a
fix: partition the cache per deployment, not per BUILD_ID
bestickley Sep 22, 2026
45409e1
fix: drop an optional catchall's param when the request filled none
bestickley Sep 22, 2026
64ad8fe
fix: type a static metadata route from its route, not its `.body` file
bestickley Sep 22, 2026
741f5ad
test: run the ten adapter-gated e2e files, and make PPR responses spl…
bestickley Sep 22, 2026
2854fbf
fix: drop an unfilled optional catchall param, however routing spells it
bestickley Sep 23, 2026
27a8d62
fix: serve a draft-gated prerender, and seed the PPR fallback shells
bestickley Sep 23, 2026
4328be5
test: run the three newly fixed files, verified green deployed
bestickley Sep 23, 2026
c5fcf2e
docs: document the offline repro script and the skip screen's false p…
bestickley Sep 23, 2026
daf0a7b
Merge origin/main (v0.6.2) into docs/adapter-runtime-plan
bestickley Sep 23, 2026
4367af1
fix!: move healthCheckPath to the Containers constructs, invalidate u…
bestickley Sep 23, 2026
52eb40e
fix: keep the adapter bundle parseable
bestickley Sep 23, 2026
094ce81
fix: serve a Pages Router app's own 404 page, and add 15 harness files
bestickley Sep 23, 2026
69bda3c
ci: run the harness weekly on Sunday, not nightly
bestickley Sep 23, 2026
0285b1f
test: screen out mode-gated files, which report a pass without deploying
bestickley Sep 23, 2026
db126fd
fix: serve bundles under a path-style assetPrefix
bestickley Sep 23, 2026
3ba5b83
test: report the deployment ID the build inlined, not the stack name
bestickley Sep 23, 2026
8afc332
fix: invalidate CloudFront for every tag a revalidation touches
bestickley Sep 23, 2026
da35304
fix: keep pruning past a listing page that held no matching key
bestickley Sep 23, 2026
5f4de3c
fix: retry a tag-mapping batch that threw, and say when none were seeded
bestickley Sep 23, 2026
0c97e17
fix: emit each cookie the response carries exactly once
bestickley Sep 23, 2026
504a7d2
fix: answer a static file's own 4xx instead of 500
bestickley Sep 23, 2026
ec6f09d
fix: do not gzip a 206, whose body is a range of the stored bytes
bestickley Sep 23, 2026
92786c3
fix: rejoin repeated request headers with the separator each one takes
bestickley Sep 23, 2026
0b3455f
fix: forget a module load that failed instead of caching the rejection
bestickley Sep 23, 2026
c1cfa57
fix: reject i18n splitting before assigning routes to groups
bestickley Sep 23, 2026
0962565
fix: stage the entrypoint behind a group's prerendered pathname
bestickley Sep 23, 2026
8c3f9ee
fix: validate functionGroups before running the build, not after it
bestickley Sep 23, 2026
88cf5ac
fix: rank CloudFront behaviors by literal prefix, and count every bud…
bestickley Sep 23, 2026
384a06d
fix: route the canonical URL of a trailingSlash app to its function g…
bestickley Sep 23, 2026
ac52704
ci: delete the harness stack by name rather than dropping the age floor
bestickley Sep 23, 2026
8634f47
ci: shard the harness across one stack per shard
bestickley Sep 23, 2026
17f2ac9
ci: build next.js once per harness run, not once per shard
bestickley Sep 23, 2026
43e5939
ci: run the harness every six days, and drop the keep-alive job
bestickley Sep 23, 2026
ca70d22
perf: keep the cache bucket's tags out of every deploy's diff
bestickley Sep 23, 2026
191faa5
docs: record batch 9's verdicts and promote its eleven green files
bestickley Sep 23, 2026
1ee53a7
fix: route a Pages Router home page at `/` instead of `/index`
bestickley Sep 23, 2026
17fb7ed
docs: record batch 10 and promote its fifteen green files
bestickley Sep 23, 2026
12a955a
fix: serve a `public/` file whose name CloudFront cannot spell
bestickley Sep 23, 2026
133ae10
fix: render the app's error page when a route throws
bestickley Sep 23, 2026
1cca298
fix: serve an i18n app's home page instead of redirecting it
bestickley Sep 23, 2026
13e612f
fix: serve a static page's data route instead of 404ing it
bestickley Sep 23, 2026
22be420
chore: self mutation
github-actions[bot] Sep 23, 2026
546ae59
fix: serve bundles under the path an absolute assetPrefix carries
bestickley Sep 23, 2026
4d1cfef
chore: add batch 12's fifty green harness files to the manifest
bestickley Sep 23, 2026
d08f5ab
docs: name the error path a static-file 4xx would otherwise reach
bestickley Sep 23, 2026
4ebd9ea
fix: re-render a tag-revalidated page instead of shell-serving it for…
bestickley Sep 23, 2026
58eb371
chore: self mutation
github-actions[bot] Sep 23, 2026
9883aba
fix: serve an image whose public/ filename needs percent-encoding
bestickley Sep 23, 2026
c8dcc29
chore: exclude a config-loader family a plain next build also fails
bestickley Sep 23, 2026
ddc5aa9
fix: eleven review findings across the runtime, cache, and distribution
bestickley Sep 23, 2026
e327e8e
fix: serve an image whose public/ filename needs percent-encoding
bestickley Sep 23, 2026
d1b47f0
chore: exclude a config-loader family a plain next build also fails
bestickley Sep 23, 2026
4c42331
chore: add batch 14's thirty-two green harness files to the manifest
bestickley Sep 23, 2026
3e3b64e
chore: add batch 15's forty-eight green harness files to the manifest
bestickley Sep 23, 2026
2c0c914
fix: start a turbopack web worker whose bootstrap chunk carries the f…
bestickley Sep 23, 2026
441e1df
fix: size the init-cache deployment lambda's /tmp to the cache it unp…
bestickley Sep 23, 2026
ac7c3db
perf: store cached buffers as base64 instead of per-byte JSON arrays
bestickley Sep 23, 2026
e09f662
chore: add batch 16's fifty green harness files to the manifest
bestickley Sep 23, 2026
c25403b
docs: describe the base64 cache format and the init cache deployment'…
bestickley Sep 23, 2026
70c83ce
fix: seed the Pages Router's prerenders, including each dynamic route…
bestickley Sep 23, 2026
b5d9808
fix(harness): keep the logs script's output to what next.js treats as…
bestickley Sep 24, 2026
ad5d824
fix(harness): install and build with the package manager the fixture …
bestickley Sep 24, 2026
1601bc6
fix: hand the resolved query to the entrypoint so a self-matching rew…
bestickley Sep 24, 2026
06e7e60
fix: redirect a path with repeated slashes or a backslash, as next.js…
bestickley Sep 24, 2026
571e50b
fix: collapse repeated slashes at the edge, which origin access contr…
bestickley Sep 24, 2026
2183e0a
fix(harness): install with npm's default cache freshness, not --prefe…
bestickley Sep 24, 2026
48ea26e
docs: correct defect 31 - a bare `//` does reach the CloudFront function
bestickley Sep 24, 2026
6ec8733
chore: add batch 17's thirty-nine green harness files to the manifest
bestickley Sep 24, 2026
776c3fd
fix: the remaining eleven review findings
bestickley Sep 24, 2026
7b06a39
Merge docs/adapter-runtime-plan into fix/review-findings-2
bestickley Sep 24, 2026
fa60517
fix: skip a build-time `notFound` prerender rather than seeding it as…
bestickley Sep 24, 2026
3cba79f
fix: answer `res.revalidate()` in process rather than letting it throw
bestickley Sep 24, 2026
9faf85a
docs: record batch 18's verdicts, and state the payload-hash constraint
bestickley Sep 24, 2026
c6b1bd2
docs: record batch 18's progress entry
bestickley Sep 24, 2026
d8e04b5
chore: add batch 18's forty-one green harness files to the manifest
bestickley Sep 24, 2026
d2d2e2d
chore: promote the two fixed files, and close the candidate pool
bestickley Sep 24, 2026
566fc98
fix(harness): let a fixture that pins npm run next.js's hardcoded `pn…
bestickley Sep 24, 2026
bd7b2f2
docs: record that the harness candidate pool is closed
bestickley Sep 24, 2026
90dd78e
Merge branch 'docs/adapter-runtime-plan' into fix/review-findings-2
bestickley Sep 24, 2026
dfd61b8
ci: raise GitHubActionRole's MaxSessionDuration to the 3h the harness…
bestickley Sep 24, 2026
9e76d8b
fix: check a revalidated fetch entry against the request's implicit tags
bestickley Sep 24, 2026
5d03eb6
docs: correct two harness-coverage entries
bestickley Sep 24, 2026
a5d678b
fix: pass a route param containing an encoded slash out of band
bestickley Sep 24, 2026
5d677a7
docs: link the two upstream verdicts to their filed issues
bestickley Sep 24, 2026
185ecc9
docs: show how a function group owns a page and its subtree
bestickley Sep 24, 2026
f632bc2
docs: say the configuration env vars are runtime and show how to set …
bestickley Sep 24, 2026
5252283
ci: cover the zero-config NEXT_ADAPTER_PATH path with a packed tarball
bestickley Sep 24, 2026
bd97918
docs: close three stale open items in the progress log
bestickley Sep 24, 2026
d163a3a
fix(cache): delete an entry's tag mapping rows when the entry is deleted
bestickley Sep 24, 2026
e7eb593
test(e2e): run the suite in parallel, keeping isr and revalidation se…
bestickley Sep 24, 2026
dc087fc
ci(e2e): tell the suite which deployment type it is running against
bestickley Sep 24, 2026
1362c9b
fix: stop warning that a regional app's bundles will 404 when it only…
bestickley Sep 24, 2026
67d0aa1
chore(app-playground): commit the agent files next dev writes
bestickley Sep 24, 2026
e9dc52d
test(e2e): back-fill the compatibility harness's findings on all four…
bestickley Sep 24, 2026
3cbc374
docs: record the cross-type back-fill, and defect 34
bestickley Sep 24, 2026
e533dd9
test(e2e): serve a top-level public/ file with a space in its name
bestickley Sep 24, 2026
4f4e159
Merge branch 'docs/adapter-runtime-plan' into worktree-e2e-coverage-e…
bestickley Sep 24, 2026
7f5064d
fix(regional-functions): hand Next.js the unstripped API Gateway path…
bestickley Sep 24, 2026
ae7a0fe
test(harness): run the Next.js suite on NextjsRegionalFunctions behin…
bestickley Sep 24, 2026
ac6ea1f
fix(regional-functions): derive the basePath prop from the app minus …
bestickley Sep 25, 2026
adae659
chore: self mutation
github-actions[bot] Sep 25, 2026
6c8a31d
test(e2e): drop the revalidation case that re-tests tests 1 and 3
bestickley Sep 25, 2026
00514ed
test: point the fixture capture at sync-cdk-nextjs and keep the param…
bestickley Sep 25, 2026
1050044
test(e2e): cover config redirects, headers and a self-matching before…
bestickley Sep 25, 2026
fc3b370
test: regenerate adapter fixtures with the params routes and config r…
bestickley Sep 25, 2026
f17b54f
docs: record that defect 29 is back-filled through config-routing.tes…
bestickley Sep 25, 2026
ce1be91
fix(distribution): match a public/ name CloudFront decodes with one ?…
bestickley Sep 25, 2026
4716bf6
fix(adapter): list public/ in the manifest so NextjsRegionalContainer…
bestickley Sep 25, 2026
d168974
test(e2e): send the regional-containers gating cookie from the jar, a…
bestickley Sep 25, 2026
aa56ca2
test(e2e): assert what plain HTTP and a Function URL can deliver, ins…
bestickley Sep 25, 2026
e24a677
docs: record defects 37 and 38 from the four-type e2e back-fill
bestickley Sep 25, 2026
98aaf5a
test(e2e): stop the request-method cases racing the fetch patch and C…
bestickley Sep 25, 2026
400a94f
fix(distribution)!: don't cache a dynamic response that sends no Cach…
bestickley Sep 25, 2026
bf3663a
fix(runtime)!: serve public/ from disk at cold start, as next start does
bestickley Sep 25, 2026
d89546f
fix(distribution): skip all-wildcard public/ patterns and keep maxTtl…
bestickley Sep 25, 2026
5e4ebc1
fix(adapter): reject function-group routes a CloudFront path pattern …
bestickley Sep 25, 2026
18685b8
test(e2e): keep draft mode on loopback, drop the HEAD cache-buster, g…
bestickley Sep 25, 2026
08c5e0f
docs: record the defect 37/38 review follow-up; tidy the fixture capt…
bestickley Sep 25, 2026
5c2fa79
test(e2e): accept a CloudFront hit as the stale ISR response, whateve…
bestickley Sep 25, 2026
490c2be
test(e2e): assert ssg renders on the page's timestamp, not its relati…
bestickley Sep 25, 2026
5c75d1b
docs: replace the plan and progress logs with docs/adapter-runtime.md
bestickley Sep 25, 2026
0b508c0
fix(runtime): keep Set-Cookie intact, clear stale headers on errors, …
bestickley Sep 25, 2026
e217ad5
fix(adapter): ship error pages in every group, derive cache kinds fro…
bestickley Sep 25, 2026
520c81b
fix(constructs): resolve TTLs like CDK, scope pruning to _next/, guar…
bestickley Sep 25, 2026
8dfde5d
fix(cache): check revalidation on memory hits, send one bounded inval…
bestickley Sep 25, 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
29 changes: 29 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"hooks": {
"PostToolUse": [
{
"matcher": "EnterWorktree",
"hooks": [
{
"type": "command",
"command": "D=$(pwd); case \"$D\" in */.claude/worktrees/*) ;; *) exit 0 ;; esac; if [ ! -f \"$D/package.json\" ] || [ -d \"$D/node_modules\" ]; then exit 0; fi; LOG=/tmp/claude-worktree-setup.log; if pnpm install > \"$LOG\" 2>&1; then echo '{\"systemMessage\": \"Worktree deps installed: pnpm install\"}'; else echo \"{\\\"systemMessage\\\": \\\"Worktree dependency install failed - see $LOG\\\"}\"; fi",
"timeout": 600,
"statusMessage": "Installing worktree dependencies (pnpm install)..."
}
]
}
],
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "D=$(pwd); case \"$D\" in */.claude/worktrees/*) ;; *) exit 0 ;; esac; if [ ! -f \"$D/package.json\" ] || [ -d \"$D/node_modules\" ]; then exit 0; fi; LOG=/tmp/claude-worktree-setup.log; if pnpm install > \"$LOG\" 2>&1; then echo '{\"systemMessage\": \"Worktree deps installed: pnpm install\"}'; else echo \"{\\\"systemMessage\\\": \\\"Worktree dependency install failed - see $LOG\\\"}\"; fi",
"timeout": 600,
"statusMessage": "Installing worktree dependencies (pnpm install)..."
}
]
}
]
}
}
2 changes: 1 addition & 1 deletion .gitattributes

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

48 changes: 48 additions & 0 deletions .github/actions/build-nextjs/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: "Build next.js for the harness"
description: >
Checks out vercel/next.js at a ref and builds it, plus the Playwright browser
its e2e suite drives. This is the slow thing the harness workflow caches, so it
runs on the cache-miss path only - from the `nextjs` job that populates the
cache, and from a shard as a fallback if the entry went away mid-run.

inputs:
ref:
description: "vercel/next.js ref to check out"
required: true
path:
description: "Directory to check out into, relative to the workspace. Must match the cached path."
required: false
default: nextjs

runs:
using: composite
steps:
- name: Checkout vercel/next.js
uses: actions/checkout@v4
with:
repository: vercel/next.js
ref: ${{ inputs.ref }}
path: ${{ inputs.path }}
fetch-depth: 1

- name: Install and build next.js
working-directory: ${{ inputs.path }}
shell: bash
# The harness runs out of a next.js checkout: `run-tests.js` and the
# `test/lib` helpers are repo files, not published ones. The second
# `pnpm install` relinks the workspace against what `pnpm build` just
# produced.
run: |
corepack enable
pnpm install
pnpm build
pnpm install

- name: Install the Playwright browser
working-directory: ${{ inputs.path }}
shell: bash
# Downloads into ~/.cache/ms-playwright, which the workflow caches
# alongside the checkout. Deliberately without `--with-deps`: the system
# libraries that installs are apt packages outside any cacheable path, so
# the job that actually drives the browser installs those itself.
run: pnpm playwright install chromium
7 changes: 7 additions & 0 deletions .github/actions/run-e2e-tests-on-example/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ runs:
run: cd examples/e2e-tests && pnpm install-browser
- name: Deploy and Run Tests
shell: bash
# Several behaviours are answered by different infrastructure per deployment
# type - a top-level `public/` file with a space in its name is a 404 on API
# Gateway by design, a repeated slash is collapsed by a CloudFront function
# only when the compute is a Lambda - and the tests assert the divergence
# rather than skipping it. The example directory *is* the type.
env:
E2E_NEXTJS_TYPE: ${{ inputs.example_directory }}
run: |
cd examples/${{ inputs.example_directory }}
pnpm run deploy:ci
Expand Down
Loading
Loading