@wular/pnext 0.0.1

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 (371) hide show
  1. package/README.md +153 -0
  2. package/bin/pnext +67 -0
  3. package/config/lint/base.js +48 -0
  4. package/config/ts/base.json +26 -0
  5. package/config/ts/react.json +13 -0
  6. package/package.json +70 -0
  7. package/reference/compat.md +63 -0
  8. package/reference/config.md +120 -0
  9. package/reference/css.md +58 -0
  10. package/reference/dev.md +69 -0
  11. package/reference/env.md +40 -0
  12. package/reference/metadata.md +86 -0
  13. package/reference/navigation.md +149 -0
  14. package/reference/overview.md +35 -0
  15. package/reference/performance.md +97 -0
  16. package/reference/rendering.md +127 -0
  17. package/reference/routing.md +167 -0
  18. package/reference/typegen.md +64 -0
  19. package/src/api/cache.ts +80 -0
  20. package/src/api/client-cache.ts +9 -0
  21. package/src/api/client-navigation.ts +279 -0
  22. package/src/api/dynamic.tsx +102 -0
  23. package/src/api/link.tsx +119 -0
  24. package/src/api/navigation.ts +198 -0
  25. package/src/api/router/events.ts +53 -0
  26. package/src/api/router/history.ts +70 -0
  27. package/src/api/router/hub.ts +194 -0
  28. package/src/api/router/policies.ts +107 -0
  29. package/src/api/router/runtime.ts +5238 -0
  30. package/src/api/router/types.ts +299 -0
  31. package/src/api/router.ts +167 -0
  32. package/src/api/server.ts +323 -0
  33. package/src/api/suspense.ts +16 -0
  34. package/src/cache/context.ts +61 -0
  35. package/src/cli/adapters/vercel-warm.ts +375 -0
  36. package/src/cli/adapters/vercel.ts +1310 -0
  37. package/src/cli/analyze-print.ts +181 -0
  38. package/src/cli/analyze.ts +328 -0
  39. package/src/cli/boot-trace.ts +29 -0
  40. package/src/cli/build.ts +3114 -0
  41. package/src/cli/dev.ts +276 -0
  42. package/src/cli/index.ts +196 -0
  43. package/src/cli/named-bin.ts +119 -0
  44. package/src/cli/serve-ui.ts +160 -0
  45. package/src/cli/start.ts +1425 -0
  46. package/src/client/build.ts +2136 -0
  47. package/src/client/chunk-fold.ts +526 -0
  48. package/src/client/entry.ts +1525 -0
  49. package/src/client/paths.ts +22 -0
  50. package/src/client/prebuilt.ts +621 -0
  51. package/src/client/profile.ts +75 -0
  52. package/src/client/react-compiler.ts +94 -0
  53. package/src/client/reference-stub.ts +145 -0
  54. package/src/client/reference.ts +47 -0
  55. package/src/compat/actions/action-client.ts +531 -0
  56. package/src/compat/actions/action-dispatch.ts +676 -0
  57. package/src/compat/actions/action-router.ts +40 -0
  58. package/src/compat/actions/action-shared.ts +95 -0
  59. package/src/compat/actions/client-plugin.ts +135 -0
  60. package/src/compat/actions/client-stub.ts +65 -0
  61. package/src/compat/actions/config.ts +164 -0
  62. package/src/compat/actions/detect.ts +208 -0
  63. package/src/compat/actions/discovery.ts +244 -0
  64. package/src/compat/actions/early-submit.ts +40 -0
  65. package/src/compat/actions/endpoint.ts +602 -0
  66. package/src/compat/actions/flight.ts +52 -0
  67. package/src/compat/actions/form-state.ts +73 -0
  68. package/src/compat/actions/hoist.ts +485 -0
  69. package/src/compat/actions/ids.ts +39 -0
  70. package/src/compat/actions/index.ts +41 -0
  71. package/src/compat/actions/instances.ts +144 -0
  72. package/src/compat/actions/origin.ts +109 -0
  73. package/src/compat/actions/protocol.ts +125 -0
  74. package/src/compat/actions/registry.ts +74 -0
  75. package/src/compat/actions/rewrite.ts +282 -0
  76. package/src/compat/actions/serve.ts +414 -0
  77. package/src/compat/actions/server-tag.ts +21 -0
  78. package/src/compat/actions/unrecognized-error.ts +30 -0
  79. package/src/compat/adapter/build-complete.ts +257 -0
  80. package/src/compat/bundler/bun-externals.ts +53 -0
  81. package/src/compat/bundler/cjs-exports.ts +542 -0
  82. package/src/compat/bundler/config.ts +363 -0
  83. package/src/compat/bundler/externals.ts +34 -0
  84. package/src/compat/bundler/import-meta-url.ts +60 -0
  85. package/src/compat/bundler/modularize-imports.ts +119 -0
  86. package/src/compat/bundler/new-url-asset.ts +87 -0
  87. package/src/compat/bundler/optimize-package-imports.ts +273 -0
  88. package/src/compat/bundler/polyfill.ts +88 -0
  89. package/src/compat/bundler/react-compiler.ts +61 -0
  90. package/src/compat/bundler/react-profiler.tsx +25 -0
  91. package/src/compat/bundler/relay-transform.ts +116 -0
  92. package/src/compat/bundler/require-context.ts +281 -0
  93. package/src/compat/bundler/resolve-extensions.ts +75 -0
  94. package/src/compat/bundler/source-cache.ts +61 -0
  95. package/src/compat/bundler/static-imports.ts +25 -0
  96. package/src/compat/bundler/symlink-imports.ts +119 -0
  97. package/src/compat/bundler/tsconfig-paths.ts +50 -0
  98. package/src/compat/bundler/wasm.ts +153 -0
  99. package/src/compat/bundler/webpack-loaders.ts +685 -0
  100. package/src/compat/bundler/worker.ts +278 -0
  101. package/src/compat/cache/build-flags.ts +81 -0
  102. package/src/compat/cache/build-prerender-errors.ts +163 -0
  103. package/src/compat/cache/custom-handler.ts +159 -0
  104. package/src/compat/cache/fetch-patch.ts +745 -0
  105. package/src/compat/cache/handler.ts +100 -0
  106. package/src/compat/cache/modern-handler.ts +275 -0
  107. package/src/compat/cache/resume-data-cache.ts +143 -0
  108. package/src/compat/cache/revalidate.ts +759 -0
  109. package/src/compat/cache/runtime-error.ts +124 -0
  110. package/src/compat/cache/use-cache-transform.ts +961 -0
  111. package/src/compat/cache/use-cache.ts +1695 -0
  112. package/src/compat/cache-control.ts +269 -0
  113. package/src/compat/client/base-path.ts +64 -0
  114. package/src/compat/client/css-order.ts +36 -0
  115. package/src/compat/client/errors/control-flow.ts +92 -0
  116. package/src/compat/client/errors/error-boundary.ts +222 -0
  117. package/src/compat/client/errors/global-error.ts +238 -0
  118. package/src/compat/client/errors/install.ts +217 -0
  119. package/src/compat/client/errors/lazy.ts +53 -0
  120. package/src/compat/client/errors/primitive-throw.ts +126 -0
  121. package/src/compat/client/errors/soft-refresh.ts +14 -0
  122. package/src/compat/client/link-status.ts +86 -0
  123. package/src/compat/client/nav-compat-runtime.ts +57 -0
  124. package/src/compat/client/nav-compat.ts +42 -0
  125. package/src/compat/client/navigation-scroll.ts +154 -0
  126. package/src/compat/client/optimistic-routing.ts +206 -0
  127. package/src/compat/client/prefetch-cache.ts +111 -0
  128. package/src/compat/client/route-announcer.ts +72 -0
  129. package/src/compat/client/segment-cache-policy.ts +159 -0
  130. package/src/compat/client/segment-cache.ts +1077 -0
  131. package/src/compat/client/segment-prefetch.ts +375 -0
  132. package/src/compat/client/trailing-slash.ts +24 -0
  133. package/src/compat/css/chunking.ts +254 -0
  134. package/src/compat/css/inline-css.ts +73 -0
  135. package/src/compat/css/lightningcss.ts +90 -0
  136. package/src/compat/css/modules.ts +373 -0
  137. package/src/compat/css/nonce.ts +30 -0
  138. package/src/compat/css/sass-plugin.ts +65 -0
  139. package/src/compat/css/sass.ts +392 -0
  140. package/src/compat/css/styled-jsx-runtime.ts +80 -0
  141. package/src/compat/css/styled-jsx.ts +49 -0
  142. package/src/compat/edge-runtime.ts +71 -0
  143. package/src/compat/export/client.ts +112 -0
  144. package/src/compat/export/index.ts +272 -0
  145. package/src/compat/export/standalone.ts +207 -0
  146. package/src/compat/image-optimizer/cache.ts +119 -0
  147. package/src/compat/image-optimizer/detect.ts +143 -0
  148. package/src/compat/image-optimizer/index.ts +601 -0
  149. package/src/compat/image-optimizer/source.ts +243 -0
  150. package/src/compat/index.ts +458 -0
  151. package/src/compat/lifecycle/after-scope.ts +86 -0
  152. package/src/compat/lifecycle/after.ts +173 -0
  153. package/src/compat/lifecycle/error-funnel.ts +306 -0
  154. package/src/compat/lifecycle/error-serialize.ts +87 -0
  155. package/src/compat/lifecycle/error-ui.ts +167 -0
  156. package/src/compat/lifecycle/instrumentation-client.ts +138 -0
  157. package/src/compat/lifecycle/instrumentation.ts +277 -0
  158. package/src/compat/lifecycle/node-console.ts +19 -0
  159. package/src/compat/lifecycle/testmode.ts +263 -0
  160. package/src/compat/mdx/compile.ts +219 -0
  161. package/src/compat/mdx/next-mdx-stub.ts +46 -0
  162. package/src/compat/mdx/plugin.ts +37 -0
  163. package/src/compat/metadata-route-artifacts.ts +458 -0
  164. package/src/compat/metadata.ts +295 -0
  165. package/src/compat/middleware/manifest.ts +210 -0
  166. package/src/compat/misc/action-return.ts +173 -0
  167. package/src/compat/next/cache.ts +211 -0
  168. package/src/compat/next/canonical-url.ts +35 -0
  169. package/src/compat/next/client-cache.ts +57 -0
  170. package/src/compat/next/client-navigation.ts +313 -0
  171. package/src/compat/next/client-only.ts +3 -0
  172. package/src/compat/next/client-script.tsx +215 -0
  173. package/src/compat/next/client-server.ts +39 -0
  174. package/src/compat/next/config-loader.ts +569 -0
  175. package/src/compat/next/config.ts +29 -0
  176. package/src/compat/next/constants.cjs +6 -0
  177. package/src/compat/next/constants.ts +6 -0
  178. package/src/compat/next/custom-server.ts +236 -0
  179. package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
  180. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
  181. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
  182. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
  183. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
  184. package/src/compat/next/dynamic.tsx +46 -0
  185. package/src/compat/next/error.tsx +148 -0
  186. package/src/compat/next/font/cache.ts +171 -0
  187. package/src/compat/next/font/google.ts +2 -0
  188. package/src/compat/next/font/index.ts +8 -0
  189. package/src/compat/next/font/local.ts +5 -0
  190. package/src/compat/next/font/runtime-client.ts +71 -0
  191. package/src/compat/next/font/runtime.ts +974 -0
  192. package/src/compat/next/font/shared.ts +281 -0
  193. package/src/compat/next/form.tsx +156 -0
  194. package/src/compat/next/head.tsx +10 -0
  195. package/src/compat/next/headers.ts +247 -0
  196. package/src/compat/next/image/config.ts +196 -0
  197. package/src/compat/next/image/optimizer.ts +96 -0
  198. package/src/compat/next/image/patterns.ts +103 -0
  199. package/src/compat/next/image/shared.ts +141 -0
  200. package/src/compat/next/image/static-metadata.ts +283 -0
  201. package/src/compat/next/image/validate.ts +269 -0
  202. package/src/compat/next/image-client.tsx +215 -0
  203. package/src/compat/next/image-props.ts +575 -0
  204. package/src/compat/next/image-usage.ts +102 -0
  205. package/src/compat/next/image.tsx +56 -0
  206. package/src/compat/next/index.ts +1 -0
  207. package/src/compat/next/legacy-image.tsx +97 -0
  208. package/src/compat/next/link-usage.ts +29 -0
  209. package/src/compat/next/link-validation-transform.ts +200 -0
  210. package/src/compat/next/link.tsx +466 -0
  211. package/src/compat/next/navigation.cjs +21 -0
  212. package/src/compat/next/navigation.ts +188 -0
  213. package/src/compat/next/offline.ts +51 -0
  214. package/src/compat/next/og.ts +324 -0
  215. package/src/compat/next/optimistic-route-state.ts +188 -0
  216. package/src/compat/next/preferred-region.ts +39 -0
  217. package/src/compat/next/redirects.ts +131 -0
  218. package/src/compat/next/resource-hints.ts +136 -0
  219. package/src/compat/next/rewrites.ts +350 -0
  220. package/src/compat/next/root-params.ts +142 -0
  221. package/src/compat/next/router.cjs +49 -0
  222. package/src/compat/next/router.ts +143 -0
  223. package/src/compat/next/script.tsx +355 -0
  224. package/src/compat/next/server-only.ts +3 -0
  225. package/src/compat/next/server.ts +28 -0
  226. package/src/compat/next/svgr.ts +58 -0
  227. package/src/compat/next/telemetry.ts +77 -0
  228. package/src/compat/next/user-agent.ts +100 -0
  229. package/src/compat/next/web-vitals.ts +56 -0
  230. package/src/compat/otel/api.ts +95 -0
  231. package/src/compat/otel/client-trace-metadata.ts +71 -0
  232. package/src/compat/otel/fetch-span.ts +77 -0
  233. package/src/compat/otel/tracer.ts +944 -0
  234. package/src/compat/pages/client-plugin.ts +108 -0
  235. package/src/compat/pages/index.ts +527 -0
  236. package/src/compat/pages/router-state.ts +94 -0
  237. package/src/compat/ppr/io.ts +38 -0
  238. package/src/compat/ppr/missing-root-params.ts +105 -0
  239. package/src/compat/ppr/root-params-scan.ts +164 -0
  240. package/src/compat/ppr/root-params-transform.ts +75 -0
  241. package/src/compat/ppr/root-params.ts +129 -0
  242. package/src/compat/ppr/segment-config-incompat.ts +34 -0
  243. package/src/compat/protocol.ts +202 -0
  244. package/src/compat/react/client.ts +59 -0
  245. package/src/compat/react/compiler-runtime.ts +60 -0
  246. package/src/compat/react/dom-client.ts +115 -0
  247. package/src/compat/react/dom-react-server.ts +20 -0
  248. package/src/compat/react/dom-server.ts +40 -0
  249. package/src/compat/react/dom.ts +154 -0
  250. package/src/compat/react/preact.ts +522 -0
  251. package/src/compat/react/react-server.ts +84 -0
  252. package/src/compat/react/router-shim.ts +26 -0
  253. package/src/compat/react/server-component-use.ts +48 -0
  254. package/src/compat/react/server-inserted-html.ts +87 -0
  255. package/src/compat/react/server.ts +156 -0
  256. package/src/compat/react/view-transition.ts +60 -0
  257. package/src/compat/register/actions.ts +875 -0
  258. package/src/compat/register/boot.ts +141 -0
  259. package/src/compat/register/build-tier.ts +11 -0
  260. package/src/compat/register/build.ts +182 -0
  261. package/src/compat/register/bundler.ts +587 -0
  262. package/src/compat/register/cache.ts +85 -0
  263. package/src/compat/register/client-errors.ts +18 -0
  264. package/src/compat/register/config.ts +17 -0
  265. package/src/compat/register/css-extras.ts +120 -0
  266. package/src/compat/register/edge-runtime.ts +6 -0
  267. package/src/compat/register/errors.ts +46 -0
  268. package/src/compat/register/export.ts +23 -0
  269. package/src/compat/register/font.ts +36 -0
  270. package/src/compat/register/hooks.ts +34 -0
  271. package/src/compat/register/image.ts +133 -0
  272. package/src/compat/register/index.ts +111 -0
  273. package/src/compat/register/instrumentation-client.ts +35 -0
  274. package/src/compat/register/lifecycle.ts +86 -0
  275. package/src/compat/register/mdx.ts +48 -0
  276. package/src/compat/register/middleware.ts +36 -0
  277. package/src/compat/register/misc.ts +44 -0
  278. package/src/compat/register/otel.ts +288 -0
  279. package/src/compat/register/pages-api.ts +473 -0
  280. package/src/compat/register/ppr.ts +56 -0
  281. package/src/compat/register/protocol.ts +57 -0
  282. package/src/compat/register/proxy.ts +127 -0
  283. package/src/compat/register/render.ts +268 -0
  284. package/src/compat/register/routing.ts +410 -0
  285. package/src/compat/register/segment.ts +1903 -0
  286. package/src/compat/register/static-image.ts +21 -0
  287. package/src/compat/register/typed-routes.ts +35 -0
  288. package/src/compat/register/usecache.ts +131 -0
  289. package/src/compat/register/validation.ts +56 -0
  290. package/src/compat/segment/loading-boundary.ts +113 -0
  291. package/src/compat/segment/page-slot.ts +200 -0
  292. package/src/compat/segment/tree.ts +481 -0
  293. package/src/compat/segment/vary-key.ts +102 -0
  294. package/src/compat/segment/vary-params.ts +551 -0
  295. package/src/compat/static-params.ts +33 -0
  296. package/src/compat/tsconfig-defaults.ts +301 -0
  297. package/src/compat/typecheck/index.ts +1481 -0
  298. package/src/compat/typecheck/worker.ts +26 -0
  299. package/src/compat/typed-routes/index.ts +92 -0
  300. package/src/compat/typed-routes/manifest.ts +356 -0
  301. package/src/compat/typed-routes/typegen.ts +566 -0
  302. package/src/compat/validation/errors.ts +159 -0
  303. package/src/compat/validation/index.ts +1770 -0
  304. package/src/compat/validation/prerender-diagnostics.ts +1508 -0
  305. package/src/compat-bootstrap.ts +67 -0
  306. package/src/config.ts +218 -0
  307. package/src/css/build.ts +697 -0
  308. package/src/css/index.ts +2 -0
  309. package/src/css/postcss.ts +236 -0
  310. package/src/css/worker.ts +34 -0
  311. package/src/dev/client-actions.ts +35 -0
  312. package/src/dev/client-chunk-store.ts +92 -0
  313. package/src/dev/client-key-cache.ts +178 -0
  314. package/src/dev/global-css-cache.ts +212 -0
  315. package/src/dev/imports.ts +2430 -0
  316. package/src/dev/module-cache.ts +721 -0
  317. package/src/dev/module-generations.ts +38 -0
  318. package/src/dev/module-transform.ts +188 -0
  319. package/src/dev/node-module-bundle-cache.ts +63 -0
  320. package/src/dev/restart-cache.ts +10 -0
  321. package/src/dev/route-bundle-key-cache.ts +154 -0
  322. package/src/dev/route-facts-cache.ts +223 -0
  323. package/src/dev/server.ts +1710 -0
  324. package/src/dynamic/source.ts +307 -0
  325. package/src/dynamic/tree-shake.ts +262 -0
  326. package/src/env.ts +92 -0
  327. package/src/extensions.ts +1898 -0
  328. package/src/index.ts +34 -0
  329. package/src/internal.ts +43 -0
  330. package/src/islands/boundary-error.ts +8 -0
  331. package/src/islands/static-children.ts +37 -0
  332. package/src/islands/static-slots.ts +106 -0
  333. package/src/ppr-postpone.ts +24 -0
  334. package/src/ppr.ts +784 -0
  335. package/src/proxy.ts +752 -0
  336. package/src/render/hooks.ts +384 -0
  337. package/src/render/index.ts +1 -0
  338. package/src/render/island-context.ts +47 -0
  339. package/src/render/metadata.ts +857 -0
  340. package/src/render/renderer.ts +7391 -0
  341. package/src/render/resource-hints.ts +44 -0
  342. package/src/render/slots.tsx +679 -0
  343. package/src/request/context.ts +396 -0
  344. package/src/resolve/engine.ts +219 -0
  345. package/src/resolve/imports.ts +1104 -0
  346. package/src/resolve/scan-facts.ts +474 -0
  347. package/src/resolve/source-text.ts +86 -0
  348. package/src/routing/forwarded.ts +41 -0
  349. package/src/routing/handler.ts +271 -0
  350. package/src/routing/href.ts +203 -0
  351. package/src/routing/metadata.ts +1018 -0
  352. package/src/routing/request-runtime.ts +43 -0
  353. package/src/routing/routes.ts +2560 -0
  354. package/src/routing/slots.ts +432 -0
  355. package/src/runtime/server.ts +3453 -0
  356. package/src/runtime/vendor.ts +1160 -0
  357. package/src/style-modules.d.ts +9 -0
  358. package/src/typegen.ts +151 -0
  359. package/src/types.ts +725 -0
  360. package/src/utils/ansi.ts +9 -0
  361. package/src/utils/content-type.ts +31 -0
  362. package/src/utils/decode.ts +7 -0
  363. package/src/utils/dev-profile.ts +31 -0
  364. package/src/utils/error-log.ts +29 -0
  365. package/src/utils/fs-cache.ts +31 -0
  366. package/src/utils/fs.ts +119 -0
  367. package/src/utils/html.ts +46 -0
  368. package/src/utils/serialize.ts +378 -0
  369. package/src/utils/source.ts +35 -0
  370. package/src/utils/verbose.ts +39 -0
  371. package/tsconfig.json +10 -0
@@ -0,0 +1,323 @@
1
+ import { safeDecode } from '../utils/decode';
2
+ import { getProxyExtensions, getProxyResponseProtocol } from '../extensions';
3
+ import { getBasePathPrefix } from '../routing/href';
4
+ import type {
5
+ NextRequest as NextRequestLike,
6
+ NextRequestCookie,
7
+ NextRequestCookies,
8
+ NextURL,
9
+ NextResponseCookies,
10
+ } from '../types';
11
+
12
+ const nextResponseMetaSymbol = Symbol.for('pnext.nextResponse');
13
+
14
+ export type { NextFetchEvent } from '../types';
15
+
16
+ export interface NextRequestGeo {
17
+ city?: string;
18
+ country?: string;
19
+ region?: string;
20
+ latitude?: string;
21
+ longitude?: string;
22
+ }
23
+
24
+ /**
25
+ * Runtime NextRequest for user code that constructs requests, mirroring
26
+ * Next's `new NextRequest(input, init?)`. Internal paths keep augmenting
27
+ * plain Requests via toNextRequest().
28
+ */
29
+ export class NextRequest extends Request implements NextRequestLike {
30
+ readonly cookies: NextRequestCookies;
31
+ readonly nextUrl: NextURL;
32
+ readonly geo?: NextRequestGeo;
33
+ readonly ip?: string;
34
+
35
+ constructor(input: RequestInfo | URL, init?: RequestInit) {
36
+ super(input, init);
37
+ this.cookies = requestCookies(this.headers);
38
+ this.nextUrl = createNextUrl(this.url);
39
+ }
40
+ }
41
+
42
+ export type NextResponseKind = 'next' | 'rewrite';
43
+
44
+ export interface NextResponseMeta {
45
+ kind: NextResponseKind;
46
+ url?: string;
47
+ requestHeaders?: Headers;
48
+ }
49
+
50
+ type NextResponseInit = ResponseInit & {
51
+ request?: {
52
+ headers?: HeadersInit;
53
+ };
54
+ };
55
+
56
+ export class NextResponse extends Response {
57
+ readonly cookies: NextResponseCookies;
58
+ readonly [nextResponseMetaSymbol]?: NextResponseMeta;
59
+
60
+ constructor(body?: BodyInit | null, init?: ResponseInit) {
61
+ super(body, init);
62
+ this.cookies = responseCookies(this.headers);
63
+ }
64
+
65
+ static json<JsonBody>(body: JsonBody, init?: ResponseInit) {
66
+ const headers = new Headers(init?.headers);
67
+ if (!headers.has('content-type')) headers.set('content-type', 'application/json');
68
+ return new NextResponse(JSON.stringify(body), {
69
+ ...init,
70
+ headers,
71
+ });
72
+ }
73
+
74
+ static next(init?: NextResponseInit) {
75
+ const response = new NextResponse(null, init);
76
+ response.headers.set(getProxyResponseProtocol().nextHeader, '1');
77
+ defineMeta(response, { kind: 'next', ...requestMeta(init) });
78
+ return response;
79
+ }
80
+
81
+ static rewrite(url: string | URL, init?: NextResponseInit) {
82
+ const response = new NextResponse(null, init);
83
+ response.headers.set(getProxyResponseProtocol().rewriteHeader, String(url));
84
+ defineMeta(response, { kind: 'rewrite', url: String(url), ...requestMeta(init) });
85
+ return response;
86
+ }
87
+
88
+ static redirect(url: string | URL, init: number | ResponseInit = 307) {
89
+ const responseInit = typeof init === 'number' ? { status: init } : init;
90
+ const headers = new Headers(responseInit.headers);
91
+ headers.set('location', String(url));
92
+ return new NextResponse(null, {
93
+ ...responseInit,
94
+ status: responseInit.status ?? 307,
95
+ headers,
96
+ });
97
+ }
98
+ }
99
+
100
+ export function toNextRequest(request: Request): NextRequestLike {
101
+ const nextRequest = request as Partial<NextRequestLike>;
102
+ if (nextRequest.cookies && nextRequest.nextUrl) return request as NextRequestLike;
103
+
104
+ Object.defineProperties(request, {
105
+ cookies: {
106
+ configurable: true,
107
+ enumerable: true,
108
+ value: requestCookies(request.headers),
109
+ },
110
+ nextUrl: {
111
+ configurable: true,
112
+ enumerable: true,
113
+ value: createNextUrl(request.url),
114
+ },
115
+ });
116
+ return request as NextRequestLike;
117
+ }
118
+
119
+ export function nextResponseMeta(response: Response): NextResponseMeta | undefined {
120
+ const meta = (response as Response & { [nextResponseMetaSymbol]?: NextResponseMeta })[nextResponseMetaSymbol];
121
+ if (meta) return meta;
122
+
123
+ const protocol = getProxyResponseProtocol();
124
+ const rewrite = response.headers.get(protocol.rewriteHeader);
125
+ if (rewrite) return { kind: 'rewrite', url: rewrite };
126
+ if (response.headers.get(protocol.nextHeader)) return { kind: 'next' };
127
+ return undefined;
128
+ }
129
+
130
+ export function copyMiddlewareHeaders(from: Response, to: Response) {
131
+ const internalHeaders = proxyInternalHeaders();
132
+ from.headers.forEach((value, key) => {
133
+ if (internalHeaders.has(key) || key === 'content-length' || key === 'set-cookie') return;
134
+ // Vary is merged, never overwritten: the middleware's vary tokens join the
135
+ // handler/page's own (both survive for CDN correctness). Every other header
136
+ // is the middleware's to set.
137
+ if (key === 'vary') mergeVaryInto(to.headers, value);
138
+ else to.headers.set(key, value);
139
+ });
140
+ const middlewareCookies = getSetCookie(from.headers);
141
+ if (middlewareCookies.length === 0) return;
142
+ const responseCookies = getSetCookie(to.headers);
143
+ to.headers.delete('set-cookie');
144
+ for (const cookie of middlewareCookies) to.headers.append('set-cookie', cookie);
145
+ for (const cookie of responseCookies) to.headers.append('set-cookie', cookie);
146
+ }
147
+
148
+ // Forward a middleware response's non-internal headers onto the DOWNSTREAM REQUEST (in addition to
149
+ // the response). Next applies every non-internal middleware response header to both req.headers and
150
+ // the final response, so NextResponse.next({ headers }) values are visible to route handlers and
151
+ // pages as request headers. set-cookie is handled separately and never forwarded here.
152
+ export function forwardMiddlewareRequestHeaders(from: Response, request: Request): Request {
153
+ const additions: [string, string][] = [];
154
+ const internalHeaders = proxyInternalHeaders();
155
+ from.headers.forEach((value, key) => {
156
+ if (internalHeaders.has(key) || key === 'content-length' || key === 'set-cookie') return;
157
+ additions.push([key, value]);
158
+ });
159
+ if (additions.length === 0) return request;
160
+ const headers = new Headers(request.headers);
161
+ for (const [key, value] of additions) headers.set(key, value);
162
+ return new Request(request, { headers });
163
+ }
164
+
165
+ function proxyInternalHeaders() {
166
+ const protocol = getProxyResponseProtocol();
167
+ return new Set([protocol.nextHeader, protocol.rewriteHeader]);
168
+ }
169
+
170
+ // Append `value`'s comma-separated tokens to the response's Vary, preserving
171
+ // existing tokens and never duplicating (case-insensitive).
172
+ function mergeVaryInto(headers: Headers, value: string) {
173
+ const existing = headers.get('vary');
174
+ const seen = new Set(
175
+ (existing ?? '')
176
+ .split(',')
177
+ .map(token => token.trim().toLowerCase())
178
+ .filter(Boolean),
179
+ );
180
+ const merged = existing
181
+ ? existing.split(',').map(token => token.trim()).filter(Boolean)
182
+ : [];
183
+ for (const token of value.split(',').map(part => part.trim()).filter(Boolean)) {
184
+ if (seen.has(token.toLowerCase())) continue;
185
+ seen.add(token.toLowerCase());
186
+ merged.push(token);
187
+ }
188
+ if (merged.length > 0) headers.set('vary', merged.join(', '));
189
+ }
190
+
191
+ function defineMeta(response: NextResponse, meta: NextResponseMeta) {
192
+ Object.defineProperty(response, nextResponseMetaSymbol, {
193
+ configurable: false,
194
+ enumerable: false,
195
+ value: meta,
196
+ });
197
+ }
198
+
199
+ function requestMeta(init: NextResponseInit | undefined): Pick<NextResponseMeta, 'requestHeaders'> {
200
+ return init?.request?.headers ? { requestHeaders: new Headers(init.request.headers) } : {};
201
+ }
202
+
203
+ function createNextUrl(url: string | URL): NextURL {
204
+ const nextUrl = new URL(url) as NextURL;
205
+ Object.defineProperty(nextUrl, 'clone', {
206
+ configurable: true,
207
+ enumerable: false,
208
+ value: () => createNextUrl(nextUrl.href),
209
+ });
210
+ // Next's NextURL exposes basePath (the configured prefix, '' when unset) and
211
+ // locale ('' without i18n). The request URL reaching middleware already has
212
+ // any basePath stripped, so pathname stays app-relative while basePath holds
213
+ // the prefix. Defaulting these to strings (never undefined) matches Next, so
214
+ // `req.nextUrl.basePath` reads as a falsy '' rather than the string
215
+ // "undefined" when forwarded through a header.
216
+ nextUrl.basePath = getBasePathPrefix();
217
+ nextUrl.locale = getProxyExtensions().locale(nextUrl);
218
+ return nextUrl;
219
+ }
220
+
221
+ function requestCookies(headers: Headers): NextRequestCookies {
222
+ let cookies = parseCookies(headers.get('cookie') ?? '');
223
+ const sync = () => {
224
+ const header = requestCookieHeader(cookies);
225
+ if (header) headers.set('cookie', header);
226
+ else headers.delete('cookie');
227
+ };
228
+ return {
229
+ get(name) {
230
+ return cookies.find(cookie => cookie.name === name);
231
+ },
232
+ getAll(name) {
233
+ return name ? cookies.filter(cookie => cookie.name === name) : [...cookies];
234
+ },
235
+ has(name) {
236
+ return cookies.some(cookie => cookie.name === name);
237
+ },
238
+ set(name, value) {
239
+ cookies = [...cookies.filter(cookie => cookie.name !== name), { name, value }];
240
+ sync();
241
+ return this;
242
+ },
243
+ delete(name) {
244
+ const existed = cookies.some(cookie => cookie.name === name);
245
+ cookies = cookies.filter(cookie => cookie.name !== name);
246
+ sync();
247
+ return existed;
248
+ },
249
+ clear() {
250
+ cookies = [];
251
+ sync();
252
+ },
253
+ };
254
+ }
255
+
256
+ function responseCookies(headers: Headers): NextResponseCookies {
257
+ return {
258
+ set(nameOrOptions: string | ResponseCookie, value?: string, options: ResponseCookieOptions = {}) {
259
+ const cookie: ResponseCookie =
260
+ typeof nameOrOptions === 'string'
261
+ ? { ...options, name: nameOrOptions, value: value ?? '' }
262
+ : nameOrOptions;
263
+ headers.append('set-cookie', serializeCookie(cookie.name, cookie.value, cookie));
264
+ return this;
265
+ },
266
+ delete(name) {
267
+ headers.append('set-cookie', serializeCookie(name, '', { maxAge: 0, path: '/' }));
268
+ return this;
269
+ },
270
+ };
271
+ }
272
+
273
+ interface ResponseCookieOptions {
274
+ path?: string;
275
+ maxAge?: number;
276
+ httpOnly?: boolean;
277
+ secure?: boolean;
278
+ sameSite?: 'strict' | 'lax' | 'none';
279
+ }
280
+
281
+ interface ResponseCookie extends ResponseCookieOptions {
282
+ name: string;
283
+ value: string;
284
+ }
285
+
286
+ function serializeCookie(
287
+ name: string,
288
+ value: string,
289
+ options: ResponseCookieOptions,
290
+ ) {
291
+ const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
292
+ // Next's ResponseCookies default the cookie path to '/' when unspecified,
293
+ // so a route handler's Set-Cookie is visible to sibling routes/middleware
294
+ // (not scoped to the request path). Match that default.
295
+ parts.push(`Path=${options.path ?? '/'}`);
296
+ if (options.maxAge !== undefined) parts.push(`Max-Age=${options.maxAge}`);
297
+ if (options.httpOnly) parts.push('HttpOnly');
298
+ if (options.secure) parts.push('Secure');
299
+ if (options.sameSite) parts.push(`SameSite=${options.sameSite}`);
300
+ return parts.join('; ');
301
+ }
302
+
303
+ export function parseCookies(header: string): NextRequestCookie[] {
304
+ return header
305
+ .split(';')
306
+ .map(part => part.trim())
307
+ .filter(Boolean)
308
+ .map(part => {
309
+ const [key = '', ...rest] = part.split('=');
310
+ return { name: safeDecode(key), value: safeDecode(rest.join('=')) };
311
+ });
312
+ }
313
+
314
+ export function requestCookieHeader(cookies: NextRequestCookie[]) {
315
+ return cookies
316
+ .map(cookie => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`)
317
+ .join('; ');
318
+ }
319
+
320
+ export function getSetCookie(headers: Headers) {
321
+ const withSetCookie = headers as Headers & { getSetCookie?: () => string[] };
322
+ return withSetCookie.getSetCookie?.() ?? [];
323
+ }
@@ -0,0 +1,16 @@
1
+ import type { ComponentChildren } from 'preact';
2
+
3
+ export interface SuspenseProps {
4
+ fallback?: ComponentChildren;
5
+ children?: ComponentChildren;
6
+ }
7
+
8
+ /**
9
+ * Server streaming boundary for core PNext apps. The renderer resolves these
10
+ * boundaries itself (streaming, PPR, loading.tsx), so no preact/compat
11
+ * suspension machinery is involved. Rendered directly (client trees, tests),
12
+ * it passes children through.
13
+ */
14
+ export function Suspense(props: SuspenseProps): ComponentChildren {
15
+ return props.children ?? null;
16
+ }
@@ -0,0 +1,61 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+
3
+ export interface CacheNode {
4
+ children: Map<unknown, CacheNode>;
5
+ record?: CacheRecord;
6
+ }
7
+
8
+ export type CacheRecord =
9
+ | { status: 'pending'; value: Promise<unknown> }
10
+ | { status: 'resolved'; value: unknown; async: boolean }
11
+ | { status: 'rejected'; error: unknown; async: boolean };
12
+
13
+ export interface CacheScope {
14
+ functions: WeakMap<object, CacheNode>;
15
+ fetches?: Map<string, Promise<unknown>>;
16
+ /**
17
+ * Lazily-created controller backing React.cacheSignal() in a request render. The signal stays live
18
+ * for the whole render - including deferred/streamed Suspense boundaries that resolve after the
19
+ * shell has flushed - so a slow cache component's bounded polling is never cut short. A build
20
+ * prerender uses the prerender scope's signal instead, which aborts at completePrerender().
21
+ */
22
+ controller?: AbortController;
23
+ }
24
+
25
+ const storage = new AsyncLocalStorage<CacheScope>();
26
+
27
+ export function currentCacheScope() {
28
+ return storage.getStore();
29
+ }
30
+
31
+ /**
32
+ * The AbortSignal for the current cache/render scope (React.cacheSignal()), or null outside any
33
+ * render. A request render's shell can flush while deferred boundaries are still resolving, so this
34
+ * signal is intentionally NOT aborted at shell-flush time - doing so would abort a still-pending slow
35
+ * boundary's polling. Build prerenders get a deterministically-aborting signal from the prerender scope.
36
+ */
37
+ export function currentCacheSignal(): AbortSignal | null {
38
+ const scope = storage.getStore();
39
+ if (!scope) return null;
40
+ if (!scope.controller) scope.controller = new AbortController();
41
+ return scope.controller.signal;
42
+ }
43
+
44
+ export function runWithCacheScope<T>(callback: () => T): T {
45
+ const existing = storage.getStore();
46
+ if (existing) return callback();
47
+ return storage.run({ functions: new WeakMap() }, callback);
48
+ }
49
+
50
+ /**
51
+ * Capture the current cache scope (if any) and return a wrapper that re-runs a
52
+ * function inside it. after() uses this so a callback registered during a page
53
+ * render still shares the render's React cache() memo cache when it runs later
54
+ * in the detached work-unit flush (which otherwise carries no cache scope).
55
+ * Returns an identity wrapper when no scope is active.
56
+ */
57
+ export function captureCacheScope(): <T>(fn: () => T) => T {
58
+ const scope = storage.getStore();
59
+ if (!scope) return fn => fn();
60
+ return fn => storage.run(scope, fn);
61
+ }