@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,49 +1,49 @@
1
- import { createHash } from 'node:crypto';
1
+ import { createHash } from 'node:crypto'
2
2
 
3
- import { isIdentifier, uniqueIdentifier } from '../../utils/source';
3
+ import { isIdentifier, uniqueIdentifier } from '../../utils/code'
4
4
 
5
5
  export function rewriteStyledJsxSource(source: string, file: string): string {
6
- if (!source.includes('<style') || !/\bjsx\b/.test(source)) return source;
6
+ if (!source.includes('<style') || !/\bjsx\b/.test(source)) return source
7
7
 
8
- let next = source;
8
+ let next = source
9
9
  for (const match of source.matchAll(
10
10
  /import\s+([A-Za-z_$][\w$]*)\s+from\s+['"]styled-jsx\/css['"]\s*;?/g,
11
11
  )) {
12
- const [statement, binding] = match;
13
- if (!statement || !binding || !isIdentifier(binding)) continue;
14
- next = next.replace(statement, '');
12
+ const [statement, binding] = match
13
+ if (!statement || !binding || !isIdentifier(binding)) continue
14
+ next = next.replace(statement, '')
15
15
  next = next.replace(
16
16
  new RegExp(`\\b${binding}\`((?:\\\\.|[^\`])*)\``, 'g'),
17
17
  (_statement, css: string) => `\`${minifyStaticCss(css)}\``,
18
- );
18
+ )
19
19
  }
20
20
 
21
- const component = uniqueIdentifier(next, '__PNextStyledJsx');
22
- let index = 0;
21
+ const component = uniqueIdentifier(next, '__PNextStyledJsx')
22
+ let index = 0
23
23
  next = next.replace(
24
24
  /<style\s+(?:global\s+)?jsx\s*>\s*\{([\s\S]*?)\}\s*<\/style>/g,
25
25
  (_statement, css: string) => {
26
- const id = createHash('sha256').update(`${file}:${index++}`).digest('hex').slice(0, 12);
27
- return `<${component} id=${JSON.stringify(id)}>{${minifyTemplate(css)}}</${component}>`;
26
+ const id = createHash('sha256').update(`${file}:${index++}`).digest('hex').slice(0, 12)
27
+ return `<${component} id=${JSON.stringify(id)}>{${minifyTemplate(css)}}</${component}>`
28
28
  },
29
- );
30
- if (index === 0) return source;
29
+ )
30
+ if (index === 0) return source
31
31
 
32
- const directives = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? '';
33
- return `${directives}import { style as ${component} } from 'styled-jsx';\n${next.slice(directives.length)}`;
32
+ const directives = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(next)?.[0] ?? ''
33
+ return `${directives}import { style as ${component} } from 'styled-jsx';\n${next.slice(directives.length)}`
34
34
  }
35
35
 
36
36
  function minifyTemplate(expression: string): string {
37
- const match = /^\s*`([\s\S]*)`\s*$/.exec(expression);
38
- if (!match?.[1] || match[1].includes('${')) return expression;
39
- return `\`${minifyStaticCss(match[1])}\``;
37
+ const match = /^\s*`([\s\S]*)`\s*$/.exec(expression)
38
+ if (!match?.[1] || match[1].includes('${')) return expression
39
+ return `\`${minifyStaticCss(match[1])}\``
40
40
  }
41
41
 
42
42
  function minifyStaticCss(css: string): string {
43
- if (css.includes('${')) return css;
43
+ if (css.includes('${')) return css
44
44
  return css
45
45
  .replace(/\/\*[\s\S]*?\*\//g, '')
46
46
  .replace(/\s+/g, ' ')
47
47
  .replace(/\s*([{}:;,])\s*/g, '$1')
48
- .trim();
48
+ .trim()
49
49
  }
@@ -1,71 +1,71 @@
1
- import { reinstallCustomCacheHandlerForEdge } from './cache/custom-handler';
1
+ import { reinstallCustomCacheHandlerForEdge } from './cache/custom-handler'
2
2
 
3
- type GlobalDescriptor = PropertyDescriptor | undefined;
3
+ type GlobalDescriptor = PropertyDescriptor | undefined
4
4
 
5
5
  export function withEdgeRuntime<T>(callback: () => T): T {
6
6
  const globalObject = globalThis as typeof globalThis & {
7
- EdgeRuntime?: string;
8
- process?: NodeJS.Process;
9
- };
10
- const previousEdgeRuntime = Object.getOwnPropertyDescriptor(globalObject, 'EdgeRuntime');
11
- const previousProcess = Object.getOwnPropertyDescriptor(globalObject, 'process');
12
- const currentProcess = globalObject.process as NodeJS.Process | undefined;
7
+ EdgeRuntime?: string
8
+ process?: NodeJS.Process
9
+ }
10
+ const previousEdgeRuntime = Object.getOwnPropertyDescriptor(globalObject, 'EdgeRuntime')
11
+ const previousProcess = Object.getOwnPropertyDescriptor(globalObject, 'process')
12
+ const currentProcess = globalObject.process as NodeJS.Process | undefined
13
13
  const edgeProcess = currentProcess
14
14
  ? new Proxy(currentProcess, {
15
15
  get(target, property, receiver) {
16
- if (property === 'emit') return undefined;
16
+ if (property === 'emit') return undefined
17
17
  // Next's Edge runtime exposes only a minimal `process` polyfill —
18
18
  // notably no Node `version`/`versions`. Code that branches on
19
19
  // `process.version` (to detect Node vs Edge) must see it absent.
20
- if (property === 'version' || property === 'versions') return undefined;
21
- const value: unknown = Reflect.get(target, property, receiver);
22
- return typeof value === 'function' ? (value as () => unknown).bind(target) : value;
20
+ if (property === 'version' || property === 'versions') return undefined
21
+ const value: unknown = Reflect.get(target, property, receiver)
22
+ return typeof value === 'function' ? (value as () => unknown).bind(target) : value
23
23
  },
24
24
  })
25
- : undefined;
25
+ : undefined
26
26
 
27
27
  Object.defineProperty(globalObject, 'EdgeRuntime', {
28
28
  configurable: true,
29
29
  enumerable: false,
30
30
  writable: true,
31
31
  value: 'edge-runtime',
32
- });
32
+ })
33
33
  Object.defineProperty(globalObject, 'process', {
34
34
  configurable: true,
35
35
  enumerable: false,
36
36
  writable: true,
37
37
  value: edgeProcess ?? { env: {} },
38
- });
38
+ })
39
39
 
40
40
  try {
41
- reinstallCustomCacheHandlerForEdge();
42
- const result = callback();
41
+ reinstallCustomCacheHandlerForEdge()
42
+ const result = callback()
43
43
  if (isThenable(result)) {
44
44
  return Promise.resolve(result).finally(() =>
45
45
  restore(previousEdgeRuntime, previousProcess),
46
- ) as T;
46
+ ) as T
47
47
  }
48
- restore(previousEdgeRuntime, previousProcess);
49
- return result;
48
+ restore(previousEdgeRuntime, previousProcess)
49
+ return result
50
50
  } catch (error) {
51
- restore(previousEdgeRuntime, previousProcess);
52
- throw error;
51
+ restore(previousEdgeRuntime, previousProcess)
52
+ throw error
53
53
  }
54
54
  }
55
55
 
56
56
  function restore(edgeRuntime: GlobalDescriptor, process: GlobalDescriptor): void {
57
- restoreProperty('EdgeRuntime', edgeRuntime);
58
- restoreProperty('process', process);
57
+ restoreProperty('EdgeRuntime', edgeRuntime)
58
+ restoreProperty('process', process)
59
59
  }
60
60
 
61
61
  function restoreProperty(name: 'EdgeRuntime' | 'process', descriptor: GlobalDescriptor): void {
62
62
  if (descriptor) {
63
- Object.defineProperty(globalThis, name, descriptor);
63
+ Object.defineProperty(globalThis, name, descriptor)
64
64
  } else {
65
- delete (globalThis as Record<string, unknown>)[name];
65
+ delete (globalThis as Record<string, unknown>)[name]
66
66
  }
67
67
  }
68
68
 
69
69
  function isThenable<T>(value: T): value is T & PromiseLike<unknown> {
70
- return typeof (value as { then?: unknown } | null | undefined)?.then === 'function';
70
+ return typeof (value as { then?: unknown } | null | undefined)?.then === 'function'
71
71
  }
@@ -1,10 +1,10 @@
1
- import { existsSync } from 'node:fs';
2
- import { mkdir, writeFile } from 'node:fs/promises';
3
- import path from 'node:path';
4
- import { pathToFileHref } from '../../config';
5
- import type { ResolvedConfig } from '../../config';
6
- import type { BuildManifest, RouteManifestEntry } from '../../types';
7
- import { getNextConfig } from '../next/config-loader';
1
+ import { existsSync } from 'node:fs'
2
+ import { mkdir, writeFile } from 'node:fs/promises'
3
+ import path from 'node:path'
4
+ import { pathToFileHref } from '../../config'
5
+ import type { ResolvedConfig } from '../../config'
6
+ import type { BuildManifest, RouteManifestEntry } from '../../types'
7
+ import { getNextConfig } from '../next/config-loader'
8
8
 
9
9
  /**
10
10
  * `adapterPath` support (Next's `onBuildComplete` hook).
@@ -15,49 +15,49 @@ import { getNextConfig } from '../next/config-loader';
15
15
  * artifacts. pnext reports the same classification off its build manifest.
16
16
  */
17
17
  interface SharedRouteFields {
18
- id: string;
19
- filePath: string;
20
- pathname: string;
21
- sourcePage: string;
22
- runtime: 'nodejs' | 'edge';
23
- assets: Record<string, string>;
24
- assetsHashes: Record<string, string>;
25
- config: { maxDuration?: number };
26
- type: string;
18
+ id: string
19
+ filePath: string
20
+ pathname: string
21
+ sourcePage: string
22
+ runtime: 'nodejs' | 'edge'
23
+ assets: Record<string, string>
24
+ assetsHashes: Record<string, string>
25
+ config: { maxDuration?: number }
26
+ type: string
27
27
  }
28
28
 
29
29
  interface AdapterOutputs {
30
- pages: SharedRouteFields[];
31
- appPages: SharedRouteFields[];
32
- pagesApi: SharedRouteFields[];
33
- appRoutes: SharedRouteFields[];
34
- prerenders: { id: string; pathname: string; type: string; parentOutputId: string }[];
35
- staticFiles: { id: string; filePath: string; pathname: string; type: string }[];
30
+ pages: SharedRouteFields[]
31
+ appPages: SharedRouteFields[]
32
+ pagesApi: SharedRouteFields[]
33
+ appRoutes: SharedRouteFields[]
34
+ prerenders: { id: string; pathname: string; type: string; parentOutputId: string }[]
35
+ staticFiles: { id: string; filePath: string; pathname: string; type: string }[]
36
36
  }
37
37
 
38
38
  /** One entry of `routing.*` — Next's routes-manifest rewrite shape. */
39
39
  interface AdapterRoute {
40
- source?: string;
41
- sourceRegex: string;
42
- destination?: string;
40
+ source?: string
41
+ sourceRegex: string
42
+ destination?: string
43
43
  }
44
44
 
45
45
  /** Adapter module shape — only the hook pnext can honour is typed. */
46
46
  interface NextAdapter {
47
- name?: string;
48
- onBuildComplete?: (ctx: unknown) => unknown;
47
+ name?: string
48
+ onBuildComplete?: (ctx: unknown) => unknown
49
49
  }
50
50
 
51
51
  /** The URL pathname a built `public/` file is served at. */
52
52
  function staticPathname(relative: string): string {
53
- const url = `/${relative.replace(/\\/g, '/')}`;
54
- if (url.endsWith('/index.html')) return url.slice(0, -'index.html'.length) || '/';
55
- return url.endsWith('.html') ? url.slice(0, -'.html'.length) : url;
53
+ const url = `/${relative.replace(/\\/g, '/')}`
54
+ if (url.endsWith('/index.html')) return url.slice(0, -'index.html'.length) || '/'
55
+ return url.endsWith('.html') ? url.slice(0, -'.html'.length) : url
56
56
  }
57
57
 
58
58
  /** Where the per-route server entry for `route` is written. */
59
59
  function serverEntryPath(config: ResolvedConfig, route: RouteManifestEntry): string {
60
- return path.join(config.outPath, 'server', `${route.id}.js`);
60
+ return path.join(config.outPath, 'server', `${route.id}.js`)
61
61
  }
62
62
 
63
63
  /**
@@ -66,13 +66,10 @@ function serverEntryPath(config: ResolvedConfig, route: RouteManifestEntry): str
66
66
  * there is no per-route bundle to point at - so the entry is a descriptor module naming the route and
67
67
  * the source module the server renders for it. Only written when an adapter is configured.
68
68
  */
69
- async function writeServerEntries(
70
- config: ResolvedConfig,
71
- manifest: BuildManifest,
72
- ): Promise<void> {
73
- await mkdir(path.join(config.outPath, 'server'), { recursive: true });
69
+ async function writeServerEntries(config: ResolvedConfig, manifest: BuildManifest): Promise<void> {
70
+ await mkdir(path.join(config.outPath, 'server'), { recursive: true })
74
71
  await Promise.all(
75
- manifest.routes.map((route) =>
72
+ manifest.routes.map(route =>
76
73
  writeFile(
77
74
  serverEntryPath(config, route),
78
75
  [
@@ -89,11 +86,11 @@ async function writeServerEntries(
89
86
  ].join('\n'),
90
87
  ),
91
88
  ),
92
- );
89
+ )
93
90
  }
94
91
 
95
92
  function sourcePage(config: ResolvedConfig, route: RouteManifestEntry): string {
96
- return `/${path.relative(config.root, route.file).replace(/\\/g, '/')}`;
93
+ return `/${path.relative(config.root, route.file).replace(/\\/g, '/')}`
97
94
  }
98
95
 
99
96
  function sharedFields(
@@ -112,7 +109,7 @@ function sharedFields(
112
109
  config: {
113
110
  ...(route.maxDuration !== undefined ? { maxDuration: route.maxDuration } : {}),
114
111
  },
115
- };
112
+ }
116
113
  }
117
114
 
118
115
  /**
@@ -129,36 +126,36 @@ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): Adapte
129
126
  appRoutes: [],
130
127
  prerenders: [],
131
128
  staticFiles: [],
132
- };
133
- const prerenderedRoutes = new Set<string>();
129
+ }
130
+ const prerenderedRoutes = new Set<string>()
134
131
 
135
132
  for (const [relative, metadata] of Object.entries(manifest.staticFiles ?? {})) {
136
- const filePath = path.join(config.outPath, 'public', relative);
133
+ const filePath = path.join(config.outPath, 'public', relative)
137
134
  // The manifest also records prerenders that produced no body on disk
138
135
  // (an empty response, `_not-found` / `_global-error`). Those are not
139
136
  // deployable artifacts: leave them out, and leave the owning route as a
140
137
  // server entrypoint rather than treating it as prerendered.
141
- if (!existsSync(filePath)) continue;
142
- if (metadata.routeId) prerenderedRoutes.add(metadata.routeId);
143
- const entry = { id: relative, filePath, pathname: staticPathname(relative) };
138
+ if (!existsSync(filePath)) continue
139
+ if (metadata.routeId) prerenderedRoutes.add(metadata.routeId)
140
+ const entry = { id: relative, filePath, pathname: staticPathname(relative) }
144
141
  if (metadata.revalidateSeconds !== undefined) {
145
142
  outputs.prerenders.push({
146
143
  ...entry,
147
144
  type: 'PRERENDER',
148
145
  parentOutputId: metadata.routeId ?? relative,
149
- });
146
+ })
150
147
  } else {
151
- outputs.staticFiles.push({ ...entry, type: 'STATIC_FILE' });
148
+ outputs.staticFiles.push({ ...entry, type: 'STATIC_FILE' })
152
149
  }
153
150
  }
154
151
 
155
152
  for (const route of manifest.routes) {
156
- if (prerenderedRoutes.has(route.id) && route.mode === 'static' && !route.ppr) continue;
157
- const fields = sharedFields(config, route);
153
+ if (prerenderedRoutes.has(route.id) && route.mode === 'static' && !route.ppr) continue
154
+ const fields = sharedFields(config, route)
158
155
  if (route.kind === 'handler') {
159
- outputs.appRoutes.push({ ...fields, type: 'APP_ROUTE' });
156
+ outputs.appRoutes.push({ ...fields, type: 'APP_ROUTE' })
160
157
  } else {
161
- outputs.appPages.push({ ...fields, type: 'APP_PAGE' });
158
+ outputs.appPages.push({ ...fields, type: 'APP_PAGE' })
162
159
  // Every app page is reachable both as HTML and as its RSC payload; Next
163
160
  // reports the pair as two outputs sharing one entrypoint.
164
161
  outputs.appPages.push({
@@ -166,11 +163,11 @@ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): Adapte
166
163
  type: 'APP_PAGE',
167
164
  id: `${route.id}.rsc`,
168
165
  pathname: `${fields.pathname}.rsc`,
169
- });
166
+ })
170
167
  }
171
168
  }
172
169
 
173
- return outputs;
170
+ return outputs
174
171
  }
175
172
 
176
173
  /**
@@ -178,12 +175,12 @@ function collectOutputs(config: ResolvedConfig, manifest: BuildManifest): Adapte
178
175
  * the `namedRegex` form Next's routes-manifest uses (`$name` in destinations).
179
176
  */
180
177
  function namedSourceRegex(route: RouteManifestEntry): string {
181
- let index = 0;
178
+ let index = 0
182
179
  const named = route.pattern.replace(/\((\[\^\/\]\+|\.\*)\)/g, (whole, body: string) => {
183
- const param = route.params[index++];
184
- return param ? `(?<${param.replace(/\W/g, '')}>${body})` : whole;
185
- });
186
- return `^${named}(?:/)?$`;
180
+ const param = route.params[index++]
181
+ return param ? `(?<${param.replace(/\W/g, '')}>${body})` : whole
182
+ })
183
+ return `^${named}(?:/)?$`
187
184
  }
188
185
 
189
186
  /**
@@ -192,10 +189,10 @@ function namedSourceRegex(route: RouteManifestEntry): string {
192
189
  * emits them.
193
190
  */
194
191
  function collectDynamicRoutes(manifest: BuildManifest): AdapterRoute[] {
195
- const routes: AdapterRoute[] = [];
192
+ const routes: AdapterRoute[] = []
196
193
  for (const route of manifest.routes) {
197
- if (route.params.length === 0) continue;
198
- const sourceRegex = namedSourceRegex(route);
194
+ if (route.params.length === 0) continue
195
+ const sourceRegex = namedSourceRegex(route)
199
196
  if (route.kind === 'page') {
200
197
  routes.push({
201
198
  source: `${route.route}.rsc`,
@@ -204,11 +201,11 @@ function collectDynamicRoutes(manifest: BuildManifest): AdapterRoute[] {
204
201
  String.raw`(?<rscSuffix>\.rsc|\.segments/.+\.segment\.rsc)(?:/)?$`,
205
202
  ),
206
203
  destination: `${route.route}$rscSuffix`,
207
- });
204
+ })
208
205
  }
209
- routes.push({ source: route.route, sourceRegex, destination: route.route });
206
+ routes.push({ source: route.route, sourceRegex, destination: route.route })
210
207
  }
211
- return routes;
208
+ return routes
212
209
  }
213
210
 
214
211
  /**
@@ -221,21 +218,21 @@ export async function runBuildCompleteAdapter(
221
218
  config: ResolvedConfig,
222
219
  manifest: BuildManifest,
223
220
  ): Promise<void> {
224
- const configured = getNextConfig().adapterPath;
221
+ const configured = getNextConfig().adapterPath
225
222
  const adapterPath =
226
223
  // eslint-disable-next-line turbo/no-undeclared-env-vars -- Next's own env override
227
- process.env.NEXT_ADAPTER_PATH || (typeof configured === 'string' ? configured : undefined);
228
- if (!adapterPath) return;
224
+ process.env.NEXT_ADAPTER_PATH || (typeof configured === 'string' ? configured : undefined)
225
+ if (!adapterPath) return
229
226
  const resolved = path.isAbsolute(adapterPath)
230
227
  ? adapterPath
231
- : path.resolve(config.root, adapterPath);
228
+ : path.resolve(config.root, adapterPath)
232
229
  const module = (await import(pathToFileHref(resolved))) as {
233
- default?: NextAdapter;
234
- } & NextAdapter;
235
- const adapter = module.default ?? module;
236
- if (typeof adapter?.onBuildComplete !== 'function') return;
230
+ default?: NextAdapter
231
+ } & NextAdapter
232
+ const adapter = module.default ?? module
233
+ if (typeof adapter?.onBuildComplete !== 'function') return
237
234
 
238
- await writeServerEntries(config, manifest);
235
+ await writeServerEntries(config, manifest)
239
236
 
240
237
  await adapter.onBuildComplete({
241
238
  routing: {
@@ -253,5 +250,5 @@ export async function runBuildCompleteAdapter(
253
250
  projectDir: config.root,
254
251
  repoRoot: config.root,
255
252
  distDir: config.outPath,
256
- });
253
+ })
257
254
  }
@@ -15,15 +15,15 @@
15
15
  // rewrite of the page also cover the data request. A host-level REDIRECT typically does not, so - like
16
16
  // Next - a HEAD probe resolves the page's final URL first.
17
17
 
18
- import { setExportDocumentFetcher } from '../../api/router/policies';
18
+ import { setExportDocumentFetcher } from '../../client/router/policies'
19
19
 
20
20
  /** The exported segment file carrying a route's complete document. */
21
- const SEGMENT_FILE = '__next._full.txt';
21
+ const SEGMENT_FILE = '__next._full.txt'
22
22
 
23
23
  /** A document read out of the export tree, with the route URL it belongs to. */
24
24
  interface ExportedDocument {
25
- html: string;
26
- finalUrl: string;
25
+ html: string
26
+ finalUrl: string
27
27
  }
28
28
 
29
29
  // Registered at MODULE scope rather than from installNavCompat(): the router
@@ -31,31 +31,29 @@ interface ExportedDocument {
31
31
  // install sequence, and those would otherwise fall through to a server that
32
32
  // isn't there. Module initialization runs before any of it, and the marker is
33
33
  // an inline script in <head>, so it is already set by the time this evaluates.
34
- if (outputExportMode()) setExportDocumentFetcher(fetchExportedDocument);
34
+ if (outputExportMode()) setExportDocumentFetcher(fetchExportedDocument)
35
35
 
36
36
  /** Whether the running document was served out of an export tree. */
37
37
  function outputExportMode(): boolean {
38
38
  return (
39
39
  (process.browser || typeof window !== 'undefined') &&
40
40
  (window as { __PNEXT_OUTPUT_EXPORT__?: boolean }).__PNEXT_OUTPUT_EXPORT__ === true
41
- );
41
+ )
42
42
  }
43
43
 
44
44
  /** `/another` -> `/another.txt`; `/another/` -> `/another/index.txt`. */
45
45
  function documentUrl(url: URL): URL {
46
- const target = new URL(url.href);
47
- target.pathname += target.pathname.endsWith('/') ? 'index.txt' : '.txt';
48
- return target;
46
+ const target = new URL(url.href)
47
+ target.pathname += target.pathname.endsWith('/') ? 'index.txt' : '.txt'
48
+ return target
49
49
  }
50
50
 
51
51
  /** `/another` (or `/another/`) -> `/another/__next._full.txt`. */
52
52
  function segmentUrl(url: URL): URL {
53
- const target = new URL(url.href);
54
- const directory = target.pathname.endsWith('/')
55
- ? target.pathname.slice(0, -1)
56
- : target.pathname;
57
- target.pathname = `${directory}/${SEGMENT_FILE}`;
58
- return target;
53
+ const target = new URL(url.href)
54
+ const directory = target.pathname.endsWith('/') ? target.pathname.slice(0, -1) : target.pathname
55
+ target.pathname = `${directory}/${SEGMENT_FILE}`
56
+ return target
59
57
  }
60
58
 
61
59
  /**
@@ -68,30 +66,30 @@ async function fetchExportedDocument(
68
66
  init: RequestInit,
69
67
  prefetch: boolean,
70
68
  ): Promise<ExportedDocument | null> {
71
- const url = new URL(href, location.href);
72
- let pageUrl = url;
69
+ const url = new URL(href, location.href)
70
+ let pageUrl = url
73
71
  if (prefetch) {
74
72
  // Resolve host-level redirects on the PAGE path before asking for a file
75
73
  // beside it: a host that redirects `/old` to `/new` has no reason to also
76
74
  // redirect `/old/__next._full.txt`, which the exporter never wrote.
77
75
  const probe = await fetch(url.href, { method: 'HEAD', credentials: 'same-origin' }).catch(
78
76
  () => null,
79
- );
77
+ )
80
78
  // `Response#ok` is false for a followed 3xx chain, so test the range.
81
- if (!probe || probe.status < 200 || probe.status >= 400) return null;
82
- if (probe.redirected) pageUrl = new URL(probe.url);
79
+ if (!probe || probe.status < 200 || probe.status >= 400) return null
80
+ if (probe.redirected) pageUrl = new URL(probe.url)
83
81
  }
84
- const target = prefetch ? segmentUrl(pageUrl) : documentUrl(pageUrl);
85
- const response = await fetch(target.href, init);
86
- if (!response.ok) return null;
87
- const html = await response.text();
82
+ const target = prefetch ? segmentUrl(pageUrl) : documentUrl(pageUrl)
83
+ const response = await fetch(target.href, init)
84
+ if (!response.ok) return null
85
+ const html = await response.text()
88
86
  // Static hosts answer an unknown path with a catch-all document or a
89
87
  // directory listing rather than a 404; neither is a pnext document.
90
- if (!html.includes('<html')) return null;
88
+ if (!html.includes('<html')) return null
91
89
  return {
92
90
  html,
93
91
  finalUrl: prefetch ? pageUrl.href : navigatedUrl(response, url),
94
- };
92
+ }
95
93
  }
96
94
 
97
95
  /**
@@ -99,14 +97,14 @@ async function fetchExportedDocument(
99
97
  * suffix peeled back off when the host redirected, otherwise the requested URL.
100
98
  */
101
99
  function navigatedUrl(response: Response, requested: URL): string {
102
- if (!response.redirected) return requested.href;
100
+ if (!response.redirected) return requested.href
103
101
  try {
104
- const url = new URL(response.url);
102
+ const url = new URL(response.url)
105
103
  url.pathname = url.pathname.endsWith('/index.txt')
106
104
  ? url.pathname.slice(0, -'index.txt'.length)
107
- : url.pathname.replace(/\.txt$/, '');
108
- return url.href;
105
+ : url.pathname.replace(/\.txt$/, '')
106
+ return url.href
109
107
  } catch {
110
- return requested.href;
108
+ return requested.href
111
109
  }
112
110
  }