@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
package/reference/css.md CHANGED
@@ -1,58 +1,67 @@
1
1
  # CSS
2
2
 
3
+ Global styles, per-route styles, CSS Modules, and the compat-only preprocessors.
4
+
3
5
  ## Global CSS
4
6
 
5
- Import global styles from the root layout. pnext compiles global CSS once and links it from every page as `/assets/global.css`.
7
+ Imported from the root layout. pnext compiles it once and links it from every page as `/assets/global.css`.
8
+
9
+ ```tsx
10
+ // app/layout.tsx
11
+ import './globals.css'
12
+ ```
6
13
 
7
- Global CSS can use local workspace package imports, font files, image assets, and the app's PostCSS/Tailwind setup.
14
+ Global CSS can import local workspace packages, font files, image assets, and the app's PostCSS or Tailwind setup.
8
15
 
9
- ## PostCSS
16
+ ## Route and component CSS
10
17
 
11
- When the app root has a `postcss.config.{cjs,js,mjs}`, pnext runs its plugins on every emitted stylesheet, in a worker thread. Tailwind v4 (`@tailwindcss/postcss`) stays warm there, so dev rebuilds are incremental; config-file edits need a dev-server restart.
18
+ Any page, layout, or component can import a stylesheet.
12
19
 
13
20
  ```tsx
14
- import type { ComponentChildren } from 'preact';
15
- import './globals.css';
16
-
17
- export default function Layout({ children }: { children: ComponentChildren }) {
18
- return (
19
- <html>
20
- <body>{children}</body>
21
- </html>
22
- );
23
- }
21
+ import './page.css'
24
22
  ```
25
23
 
26
- ## Route CSS
24
+ pnext emits CSS only for routes that import it. A route stylesheet is named from the route id, as `/assets/<route-id>.css`. When a compat build splits one into chunks, each name gains an index suffix.
27
25
 
28
- Import plain CSS from pages, layouts, or components:
26
+ ## CSS Modules
27
+
28
+ A `.module.css` file gives scoped class names that match the server-rendered HTML.
29
29
 
30
30
  ```tsx
31
- import './page.css';
31
+ import styles from './page.module.css'
32
32
 
33
33
  export default function Page() {
34
- return <h1 className="title">Hello</h1>;
34
+ return <h1 className={styles.title}>Hello</h1>
35
35
  }
36
36
  ```
37
37
 
38
- pnext emits route CSS only for routes that import CSS. A route with CSS imports gets a linked `/assets/<route>.css` chunk.
38
+ Under `compat.next`, a `:global(...)` wrapper leaves the enclosed selector unscoped.
39
39
 
40
- ## CSS Modules
40
+ ## Tailwind and PostCSS
41
41
 
42
- Use `.module.css` for scoped classes:
42
+ A `postcss.config.{cjs,js,mjs}` file at the app root makes pnext run its plugins on every emitted stylesheet. Tailwind v4 stays warm in development. Editing the config file requires a dev-server restart.
43
43
 
44
- ```css
45
- .title {
46
- color: rebeccapurple;
47
- }
48
- ```
44
+ ## Sass
49
45
 
50
- ```tsx
51
- import styles from './page.module.css';
46
+ Requires `compat.next` and the optional `sass` dependency. `.scss`, `.sass`, `.module.scss`, and `.module.sass` imports compile, and `sassOptions.includePaths` from `next.config.js` is honored. If `sass` is unavailable, Sass imports produce no CSS rather than breaking a non-Sass app.
52
47
 
53
- export default function Page() {
54
- return <h1 className={styles.title}>Hello</h1>;
55
- }
56
- ```
48
+ ## styled-jsx
49
+
50
+ Requires `compat.next`. Style blocks and `styled-jsx/css` are transformed to pnext's own runtime, which collects server styles and mirrors client styles into the document head. Apps do not need to install `styled-jsx`.
51
+
52
+ ## Lightning CSS
53
+
54
+ Requires `compat.next` and the app's own `lightningcss` package.
55
+
56
+ - `experimental.useLightningcss` transforms CSS with it.
57
+ - `experimental.lightningCssFeatures` controls which features are included or excluded.
58
+
59
+ CSS passes through untransformed when the package is absent or the transform fails.
60
+
61
+ ## Nonces and inline CSS
62
+
63
+ pnext reads a CSP nonce from the request `Content-Security-Policy` header and applies it to generated styles. With `experimental.inlineCss`, production documents inline route and global CSS in nonce-bearing style tags, while development keeps stylesheet links.
64
+
65
+ ## Chunking and order
57
66
 
58
- CSS module class names are scoped in the emitted CSS and match the server-rendered HTML.
67
+ `experimental.cssChunking` groups compatible route stylesheets into fewer files while preserving each route's stylesheet order. It splits them instead when sharing a chunk would change cascade order or make a chunk too large.
package/reference/dev.md CHANGED
@@ -1,25 +1,23 @@
1
- # Dev Server
1
+ # Development
2
2
 
3
- `pnext dev` starts a Bun HTTP server for local development.
3
+ The `pnext` CLI carries the whole flow: `dev` while you build, `analyze` to inspect what ships, `build` and `start` for production.
4
4
 
5
- ## CLI
6
-
7
- ```txt
5
+ ```sh
8
6
  pnext dev [directory] [--port 3000] [--hostname 127.0.0.1]
9
7
  pnext build [directory] [--adapter vercel] [--verbose]
10
8
  pnext start [directory] [--port 3000] [--hostname 127.0.0.1]
11
9
  pnext analyze [route] [directory] [--brotli] [--files] [--json]
12
10
  pnext typegen [directory]
11
+ pnext create <directory> [--no-install]
12
+ pnext migrate [directory] [--dry-run]
13
13
  ```
14
14
 
15
- `analyze` takes a route (`/users/[id]` or a concrete path like `/users/ada`) to report on that route only.
16
-
17
- Add `@wular/pnext` as a package dependency and put `pnext` in package scripts:
15
+ `create` scaffolds a new app with everything set up. `migrate` converts a Next.js project in place: it rewrites `package.json` and `tsconfig.json` and creates a `pnext.config.ts` with `compat.next` enabled, without editing app source; `--dry-run` previews. To set a project up by hand, add the package and scripts:
18
16
 
19
17
  ```json
20
18
  {
21
19
  "devDependencies": {
22
- "@wular/pnext": "^0.0.0"
20
+ "@wular/pnext": "latest"
23
21
  },
24
22
  "scripts": {
25
23
  "dev": "pnext dev",
@@ -30,40 +28,35 @@ Add `@wular/pnext` as a package dependency and put `pnext` in package scripts:
30
28
  }
31
29
  ```
32
30
 
33
- The package exposes a `pnext` binary. Package managers make it available inside script `PATH`.
31
+ ## Dev server
34
32
 
35
- ## Processes
33
+ `pnext dev` starts a Bun HTTP server that scans the route tree, renders matching pages on request, and serves static assets from `public/`. Client route entries are built on demand and cached in `.pnext/cache`. Browser pages reload on route-tree changes over a server-sent events stream at `/__pnext/events`; the other `/__pnext/*` endpoints are implementation details, not application routes.
36
34
 
37
- pnext processes are labelled in Activity Monitor and `ps`: `pnext dev` shows
38
- up as a single `pnext-dev` server process, `pnext build` as `pnext-build`, and
39
- esbuild's service process as `pnext-esbuild`. Tailwind and PostCSS run in a
40
- worker thread inside the server process, not as child processes.
35
+ The dev server does not typecheck in the request path; run your package's lint and typecheck scripts separately. `pnext typegen` regenerates the route types on demand; see [Type Safety](./typegen.md).
41
36
 
42
- The dev server re-execs itself same pid when its memory passes
43
- `PNEXT_DEV_MAX_RSS_MB` (default 2048). The esbuild service is stopped and
44
- respawned past `PNEXT_DEV_MAX_ESBUILD_RSS_MB` (default 1024).
37
+ In Activity Monitor and `ps`, the dev server runs as `pnext-dev`, builds as `pnext-build`, and the bundler service as `pnext-esbuild`. The dev server re-execs itself when its memory passes `PNEXT_DEV_MAX_RSS_MB` (default 2048), and restarts the bundler past `PNEXT_DEV_MAX_ESBUILD_RSS_MB` (default 1024).
45
38
 
46
- ## Responsibilities
39
+ ## Analyze
47
40
 
48
- - Scan the route tree.
49
- - Render matching pages on request.
50
- - Serve static assets from `public/`.
51
- - Build client route entries on demand with esbuild.
52
- - Cache generated client entries in `.pnext/cache`.
53
- - Notify the browser of route-tree changes through `/__pnext/events`.
41
+ `pnext analyze` reports the client JavaScript behind each route. Optionally pass a route, either a template like `/users/[id]` or a concrete path, to report on that route only. `--files` breaks the report into files, `--brotli` measures with brotli instead of gzip, and `--json` emits machine-readable output.
54
42
 
55
- ## Cache
43
+ ## Build and run
56
44
 
57
- Client entry cache keys include the route id and source content hash. Cached entries are stored below `.pnext/cache/client`.
45
+ `pnext build` makes the production build and `pnext start` serves it. Routes render on the server per request; ones that never read the request are prerendered to static HTML at build time. A `compat.next` build typechecks off-thread alongside bundling.
58
46
 
59
- ## Reload Events
47
+ Debug flags: `--experimental-build-mode compile|generate` splits the build into its two phases, `--debug-build-paths <paths>` narrows diagnostics to matching paths, and `--debug-prerender` prints prerender diagnostics.
60
48
 
61
- The dev server exposes a server-sent events stream at `/__pnext/events`. Browser pages reload when app files change.
49
+ ## Deploy
62
50
 
63
- ## Typechecking
51
+ pnext deploys anywhere Bun runs: a VPS, a container, or any host you control. Run `pnext build` on the machine or in CI, then `pnext start` serves the app on your port.
64
52
 
65
- The dev server does not typecheck in the request path. Run package lint or typecheck commands separately. `pnext build` under `compat.next` typechecks off-thread, in parallel with bundling, and reports it on its own line.
53
+ Vercel has a dedicated adapter: `pnext build --adapter vercel` writes Build Output to `.vercel/output`. Static pages and static route-handler responses are emitted as files; everything dynamic runs in a single `_pnext` function on Vercel's Bun runtime.
66
54
 
67
- ## Server Adapter
55
+ ## Environment variables
68
56
 
69
- Use `pnext build --adapter vercel` to write Vercel Build Output at `.vercel/output`. Static pages and static `GET` route-handler outputs are emitted as files. Everything dynamic — pages, route handlers, and `proxy.ts` is served by a single `_pnext` function on Vercel's Bun runtime; the proxy's `config.matcher` patterns become routes into it.
57
+ - `PNEXT_COMPAT=next`: Next compatibility without a config file. See [Compatibility](./compat.md).
58
+ - `PNEXT_TYPECHECK=classic`: in-process TypeScript checker instead of the native one.
59
+ - `PNEXT_CLIENT_METAFILE=1`: write the client esbuild metafile to the output directory.
60
+ - `PNEXT_CLIENT_PROFILE=1`: print client-build phase timings.
61
+ - `PNEXT_DEV_PROFILE=1`: print dev request and build timings.
62
+ - `PNEXT_BOOT_TRACE=1`: print boot-phase timings and memory readings.
package/reference/env.md CHANGED
@@ -1,29 +1,29 @@
1
1
  # Environment Variables
2
2
 
3
- pnext loads `.env*` files from the project root, not from `src/`.
3
+ pnext loads `.env*` files from the project root, never from `src/`. Variables are server-only unless their name marks them for the browser. Server Components, layouts, route handlers, and the proxy read them from `process.env`.
4
4
 
5
- Variables already set on `process.env` win. Missing variables are loaded in this order:
5
+ ## What reaches the browser
6
6
 
7
- 1. `.env.$NODE_ENV.local`
8
- 2. `.env.local` except when `NODE_ENV` is `test`
9
- 3. `.env.$NODE_ENV`
10
- 4. `.env`
11
-
12
- If `NODE_ENV` is not set, `pnext dev` uses `development`; other commands use `production`.
13
-
14
- ## Browser Variables
15
-
16
- Browser bundles inline only:
7
+ Browser bundles inline only these:
17
8
 
18
9
  - `process.env.NODE_ENV`
19
10
  - `process.env.NEXT_PUBLIC_*`
20
11
  - `process.env.PNEXT_PUBLIC_*`
21
12
 
22
- Other variables stay server-only. Server Components, layouts, route handlers, and proxy can read them through `process.env`.
13
+ ## Load order
14
+
15
+ Variables already set on `process.env` win. Missing ones are loaded from:
23
16
 
24
- ## Variable References
17
+ 1. `.env.$NODE_ENV.local`
18
+ 2. `.env.local`, except when `NODE_ENV` is `test`
19
+ 3. `.env.$NODE_ENV`
20
+ 4. `.env`
21
+
22
+ If `NODE_ENV` is not set, the dev server uses `development` and every other command uses `production`.
25
23
 
26
- Values can reference earlier environment variables:
24
+ ## Variable references
25
+
26
+ A value can reference an earlier variable, with or without braces, and with an optional fallback.
27
27
 
28
28
  ```env
29
29
  API_HOST=api.example.com
@@ -31,10 +31,8 @@ NEXT_PUBLIC_API_URL=https://$API_HOST
31
31
  PORT=${APP_PORT:-3000}
32
32
  ```
33
33
 
34
- `${VAR}` and `${VAR:-fallback}` both work. A variable already on `process.env` wins over the file's own value.
34
+ Escape the dollar sign when it should be literal, as `\$10`.
35
35
 
36
- Escape `$` when it should be literal:
36
+ ## PNEXT_COMPAT
37
37
 
38
- ```env
39
- PRICE=\$10
40
- ```
38
+ Setting it to `next` gives an app with no `pnext.config.ts` the `next/*` module surface and `next.config.js` support. When a config file is present, it forces Next compatibility on and leaves every other compat flag as written. It is read after the `.env*` files load, so a `.env` file can set it. See [Compatibility](./compat.md).
@@ -0,0 +1,132 @@
1
+ # Getting Started
2
+
3
+ pnext is a Preact framework for file-routed apps. It renders on the server by default and ships client JavaScript only where a component opts in.
4
+
5
+ > pnext requires [Bun](https://bun.sh/get) - make sure it is installed first.
6
+
7
+ <!-- tabs:start -->
8
+
9
+ ## New app
10
+
11
+ ```sh
12
+ bunx @wular/pnext create my-app
13
+ cd my-app
14
+ bun dev
15
+ ```
16
+
17
+ The app is running at `http://localhost:3000`. Edit `app/page.tsx`; the browser reloads on save.
18
+
19
+ `app/page.tsx` is a Server Component: it can be async, load data on the server, and ships no client JavaScript. The counter it renders, `app/counter.tsx`, starts with `'use client'`, so it alone hydrates in the browser. That's the model: files name routes, the server renders by default, components opt in to the client.
20
+
21
+ ## Coming from Next.js
22
+
23
+ Run in your Next project:
24
+
25
+ ```sh
26
+ bunx @wular/pnext migrate
27
+ ```
28
+
29
+ It converts the project to pnext with `compat.next` enabled, without editing app source. `--dry-run` previews.
30
+
31
+ With `compat.next`, the `next/*` modules, `next.config.js`, server actions, metadata, and the rest of the App Router behavior work as they do in Next, validated against Next's own test suite. [Compatibility](./compat.md) covers the full surface and where it stops short.
32
+
33
+ <!-- tabs:end -->
34
+
35
+ ## Build and deploy
36
+
37
+ ```sh
38
+ pnext build
39
+ pnext start
40
+ ```
41
+
42
+ `pnext build` makes the production build and `pnext start` serves it. Routes render on the server per request; ones that never read the request are prerendered to static HTML at build time.
43
+
44
+ That deploys anywhere Bun runs. For Vercel, build with `pnext build --adapter vercel` and it writes ready-to-deploy Build Output.
45
+
46
+ ## A quick tour
47
+
48
+ ### Your first page
49
+
50
+ Routes live in `app/`. A `page.tsx` is a Server Component by default. It runs only on the server, so it can be async and talk to your database, filesystem, or internal services directly. None of that code reaches the browser:
51
+
52
+ ```tsx
53
+ // app/posts/[id]/page.tsx
54
+ import type { PageProps } from '#gen/app/posts/[id]/page'
55
+
56
+ export default async function Page({ params }: PageProps) {
57
+ const { id } = await params
58
+ const post = await db.post.findUnique({ where: { id } })
59
+ return (
60
+ <article>
61
+ <h1>{post.title}</h1>
62
+ <p>{post.body}</p>
63
+ </article>
64
+ )
65
+ }
66
+ ```
67
+
68
+ This page ships **0 KB** of JavaScript. Layouts work the same way: the root `layout.tsx` owns `<html>` and `<body>` and can export `metadata`.
69
+
70
+ ### Adding interactivity
71
+
72
+ Mark a component with `"use client"` where you need state, effects, or event handlers. Server Components render it into the page, and only that island hydrates in the browser:
73
+
74
+ ```tsx
75
+ // app/counter.tsx
76
+ 'use client'
77
+ import { useState } from 'preact/hooks'
78
+
79
+ export function Counter({ initial }: { initial: number }) {
80
+ const [count, setCount] = useState(initial)
81
+ return (
82
+ <button onClick={() => setCount(count + 1)}>Count {count}</button>
83
+ )
84
+ }
85
+ ```
86
+
87
+ Client Components hydrate on Preact for ~7.5 KB of framework, or ~12.5 KB with [`compat.react`](./compat.md) if you want to run React components and libraries unchanged. Offscreen islands can stay out of the initial bundle entirely with `dynamic({ load: 'visible' })`.
88
+
89
+ ### Streaming
90
+
91
+ Wrap slow server work in `<Suspense>`. The shell streams immediately and the content follows when it's ready:
92
+
93
+ ```tsx
94
+ import { Suspense } from '@wular/pnext'
95
+
96
+ export default function Page() {
97
+ return (
98
+ <Suspense fallback={<p>Loading comments…</p>}>
99
+ <Comments />
100
+ </Suspense>
101
+ )
102
+ }
103
+ ```
104
+
105
+ ### APIs and everything else
106
+
107
+ A `route.ts` file is an HTTP handler:
108
+
109
+ ```ts
110
+ // app/api/users/route.ts
111
+ export async function GET(request: NextRequest) {
112
+ return Response.json(await listUsers())
113
+ }
114
+ ```
115
+
116
+ - `proxy.ts` runs before route matching.
117
+ - `loading.tsx`, `error.tsx`, and `not-found.tsx` define per-segment fallbacks.
118
+ - `pnext build` makes the production build and `pnext start` serves it. Routes that never read the request are prerendered to static HTML.
119
+
120
+ ## References
121
+
122
+ - [Routing](./routing.md)
123
+ - [Navigation](./navigation.md)
124
+ - [Rendering](./rendering.md)
125
+ - [Metadata](./metadata.md)
126
+ - [CSS](./css.md)
127
+ - [Environment Variables](./env.md)
128
+ - [Config](./config.md)
129
+ - [Type Safety](./typegen.md)
130
+ - [Compatibility](./compat.md)
131
+ - [Development](./dev.md)
132
+ - [Performance](./performance.md)
@@ -1,86 +1,71 @@
1
1
  # Metadata
2
2
 
3
- Core metadata takes no request input, so it resolves at build time. `pnext build` evaluates metadata objects, `metadata()`/`viewport()` functions, and metadata route code, and `pnext start` serves the prebuilt head for static routes without recomputing it per request.
3
+ Titles, descriptions, icons, and social images for a route. Metadata takes no request input in core, so it all resolves during the build, and the server sends the prebuilt head for a static route without recomputing it.
4
4
 
5
- Use `compat.next` for Next.js request-time metadata APIs such as `generateMetadata()`, `generateViewport()`, streaming metadata, `headers()`, `cookies()`, and full `next/og` behavior.
5
+ ## metadata
6
6
 
7
- ## Page and Layout Exports
8
-
9
- Pages and layouts can export `metadata` as an object:
7
+ Pages and layouts export it as an object. Metadata resolves from the root layout down to the page, and nearer segments override or extend what earlier ones set.
10
8
 
11
9
  ```tsx
12
- import type { Metadata } from '@wular/pnext';
10
+ import type { Metadata } from '@wular/pnext'
13
11
 
14
12
  export const metadata: Metadata = {
15
13
  title: 'About',
16
14
  description: 'About the team',
17
- };
15
+ }
18
16
  ```
19
17
 
20
- They can also export `metadata()` as a no-arg build-time function:
18
+ ## Fields
19
+
20
+ pnext follows the Next.js field shapes for `title`, `description`, `metadataBase`, `openGraph`, `twitter`, `robots`, `icons`, `manifest`, `alternates`, `verification`, `appleWebApp`, `appLinks`, and `other`. The [Next.js metadata fields reference](https://nextjs.org/docs/app/api-reference/functions/generate-metadata#metadata-fields) documents the full schema.
21
+
22
+ ## metadata()
23
+
24
+ A no-argument function export, for values that come from somewhere else. It runs during the build.
21
25
 
22
26
  ```tsx
23
27
  export async function metadata() {
24
- const site = await getSiteMetadata();
25
- return {
26
- title: site.title,
27
- description: site.description,
28
- };
28
+ const site = await getSiteMetadata()
29
+ return { title: site.title, description: site.description }
29
30
  }
30
31
  ```
31
32
 
32
- Metadata is resolved from root layout to page. Nearer segments override or extend earlier segments.
33
-
34
- pnext follows the Next.js metadata field shapes for common fields such as `title`, `description`, `metadataBase`, `openGraph`, `twitter`, `robots`, `icons`, `manifest`, `alternates`, `verification`, `appleWebApp`, `appLinks`, and `other`. Use the [Next.js metadata fields reference](https://nextjs.org/docs/app/api-reference/functions/generate-metadata#metadata-fields) for the full field schema.
33
+ ## viewport
35
34
 
36
- ## Viewport
37
-
38
- Pages and layouts can export `viewport` as an object or a build-time function:
35
+ Pages and layouts export it as an object or as a build-time function, the same way.
39
36
 
40
37
  ```tsx
41
- import type { Viewport } from '@wular/pnext';
38
+ import type { Viewport } from '@wular/pnext'
42
39
 
43
40
  export const viewport: Viewport = {
44
41
  width: 'device-width',
45
42
  initialScale: 1,
46
43
  themeColor: '#0b0b0b',
47
- };
44
+ }
48
45
  ```
49
46
 
50
- Use `compat.next` for `generateViewport()` with route props.
47
+ ## Metadata files
51
48
 
52
- ## File Conventions
49
+ Drop these into a route segment and pnext picks them up:
53
50
 
54
- Core supports static metadata files in route segments:
51
+ - `icon`, `apple-icon`, `opengraph-image`, and `twitter-image`, as `.ico`, `.jpg`, `.jpeg`, `.png`, `.svg`, `.gif`, or `.webp`, optionally numbered as `icon2.png`.
52
+ - `sitemap.xml`.
53
+ - `favicon.ico`, `robots.txt`, `manifest.json`, and `manifest.webmanifest`, at the app root only.
55
54
 
56
- - `icon`, `apple-icon`, `opengraph-image`, `twitter-image` `.ico`, `.jpg`, `.jpeg`, `.png`, `.svg`, `.gif`, or `.webp`, optionally numbered (`icon2.png`)
57
- - `sitemap.xml`
58
- - `favicon.ico`, `robots.txt`, `manifest.json`, `manifest.webmanifest` — app root only
55
+ The build copies them into the public output. Image and sitemap files apply to their segment and its descendants, while the root-only files are global.
59
56
 
60
- Static files are copied during `pnext build` and served from the built public output. Image and sitemap files apply to their segment and its descendants; the root-only files are global.
57
+ ## Generated metadata files
61
58
 
62
- ## Code Metadata Files
59
+ Each of the above has a code variant, written in `.tsx`, `.ts`, `.jsx`, `.js`, or `.mjs`: `icon`, `apple-icon`, `opengraph-image`, `twitter-image`, and `sitemap`, plus root-only `robots` and `manifest`.
63
60
 
64
- Core also supports code variants of each, in `.tsx`, `.ts`, `.jsx`, `.js`, or `.mjs`: `icon`, `apple-icon`, `opengraph-image`, `twitter-image`, `sitemap`, plus root-only `robots` and `manifest`.
65
-
66
- In core, these modules run at build time. Their generated links and route outputs are stored in the build output, and `pnext start` does not recompute them during page requests.
67
-
68
- Code metadata route handlers can keep their metadata-route signatures, including `generateImageMetadata()` and `generateSitemaps()`, but core treats their results as build artifacts. Request-time variants that depend on `headers()`, `cookies()`, or dynamic request state belong in `compat.next`.
61
+ These modules run at build time, and their generated links and route outputs are stored in the build output rather than recomputed per request. They can keep their metadata-route signatures, including `generateImageMetadata()` and `generateSitemaps()`, but core treats the results as build artifacts. Use `params()` to choose build-time params, as shown in [Type Safety](./typegen.md).
69
62
 
70
63
  ## Precedence
71
64
 
72
- File-based metadata has higher priority than page/layout metadata for images and icons. Explicit page/layout image metadata still wins when it defines its own image list.
73
-
74
- The request path determines which segment metadata files apply. Route groups and parallel-route slot directories do not add URL path segments, but their metadata file output names are disambiguated at build time.
75
-
76
- ## Static Params
65
+ File-based metadata outranks page and layout metadata for images and icons, unless the page or layout defines its own image list.
77
66
 
78
- Core dynamic routes use `params()` for build-time param selection:
67
+ The request path decides which segment's metadata files apply. Route groups and slot directories add no URL segment, and their metadata output names are disambiguated during the build.
79
68
 
80
- ```tsx
81
- export function params() {
82
- return [{ slug: 'intro' }];
83
- }
84
- ```
69
+ ## Request-time metadata
85
70
 
86
- `generateStaticParams()` is a Next compat API. In `compat.next`, pnext treats it as the fallback static params provider when a module does not export core `params()`.
71
+ Anything that depends on the request needs `compat.next`: `generateMetadata()`, `generateViewport()`, streaming metadata, `headers()`, `cookies()`, and full `next/og` behavior. Under compat, `generateStaticParams()` also serves as the fallback static params provider for a module with no `params()` export. See [Compatibility](./compat.md).