@wular/pnext 0.0.3 → 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 -1961
  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 -1887
  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} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  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 +833 -848
  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
@@ -1,71 +1,69 @@
1
- import { copyFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import type { ResolvedConfig } from '../../config';
4
- import type { BuildManifest, RouteManifestEntry } from '../../types';
5
- import { listFiles, toPosixPath } from '../../utils/fs';
6
- import type { BuildStepLogger } from '../../extensions';
7
- import { getNextConfig } from '../next/config-loader';
8
- import { emitStandalone } from './standalone';
1
+ import { copyFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
2
+ import path from 'node:path'
3
+ import type { ResolvedConfig } from '../../config'
4
+ import type { BuildManifest, RouteManifestEntry } from '../../types'
5
+ import { listFiles, toPosixPath } from '../../utils/fs'
6
+ import type { BuildStepLogger } from '../../extensions'
7
+ import { getNextConfig } from '../next/config-loader'
8
+ import { emitStandalone } from './standalone'
9
9
 
10
10
  interface EmitStaticExportContext {
11
- config: ResolvedConfig;
12
- manifest: BuildManifest;
13
- log: BuildStepLogger;
11
+ config: ResolvedConfig
12
+ manifest: BuildManifest
13
+ log: BuildStepLogger
14
14
  }
15
15
 
16
16
  interface ExportPage {
17
- route: RouteManifestEntry;
18
- htmlFile: string;
19
- outHtml: string;
20
- outPageTxt: string;
21
- segmentDir: string;
17
+ route: RouteManifestEntry
18
+ htmlFile: string
19
+ outHtml: string
20
+ outPageTxt: string
21
+ segmentDir: string
22
22
  }
23
23
 
24
- const BUILD_ID = 'pnext';
25
- const COMMON_SEGMENTS = ['_full', '_head', '_index', '_tree'];
24
+ const BUILD_ID = 'pnext'
25
+ const COMMON_SEGMENTS = ['_full', '_head', '_index', '_tree']
26
26
 
27
27
  // Where the client runtime lands inside the export tree. A compat build serves `public/assets/<rel>` at
28
28
  // `/_next/static/<rel>`, but a static export may only add files Next itself would add - the file-set
29
29
  // contract treats everything under `_next/static/chunks/` as ignorable build output and nothing else.
30
30
  // Shifting the whole `assets/` tree down one level, rather than flattening it, keeps its internal
31
31
  // layout intact, so an entry's relative `./chunks/<chunk>.js` import still resolves after the move.
32
- const RUNTIME_ASSET_DIR = '_next/static/chunks';
32
+ const RUNTIME_ASSET_DIR = '_next/static/chunks'
33
33
 
34
34
  // Marks an exported document as "served without a pnext server" for the client
35
35
  // router: it switches to fetching the flat artifacts written beside each page
36
36
  // instead of negotiating with a server. See ./client.ts. Injected only into the
37
37
  // export tree — `pnext start` serves the same build unchanged.
38
- const EXPORT_MODE_SCRIPT = '<script>window.__PNEXT_OUTPUT_EXPORT__=true;</script>';
38
+ const EXPORT_MODE_SCRIPT = '<script>window.__PNEXT_OUTPUT_EXPORT__=true;</script>'
39
39
 
40
40
  export async function emitStaticExport({ config, manifest, log }: EmitStaticExportContext) {
41
41
  // Every compat build serves `/_next/static/<buildId>/_buildManifest.js` (and `_ssgManifest.js`) from
42
42
  // the running server - client runtime code fetches it unconditionally, and Next's own asset-404 tests
43
43
  // probe it as "a known valid asset path". Export mode additionally snapshots a standalone `out/` tree
44
44
  // below; the manifest files it needs are the same bytes, so write the server-served copy first.
45
- await log.step('build manifest', () =>
46
- writeBuildManifests(path.join(config.outPath, 'public')),
47
- );
48
- const output = getNextConfig().output;
45
+ await log.step('build manifest', () => writeBuildManifests(path.join(config.outPath, 'public')))
46
+ const output = getNextConfig().output
49
47
  if (output === 'standalone') {
50
- await emitStandalone({ config, manifest, log });
51
- return;
48
+ await emitStandalone({ config, manifest, log })
49
+ return
52
50
  }
53
- if (output !== 'export') return;
54
- await log.step('static export', () => writeExportTree(config, manifest));
51
+ if (output !== 'export') return
52
+ await log.step('static export', () => writeExportTree(config, manifest))
55
53
  }
56
54
 
57
55
  async function writeExportTree(config: ResolvedConfig, manifest: BuildManifest): Promise<void> {
58
- const outDir = exportOutDir(config);
59
- await rm(outDir, { recursive: true, force: true });
60
- await mkdir(outDir, { recursive: true });
56
+ const outDir = exportOutDir(config)
57
+ await rm(outDir, { recursive: true, force: true })
58
+ await mkdir(outDir, { recursive: true })
61
59
 
62
- const assets = await copyRuntimeAssets(config, outDir);
63
- await copyPublicTree(config, outDir, assets);
64
- await writeBuildManifests(outDir);
60
+ const assets = await copyRuntimeAssets(config, outDir)
61
+ await copyPublicTree(config, outDir, assets)
62
+ await writeBuildManifests(outDir)
65
63
 
66
- const pages = exportPages(config, manifest);
67
- for (const page of pages) await writePageArtifacts(page, assets);
68
- await writeNotFoundArtifacts(config, outDir);
64
+ const pages = exportPages(config, manifest)
65
+ for (const page of pages) await writePageArtifacts(page, assets)
66
+ await writeNotFoundArtifacts(config, outDir)
69
67
  }
70
68
 
71
69
  /**
@@ -76,16 +74,16 @@ async function writeExportTree(config: ResolvedConfig, manifest: BuildManifest):
76
74
  * can be pointed at their new location.
77
75
  */
78
76
  async function copyRuntimeAssets(config: ResolvedConfig, outDir: string): Promise<Set<string>> {
79
- const assetsDir = path.join(config.outPath, 'public', 'assets');
80
- const assets = new Set<string>();
77
+ const assetsDir = path.join(config.outPath, 'public', 'assets')
78
+ const assets = new Set<string>()
81
79
  for (const file of await listFiles(assetsDir)) {
82
- const relative = toPosixPath(path.relative(assetsDir, file));
83
- assets.add(relative);
84
- const target = path.join(outDir, ...RUNTIME_ASSET_DIR.split('/'), ...relative.split('/'));
85
- await mkdir(path.dirname(target), { recursive: true });
86
- await copyFile(file, target);
80
+ const relative = toPosixPath(path.relative(assetsDir, file))
81
+ assets.add(relative)
82
+ const target = path.join(outDir, ...RUNTIME_ASSET_DIR.split('/'), ...relative.split('/'))
83
+ await mkdir(path.dirname(target), { recursive: true })
84
+ await copyFile(file, target)
87
85
  }
88
- return assets;
86
+ return assets
89
87
  }
90
88
 
91
89
  async function copyPublicTree(
@@ -93,16 +91,16 @@ async function copyPublicTree(
93
91
  outDir: string,
94
92
  assets: ReadonlySet<string>,
95
93
  ): Promise<void> {
96
- const publicDir = path.join(config.outPath, 'public');
94
+ const publicDir = path.join(config.outPath, 'public')
97
95
  for (const file of await listFiles(publicDir)) {
98
- const relative = toPosixPath(path.relative(publicDir, file));
99
- if (relative.startsWith('assets/')) continue;
100
- const target = path.join(outDir, ...relative.split('/'));
101
- await mkdir(path.dirname(target), { recursive: true });
96
+ const relative = toPosixPath(path.relative(publicDir, file))
97
+ if (relative.startsWith('assets/')) continue
98
+ const target = path.join(outDir, ...relative.split('/'))
99
+ await mkdir(path.dirname(target), { recursive: true })
102
100
  if (relative.endsWith('.html')) {
103
- await writeFile(target, exportDocument(await readFile(file, 'utf8'), assets));
101
+ await writeFile(target, exportDocument(await readFile(file, 'utf8'), assets))
104
102
  } else {
105
- await copyFile(file, target);
103
+ await copyFile(file, target)
106
104
  }
107
105
  }
108
106
  }
@@ -119,23 +117,23 @@ function exportDocument(html: string, assets: ReadonlySet<string>): string {
119
117
  /\/_next\/static\/([^"'`\s<>)?#]+)([?#][^"'`\s<>]*)?/g,
120
118
  (match: string, rest: string, suffix?: string) =>
121
119
  assets.has(rest) ? `/${RUNTIME_ASSET_DIR}/${rest}${suffix ?? ''}` : match,
122
- );
120
+ )
123
121
  // Before any module script runs, so the first navigation already sees it. A
124
122
  // fragment with neither <head> nor <body> takes the marker up front.
125
- const anchor = /<head[^>]*>|<body[^>]*>/.exec(repointed);
126
- if (!anchor) return EXPORT_MODE_SCRIPT + repointed;
127
- const at = anchor.index + anchor[0].length;
128
- return `${repointed.slice(0, at)}${EXPORT_MODE_SCRIPT}${repointed.slice(at)}`;
123
+ const anchor = /<head[^>]*>|<body[^>]*>/.exec(repointed)
124
+ if (!anchor) return EXPORT_MODE_SCRIPT + repointed
125
+ const at = anchor.index + anchor[0].length
126
+ return `${repointed.slice(0, at)}${EXPORT_MODE_SCRIPT}${repointed.slice(at)}`
129
127
  }
130
128
 
131
129
  async function writeBuildManifests(outDir: string): Promise<void> {
132
- const dir = path.join(outDir, '_next', 'static', BUILD_ID);
133
- await mkdir(dir, { recursive: true });
130
+ const dir = path.join(outDir, '_next', 'static', BUILD_ID)
131
+ await mkdir(dir, { recursive: true })
134
132
  await writeFile(
135
133
  path.join(dir, '_buildManifest.js'),
136
134
  'self.__BUILD_MANIFEST={};self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();\n',
137
- );
138
- await writeFile(path.join(dir, '_ssgManifest.js'), 'self.__SSG_MANIFEST=new Set();\n');
135
+ )
136
+ await writeFile(path.join(dir, '_ssgManifest.js'), 'self.__SSG_MANIFEST=new Set();\n')
139
137
  }
140
138
 
141
139
  /**
@@ -144,65 +142,65 @@ async function writeBuildManifests(outDir: string): Promise<void> {
144
142
  * default dir.
145
143
  */
146
144
  function exportOutDir(config: ResolvedConfig): string {
147
- const distDir = getNextConfig().distDir;
145
+ const distDir = getNextConfig().distDir
148
146
  // Next's hasCustomExportOutput treats '.next' as the default distDir — the
149
147
  // export then lands in 'out' rather than clobbering the build directory.
150
148
  const dir =
151
- typeof distDir === 'string' && distDir.length > 0 && distDir !== '.next' ? distDir : 'out';
152
- return path.resolve(config.root, dir);
149
+ typeof distDir === 'string' && distDir.length > 0 && distDir !== '.next' ? distDir : 'out'
150
+ return path.resolve(config.root, dir)
153
151
  }
154
152
 
155
153
  function exportPages(config: ResolvedConfig, manifest: BuildManifest): ExportPage[] {
156
- const staticFiles = manifest.staticFiles ?? {};
157
- const routeById = new Map(manifest.routes.map(route => [route.id, route]));
158
- const pages: ExportPage[] = [];
154
+ const staticFiles = manifest.staticFiles ?? {}
155
+ const routeById = new Map(manifest.routes.map(route => [route.id, route]))
156
+ const pages: ExportPage[] = []
159
157
 
160
158
  for (const [relative, metadata] of Object.entries(staticFiles)) {
161
- if (metadata.kind !== 'page' || !relative.endsWith('.html')) continue;
162
- const route = metadata.routeId ? routeById.get(metadata.routeId) : undefined;
163
- if (route?.kind !== 'page') continue;
164
- const htmlFile = path.join(config.outPath, 'public', ...relative.split('/'));
159
+ if (metadata.kind !== 'page' || !relative.endsWith('.html')) continue
160
+ const route = metadata.routeId ? routeById.get(metadata.routeId) : undefined
161
+ if (route?.kind !== 'page') continue
162
+ const htmlFile = path.join(config.outPath, 'public', ...relative.split('/'))
165
163
  pages.push({
166
164
  route,
167
165
  htmlFile,
168
166
  ...exportPathsForHtml(config, relative),
169
- });
167
+ })
170
168
  }
171
169
 
172
- return pages.sort((a, b) => a.outHtml.localeCompare(b.outHtml));
170
+ return pages.sort((a, b) => a.outHtml.localeCompare(b.outHtml))
173
171
  }
174
172
 
175
173
  function exportPathsForHtml(config: ResolvedConfig, relative: string) {
176
- const outDir = exportOutDir(config);
177
- const normalized = toPosixPath(relative);
174
+ const outDir = exportOutDir(config)
175
+ const normalized = toPosixPath(relative)
178
176
  if (normalized === 'index.html') {
179
177
  return {
180
178
  outHtml: path.join(outDir, 'index.html'),
181
179
  outPageTxt: path.join(outDir, 'index.txt'),
182
180
  segmentDir: outDir,
183
- };
181
+ }
184
182
  }
185
183
  if (normalized.endsWith('/index.html')) {
186
- const routePath = normalized.slice(0, -'/index.html'.length);
184
+ const routePath = normalized.slice(0, -'/index.html'.length)
187
185
  return {
188
186
  outHtml: path.join(outDir, ...normalized.split('/')),
189
187
  outPageTxt: path.join(outDir, ...routePath.split('/'), 'index.txt'),
190
188
  segmentDir: path.join(outDir, ...routePath.split('/')),
191
- };
189
+ }
192
190
  }
193
- const routePath = normalized.slice(0, -'.html'.length);
191
+ const routePath = normalized.slice(0, -'.html'.length)
194
192
  return {
195
193
  outHtml: path.join(outDir, ...normalized.split('/')),
196
194
  outPageTxt: path.join(outDir, `${routePath}.txt`),
197
195
  segmentDir: path.join(outDir, ...routePath.split('/')),
198
- };
196
+ }
199
197
  }
200
198
 
201
199
  async function writePageArtifacts(page: ExportPage, assets: ReadonlySet<string>): Promise<void> {
202
- const html = exportDocument(await readFile(page.htmlFile, 'utf8'), assets);
203
- await mkdir(path.dirname(page.outPageTxt), { recursive: true });
204
- await writeFile(page.outPageTxt, html);
205
- await writeSegmentFiles(page.segmentDir, page.route, html);
200
+ const html = exportDocument(await readFile(page.htmlFile, 'utf8'), assets)
201
+ await mkdir(path.dirname(page.outPageTxt), { recursive: true })
202
+ await writeFile(page.outPageTxt, html)
203
+ await writeSegmentFiles(page.segmentDir, page.route, html)
206
204
  }
207
205
 
208
206
  async function writeSegmentFiles(
@@ -210,63 +208,66 @@ async function writeSegmentFiles(
210
208
  route: Pick<RouteManifestEntry, 'route' | 'params'>,
211
209
  body: string,
212
210
  ): Promise<void> {
213
- await mkdir(segmentDir, { recursive: true });
211
+ await mkdir(segmentDir, { recursive: true })
214
212
  for (const segment of COMMON_SEGMENTS) {
215
- await writeFile(path.join(segmentDir, `__next.${segment}.txt`), body);
213
+ await writeFile(path.join(segmentDir, `__next.${segment}.txt`), body)
216
214
  }
217
215
 
218
- const keys = segmentKeys(route);
219
- const leaf = keys.at(-1) ?? '';
220
- await writeFile(path.join(segmentDir, leaf ? `__next.${leaf}.__PAGE__.txt` : '__next.__PAGE__.txt'), body);
221
- if (leaf) await writeFile(path.join(segmentDir, `__next.${leaf}.txt`), body);
216
+ const keys = segmentKeys(route)
217
+ const leaf = keys.at(-1) ?? ''
218
+ await writeFile(
219
+ path.join(segmentDir, leaf ? `__next.${leaf}.__PAGE__.txt` : '__next.__PAGE__.txt'),
220
+ body,
221
+ )
222
+ if (leaf) await writeFile(path.join(segmentDir, `__next.${leaf}.txt`), body)
222
223
  for (const key of keys.slice(0, -1)) {
223
- if (key) await writeFile(path.join(segmentDir, `__next.${key}.txt`), body);
224
+ if (key) await writeFile(path.join(segmentDir, `__next.${key}.txt`), body)
224
225
  }
225
226
  }
226
227
 
227
228
  function segmentKeys(route: Pick<RouteManifestEntry, 'route' | 'params'>): string[] {
228
- const params = new Set(route.params);
229
+ const params = new Set(route.params)
229
230
  const parts = route.route
230
231
  .replace(/^\/|\/$/g, '')
231
232
  .split('/')
232
233
  .filter(Boolean)
233
- .map(part => (part.startsWith(':') ? `$d$${part.replace(/^:|[*?]$/g, '')}` : part));
234
- if (parts.length === 0) return [''];
235
- const keys: string[] = [];
234
+ .map(part => (part.startsWith(':') ? `$d$${part.replace(/^:|[*?]$/g, '')}` : part))
235
+ if (parts.length === 0) return ['']
236
+ const keys: string[] = []
236
237
  for (const [index, part] of parts.entries()) {
237
- const key = part.startsWith('$d$') && !params.has(part.slice(3)) ? part.slice(3) : part;
238
- keys.push([...parts.slice(0, index), key].join('.'));
238
+ const key = part.startsWith('$d$') && !params.has(part.slice(3)) ? part.slice(3) : part
239
+ keys.push([...parts.slice(0, index), key].join('.'))
239
240
  }
240
- return keys;
241
+ return keys
241
242
  }
242
243
 
243
244
  async function writeNotFoundArtifacts(config: ResolvedConfig, outDir: string): Promise<void> {
244
245
  // Read back the COPY in the export tree — copyPublicTree already repointed
245
246
  // its runtime references and stamped the export marker.
246
- const htmlFile = path.join(outDir, '404.html');
247
- const html = await readFile(htmlFile, 'utf8').catch(() => undefined);
248
- if (html === undefined) return;
247
+ const htmlFile = path.join(outDir, '404.html')
248
+ const html = await readFile(htmlFile, 'utf8').catch(() => undefined)
249
+ if (html === undefined) return
249
250
 
250
251
  if (config.trailingSlash === true) {
251
- const nested = path.join(outDir, '404', 'index.html');
252
- await mkdir(path.dirname(nested), { recursive: true });
253
- await writeFile(nested, html);
252
+ const nested = path.join(outDir, '404', 'index.html')
253
+ await mkdir(path.dirname(nested), { recursive: true })
254
+ await writeFile(nested, html)
254
255
  }
255
256
 
256
257
  const outHtml =
257
258
  config.trailingSlash === true
258
259
  ? path.join(outDir, '_not-found', 'index.html')
259
- : path.join(outDir, '_not-found.html');
260
+ : path.join(outDir, '_not-found.html')
260
261
  const outTxt =
261
262
  config.trailingSlash === true
262
263
  ? path.join(outDir, '_not-found', 'index.txt')
263
- : path.join(outDir, '_not-found.txt');
264
- await mkdir(path.dirname(outHtml), { recursive: true });
265
- await writeFile(outHtml, html);
266
- await writeFile(outTxt, html);
264
+ : path.join(outDir, '_not-found.txt')
265
+ await mkdir(path.dirname(outHtml), { recursive: true })
266
+ await writeFile(outHtml, html)
267
+ await writeFile(outTxt, html)
267
268
  await writeSegmentFiles(
268
269
  path.join(outDir, '_not-found'),
269
270
  { route: '/_not-found', params: [] },
270
271
  html,
271
- );
272
+ )
272
273
  }
@@ -11,34 +11,38 @@
11
11
  // straight onto its own stdout, so the harness's readiness regex fires without a proxy hop. The original
12
12
  // build tree outlives the moved standalone folder for the duration of the test, so absolute references
13
13
  // back into it are safe.
14
- import { existsSync, readFileSync } from 'node:fs';
15
- import { mkdir, rm, writeFile } from 'node:fs/promises';
16
- import path from 'node:path';
17
- import type { ResolvedConfig } from '../../config';
18
- import type { BuildManifest, RouteManifestEntry } from '../../types';
19
- import { listFiles, toPosixPath } from '../../utils/fs';
20
- import type { BuildStepLogger } from '../../extensions';
14
+ import { existsSync, readFileSync } from 'node:fs'
15
+ import { mkdir, rm, writeFile } from 'node:fs/promises'
16
+ import path from 'node:path'
17
+ import type { ResolvedConfig } from '../../config'
18
+ import type { BuildManifest, RouteManifestEntry } from '../../types'
19
+ import { listFiles, toPosixPath } from '../../utils/fs'
20
+ import type { BuildStepLogger } from '../../extensions'
21
21
 
22
22
  interface EmitStandaloneContext {
23
- config: ResolvedConfig;
24
- manifest: BuildManifest;
25
- log: BuildStepLogger;
23
+ config: ResolvedConfig
24
+ manifest: BuildManifest
25
+ log: BuildStepLogger
26
26
  }
27
27
 
28
28
  /** `page.*` / `route.*` entry files whose compiled `<name>.js` gets a trace. */
29
- const ENTRY_FILE = /(?:^|[\\/])(page|route)\.(?:js|jsx|ts|tsx|mjs|cjs)$/;
29
+ const ENTRY_FILE = /(?:^|[\\/])(page|route)\.(?:js|jsx|ts|tsx|mjs|cjs)$/
30
30
 
31
- export async function emitStandalone({ config, manifest, log }: EmitStandaloneContext): Promise<void> {
32
- await log.step('standalone output', () => writeStandalone(config, manifest));
31
+ export async function emitStandalone({
32
+ config,
33
+ manifest,
34
+ log,
35
+ }: EmitStandaloneContext): Promise<void> {
36
+ await log.step('standalone output', () => writeStandalone(config, manifest))
33
37
  }
34
38
 
35
39
  async function writeStandalone(config: ResolvedConfig, manifest: BuildManifest): Promise<void> {
36
- const standaloneDir = path.join(config.root, '.next', 'standalone');
37
- await rm(standaloneDir, { recursive: true, force: true });
38
- await mkdir(standaloneDir, { recursive: true });
39
- await writeServerEntry(config, standaloneDir);
40
- await writeTraceFiles(config, standaloneDir);
41
- await writeMiddlewareManifest(manifest, standaloneDir);
40
+ const standaloneDir = path.join(config.root, '.next', 'standalone')
41
+ await rm(standaloneDir, { recursive: true, force: true })
42
+ await mkdir(standaloneDir, { recursive: true })
43
+ await writeServerEntry(config, standaloneDir)
44
+ await writeTraceFiles(config, standaloneDir)
45
+ await writeMiddlewareManifest(manifest, standaloneDir)
42
46
  }
43
47
 
44
48
  /**
@@ -51,8 +55,8 @@ async function writeServerEntry(config: ResolvedConfig, standaloneDir: string):
51
55
  await writeFile(
52
56
  path.join(standaloneDir, 'package.json'),
53
57
  `${JSON.stringify({ name: 'pnext-standalone', version: '0.0.0', type: 'commonjs', private: true }, null, 2)}\n`,
54
- );
55
- await writeFile(path.join(standaloneDir, 'server.js'), standaloneServerSource(config));
58
+ )
59
+ await writeFile(path.join(standaloneDir, 'server.js'), standaloneServerSource(config))
56
60
  }
57
61
 
58
62
  /**
@@ -64,7 +68,7 @@ async function writeServerEntry(config: ResolvedConfig, standaloneDir: string):
64
68
  * after() callbacks drain.
65
69
  */
66
70
  function standaloneServerSource(config: ResolvedConfig): string {
67
- const cliPath = path.resolve(import.meta.dirname, '..', '..', 'cli', 'index.ts');
71
+ const cliPath = path.resolve(import.meta.dirname, '..', '..', 'cli', 'index.ts')
68
72
  return `'use strict';
69
73
  // pnext standalone launcher. Generated by pnext build; see
70
74
  // src/compat/export/standalone.ts. Spawned as \`node server.js\` from the moved
@@ -109,7 +113,7 @@ for (const signal of ['SIGINT', 'SIGTERM']) {
109
113
  if (child.exitCode === null) child.kill(signal);
110
114
  });
111
115
  }
112
- `;
116
+ `
113
117
  }
114
118
 
115
119
  /**
@@ -122,11 +126,11 @@ for (const signal of ['SIGINT', 'SIGTERM']) {
122
126
  * never distort the emitted paths.
123
127
  */
124
128
  async function writeTraceFiles(config: ResolvedConfig, standaloneDir: string): Promise<void> {
125
- const serverDir = path.join(standaloneDir, '.next', 'server');
126
- await emitTracesFor(path.join(config.root, 'app'), path.join(serverDir, 'app'));
127
- await emitTracesFor(path.join(config.root, 'src', 'app'), path.join(serverDir, 'app'));
128
- await emitTracesFor(path.join(config.root, 'pages'), path.join(serverDir, 'pages'));
129
- await emitTracesFor(path.join(config.root, 'src', 'pages'), path.join(serverDir, 'pages'));
129
+ const serverDir = path.join(standaloneDir, '.next', 'server')
130
+ await emitTracesFor(path.join(config.root, 'app'), path.join(serverDir, 'app'))
131
+ await emitTracesFor(path.join(config.root, 'src', 'app'), path.join(serverDir, 'app'))
132
+ await emitTracesFor(path.join(config.root, 'pages'), path.join(serverDir, 'pages'))
133
+ await emitTracesFor(path.join(config.root, 'src', 'pages'), path.join(serverDir, 'pages'))
130
134
  }
131
135
 
132
136
  /**
@@ -144,10 +148,10 @@ async function writeMiddlewareManifest(
144
148
  manifest: BuildManifest,
145
149
  standaloneDir: string,
146
150
  ): Promise<void> {
147
- const functions: Record<string, unknown> = {};
151
+ const functions: Record<string, unknown> = {}
148
152
  for (const route of manifest.routes) {
149
- if (!isEdgeRoute(route)) continue;
150
- const page = route.route || '/';
153
+ if (!isEdgeRoute(route)) continue
154
+ const page = route.route || '/'
151
155
  functions[page] = {
152
156
  files: [],
153
157
  name: `edge${page === '/' ? '/index' : page}`,
@@ -156,15 +160,15 @@ async function writeMiddlewareManifest(
156
160
  wasm: [],
157
161
  assets: [],
158
162
  env: {},
159
- };
163
+ }
160
164
  }
161
- if (Object.keys(functions).length === 0) return;
162
- const serverDir = path.join(standaloneDir, '.next', 'server');
163
- await mkdir(serverDir, { recursive: true });
165
+ if (Object.keys(functions).length === 0) return
166
+ const serverDir = path.join(standaloneDir, '.next', 'server')
167
+ await mkdir(serverDir, { recursive: true })
164
168
  await writeFile(
165
169
  path.join(serverDir, 'middleware-manifest.json'),
166
170
  `${JSON.stringify({ version: 3, sortedMiddleware: [], middleware: {}, functions }, null, 2)}\n`,
167
- );
171
+ )
168
172
  }
169
173
 
170
174
  /**
@@ -173,35 +177,39 @@ async function writeMiddlewareManifest(
173
177
  * is detected from the route source directly.
174
178
  */
175
179
  function isEdgeRoute(route: RouteManifestEntry): boolean {
176
- const runtime = route.segmentConfig?.runtime;
177
- if (runtime === 'edge' || runtime === 'experimental-edge') return true;
180
+ const runtime = route.segmentConfig?.runtime
181
+ if (runtime === 'edge' || runtime === 'experimental-edge') return true
178
182
  for (const file of [route.file, ...(route.sourceFiles ?? [])]) {
179
- if (!file || !existsSync(file)) continue;
180
- let source: string;
183
+ if (!file || !existsSync(file)) continue
184
+ let source: string
181
185
  try {
182
- source = readFileSync(file, 'utf8');
186
+ source = readFileSync(file, 'utf8')
183
187
  } catch {
184
- continue;
188
+ continue
185
189
  }
186
- if (/\bruntime\s*:\s*['"](?:edge|experimental-edge)['"]/.test(source)) return true;
187
- if (/export\s+const\s+runtime\s*=\s*['"](?:edge|experimental-edge)['"]/.test(source)) return true;
190
+ if (/\bruntime\s*:\s*['"](?:edge|experimental-edge)['"]/.test(source)) return true
191
+ if (/export\s+const\s+runtime\s*=\s*['"](?:edge|experimental-edge)['"]/.test(source))
192
+ return true
188
193
  }
189
- return false;
194
+ return false
190
195
  }
191
196
 
192
197
  function escapeRouteRegexp(route: string): string {
193
- return route.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/:([^/\\]+)/g, '[^/]+');
198
+ return route.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/:([^/\\]+)/g, '[^/]+')
194
199
  }
195
200
 
196
201
  async function emitTracesFor(sourceDir: string, targetDir: string): Promise<void> {
197
- if (!existsSync(sourceDir)) return;
202
+ if (!existsSync(sourceDir)) return
198
203
  for (const file of await listFiles(sourceDir)) {
199
- const match = ENTRY_FILE.exec(file);
200
- if (!match) continue;
201
- const relative = toPosixPath(path.relative(sourceDir, file));
202
- const relativeDir = path.posix.dirname(relative);
203
- const dir = path.join(targetDir, ...(relativeDir === '.' ? [] : relativeDir.split('/')));
204
- await mkdir(dir, { recursive: true });
205
- await writeFile(path.join(dir, `${match[1]}.js.nft.json`), `${JSON.stringify({ version: 1, files: [] })}\n`);
204
+ const match = ENTRY_FILE.exec(file)
205
+ if (!match) continue
206
+ const relative = toPosixPath(path.relative(sourceDir, file))
207
+ const relativeDir = path.posix.dirname(relative)
208
+ const dir = path.join(targetDir, ...(relativeDir === '.' ? [] : relativeDir.split('/')))
209
+ await mkdir(dir, { recursive: true })
210
+ await writeFile(
211
+ path.join(dir, `${match[1]}.js.nft.json`),
212
+ `${JSON.stringify({ version: 1, files: [] })}\n`,
213
+ )
206
214
  }
207
215
  }