@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,257 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { pathToFileHref } from '../../config';
5
+ import type { ResolvedConfig } from '../../config';
6
+ import type { BuildManifest, RouteManifestEntry } from '../../types';
7
+ import { getNextConfig } from '../next/config-loader';
8
+
9
+ /**
10
+ * `adapterPath` support (Next's `onBuildComplete` hook).
11
+ *
12
+ * A deployment adapter is a module with `{ name, onBuildComplete(ctx) }`. Next
13
+ * calls it at the very end of `next build` with the build's routing table and a
14
+ * classified list of OUTPUTS; adapters turn those into their own deployment
15
+ * artifacts. pnext reports the same classification off its build manifest.
16
+ */
17
+ interface SharedRouteFields {
18
+ id: string;
19
+ filePath: string;
20
+ pathname: string;
21
+ sourcePage: string;
22
+ runtime: 'nodejs' | 'edge';
23
+ assets: Record<string, string>;
24
+ assetsHashes: Record<string, string>;
25
+ config: { maxDuration?: number };
26
+ type: string;
27
+ }
28
+
29
+ interface AdapterOutputs {
30
+ pages: SharedRouteFields[];
31
+ appPages: SharedRouteFields[];
32
+ pagesApi: SharedRouteFields[];
33
+ appRoutes: SharedRouteFields[];
34
+ prerenders: { id: string; pathname: string; type: string; parentOutputId: string }[];
35
+ staticFiles: { id: string; filePath: string; pathname: string; type: string }[];
36
+ }
37
+
38
+ /** One entry of `routing.*` — Next's routes-manifest rewrite shape. */
39
+ interface AdapterRoute {
40
+ source?: string;
41
+ sourceRegex: string;
42
+ destination?: string;
43
+ }
44
+
45
+ /** Adapter module shape — only the hook pnext can honour is typed. */
46
+ interface NextAdapter {
47
+ name?: string;
48
+ onBuildComplete?: (ctx: unknown) => unknown;
49
+ }
50
+
51
+ /** The URL pathname a built `public/` file is served at. */
52
+ function staticPathname(relative: string): string {
53
+ const url = `/${relative.replace(/\\/g, '/')}`;
54
+ if (url.endsWith('/index.html')) return url.slice(0, -'index.html'.length) || '/';
55
+ return url.endsWith('.html') ? url.slice(0, -'.html'.length) : url;
56
+ }
57
+
58
+ /** Where the per-route server entry for `route` is written. */
59
+ function serverEntryPath(config: ResolvedConfig, route: RouteManifestEntry): string {
60
+ return path.join(config.outPath, 'server', `${route.id}.js`);
61
+ }
62
+
63
+ /**
64
+ * Write one server entry per route. An adapter keys its deployment artifacts by output `filePath`, so
65
+ * every output has to name a file that exists. pnext serves every route from a single server process -
66
+ * there is no per-route bundle to point at - so the entry is a descriptor module naming the route and
67
+ * the source module the server renders for it. Only written when an adapter is configured.
68
+ */
69
+ async function writeServerEntries(
70
+ config: ResolvedConfig,
71
+ manifest: BuildManifest,
72
+ ): Promise<void> {
73
+ await mkdir(path.join(config.outPath, 'server'), { recursive: true });
74
+ await Promise.all(
75
+ manifest.routes.map((route) =>
76
+ writeFile(
77
+ serverEntryPath(config, route),
78
+ [
79
+ '// Generated by `pnext build` for the configured deployment adapter.',
80
+ '// pnext serves every route from one server process (`pnext start`);',
81
+ '// this entry identifies the route rather than bundling it standalone.',
82
+ `export const id = ${JSON.stringify(route.id)};`,
83
+ `export const pathname = ${JSON.stringify(route.route)};`,
84
+ `export const sourcePage = ${JSON.stringify(sourcePage(config, route))};`,
85
+ `export const kind = ${JSON.stringify(route.kind)};`,
86
+ "export const runtime = 'nodejs';",
87
+ 'export default { id, pathname, sourcePage, kind, runtime };',
88
+ '',
89
+ ].join('\n'),
90
+ ),
91
+ ),
92
+ );
93
+ }
94
+
95
+ function sourcePage(config: ResolvedConfig, route: RouteManifestEntry): string {
96
+ return `/${path.relative(config.root, route.file).replace(/\\/g, '/')}`;
97
+ }
98
+
99
+ function sharedFields(
100
+ config: ResolvedConfig,
101
+ route: RouteManifestEntry,
102
+ ): Omit<SharedRouteFields, 'type'> {
103
+ return {
104
+ id: route.id,
105
+ filePath: serverEntryPath(config, route),
106
+ pathname: route.route,
107
+ sourcePage: sourcePage(config, route),
108
+ // pnext has one runtime: the server process. `edge` is never emitted.
109
+ runtime: 'nodejs',
110
+ assets: {},
111
+ assetsHashes: {},
112
+ config: {
113
+ ...(route.maxDuration !== undefined ? { maxDuration: route.maxDuration } : {}),
114
+ },
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Classify the build into adapter outputs. A route that produced a file in `public/` was prerendered:
120
+ * a STATIC_FILE when it is frozen for the life of the deployment, a PRERENDER when it carries a
121
+ * revalidate (ISR seeds a cache entry the server refreshes). Everything else is a server entrypoint -
122
+ * `page` routes are APP_PAGE, `handler` routes (API routes and code-based metadata routes) are APP_ROUTE.
123
+ */
124
+ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): AdapterOutputs {
125
+ const outputs: AdapterOutputs = {
126
+ pages: [],
127
+ appPages: [],
128
+ pagesApi: [],
129
+ appRoutes: [],
130
+ prerenders: [],
131
+ staticFiles: [],
132
+ };
133
+ const prerenderedRoutes = new Set<string>();
134
+
135
+ for (const [relative, metadata] of Object.entries(manifest.staticFiles ?? {})) {
136
+ const filePath = path.join(config.outPath, 'public', relative);
137
+ // The manifest also records prerenders that produced no body on disk
138
+ // (an empty response, `_not-found` / `_global-error`). Those are not
139
+ // deployable artifacts: leave them out, and leave the owning route as a
140
+ // server entrypoint rather than treating it as prerendered.
141
+ if (!existsSync(filePath)) continue;
142
+ if (metadata.routeId) prerenderedRoutes.add(metadata.routeId);
143
+ const entry = { id: relative, filePath, pathname: staticPathname(relative) };
144
+ if (metadata.revalidateSeconds !== undefined) {
145
+ outputs.prerenders.push({
146
+ ...entry,
147
+ type: 'PRERENDER',
148
+ parentOutputId: metadata.routeId ?? relative,
149
+ });
150
+ } else {
151
+ outputs.staticFiles.push({ ...entry, type: 'STATIC_FILE' });
152
+ }
153
+ }
154
+
155
+ for (const route of manifest.routes) {
156
+ if (prerenderedRoutes.has(route.id) && route.mode === 'static' && !route.ppr) continue;
157
+ const fields = sharedFields(config, route);
158
+ if (route.kind === 'handler') {
159
+ outputs.appRoutes.push({ ...fields, type: 'APP_ROUTE' });
160
+ } else {
161
+ outputs.appPages.push({ ...fields, type: 'APP_PAGE' });
162
+ // Every app page is reachable both as HTML and as its RSC payload; Next
163
+ // reports the pair as two outputs sharing one entrypoint.
164
+ outputs.appPages.push({
165
+ ...fields,
166
+ type: 'APP_PAGE',
167
+ id: `${route.id}.rsc`,
168
+ pathname: `${fields.pathname}.rsc`,
169
+ });
170
+ }
171
+ }
172
+
173
+ return outputs;
174
+ }
175
+
176
+ /**
177
+ * Name the capture groups of a route's match pattern after its params, giving
178
+ * the `namedRegex` form Next's routes-manifest uses (`$name` in destinations).
179
+ */
180
+ function namedSourceRegex(route: RouteManifestEntry): string {
181
+ let index = 0;
182
+ const named = route.pattern.replace(/\((\[\^\/\]\+|\.\*)\)/g, (whole, body: string) => {
183
+ const param = route.params[index++];
184
+ return param ? `(?<${param.replace(/\W/g, '')}>${body})` : whole;
185
+ });
186
+ return `^${named}(?:/)?$`;
187
+ }
188
+
189
+ /**
190
+ * The dynamic (param-carrying) routes, in match order. App pages get a second entry ahead of the plain
191
+ * one matching their RSC suffixes - `/x.rsc` and the per-segment prefetch URLs - mirroring how Next
192
+ * emits them.
193
+ */
194
+ function collectDynamicRoutes(manifest: BuildManifest): AdapterRoute[] {
195
+ const routes: AdapterRoute[] = [];
196
+ for (const route of manifest.routes) {
197
+ if (route.params.length === 0) continue;
198
+ const sourceRegex = namedSourceRegex(route);
199
+ if (route.kind === 'page') {
200
+ routes.push({
201
+ source: `${route.route}.rsc`,
202
+ sourceRegex: sourceRegex.replace(
203
+ /\(\?:\/\)\?\$$/,
204
+ String.raw`(?<rscSuffix>\.rsc|\.segments/.+\.segment\.rsc)(?:/)?$`,
205
+ ),
206
+ destination: `${route.route}$rscSuffix`,
207
+ });
208
+ }
209
+ routes.push({ source: route.route, sourceRegex, destination: route.route });
210
+ }
211
+ return routes;
212
+ }
213
+
214
+ /**
215
+ * Resolve the configured adapter and run its `onBuildComplete`.
216
+ *
217
+ * `NEXT_ADAPTER_PATH` wins over the config value (Next reads it the same way, so
218
+ * a deployment platform can inject its adapter into an unmodified app).
219
+ */
220
+ export async function runBuildCompleteAdapter(
221
+ config: ResolvedConfig,
222
+ manifest: BuildManifest,
223
+ ): Promise<void> {
224
+ const configured = getNextConfig().adapterPath;
225
+ const adapterPath =
226
+ // eslint-disable-next-line turbo/no-undeclared-env-vars -- Next's own env override
227
+ process.env.NEXT_ADAPTER_PATH || (typeof configured === 'string' ? configured : undefined);
228
+ if (!adapterPath) return;
229
+ const resolved = path.isAbsolute(adapterPath)
230
+ ? adapterPath
231
+ : path.resolve(config.root, adapterPath);
232
+ const module = (await import(pathToFileHref(resolved))) as {
233
+ default?: NextAdapter;
234
+ } & NextAdapter;
235
+ const adapter = module.default ?? module;
236
+ if (typeof adapter?.onBuildComplete !== 'function') return;
237
+
238
+ await writeServerEntries(config, manifest);
239
+
240
+ await adapter.onBuildComplete({
241
+ routing: {
242
+ beforeMiddleware: [],
243
+ middlewareMatchers: [],
244
+ beforeFiles: [],
245
+ afterFiles: [],
246
+ dynamicRoutes: collectDynamicRoutes(manifest),
247
+ onMatch: [],
248
+ fallback: [],
249
+ shouldNormalizeNextData: false,
250
+ rsc: undefined,
251
+ },
252
+ outputs: collectOutputs(config, manifest),
253
+ projectDir: config.root,
254
+ repoRoot: config.root,
255
+ distDir: config.outPath,
256
+ });
257
+ }
@@ -0,0 +1,53 @@
1
+ import { uniqueIdentifier } from '../../utils/source';
2
+
3
+ // A quoted `'bun'`/`'bun:x'` specifier anywhere in the source. Deliberately not
4
+ // the module record's edges: a route handler looping
5
+ // `require(name)` over a table of module names has NO static edge, and Next
6
+ // still externalizes those. Matching the quoted specifier keeps that reach while
7
+ // staying far tighter than the old bare-word `bun` regex.
8
+ const QUOTED_BUN_SPECIFIER = /(['"])bun(?::[^'"]+)?\1/;
9
+
10
+ /**
11
+ * Guard `bun`/`bun:*` builtins behind a runtime throw so a module importing one can still be compiled
12
+ * for a non-Bun target. The call-site rewrite is textual - the guard has to reach non-literal
13
+ * require/import calls too, which no record can name.
14
+ */
15
+ export function rewriteBunBuiltinExternals(source: string, _file = 'module.tsx'): string {
16
+ if (!source.includes('bun')) return source;
17
+ if (!QUOTED_BUN_SPECIFIER.test(source)) return source;
18
+
19
+ const requireName = uniqueIdentifier(source, '__pnext_require_external');
20
+ const importName = uniqueIdentifier(source, '__pnext_import_external', requireName);
21
+ const literalRequires: string[] = [];
22
+ let next = source.replace(
23
+ /\brequire\s*\(\s*(['"])(bun(?::[^'"]+)?)\1\s*\)/g,
24
+ (_match, _quote: string, specifier: string) => {
25
+ literalRequires.push(specifier);
26
+ return `__pnext_bun_external_${literalRequires.length - 1}__`;
27
+ },
28
+ );
29
+ next = next.replace(/\brequire\s*\(/g, `${requireName}(`);
30
+ next = next.replace(/__pnext_bun_external_(\d+)__/g, (_match, index: string) => {
31
+ const specifier = literalRequires[Number(index)];
32
+ return `${requireName}(${JSON.stringify(specifier)}, () => require(${JSON.stringify(specifier)}))`;
33
+ });
34
+ next = next.replace(/\bimport\s*\(/g, `${importName}(`);
35
+
36
+ const directive = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? '';
37
+ const helpers = [
38
+ `const ${requireName} = (specifier, load) => {`,
39
+ ` if (specifier === 'bun' || specifier.startsWith('bun:')) {`,
40
+ " throw new Error(`Cannot find module '${specifier}'`);",
41
+ ' }',
42
+ ' return load ? load() : require(specifier);',
43
+ '};',
44
+ `const ${importName} = (specifier) => {`,
45
+ ` if (specifier === 'bun' || specifier.startsWith('bun:')) {`,
46
+ " return Promise.reject(new Error(`Cannot find module '${specifier}'`));",
47
+ ' }',
48
+ ' return import(specifier);',
49
+ '};',
50
+ '',
51
+ ].join('\n');
52
+ return `${directive}${helpers}${next.slice(directive.length)}`;
53
+ }