@wular/pnext 0.0.4 → 0.0.7

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 (395) hide show
  1. package/README.md +22 -16
  2. package/bin/pnext +6 -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 +87 -22
  8. package/reference/config.md +40 -93
  9. package/reference/css.md +42 -33
  10. package/reference/dev.md +26 -33
  11. package/reference/env.md +18 -20
  12. package/reference/getting-started.md +132 -0
  13. package/reference/metadata.md +31 -46
  14. package/reference/navigation.md +65 -105
  15. package/reference/performance.md +21 -142
  16. package/reference/rendering.md +78 -75
  17. package/reference/routing.md +97 -107
  18. package/reference/typegen.md +27 -29
  19. package/src/api/cache.ts +36 -37
  20. package/src/api/client-cache.ts +2 -2
  21. package/src/api/client-navigation.ts +121 -114
  22. package/src/api/dynamic.tsx +58 -55
  23. package/src/api/link.tsx +52 -53
  24. package/src/api/navigation.ts +59 -58
  25. package/src/api/server.ts +152 -144
  26. package/src/api/suspense.ts +4 -4
  27. package/src/cli/adapters/vercel-warm.ts +126 -121
  28. package/src/cli/adapters/vercel.ts +437 -443
  29. package/src/cli/analyze.ts +333 -144
  30. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  31. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  32. package/src/cli/build.ts +976 -978
  33. package/src/cli/create.ts +72 -64
  34. package/src/cli/dev.ts +116 -116
  35. package/src/cli/index.ts +94 -85
  36. package/src/cli/migrate/package-json.ts +73 -71
  37. package/src/cli/migrate/report.ts +32 -33
  38. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  39. package/src/cli/migrate/scan.ts +46 -46
  40. package/src/cli/migrate/spinner.ts +9 -9
  41. package/src/cli/migrate/tsconfig.ts +35 -35
  42. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  43. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  44. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  45. package/src/cli/start.ts +65 -66
  46. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  47. package/src/client/build.ts +802 -768
  48. package/src/client/chunk-fold.ts +245 -240
  49. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  50. package/src/client/entry.ts +162 -147
  51. package/src/client/prebuilt.ts +231 -223
  52. package/src/client/profile.ts +29 -29
  53. package/src/client/react-compiler.ts +20 -15
  54. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  55. package/src/client/reference-stub.ts +51 -51
  56. package/src/client/reference.ts +19 -19
  57. package/src/{api → client}/router/events.ts +32 -17
  58. package/src/{api → client}/router/history.ts +16 -16
  59. package/src/{api → client}/router/hub.ts +52 -53
  60. package/src/{api/router.ts → client/router/index.ts} +61 -60
  61. package/src/{api → client}/router/policies.ts +24 -24
  62. package/src/{api → client}/router/runtime.ts +2022 -1995
  63. package/src/{api → client}/router/types.ts +98 -98
  64. package/src/compat/actions/client-plugin.ts +42 -43
  65. package/src/compat/actions/client-stub.ts +14 -14
  66. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  67. package/src/compat/actions/config.ts +63 -64
  68. package/src/compat/actions/detect.ts +68 -68
  69. package/src/compat/actions/discovery.ts +105 -105
  70. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  71. package/src/compat/actions/early-submit.ts +1 -1
  72. package/src/compat/actions/endpoint.ts +198 -198
  73. package/src/compat/actions/extensions.ts +811 -0
  74. package/src/compat/actions/flight.ts +23 -23
  75. package/src/compat/actions/form-state.ts +34 -34
  76. package/src/compat/actions/hoist.ts +382 -236
  77. package/src/compat/actions/ids.ts +7 -12
  78. package/src/compat/actions/index.ts +8 -8
  79. package/src/compat/actions/instances.ts +46 -46
  80. package/src/compat/actions/origin.ts +47 -48
  81. package/src/compat/actions/protocol.ts +22 -22
  82. package/src/compat/actions/registry.ts +19 -19
  83. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  84. package/src/compat/actions/rewrite.ts +125 -125
  85. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  86. package/src/compat/actions/serve.ts +132 -136
  87. package/src/compat/actions/server-tag.ts +4 -4
  88. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  89. package/src/compat/actions/unrecognized-error.ts +4 -4
  90. package/src/compat/{index.ts → aliases.ts} +112 -109
  91. package/src/compat/bundler/bun-externals.ts +18 -18
  92. package/src/compat/bundler/cjs-exports.ts +271 -223
  93. package/src/compat/bundler/config.ts +116 -111
  94. package/src/compat/bundler/externals.ts +12 -12
  95. package/src/compat/bundler/import-meta-url.ts +19 -19
  96. package/src/compat/bundler/modularize-imports.ts +36 -33
  97. package/src/compat/bundler/new-url-asset.ts +22 -24
  98. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  99. package/src/compat/bundler/polyfill.ts +28 -28
  100. package/src/compat/bundler/react-compiler.ts +35 -29
  101. package/src/compat/bundler/react-profiler.tsx +11 -11
  102. package/src/compat/bundler/relay-transform.ts +48 -47
  103. package/src/compat/bundler/require-context.ts +119 -113
  104. package/src/compat/bundler/resolve-extensions.ts +19 -19
  105. package/src/compat/bundler/source-cache.ts +25 -25
  106. package/src/compat/bundler/static-imports.ts +7 -7
  107. package/src/compat/bundler/symlink-imports.ts +46 -46
  108. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  109. package/src/compat/bundler/wasm.ts +58 -60
  110. package/src/compat/bundler/webpack-loaders.ts +254 -241
  111. package/src/compat/bundler/worker.ts +101 -104
  112. package/src/compat/cache/build-flags.ts +29 -29
  113. package/src/compat/cache/build-prerender-errors.ts +40 -44
  114. package/src/compat/cache/custom-handler.ts +60 -53
  115. package/src/compat/cache/fetch-patch.ts +240 -240
  116. package/src/compat/cache/handler.ts +27 -31
  117. package/src/compat/cache/modern-handler.ts +148 -126
  118. package/src/compat/cache/resume-data-cache.ts +47 -45
  119. package/src/compat/cache/revalidate.ts +233 -232
  120. package/src/compat/cache/runtime-error.ts +35 -35
  121. package/src/compat/cache/use-cache-transform.ts +442 -417
  122. package/src/compat/cache/use-cache.ts +650 -614
  123. package/src/compat/cache-control.ts +140 -142
  124. package/src/compat/client/base-path.ts +21 -20
  125. package/src/compat/client/css-order.ts +18 -18
  126. package/src/compat/client/errors/bare-boundary.ts +11 -11
  127. package/src/compat/client/errors/control-flow.ts +23 -23
  128. package/src/compat/client/errors/error-boundary.ts +61 -61
  129. package/src/compat/client/errors/global-error.ts +101 -91
  130. package/src/compat/client/errors/install.ts +71 -72
  131. package/src/compat/client/errors/lazy.ts +23 -23
  132. package/src/compat/client/errors/primitive-throw.ts +47 -45
  133. package/src/compat/client/errors/soft-refresh.ts +4 -4
  134. package/src/compat/client/link-status.ts +33 -33
  135. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  136. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  137. package/src/compat/client/navigation-scroll.ts +63 -63
  138. package/src/compat/client/optimistic-routing.ts +93 -88
  139. package/src/compat/client/prefetch-cache.ts +23 -24
  140. package/src/compat/client/route-announcer.ts +35 -35
  141. package/src/compat/client/segment-cache-policy.ts +20 -20
  142. package/src/compat/client/segment-cache.ts +309 -315
  143. package/src/compat/client/segment-prefetch.ts +127 -132
  144. package/src/compat/client/trailing-slash.ts +5 -4
  145. package/src/compat/css/chunking.ts +113 -116
  146. package/src/compat/css/inline-css.ts +21 -21
  147. package/src/compat/css/lightningcss.ts +37 -38
  148. package/src/compat/css/modules.ts +161 -175
  149. package/src/compat/css/nonce.ts +7 -7
  150. package/src/compat/css/sass-plugin.ts +18 -21
  151. package/src/compat/css/sass.ts +150 -152
  152. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  153. package/src/compat/css/styled-jsx.ts +21 -21
  154. package/src/compat/edge-runtime.ts +27 -27
  155. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  156. package/src/compat/export/client.ts +29 -31
  157. package/src/compat/export/{index.ts → emit.ts} +111 -110
  158. package/src/compat/export/standalone.ts +62 -54
  159. package/src/compat/image-optimizer/cache.ts +51 -49
  160. package/src/compat/image-optimizer/detect.ts +52 -52
  161. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  162. package/src/compat/image-optimizer/source.ts +77 -80
  163. package/src/compat/lifecycle/after-scope.ts +26 -26
  164. package/src/compat/lifecycle/after.ts +48 -45
  165. package/src/compat/lifecycle/error-funnel.ts +98 -102
  166. package/src/compat/lifecycle/error-serialize.ts +30 -26
  167. package/src/compat/lifecycle/error-ui.ts +67 -32
  168. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  169. package/src/compat/lifecycle/instrumentation.ts +85 -85
  170. package/src/compat/lifecycle/node-console.ts +11 -11
  171. package/src/compat/lifecycle/testmode.ts +160 -132
  172. package/src/compat/mdx/compile.ts +60 -57
  173. package/src/compat/mdx/plugin.ts +11 -11
  174. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  175. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  176. package/src/compat/metadata.ts +75 -81
  177. package/src/compat/next/cache.ts +68 -69
  178. package/src/compat/next/canonical-url.ts +9 -9
  179. package/src/compat/next/client-cache.ts +19 -19
  180. package/src/compat/next/client-navigation.ts +112 -116
  181. package/src/compat/next/client-only.ts +1 -1
  182. package/src/compat/next/client-script.tsx +99 -93
  183. package/src/compat/next/client-server.ts +10 -10
  184. package/src/compat/next/config-loader.ts +176 -173
  185. package/src/compat/next/config.ts +7 -7
  186. package/src/compat/next/constants.cjs +6 -6
  187. package/src/compat/next/constants.ts +6 -6
  188. package/src/compat/next/custom-server.ts +26 -24
  189. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  190. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  191. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  192. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  193. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  194. package/src/compat/next/dynamic.tsx +21 -18
  195. package/src/compat/next/error.tsx +52 -52
  196. package/src/compat/next/font/cache.ts +74 -74
  197. package/src/compat/next/font/google.ts +2 -2
  198. package/src/compat/next/font/index.ts +1 -1
  199. package/src/compat/next/font/local.ts +3 -3
  200. package/src/compat/next/font/runtime-client.ts +17 -15
  201. package/src/compat/next/font/runtime.ts +443 -408
  202. package/src/compat/next/font/shared.ts +120 -108
  203. package/src/compat/next/form.tsx +63 -63
  204. package/src/compat/next/head.tsx +2 -2
  205. package/src/compat/next/headers.ts +103 -95
  206. package/src/compat/next/image/client.tsx +220 -0
  207. package/src/compat/next/image/config.ts +56 -58
  208. package/src/compat/next/image/optimizer.ts +40 -36
  209. package/src/compat/next/image/patterns.ts +37 -40
  210. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  211. package/src/compat/next/image/shared.ts +65 -57
  212. package/src/compat/next/image/static-metadata.ts +98 -107
  213. package/src/compat/next/image/validate.ts +79 -88
  214. package/src/compat/next/image.tsx +19 -23
  215. package/src/compat/next/index.ts +1 -1
  216. package/src/compat/next/legacy-image.tsx +59 -60
  217. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  218. package/src/compat/next/link.tsx +158 -158
  219. package/src/compat/next/navigation.cjs +12 -3
  220. package/src/compat/next/navigation.ts +48 -50
  221. package/src/compat/next/offline.ts +27 -27
  222. package/src/compat/next/og.ts +121 -124
  223. package/src/compat/next/preferred-region.ts +13 -14
  224. package/src/compat/next/redirects.ts +58 -56
  225. package/src/compat/next/resource-hints.ts +73 -76
  226. package/src/compat/next/rewrites.ts +130 -133
  227. package/src/compat/next/root-params.ts +45 -45
  228. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  229. package/src/compat/next/router.cjs +4 -2
  230. package/src/compat/next/router.ts +58 -61
  231. package/src/compat/next/script.tsx +108 -108
  232. package/src/compat/next/server-only.ts +1 -1
  233. package/src/compat/next/server.ts +19 -19
  234. package/src/compat/next/svgr.ts +18 -17
  235. package/src/compat/next/telemetry.ts +24 -24
  236. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  237. package/src/compat/next/user-agent.ts +53 -49
  238. package/src/compat/next/web-vitals.ts +22 -24
  239. package/src/compat/otel/api.ts +41 -41
  240. package/src/compat/otel/client-trace-metadata.ts +25 -27
  241. package/src/compat/otel/fetch-span.ts +29 -29
  242. package/src/compat/otel/tracer.ts +331 -331
  243. package/src/compat/pages/api.ts +456 -0
  244. package/src/compat/pages/client-plugin.ts +36 -36
  245. package/src/compat/pages/router-state.ts +34 -34
  246. package/src/compat/pages/{index.ts → router.ts} +130 -135
  247. package/src/compat/ppr/io.ts +12 -12
  248. package/src/compat/ppr/missing-root-params.ts +34 -38
  249. package/src/compat/ppr/root-params-scan.ts +66 -66
  250. package/src/compat/ppr/root-params-transform.ts +24 -26
  251. package/src/compat/ppr/root-params.ts +30 -30
  252. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  253. package/src/compat/protocol.ts +71 -70
  254. package/src/compat/react/action-state.ts +47 -48
  255. package/src/compat/react/client-lite.ts +15 -15
  256. package/src/compat/react/client.ts +4 -4
  257. package/src/compat/react/compiler-runtime.ts +11 -11
  258. package/src/compat/react/dom-client.ts +44 -44
  259. package/src/compat/react/dom-react-server.ts +10 -16
  260. package/src/compat/react/dom-server.ts +10 -10
  261. package/src/compat/react/dom.ts +52 -52
  262. package/src/compat/react/hooks-extra.ts +34 -35
  263. package/src/compat/react/parity.ts +64 -61
  264. package/src/compat/react/preact.ts +81 -82
  265. package/src/compat/react/react-server.ts +28 -28
  266. package/src/compat/react/router-shim.ts +1 -1
  267. package/src/compat/react/server-component-use.ts +8 -8
  268. package/src/compat/react/server-inserted-html.ts +30 -31
  269. package/src/compat/react/server.ts +53 -55
  270. package/src/compat/react/use.ts +32 -32
  271. package/src/compat/react/view-transition.ts +20 -20
  272. package/src/compat/register/actions.ts +35 -824
  273. package/src/compat/register/boot.ts +41 -41
  274. package/src/compat/register/build-tier.ts +5 -5
  275. package/src/compat/register/build.ts +74 -70
  276. package/src/compat/register/bundler.ts +161 -156
  277. package/src/compat/register/cache.ts +20 -20
  278. package/src/compat/register/client-errors.ts +3 -3
  279. package/src/compat/register/config.ts +6 -6
  280. package/src/compat/register/css-extras.ts +30 -34
  281. package/src/compat/register/edge-runtime.ts +3 -3
  282. package/src/compat/register/errors.ts +10 -12
  283. package/src/compat/register/export.ts +16 -16
  284. package/src/compat/register/font.ts +11 -11
  285. package/src/compat/register/hooks.ts +2 -2
  286. package/src/compat/register/image.ts +40 -40
  287. package/src/compat/register/index.ts +59 -62
  288. package/src/compat/register/instrumentation-client.ts +10 -10
  289. package/src/compat/register/lifecycle.ts +25 -28
  290. package/src/compat/register/mdx.ts +10 -10
  291. package/src/compat/register/middleware.ts +226 -16
  292. package/src/compat/register/otel.ts +80 -88
  293. package/src/compat/register/pages-api.ts +10 -463
  294. package/src/compat/register/ppr.ts +16 -16
  295. package/src/compat/register/protocol.ts +17 -18
  296. package/src/compat/register/proxy.ts +49 -51
  297. package/src/compat/register/render.ts +79 -76
  298. package/src/compat/register/routing.ts +162 -159
  299. package/src/compat/register/segment.ts +24 -1897
  300. package/src/compat/register/static-image.ts +3 -3
  301. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  302. package/src/compat/register/typed-routes.ts +14 -14
  303. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  304. package/src/compat/register/validation.ts +18 -18
  305. package/src/compat/segment/loading-boundary.ts +43 -45
  306. package/src/compat/segment/page-slot.ts +69 -69
  307. package/src/compat/segment/serve.ts +1884 -0
  308. package/src/compat/segment/tree.ts +113 -112
  309. package/src/compat/segment/vary-key.ts +38 -38
  310. package/src/compat/segment/vary-params.ts +138 -142
  311. package/src/compat/static-params.ts +14 -12
  312. package/src/compat/tsconfig-defaults.ts +87 -91
  313. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  314. package/src/compat/typecheck/worker.ts +15 -12
  315. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  316. package/src/compat/typed-routes/manifest.ts +174 -170
  317. package/src/compat/typed-routes/typegen.ts +127 -110
  318. package/src/compat/validation/errors.ts +16 -19
  319. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  320. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  321. package/src/compat-bootstrap.ts +16 -16
  322. package/src/config.ts +86 -69
  323. package/src/css/build.ts +230 -227
  324. package/src/css/postcss.ts +79 -80
  325. package/src/css/worker.ts +14 -15
  326. package/src/dev/client-actions.ts +10 -10
  327. package/src/dev/client-chunk-store.ts +27 -27
  328. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  329. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  330. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  331. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  332. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  333. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  334. package/src/dev/server.ts +804 -820
  335. package/src/env.ts +46 -43
  336. package/src/extensions.ts +491 -478
  337. package/src/index.ts +8 -8
  338. package/src/internal.ts +20 -23
  339. package/src/{islands → render}/boundary-error.ts +3 -3
  340. package/src/render/hooks.ts +71 -71
  341. package/src/render/island-context.ts +14 -14
  342. package/src/render/metadata.ts +310 -310
  343. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  344. package/src/{ppr.ts → render/ppr.ts} +244 -245
  345. package/src/render/renderer.ts +2087 -2082
  346. package/src/render/resource-hints.ts +16 -17
  347. package/src/render/slots.tsx +224 -235
  348. package/src/{islands → render}/static-children.ts +9 -12
  349. package/src/{islands → render}/static-slots.ts +37 -37
  350. package/src/{cache/context.ts → request/cache.ts} +20 -20
  351. package/src/request/context.ts +107 -107
  352. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  353. package/src/resolve/engine.ts +90 -77
  354. package/src/resolve/imports.ts +475 -463
  355. package/src/resolve/scan-facts.ts +318 -296
  356. package/src/resolve/source-text.ts +37 -37
  357. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  358. package/src/routing/forwarded.ts +19 -19
  359. package/src/routing/handler.ts +84 -91
  360. package/src/routing/href.ts +87 -70
  361. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  362. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  363. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  364. package/src/routing/routes.ts +827 -815
  365. package/src/routing/slots.ts +164 -160
  366. package/src/runtime/loader.ts +954 -0
  367. package/src/{dev → runtime}/module-cache.ts +309 -287
  368. package/src/{dev → runtime}/module-generations.ts +9 -9
  369. package/src/{dev → runtime}/module-transform.ts +81 -72
  370. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  371. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  372. package/src/runtime/vendor.ts +428 -406
  373. package/src/styles.d.ts +9 -0
  374. package/src/types.ts +324 -335
  375. package/src/utils/ansi.ts +5 -5
  376. package/src/utils/{source.ts → code.ts} +15 -12
  377. package/src/utils/content-type.ts +3 -3
  378. package/src/utils/decode.ts +2 -2
  379. package/src/utils/dev-profile.ts +13 -13
  380. package/src/utils/error-log.ts +6 -6
  381. package/src/utils/esbuild.ts +18 -18
  382. package/src/utils/fs-cache.ts +13 -13
  383. package/src/utils/fs.ts +57 -49
  384. package/src/utils/html.ts +20 -24
  385. package/src/utils/native-require.ts +8 -8
  386. package/src/utils/serialize.ts +139 -146
  387. package/src/utils/verbose.ts +18 -18
  388. package/reference/overview.md +0 -35
  389. package/src/cli/analyze-print.ts +0 -181
  390. package/src/compat/middleware/manifest.ts +0 -210
  391. package/src/compat/next/image-client.tsx +0 -215
  392. package/src/compat/next/link-usage.ts +0 -29
  393. package/src/css/index.ts +0 -2
  394. package/src/render/index.ts +0 -1
  395. 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
  }