@wular/pnext 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1992
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1897
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +827 -815
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -8,36 +8,36 @@
8
8
  // Next's fetchExternalImage / fetchInternalImage exactly.
9
9
  // ---------------------------------------------------------------------------
10
10
 
11
- import { lookup } from 'node:dns/promises';
12
- import { isIP } from 'node:net';
13
- import { getHash } from './cache';
11
+ import { lookup } from 'node:dns/promises'
12
+ import { isIP } from 'node:net'
13
+ import { getHash } from './cache'
14
14
 
15
15
  export class ImageError extends Error {
16
- statusCode: number;
16
+ statusCode: number
17
17
  constructor(statusCode: number, message: string) {
18
- super(message);
18
+ super(message)
19
19
  // Ensure an error status is used > 400 (Next normalizes 1xx-3xx to 500).
20
- this.statusCode = statusCode >= 400 ? statusCode : 500;
20
+ this.statusCode = statusCode >= 400 ? statusCode : 500
21
21
  }
22
22
  }
23
23
 
24
24
  export interface ImageUpstream {
25
- buffer: Buffer;
26
- contentType: string | null;
27
- cacheControl: string | null;
28
- etag: string;
25
+ buffer: Buffer
26
+ contentType: string | null
27
+ cacheControl: string | null
28
+ etag: string
29
29
  }
30
30
 
31
31
  /** Upstream etag when present (base64url so it is filename-safe), else a content hash. */
32
32
  export function extractEtag(etag: string | null | undefined, buffer: Buffer): string {
33
- if (etag) return Buffer.from(etag).toString('base64url');
34
- return getHash([buffer]);
33
+ if (etag) return Buffer.from(etag).toString('base64url')
34
+ return getHash([buffer])
35
35
  }
36
36
 
37
37
  function isPrivateIp(ip: string): boolean {
38
38
  if (isIP(ip) === 4) {
39
- const parts = ip.split('.').map(Number);
40
- const [a = -1, b = -1] = parts;
39
+ const parts = ip.split('.').map(Number)
40
+ const [a = -1, b = -1] = parts
41
41
  return (
42
42
  a === 0 ||
43
43
  a === 10 ||
@@ -46,9 +46,9 @@ function isPrivateIp(ip: string): boolean {
46
46
  (a === 172 && b >= 16 && b <= 31) ||
47
47
  (a === 192 && b === 168) ||
48
48
  (a === 169 && b === 254)
49
- );
49
+ )
50
50
  }
51
- const lower = ip.toLowerCase();
51
+ const lower = ip.toLowerCase()
52
52
  return (
53
53
  lower === '::' ||
54
54
  lower === '::1' ||
@@ -60,11 +60,11 @@ function isPrivateIp(ip: string): boolean {
60
60
  lower.startsWith('feb') ||
61
61
  lower.startsWith('::ffff:127.') ||
62
62
  lower === 'localhost'
63
- );
63
+ )
64
64
  }
65
65
 
66
66
  function isRedirect(status: number): boolean {
67
- return [301, 302, 303, 307, 308].includes(status);
67
+ return [301, 302, 303, 307, 308].includes(status)
68
68
  }
69
69
 
70
70
  async function readBodyWithLimit(
@@ -72,21 +72,21 @@ async function readBodyWithLimit(
72
72
  maximumResponseBody: number,
73
73
  onExceeded: () => never,
74
74
  ): Promise<Buffer> {
75
- const chunks: Buffer[] = [];
76
- let totalSize = 0;
77
- const reader = body.getReader();
75
+ const chunks: Buffer[] = []
76
+ let totalSize = 0
77
+ const reader = body.getReader()
78
78
  for (;;) {
79
- const { done, value } = await reader.read();
80
- if (done) break;
81
- const chunk = Buffer.from(value);
82
- totalSize += chunk.byteLength;
79
+ const { done, value } = await reader.read()
80
+ if (done) break
81
+ const chunk = Buffer.from(value)
82
+ totalSize += chunk.byteLength
83
83
  if (totalSize > maximumResponseBody) {
84
- await reader.cancel().catch(() => undefined);
85
- onExceeded();
84
+ await reader.cancel().catch(() => undefined)
85
+ onExceeded()
86
86
  }
87
- chunks.push(chunk);
87
+ chunks.push(chunk)
88
88
  }
89
- return Buffer.concat(chunks);
89
+ return Buffer.concat(chunks)
90
90
  }
91
91
 
92
92
  export async function fetchExternalImage(
@@ -96,15 +96,15 @@ export async function fetchExternalImage(
96
96
  count: number,
97
97
  ): Promise<ImageUpstream> {
98
98
  if (!dangerouslyAllowLocalIP) {
99
- const { hostname } = new URL(href);
100
- let ips = [hostname];
99
+ const { hostname } = new URL(href)
100
+ let ips = [hostname]
101
101
  if (!isIP(hostname)) {
102
102
  const records = await lookup(hostname, { family: 0, all: true }).catch(() => [
103
103
  { address: hostname },
104
- ]);
105
- ips = records.map(record => record.address);
104
+ ])
105
+ ips = records.map(record => record.address)
106
106
  }
107
- const privateIps = ips.filter(ip => isPrivateIp(ip));
107
+ const privateIps = ips.filter(ip => isPrivateIp(ip))
108
108
  if (privateIps.length > 0) {
109
109
  console.error(
110
110
  'upstream image',
@@ -112,60 +112,57 @@ export async function fetchExternalImage(
112
112
  'hostname resolved to private IP',
113
113
  JSON.stringify(privateIps),
114
114
  'If this is expected and you understand SSRF risk, use images.dangerouslyAllowLocalIP = true to continue.',
115
- );
116
- throw new ImageError(400, '"url" parameter is not allowed');
115
+ )
116
+ throw new ImageError(400, '"url" parameter is not allowed')
117
117
  }
118
118
  }
119
119
 
120
120
  const res = await fetch(href, {
121
121
  signal: AbortSignal.timeout(7_000),
122
122
  redirect: 'manual',
123
- }).catch(err => err as Error);
123
+ }).catch(err => err as Error)
124
124
 
125
125
  if (res instanceof Error) {
126
- const err = res;
126
+ const err = res
127
127
  if (err.name === 'TimeoutError' || err.name === 'AbortError') {
128
- console.error('upstream image response timed out for', href);
129
- throw new ImageError(504, '"url" parameter is valid but upstream response timed out');
128
+ console.error('upstream image response timed out for', href)
129
+ throw new ImageError(504, '"url" parameter is valid but upstream response timed out')
130
130
  }
131
- throw err;
131
+ throw err
132
132
  }
133
133
 
134
- const locationHeader = res.headers.get('Location');
134
+ const locationHeader = res.headers.get('Location')
135
135
  if (isRedirect(res.status) && locationHeader && URL.canParse(locationHeader, href)) {
136
- await res.body?.cancel().catch(() => undefined);
136
+ await res.body?.cancel().catch(() => undefined)
137
137
  if (count === 0) {
138
- console.error('upstream image response had too many redirects', href);
139
- throw new ImageError(508, '"url" parameter is valid but upstream response is invalid');
138
+ console.error('upstream image response had too many redirects', href)
139
+ throw new ImageError(508, '"url" parameter is valid but upstream response is invalid')
140
140
  }
141
- const redirect = new URL(locationHeader, href).href;
142
- return fetchExternalImage(redirect, dangerouslyAllowLocalIP, maximumResponseBody, count - 1);
141
+ const redirect = new URL(locationHeader, href).href
142
+ return fetchExternalImage(redirect, dangerouslyAllowLocalIP, maximumResponseBody, count - 1)
143
143
  }
144
144
 
145
145
  if (!res.ok) {
146
- console.error('upstream image response failed for', href, res.status);
147
- throw new ImageError(
148
- res.status,
149
- '"url" parameter is valid but upstream response is invalid',
150
- );
146
+ console.error('upstream image response failed for', href, res.status)
147
+ throw new ImageError(res.status, '"url" parameter is valid but upstream response is invalid')
151
148
  }
152
149
 
153
150
  if (!res.body) {
154
- console.error('upstream image response is empty for', href);
155
- throw new ImageError(400, '"url" parameter is valid but upstream response is invalid');
151
+ console.error('upstream image response is empty for', href)
152
+ throw new ImageError(400, '"url" parameter is valid but upstream response is invalid')
156
153
  }
157
154
 
158
155
  const buffer = await readBodyWithLimit(res.body, maximumResponseBody, () => {
159
- console.error('upstream image response exceeded maximum size for', href);
160
- throw new ImageError(413, '"url" parameter is valid but upstream response is invalid');
161
- });
156
+ console.error('upstream image response exceeded maximum size for', href)
157
+ throw new ImageError(413, '"url" parameter is valid but upstream response is invalid')
158
+ })
162
159
 
163
160
  return {
164
161
  buffer,
165
162
  contentType: res.headers.get('Content-Type'),
166
163
  cacheControl: res.headers.get('Cache-Control'),
167
164
  etag: extractEtag(res.headers.get('ETag'), buffer),
168
- };
165
+ }
169
166
  }
170
167
 
171
168
  /**
@@ -182,27 +179,27 @@ export async function readPublicFile(
182
179
  publicDirs: string[],
183
180
  href: string,
184
181
  ): Promise<Buffer | undefined> {
185
- let decoded: string;
182
+ let decoded: string
186
183
  try {
187
- decoded = decodeURIComponent(href.split('?', 1)[0] ?? href);
184
+ decoded = decodeURIComponent(href.split('?', 1)[0] ?? href)
188
185
  } catch {
189
- return undefined;
186
+ return undefined
190
187
  }
191
- if (decoded.includes('..') || decoded.includes('\0')) return undefined;
192
- const fs = await import('node:fs/promises');
193
- const path = await import('node:path');
188
+ if (decoded.includes('..') || decoded.includes('\0')) return undefined
189
+ const fs = await import('node:fs/promises')
190
+ const path = await import('node:path')
194
191
  for (const dir of publicDirs) {
195
192
  for (const form of ['NFC', 'NFD'] as const) {
196
- const candidate = path.join(dir, ...decoded.normalize(form).split('/').filter(Boolean));
197
- if (!candidate.startsWith(dir)) continue;
193
+ const candidate = path.join(dir, ...decoded.normalize(form).split('/').filter(Boolean))
194
+ if (!candidate.startsWith(dir)) continue
198
195
  try {
199
- return await fs.readFile(candidate);
196
+ return await fs.readFile(candidate)
200
197
  } catch {
201
198
  // try next candidate
202
199
  }
203
200
  }
204
201
  }
205
- return undefined;
202
+ return undefined
206
203
  }
207
204
 
208
205
  export async function fetchInternalImage(
@@ -214,19 +211,19 @@ export async function fetchInternalImage(
214
211
  const res = await fetch(new URL(href, origin), {
215
212
  redirect: 'follow',
216
213
  headers: { 'x-pnext-internal-image': '1' },
217
- });
214
+ })
218
215
 
219
216
  if (!res.body) {
220
- console.error('internal image response is empty for', href);
221
- throw new ImageError(400, '"url" parameter is valid but internal response is invalid');
217
+ console.error('internal image response is empty for', href)
218
+ throw new ImageError(400, '"url" parameter is valid but internal response is invalid')
222
219
  }
223
220
  const buffer = await readBodyWithLimit(res.body, maximumResponseBody, () => {
224
- console.error('internal image response exceeded maximum size for', href);
225
- throw new ImageError(413, '"url" parameter is valid but internal response is invalid');
226
- });
221
+ console.error('internal image response exceeded maximum size for', href)
222
+ throw new ImageError(413, '"url" parameter is valid but internal response is invalid')
223
+ })
227
224
  if (buffer.byteLength === 0) {
228
- console.error('internal image response is empty for', href);
229
- throw new ImageError(400, '"url" parameter is valid but internal response is invalid');
225
+ console.error('internal image response is empty for', href)
226
+ throw new ImageError(400, '"url" parameter is valid but internal response is invalid')
230
227
  }
231
228
 
232
229
  return {
@@ -234,10 +231,10 @@ export async function fetchInternalImage(
234
231
  contentType: res.headers.get('Content-Type'),
235
232
  cacheControl: res.headers.get('Cache-Control'),
236
233
  etag: extractEtag(res.headers.get('ETag'), buffer),
237
- };
234
+ }
238
235
  } catch (err) {
239
- if (err instanceof ImageError) throw err;
240
- console.error('upstream image response failed for', href, err);
241
- throw new ImageError(500, '"url" parameter is valid but upstream response is invalid');
236
+ if (err instanceof ImageError) throw err
237
+ console.error('upstream image response failed for', href, err)
238
+ throw new ImageError(500, '"url" parameter is valid but upstream response is invalid')
242
239
  }
243
240
  }
@@ -8,37 +8,37 @@
8
8
  //
9
9
  // The route pathname is stashed on the work unit at request start so the detached callback can name it.
10
10
 
11
- import { AsyncLocalStorage } from 'node:async_hooks';
12
- import { currentRequest, getWorkUnit } from '../../request/context';
11
+ import { AsyncLocalStorage } from 'node:async_hooks'
12
+ import { currentRequest, getWorkUnit } from '../../request/context'
13
13
 
14
- const REQUEST_PATH_KEY = Symbol.for('pnext.requestPath');
15
- const INSPECT_CUSTOM = Symbol.for('nodejs.util.inspect.custom');
16
- const requestApiScope = new AsyncLocalStorage<boolean>();
14
+ const REQUEST_PATH_KEY = Symbol.for('pnext.requestPath')
15
+ const INSPECT_CUSTOM = Symbol.for('nodejs.util.inspect.custom')
16
+ const requestApiScope = new AsyncLocalStorage<boolean>()
17
17
 
18
18
  /** Run one after() task with its request-API capability. */
19
19
  export function runWithAfterRequestApiScope<T>(allowed: boolean, callback: () => T): T {
20
- return requestApiScope.run(allowed, callback);
20
+ return requestApiScope.run(allowed, callback)
21
21
  }
22
22
 
23
23
  /** Whether the current after() task may use request APIs. */
24
24
  export function afterRequestApisAllowed(): boolean {
25
- return requestApiScope.getStore() === true;
25
+ return requestApiScope.getStore() === true
26
26
  }
27
27
 
28
28
  /** Stash the request pathname on the active work unit for after() diagnostics. */
29
29
  export function recordRequestPath(pathname: string): void {
30
- const unit = getWorkUnit();
31
- if (unit) (unit.compat ??= {})[REQUEST_PATH_KEY] = pathname;
30
+ const unit = getWorkUnit()
31
+ if (unit) (unit.compat ??= {})[REQUEST_PATH_KEY] = pathname
32
32
  }
33
33
 
34
34
  function currentRoutePath(): string {
35
- const recorded = getWorkUnit()?.compat?.[REQUEST_PATH_KEY] as string | undefined;
36
- if (recorded) return recorded;
35
+ const recorded = getWorkUnit()?.compat?.[REQUEST_PATH_KEY] as string | undefined
36
+ if (recorded) return recorded
37
37
  try {
38
- const request = currentRequest();
39
- return request ? new URL(request.url).pathname : '';
38
+ const request = currentRequest()
39
+ return request ? new URL(request.url).pathname : ''
40
40
  } catch {
41
- return '';
41
+ return ''
42
42
  }
43
43
  }
44
44
 
@@ -47,14 +47,14 @@ function currentRoutePath(): string {
47
47
  // with no misleading pnext-internal stack frame (the suite matches the message
48
48
  // text exactly). Typed as Error so throw sites satisfy `only-throw-error`.
49
49
  export function lifecycleError(message: string): Error {
50
- const formatted = `Error: ${message}`;
50
+ const formatted = `Error: ${message}`
51
51
  return {
52
52
  name: 'Error',
53
53
  message,
54
54
  stack: formatted,
55
55
  toString: () => formatted,
56
56
  [INSPECT_CUSTOM]: () => formatted,
57
- } as unknown as Error;
57
+ } as unknown as Error
58
58
  }
59
59
 
60
60
  /**
@@ -62,16 +62,16 @@ export function lifecycleError(message: string): Error {
62
62
  * detached after() callback (render phase, no live request scope). Returns
63
63
  * without throwing in every legal case so callers proceed to the normal path.
64
64
  */
65
- export function assertRequestApiAllowedInAfter(api: 'headers()' | 'cookies()' | 'connection()'): void {
66
- const unit = getWorkUnit();
67
- if (unit?.phase !== 'after') return;
65
+ export function assertRequestApiAllowedInAfter(
66
+ api: 'headers()' | 'cookies()' | 'connection()',
67
+ ): void {
68
+ const unit = getWorkUnit()
69
+ if (unit?.phase !== 'after') return
68
70
  // Rendering keeps a synthetic request context during prerendering, so the
69
71
  // explicit after-task capability—not merely currentRequest()—defines this.
70
- if (afterRequestApisAllowed() && currentRequest()) return;
71
- const suffix = api === 'connection()' ? '' : ' This is not supported.';
72
- throw lifecycleError(
73
- `Route ${currentRoutePath()} used \`${api}\` inside \`after()\`.${suffix}`,
74
- );
72
+ if (afterRequestApisAllowed() && currentRequest()) return
73
+ const suffix = api === 'connection()' ? '' : ' This is not supported.'
74
+ throw lifecycleError(`Route ${currentRoutePath()} used \`${api}\` inside \`after()\`.${suffix}`)
75
75
  }
76
76
 
77
77
  /**
@@ -79,8 +79,8 @@ export function assertRequestApiAllowedInAfter(api: 'headers()' | 'cookies()' |
79
79
  * every context (Next's exact message names the route + method).
80
80
  */
81
81
  export function assertDraftModeToggleAllowedInAfter(method: 'enable' | 'disable'): void {
82
- if (getWorkUnit()?.phase !== 'after') return;
82
+ if (getWorkUnit()?.phase !== 'after') return
83
83
  throw lifecycleError(
84
84
  `Route ${currentRoutePath()} used "draftMode().${method}()" inside \`after()\``,
85
- );
85
+ )
86
86
  }
@@ -10,42 +10,41 @@
10
10
  // handed to it so a serverless platform keeps the invocation alive until it settles. When no work unit
11
11
  // is active, the task runs on the microtask queue as a best-effort fallback.
12
12
 
13
- import { captureCacheScope } from '../../cache/context';
13
+ import { captureCacheScope } from '../../request/cache'
14
14
  import {
15
15
  captureRequestScope,
16
16
  currentRequest,
17
17
  getWorkUnit,
18
18
  queueAfterTask,
19
19
  setPhase,
20
- } from '../../request/context';
21
- import { currentRenderCacheMeta } from '../cache/revalidate';
20
+ } from '../../request/context'
21
+ import { currentRenderCacheMeta } from '../cache/revalidate'
22
22
  import {
23
23
  afterRequestApisAllowed,
24
24
  recordRequestPath,
25
25
  runWithAfterRequestApiScope,
26
- } from './after-scope';
26
+ } from './after-scope'
27
27
 
28
- type AfterTask<T> = Promise<T> | (() => T | Promise<T>);
28
+ type AfterTask<T> = Promise<T> | (() => T | Promise<T>)
29
29
 
30
- const requestContextSymbol = Symbol.for('@next/request-context');
30
+ const requestContextSymbol = Symbol.for('@next/request-context')
31
31
 
32
32
  /**
33
33
  * Marks an error that escaped an after() task during a BUILD prerender. The build's per-route
34
34
  * skip-and-warn catch reads it to fail the build instead of silently degrading the route to dynamic -
35
35
  * Next fails the build when after() throws while prerendering.
36
36
  */
37
- export const AFTER_PRERENDER_ERROR = Symbol.for('pnext.afterPrerenderError');
37
+ export const AFTER_PRERENDER_ERROR = Symbol.for('pnext.afterPrerenderError')
38
38
 
39
39
  interface VercelRequestContext {
40
- get?: () => { waitUntil?: (promise: Promise<unknown>) => void } | undefined;
40
+ get?: () => { waitUntil?: (promise: Promise<unknown>) => void } | undefined
41
41
  }
42
42
 
43
43
  /** The platform waitUntil, when a Vercel-style request context is present. */
44
44
  function platformWaitUntil(): ((promise: Promise<unknown>) => void) | undefined {
45
45
  const holder = (globalThis as Record<symbol, unknown>)[requestContextSymbol] as
46
- | VercelRequestContext
47
- | undefined;
48
- return holder?.get?.()?.waitUntil;
46
+ VercelRequestContext | undefined
47
+ return holder?.get?.()?.waitUntil
49
48
  }
50
49
 
51
50
  /**
@@ -62,13 +61,15 @@ async function runAfterTask<T>(task: AfterTask<T>): Promise<void> {
62
61
  error => {
63
62
  console.error(
64
63
  `An error occurred in a function passed to \`after()\`: ${
65
- error instanceof Error ? (error.stack ?? `${error.name}: ${error.message}`) : String(error)
64
+ error instanceof Error
65
+ ? (error.stack ?? `${error.name}: ${error.message}`)
66
+ : String(error)
66
67
  }`,
67
- );
68
+ )
68
69
  },
69
- );
70
- platformWaitUntil()?.(promise);
71
- await promise;
70
+ )
71
+ platformWaitUntil()?.(promise)
72
+ await promise
72
73
  }
73
74
 
74
75
  /**
@@ -79,20 +80,23 @@ async function runAfterTask<T>(task: AfterTask<T>): Promise<void> {
79
80
  * rejection) so a serverless platform keeps the invocation alive until it ends.
80
81
  */
81
82
  async function settleAfterTask<T>(task: AfterTask<T>): Promise<void> {
82
- const promise = Promise.resolve().then(() =>
83
- typeof task === 'function' ? task() : task,
84
- );
85
- platformWaitUntil()?.(promise.then(() => undefined, () => undefined));
83
+ const promise = Promise.resolve().then(() => (typeof task === 'function' ? task() : task))
84
+ platformWaitUntil()?.(
85
+ promise.then(
86
+ () => undefined,
87
+ () => undefined,
88
+ ),
89
+ )
86
90
  try {
87
- await promise;
91
+ await promise
88
92
  } catch (error) {
89
93
  // Tag so the build's per-route catch fails the build rather than degrading
90
94
  // the route to dynamic. The tag rides the same error object up through the
91
95
  // static after-drain (which re-throws it) to cli/build.ts.
92
96
  if (error && typeof error === 'object') {
93
- (error as Record<symbol, unknown>)[AFTER_PRERENDER_ERROR] = true;
97
+ ;(error as Record<symbol, unknown>)[AFTER_PRERENDER_ERROR] = true
94
98
  }
95
- throw error;
99
+ throw error
96
100
  }
97
101
  }
98
102
 
@@ -108,9 +112,9 @@ function runInPrerenderAfterPhase<T>(
108
112
  requestApisAllowed: boolean,
109
113
  fn: () => T,
110
114
  ): T {
111
- setPhase('after');
112
- if (route) recordRequestPath(route);
113
- return runWithAfterRequestApiScope(requestApisAllowed, fn);
115
+ setPhase('after')
116
+ if (route) recordRequestPath(route)
117
+ return runWithAfterRequestApiScope(requestApisAllowed, fn)
114
118
  }
115
119
 
116
120
  /**
@@ -124,50 +128,49 @@ export function after<T>(task: AfterTask<T>): void {
124
128
  // its after() callbacks run detached, so headers()/cookies()/connection() throw Next's "used inside
125
129
  // after()" error. The phase distinguishes them - renders stay 'render', handlers set routeKind,
126
130
  // actions set phase 'action'.
127
- const unit = getWorkUnit();
131
+ const unit = getWorkUnit()
128
132
  const isHandlerOrAction =
129
- unit?.phase === 'action' ||
130
- unit?.phase === 'middleware' ||
131
- unit?.routeKind === 'route-handler';
133
+ unit?.phase === 'action' || unit?.phase === 'middleware' || unit?.routeKind === 'route-handler'
132
134
  const isNestedRequestAfter =
133
- unit?.phase === 'after' && Boolean(currentRequest()) && afterRequestApisAllowed();
135
+ unit?.phase === 'after' && Boolean(currentRequest()) && afterRequestApisAllowed()
134
136
  // Handlers and actions capture the live request scope so headers()/cookies() keep working inside their
135
137
  // after() callbacks. A page render (or generateMetadata) instead captures only the React cache()
136
138
  // scope, so cache() shares the render's memo cache in the callback while the request scope stays
137
139
  // detached and headers()/cookies()/connection() still throw Next's "used inside after()" error.
138
140
  const withScope =
139
- isHandlerOrAction || isNestedRequestAfter
140
- ? captureRequestScope()
141
- : captureCacheScope();
141
+ isHandlerOrAction || isNestedRequestAfter ? captureRequestScope() : captureCacheScope()
142
142
  // Static-generation render (build prerender or ISR regeneration): there is
143
143
  // no response close to flush against, so the task queues on the render's
144
144
  // cache meta and the render drains it once produce settles (Next waits for
145
145
  // after() during prerendering). Build prerenders propagate rejections so a
146
146
  // throwing after() fails the page's prerender (next-after-app-static);
147
147
  // runtime regenerations log-and-continue like every other runtime path.
148
- const meta = currentRenderCacheMeta();
148
+ const meta = currentRenderCacheMeta()
149
149
  if (meta && (meta.prerender === true || meta.blockingStaleFetches === true)) {
150
150
  // A build/ISR prerender runs with no work unit, so the top-level routeKind check above cannot tell a
151
151
  // route-handler prerender from a page one - meta.handler does. A handler prerender captures the live
152
152
  // request scope so request APIs resolve inside after(); a page prerender keeps only the cache scope
153
153
  // so they throw "used inside after()".
154
- const prerenderScope = meta.handler ? captureRequestScope() : withScope;
155
- const route = meta.route;
156
- const requestApisAllowed = Boolean(meta.handler);
154
+ const prerenderScope = meta.handler ? captureRequestScope() : withScope
155
+ const route = meta.route
156
+ const requestApisAllowed = Boolean(meta.handler)
157
157
  const run = meta.prerender
158
158
  ? () =>
159
159
  prerenderScope(() =>
160
160
  runInPrerenderAfterPhase(route, requestApisAllowed, () => settleAfterTask(task)),
161
161
  )
162
- : () => prerenderScope(() => runWithAfterRequestApiScope(requestApisAllowed, () => runAfterTask(task)));
163
- (meta.afterTasks ??= []).push(run);
164
- return;
162
+ : () =>
163
+ prerenderScope(() =>
164
+ runWithAfterRequestApiScope(requestApisAllowed, () => runAfterTask(task)),
165
+ )
166
+ ;(meta.afterTasks ??= []).push(run)
167
+ return
165
168
  }
166
- const requestApisAllowed = Boolean(isHandlerOrAction || isNestedRequestAfter);
169
+ const requestApisAllowed = Boolean(isHandlerOrAction || isNestedRequestAfter)
167
170
  const queued = queueAfterTask(() =>
168
171
  withScope(() => runWithAfterRequestApiScope(requestApisAllowed, () => runAfterTask(task))),
169
- );
170
- if (queued) return;
172
+ )
173
+ if (queued) return
171
174
  // No active work unit (e.g. called at module scope): best-effort microtask.
172
- void withScope(() => runWithAfterRequestApiScope(requestApisAllowed, () => runAfterTask(task)));
175
+ void withScope(() => runWithAfterRequestApiScope(requestApisAllowed, () => runAfterTask(task)))
173
176
  }