@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,83 +1,84 @@
1
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
- import path from 'node:path';
3
- import { nextCompatEnabled } from '../compat';
4
- import type { ResolvedConfig } from '../config';
5
- import type { ResponseFinalizer, ResponseFinalizerContext } from '../extensions';
6
- import { getNextConfig } from './next/config-loader';
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { nextCompatEnabled } from '../compat/aliases'
4
+ import type { ResolvedConfig } from '../config'
5
+ import type { ResponseFinalizer, ResponseFinalizerContext } from '../extensions'
6
+ import { getNextConfig } from './next/config-loader'
7
+ import { escapeRegex } from '../utils/code'
7
8
  import {
8
9
  evaluateConditions,
9
10
  parseConditions,
10
11
  substitute,
11
12
  type RewriteCondition,
12
13
  type RewriteRequestContext,
13
- } from './next/rewrites';
14
+ } from './next/rewrites'
14
15
 
15
- const DEFAULT_EXPIRE_TIME = 31536000;
16
+ const DEFAULT_EXPIRE_TIME = 31536000
16
17
 
17
18
  interface HeaderRule {
18
- regex: RegExp;
19
- paramNames: string[];
20
- headers: [string, string][];
21
- has: RewriteCondition[];
22
- missing: RewriteCondition[];
19
+ regex: RegExp
20
+ paramNames: string[]
21
+ headers: [string, string][]
22
+ has: RewriteCondition[]
23
+ missing: RewriteCondition[]
23
24
  }
24
25
 
25
26
  interface HeaderEntry {
26
- source?: string;
27
- headers?: unknown;
28
- has?: unknown;
29
- missing?: unknown;
27
+ source?: string
28
+ headers?: unknown
29
+ has?: unknown
30
+ missing?: unknown
30
31
  }
31
32
 
32
33
  interface RevalidateRule {
33
- regex: RegExp;
34
- revalidateSeconds: number;
34
+ regex: RegExp
35
+ revalidateSeconds: number
35
36
  }
36
37
 
37
38
  interface ConfigHeader {
38
- key?: unknown;
39
- value?: unknown;
39
+ key?: unknown
40
+ value?: unknown
40
41
  }
41
42
 
42
43
  export function cacheControlFinalizers(config: ResolvedConfig): ResponseFinalizer[] {
43
- if (!nextCompatEnabled(config)) return [];
44
+ if (!nextCompatEnabled(config)) return []
44
45
 
45
- let rules: Promise<HeaderRule[]> | undefined;
46
- let pagesRevalidateRules: RevalidateRule[] | undefined;
46
+ let rules: Promise<HeaderRule[]> | undefined
47
+ let pagesRevalidateRules: RevalidateRule[] | undefined
47
48
  const finalizer: ResponseFinalizer = async ctx => {
48
- rules ??= loadHeaderRules();
49
- applyConfigHeaders(ctx, await rules);
50
- pagesRevalidateRules ??= loadPagesRevalidateRules(config.root);
51
- applyDefaultIsrHeader(ctx, pagesRevalidateRules);
52
- };
53
- return [finalizer];
49
+ rules ??= loadHeaderRules()
50
+ applyConfigHeaders(ctx, await rules)
51
+ pagesRevalidateRules ??= loadPagesRevalidateRules(config.root)
52
+ applyDefaultIsrHeader(ctx, pagesRevalidateRules)
53
+ }
54
+ return [finalizer]
54
55
  }
55
56
 
56
57
  async function loadHeaderRules(): Promise<HeaderRule[]> {
57
- const producer = getNextConfig().headers;
58
- if (typeof producer !== 'function') return [];
58
+ const producer = getNextConfig().headers
59
+ if (typeof producer !== 'function') return []
59
60
 
60
- let entries: unknown;
61
+ let entries: unknown
61
62
  try {
62
- entries = await (producer as () => unknown)();
63
+ entries = await (producer as () => unknown)()
63
64
  } catch {
64
- return [];
65
+ return []
65
66
  }
66
- if (!Array.isArray(entries)) return [];
67
+ if (!Array.isArray(entries)) return []
67
68
 
68
- const rules: HeaderRule[] = [];
69
+ const rules: HeaderRule[] = []
69
70
  for (const entry of entries as HeaderEntry[]) {
70
- if (!entry?.source || !Array.isArray(entry.headers)) continue;
71
- const compiled = compileHeaderSource(entry.source);
72
- if (!compiled) continue;
73
- const has = parseConditions(entry.has);
74
- const missing = parseConditions(entry.missing);
75
- if (!has || !missing) continue;
76
- const headers = headerPairs(entry.headers);
77
- if (headers.length === 0) continue;
78
- rules.push({ ...compiled, headers, has, missing });
71
+ if (!entry?.source || !Array.isArray(entry.headers)) continue
72
+ const compiled = compileHeaderSource(entry.source)
73
+ if (!compiled) continue
74
+ const has = parseConditions(entry.has)
75
+ const missing = parseConditions(entry.missing)
76
+ if (!has || !missing) continue
77
+ const headers = headerPairs(entry.headers)
78
+ if (headers.length === 0) continue
79
+ rules.push({ ...compiled, headers, has, missing })
79
80
  }
80
- return rules;
81
+ return rules
81
82
  }
82
83
 
83
84
  /**
@@ -87,86 +88,86 @@ async function loadHeaderRules(): Promise<HeaderRule[]> {
87
88
  * path-to-regexp treats those as literals. Raw regex bodies still only appear inside `:param(...)`.
88
89
  */
89
90
  function compileHeaderSource(source: string): { regex: RegExp; paramNames: string[] } | null {
90
- const paramNames: string[] = [];
91
- const parts: string[] = [];
91
+ const paramNames: string[] = []
92
+ const parts: string[] = []
92
93
  for (const segment of source.split('/').filter(Boolean)) {
93
- const custom = /^:([A-Za-z_$][\w$]*)\((.*)\)$/.exec(segment);
94
+ const custom = /^:([A-Za-z_$][\w$]*)\((.*)\)$/.exec(segment)
94
95
  if (custom?.[1] !== undefined && custom[2] !== undefined) {
95
- paramNames.push(custom[1]);
96
- parts.push(`(${custom[2]})`);
97
- continue;
96
+ paramNames.push(custom[1])
97
+ parts.push(`(${custom[2]})`)
98
+ continue
98
99
  }
99
- const catchAll = /^:([A-Za-z_$][\w$]*)[*+]$/.exec(segment);
100
+ const catchAll = /^:([A-Za-z_$][\w$]*)[*+]$/.exec(segment)
100
101
  if (catchAll?.[1]) {
101
- paramNames.push(catchAll[1]);
102
- parts.push('(.*)');
103
- continue;
102
+ paramNames.push(catchAll[1])
103
+ parts.push('(.*)')
104
+ continue
104
105
  }
105
- const optional = /^:([A-Za-z_$][\w$]*)\?$/.exec(segment);
106
+ const optional = /^:([A-Za-z_$][\w$]*)\?$/.exec(segment)
106
107
  if (optional?.[1]) {
107
- paramNames.push(optional[1]);
108
- parts.push('([^/]*)');
109
- continue;
108
+ paramNames.push(optional[1])
109
+ parts.push('([^/]*)')
110
+ continue
110
111
  }
111
- const param = /^:([A-Za-z_$][\w$]*)$/.exec(segment);
112
+ const param = /^:([A-Za-z_$][\w$]*)$/.exec(segment)
112
113
  if (param?.[1]) {
113
- paramNames.push(param[1]);
114
- parts.push('([^/]+)');
115
- continue;
114
+ paramNames.push(param[1])
115
+ parts.push('([^/]+)')
116
+ continue
116
117
  }
117
118
  // Plain literal segment: escape regex-special characters so `.` etc. match
118
119
  // literally rather than acting as regex metacharacters.
119
- parts.push(segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
120
+ parts.push(segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
120
121
  }
121
- return { regex: new RegExp(`^/${parts.join('/')}/?$`), paramNames };
122
+ return { regex: new RegExp(`^/${parts.join('/')}/?$`), paramNames }
122
123
  }
123
124
 
124
125
  function headerPairs(headers: unknown[]): [string, string][] {
125
- const pairs: [string, string][] = [];
126
+ const pairs: [string, string][] = []
126
127
  for (const header of headers as ConfigHeader[]) {
127
- if (typeof header?.key !== 'string' || typeof header.value !== 'string') continue;
128
- pairs.push([header.key, header.value]);
128
+ if (typeof header?.key !== 'string' || typeof header.value !== 'string') continue
129
+ pairs.push([header.key, header.value])
129
130
  }
130
- return pairs;
131
+ return pairs
131
132
  }
132
133
 
133
134
  function applyConfigHeaders(ctx: ResponseFinalizerContext, rules: readonly HeaderRule[]): void {
134
- if (rules.length === 0) return;
135
- const url = ctx.request.url;
135
+ if (rules.length === 0) return
136
+ const url = ctx.request.url
136
137
  const requestCtx: RewriteRequestContext = {
137
138
  host: url.host,
138
139
  headers: ctx.request.headers,
139
140
  cookies: parseCookieHeader(ctx.request.headers.get('cookie')),
140
141
  query: url.searchParams,
141
- };
142
+ }
142
143
 
143
144
  // Config `Set-Cookie` headers must be appended (each entry is its own header,
144
145
  // never overwriting) and must precede the response's own Set-Cookie headers —
145
146
  // Next applies config headers at the router layer before the route's own
146
147
  // cookies (set-cookies suite asserts [...nextConfigHeaders, ...cookies]).
147
- const configSetCookies: string[] = [];
148
+ const configSetCookies: string[] = []
148
149
  for (const rule of rules) {
149
- const match = rule.regex.exec(url.pathname);
150
- if (!match) continue;
151
- const params: Record<string, string> = {};
150
+ const match = rule.regex.exec(url.pathname)
151
+ if (!match) continue
152
+ const params: Record<string, string> = {}
152
153
  rule.paramNames.forEach((name, index) => {
153
- params[name] = match[index + 1] ?? '';
154
- });
155
- const conditionParams = evaluateConditions(rule, requestCtx);
156
- if (conditionParams === null) continue;
157
- Object.assign(params, conditionParams);
154
+ params[name] = match[index + 1] ?? ''
155
+ })
156
+ const conditionParams = evaluateConditions(rule, requestCtx)
157
+ if (conditionParams === null) continue
158
+ Object.assign(params, conditionParams)
158
159
  for (const [key, value] of rule.headers) {
159
- const resolved = substitute(value, params).pathname;
160
- if (key.toLowerCase() === 'set-cookie') configSetCookies.push(resolved);
161
- else ctx.headers.set(key, resolved);
160
+ const resolved = substitute(value, params).pathname
161
+ if (key.toLowerCase() === 'set-cookie') configSetCookies.push(resolved)
162
+ else ctx.headers.set(key, resolved)
162
163
  }
163
164
  }
164
165
  if (configSetCookies.length > 0) {
165
166
  const existing =
166
- (ctx.headers as Headers & { getSetCookie?: () => string[] }).getSetCookie?.() ?? [];
167
- ctx.headers.delete('set-cookie');
168
- for (const cookie of configSetCookies) ctx.headers.append('set-cookie', cookie);
169
- for (const cookie of existing) ctx.headers.append('set-cookie', cookie);
167
+ (ctx.headers as Headers & { getSetCookie?: () => string[] }).getSetCookie?.() ?? []
168
+ ctx.headers.delete('set-cookie')
169
+ for (const cookie of configSetCookies) ctx.headers.append('set-cookie', cookie)
170
+ for (const cookie of existing) ctx.headers.append('set-cookie', cookie)
170
171
  }
171
172
  }
172
173
 
@@ -176,94 +177,91 @@ function applyDefaultIsrHeader(
176
177
  ): void {
177
178
  const pagesRevalidateSeconds = pagesRevalidateRules.find(rule =>
178
179
  rule.regex.test(ctx.request.url.pathname),
179
- )?.revalidateSeconds;
180
- const existing = ctx.headers.get('cache-control');
180
+ )?.revalidateSeconds
181
+ const existing = ctx.headers.get('cache-control')
181
182
  // An RSC payload is never browser-cacheable: the flight response embeds the
182
183
  // render's data, so a cached copy replays stale content after a revalidation
183
184
  // (actions "should invalidate client cache when path is revalidated"). Match
184
185
  // the RSC document path in register-segment, which stamps `private, no-store`.
185
186
  if (isRscPayload(ctx)) {
186
187
  if (existing === null || isBrowserCacheable(existing)) {
187
- ctx.headers.set('cache-control', 'private, no-store');
188
+ ctx.headers.set('cache-control', 'private, no-store')
188
189
  }
189
- return;
190
+ return
190
191
  }
191
- if (existing && (pagesRevalidateSeconds === undefined || existing !== 'no-store')) return;
192
+ if (existing && (pagesRevalidateSeconds === undefined || existing !== 'no-store')) return
192
193
  const revalidateSeconds =
193
- pagesRevalidateSeconds ??
194
- (ctx.routeMode === 'isr' ? ctx.hints?.revalidateSeconds : undefined);
195
- if (typeof revalidateSeconds !== 'number' || revalidateSeconds <= 0) return;
196
- const config = getNextConfig();
197
- const expireTime =
198
- typeof config.expireTime === 'number' ? config.expireTime : DEFAULT_EXPIRE_TIME;
199
- const swr = Math.max(0, expireTime - revalidateSeconds);
200
- ctx.headers.set('cache-control', `s-maxage=${revalidateSeconds}, stale-while-revalidate=${swr}`);
194
+ pagesRevalidateSeconds ?? (ctx.routeMode === 'isr' ? ctx.hints?.revalidateSeconds : undefined)
195
+ if (typeof revalidateSeconds !== 'number' || revalidateSeconds <= 0) return
196
+ const config = getNextConfig()
197
+ const expireTime = typeof config.expireTime === 'number' ? config.expireTime : DEFAULT_EXPIRE_TIME
198
+ const swr = Math.max(0, expireTime - revalidateSeconds)
199
+ ctx.headers.set('cache-control', `s-maxage=${revalidateSeconds}, stale-while-revalidate=${swr}`)
201
200
  }
202
201
 
203
202
  /** A flight response: core's `data` route kind, or an `_rsc` cache-busted URL. */
204
203
  function isRscPayload(ctx: ResponseFinalizerContext): boolean {
205
- return ctx.routeKind === 'data' || ctx.request.url.searchParams.has('_rsc');
204
+ return ctx.routeKind === 'data' || ctx.request.url.searchParams.has('_rsc')
206
205
  }
207
206
 
208
207
  /** True for a cache-control a browser may reuse (no `no-store`/`no-cache`). */
209
208
  function isBrowserCacheable(value: string): boolean {
210
- return !/\bno-store\b|\bno-cache\b/i.test(value);
209
+ return !/\bno-store\b|\bno-cache\b/i.test(value)
211
210
  }
212
211
 
213
212
  function loadPagesRevalidateRules(root: string): RevalidateRule[] {
214
- const pagesDir = path.join(root, 'pages');
215
- if (!existsSync(pagesDir)) return [];
216
- const rules: RevalidateRule[] = [];
213
+ const pagesDir = path.join(root, 'pages')
214
+ if (!existsSync(pagesDir)) return []
215
+ const rules: RevalidateRule[] = []
217
216
  for (const file of walkFiles(pagesDir)) {
218
- const source = readFileSync(file, 'utf8');
219
- if (!/\bgetStaticProps\b/.test(source)) continue;
220
- const match = /\brevalidate\s*:\s*(\d+)/.exec(source);
221
- if (!match?.[1]) continue;
222
- const regex = pagesRouteRegex(path.relative(pagesDir, file));
223
- if (!regex) continue;
224
- rules.push({ regex, revalidateSeconds: Number(match[1]) });
217
+ const source = readFileSync(file, 'utf8')
218
+ if (!/\bgetStaticProps\b/.test(source)) continue
219
+ const match = /\brevalidate\s*:\s*(\d+)/.exec(source)
220
+ if (!match?.[1]) continue
221
+ const regex = pagesRouteRegex(path.relative(pagesDir, file))
222
+ if (!regex) continue
223
+ rules.push({ regex, revalidateSeconds: Number(match[1]) })
225
224
  }
226
- return rules;
225
+ return rules
227
226
  }
228
227
 
229
228
  function walkFiles(dir: string): string[] {
230
- const files: string[] = [];
229
+ const files: string[] = []
231
230
  for (const entry of readdirSync(dir, { withFileTypes: true })) {
232
- const file = path.join(dir, entry.name);
233
- if (entry.isDirectory()) files.push(...walkFiles(file));
234
- else if (/\.(?:tsx|ts|jsx|js|mjs)$/.test(entry.name)) files.push(file);
231
+ const file = path.join(dir, entry.name)
232
+ if (entry.isDirectory()) files.push(...walkFiles(file))
233
+ else if (/\.(?:tsx|ts|jsx|js|mjs)$/.test(entry.name)) files.push(file)
235
234
  }
236
- return files;
235
+ return files
237
236
  }
238
237
 
239
238
  function pagesRouteRegex(relative: string): RegExp | undefined {
240
- const withoutExt = relative.replace(/\.(?:tsx|ts|jsx|js|mjs)$/, '').split(path.sep).join('/');
241
- const route = withoutExt === 'index' ? '' : withoutExt.replace(/\/index$/, '');
242
- const parts = route.split('/').filter(Boolean);
239
+ const withoutExt = relative
240
+ .replace(/\.(?:tsx|ts|jsx|js|mjs)$/, '')
241
+ .split(path.sep)
242
+ .join('/')
243
+ const route = withoutExt === 'index' ? '' : withoutExt.replace(/\/index$/, '')
244
+ const parts = route.split('/').filter(Boolean)
243
245
  const pattern = parts
244
246
  .map(part => {
245
- if (/^\[\[\.\.\.[^\]]+\]\]$/.test(part)) return '(?:/.*)?';
246
- if (/^\[\.\.\.[^\]]+\]$/.test(part)) return '/.+';
247
- if (/^\[[^\]]+\]$/.test(part)) return '/[^/]+';
248
- return `/${escapeRegex(part)}`;
247
+ if (/^\[\[\.\.\.[^\]]+\]\]$/.test(part)) return '(?:/.*)?'
248
+ if (/^\[\.\.\.[^\]]+\]$/.test(part)) return '/.+'
249
+ if (/^\[[^\]]+\]$/.test(part)) return '/[^/]+'
250
+ return `/${escapeRegex(part)}`
249
251
  })
250
- .join('');
251
- return new RegExp(`^${pattern || '/'}\\/?$`);
252
- }
253
-
254
- function escapeRegex(value: string): string {
255
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
252
+ .join('')
253
+ return new RegExp(`^${pattern || '/'}\\/?$`)
256
254
  }
257
255
 
258
256
  function parseCookieHeader(header: string | null): Record<string, string> {
259
- const cookies: Record<string, string> = {};
260
- if (!header) return cookies;
257
+ const cookies: Record<string, string> = {}
258
+ if (!header) return cookies
261
259
  for (const part of header.split(';')) {
262
- const index = part.indexOf('=');
263
- if (index === -1) continue;
264
- const name = part.slice(0, index).trim();
265
- if (!name) continue;
266
- cookies[name] = decodeURIComponent(part.slice(index + 1).trim());
260
+ const index = part.indexOf('=')
261
+ if (index === -1) continue
262
+ const name = part.slice(0, index).trim()
263
+ if (!name) continue
264
+ cookies[name] = decodeURIComponent(part.slice(index + 1).trim())
267
265
  }
268
- return cookies;
266
+ return cookies
269
267
  }
@@ -10,9 +10,9 @@
10
10
 
11
11
  declare global {
12
12
  interface Window {
13
- __PNEXT_BASE_PATH__?: string;
13
+ __PNEXT_BASE_PATH__?: string
14
14
  }
15
- var __PNEXT_BASE_PATH__: string | undefined;
15
+ var __PNEXT_BASE_PATH__: string | undefined
16
16
  }
17
17
 
18
18
  /**
@@ -23,8 +23,8 @@ declare global {
23
23
  * config loader, so this stays safe to ship to the browser.
24
24
  */
25
25
  export function basePath(): string {
26
- if (process.browser || typeof window !== 'undefined') return window.__PNEXT_BASE_PATH__ ?? '';
27
- return globalThis.__PNEXT_BASE_PATH__ ?? '';
26
+ if (process.browser || typeof window !== 'undefined') return window.__PNEXT_BASE_PATH__ ?? ''
27
+ return globalThis.__PNEXT_BASE_PATH__ ?? ''
28
28
  }
29
29
 
30
30
  /**
@@ -34,21 +34,21 @@ export function basePath(): string {
34
34
  * no-basePath app is always a no-op.
35
35
  */
36
36
  export function addBasePath(path: string): string {
37
- const base = basePath();
38
- if (!base) return path;
39
- if (!path.startsWith('/') || path.startsWith('//')) return path;
40
- if (path === '/') return base;
41
- if (path === base || path.startsWith(`${base}/`)) return path;
42
- return `${base}${path}`;
37
+ const base = basePath()
38
+ if (!base) return path
39
+ if (!path.startsWith('/') || path.startsWith('//')) return path
40
+ if (path === '/') return base
41
+ if (path === base || path.startsWith(`${base}/`)) return path
42
+ return `${base}${path}`
43
43
  }
44
44
 
45
45
  /** Strip the configured basePath prefix from an in-app path (inverse of addBasePath). */
46
46
  export function stripBasePath(path: string): string {
47
- const base = basePath();
48
- if (!base) return path;
49
- if (path === base) return '/';
50
- if (path.startsWith(`${base}/`)) return path.slice(base.length);
51
- return path;
47
+ const base = basePath()
48
+ if (!base) return path
49
+ if (path === base) return '/'
50
+ if (path.startsWith(`${base}/`)) return path.slice(base.length)
51
+ return path
52
52
  }
53
53
 
54
54
  /**
@@ -56,9 +56,10 @@ export function stripBasePath(path: string): string {
56
56
  * hard-navigate to it (a `basePath:false` target). Always false when no basePath is configured.
57
57
  */
58
58
  export function isOutsideBasePath(url: URL): boolean {
59
- const base = basePath();
60
- if (!base) return false;
61
- if ((process.browser || typeof window !== 'undefined') && url.origin !== window.location.origin) return false;
62
- const path = url.pathname;
63
- return path !== base && !path.startsWith(`${base}/`);
59
+ const base = basePath()
60
+ if (!base) return false
61
+ if ((process.browser || typeof window !== 'undefined') && url.origin !== window.location.origin)
62
+ return false
63
+ const path = url.pathname
64
+ return path !== base && !path.startsWith(`${base}/`)
64
65
  }
@@ -2,35 +2,35 @@
2
2
  // Shared links otherwise retain their old position while newly-needed links
3
3
  // append, which reverses ties in the CSS cascade after a route transition.
4
4
  export function reconcileNextStylesheets(incoming: Document) {
5
- const order = new Map<string, number>();
5
+ const order = new Map<string, number>()
6
6
  for (const link of incoming.querySelectorAll<HTMLLinkElement>('link[rel="stylesheet"][href]')) {
7
- const href = absoluteHref(link);
8
- if (href && nextStylesheet(href) && !order.has(href)) order.set(href, order.size);
7
+ const href = absoluteHref(link)
8
+ if (href && nextStylesheet(href) && !order.has(href)) order.set(href, order.size)
9
9
  }
10
- if (order.size < 2) return;
10
+ if (order.size < 2) return
11
11
 
12
- const current = [...document.querySelectorAll<HTMLLinkElement>('link[rel="stylesheet"][href]')].filter(
13
- link => order.has(link.href),
14
- );
15
- if (current.length < 2) return;
12
+ const current = [
13
+ ...document.querySelectorAll<HTMLLinkElement>('link[rel="stylesheet"][href]'),
14
+ ].filter(link => order.has(link.href))
15
+ if (current.length < 2) return
16
16
 
17
- const rank = (link: HTMLLinkElement) => order.get(link.href) ?? 0;
18
- if (current.every((link, index) => index === 0 || rank(current[index - 1]!) <= rank(link))) return;
17
+ const rank = (link: HTMLLinkElement) => order.get(link.href) ?? 0
18
+ if (current.every((link, index) => index === 0 || rank(current[index - 1]!) <= rank(link))) return
19
19
 
20
- const sorted = [...current].sort((left, right) => rank(left) - rank(right));
21
- let previous = sorted[0]!;
20
+ const sorted = [...current].sort((left, right) => rank(left) - rank(right))
21
+ let previous = sorted[0]!
22
22
  for (const link of sorted.slice(1)) {
23
- if (previous.nextSibling !== link) previous.after(link);
24
- previous = link;
23
+ if (previous.nextSibling !== link) previous.after(link)
24
+ previous = link
25
25
  }
26
26
  }
27
27
 
28
28
  function absoluteHref(link: HTMLLinkElement) {
29
- const href = link.getAttribute('href');
30
- return href ? new URL(href, location.href).href : undefined;
29
+ const href = link.getAttribute('href')
30
+ return href ? new URL(href, location.href).href : undefined
31
31
  }
32
32
 
33
33
  function nextStylesheet(href: string) {
34
- const url = new URL(href, location.href);
35
- return url.origin === location.origin && url.pathname.startsWith('/assets/');
34
+ const url = new URL(href, location.href)
35
+ return url.origin === location.origin && url.pathname.startsWith('/assets/')
36
36
  }
@@ -1,32 +1,32 @@
1
1
  // Bare tier of the client error boundary (see ./error-boundary): a route with no error.*/not-found.*
2
2
  // still needs one so hydration throws reach the window last resort (not preact's diff) and primitive
3
3
  // throws keep their raw value en route to global-error. Exactly those two behaviors, ~0.5 KB raw.
4
- import { Component, type ComponentChildren } from 'preact';
5
- import { normalizeBoundaryError } from './primitive-throw';
4
+ import { Component, type ComponentChildren } from 'preact'
5
+ import { normalizeBoundaryError } from './primitive-throw'
6
6
 
7
7
  interface BareBoundaryState {
8
- error: unknown;
9
- hasError: boolean;
8
+ error: unknown
9
+ hasError: boolean
10
10
  }
11
11
 
12
12
  export class BareErrorBoundary extends Component<{ children?: unknown }, BareBoundaryState> {
13
- state: BareBoundaryState = { error: null, hasError: false };
13
+ state: BareBoundaryState = { error: null, hasError: false }
14
14
 
15
15
  static getDerivedStateFromError(error: unknown): BareBoundaryState {
16
- return { error: normalizeBoundaryError(error), hasError: true };
16
+ return { error: normalizeBoundaryError(error), hasError: true }
17
17
  }
18
18
 
19
19
  render(): ComponentChildren {
20
- if (!this.state.hasError) return this.props.children;
21
- const { error } = this.state;
20
+ if (!this.state.hasError) return this.props.children
21
+ const { error } = this.state
22
22
  // A primitive would arrive at the window handler as a synthesized Error, so
23
23
  // escalate it to global-error directly (deferred tier) with its raw value.
24
24
  // Everything else re-throws: unmarked, so the window last resort still sees
25
25
  // a genuinely uncaught error and drives it.
26
26
  if (error === null || typeof error !== 'object') {
27
- void import('./global-error').then(module => module.escalateToGlobalError(error));
28
- return null;
27
+ void import('./global-error').then(module => module.escalateToGlobalError(error))
28
+ return null
29
29
  }
30
- throw error as Error;
30
+ throw error as Error
31
31
  }
32
32
  }