@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,26 +1,26 @@
1
1
  // Shared shapes of the client router: fetched pages, navigation options, the
2
2
  // parallel-route nav state, and the entry-module handles the router imports.
3
3
  export interface PrefetchedPage {
4
- html: string;
5
- finalUrl: string;
6
- ok: boolean;
4
+ html: string
5
+ finalUrl: string
6
+ ok: boolean
7
7
  /** `x-nextjs-stale-time` from the response (seconds), when the server sent it. */
8
- staleTimeSeconds?: number;
8
+ staleTimeSeconds?: number
9
9
  /** Complete body segment was emitted from a prerendered route artifact. */
10
- segmentPrerendered?: boolean;
10
+ segmentPrerendered?: boolean
11
11
  /**
12
12
  * A partial-prefetch response: only the static shell, dynamic continuation
13
13
  * cut server-side (`x-nextjs-postponed` on a prefetch fetch). Contributes its
14
14
  * loading shell to the shell cache but must never commit as a document.
15
15
  */
16
- shellOnly?: boolean;
16
+ shellOnly?: boolean
17
17
  /**
18
18
  * This response arrived as a FRAMED segment payload and has already been filed with the per-segment
19
19
  * policy. A prefetch that came back as a whole document instead - a route the server does not serve
20
20
  * segments for, or a segment-unaware server - is recorded from its markup once it settles, so the
21
21
  * per-segment cache is fed by ordinary link prefetches either way.
22
22
  */
23
- segmentRecorded?: boolean;
23
+ segmentRecorded?: boolean
24
24
  /**
25
25
  * This SHELL response published no vary set, so how much of this URL it covers is UNKNOWN - the
26
26
  * route's baked fallback shell, rendered with every param hanging. It paints like any other shell,
@@ -28,272 +28,272 @@ export interface PrefetchedPage {
28
28
  * has never been fetched, so the URL's prefetch stays only as fresh as the dynamic window. A shell
29
29
  * that DOES publish its vary set is exact about its coverage and keeps the static window.
30
30
  */
31
- varyCoverageUnknown?: boolean;
31
+ varyCoverageUnknown?: boolean
32
32
  }
33
33
 
34
34
  export interface LoadingShellPrediction {
35
- html: string;
35
+ html: string
36
36
  route: {
37
37
  // Bracket-free colon form (`/:slug*`); `catchAllOptional` distinguishes an
38
38
  // optional catch-all so it survives being written back to __PNEXT_ROUTE__.
39
- route: string;
40
- params: Record<string, string | string[]>;
41
- catchAllOptional?: boolean;
42
- };
43
- prefetch?: 'shell' | 'eager';
39
+ route: string
40
+ params: Record<string, string | string[]>
41
+ catchAllOptional?: boolean
42
+ }
43
+ prefetch?: 'shell' | 'eager'
44
44
  /**
45
45
  * The predicted 'shell' route is RUNTIME-prefetched (request-sampled): its
46
46
  * shell content is derived from the sampled URL's params, so it is NOT shared
47
47
  * across the route's other URLs the way a static partial shell is.
48
48
  */
49
- runtimePrefetch?: boolean;
49
+ runtimePrefetch?: boolean
50
50
  }
51
51
 
52
52
  export interface NavigationScrollOptions {
53
- pop?: boolean;
54
- scroll?: boolean;
53
+ pop?: boolean
54
+ scroll?: boolean
55
55
  }
56
56
 
57
- export type NavigationScrollAction = (url: URL, options: NavigationScrollOptions) => void;
58
- export type StylesheetReconciler = (incoming: Document) => void;
57
+ export type NavigationScrollAction = (url: URL, options: NavigationScrollOptions) => void
58
+ export type StylesheetReconciler = (incoming: Document) => void
59
59
 
60
60
  export type LoadingShellPredictionPolicy = (
61
61
  url: URL,
62
62
  shells: ReadonlyMap<string, string>,
63
- ) => LoadingShellPrediction | undefined;
63
+ ) => LoadingShellPrediction | undefined
64
64
 
65
65
  export interface PrefetchOptions {
66
66
  /** Link element that triggered the prefetch; receives lifecycle events. */
67
- element?: Element;
67
+ element?: Element
68
68
  /** Public router.prefetch should match Next and throw for unparseable URLs. */
69
- strict?: boolean;
69
+ strict?: boolean
70
70
  /** `prefetch={true}` full-page prefetch — reuses for the static window. */
71
- full?: boolean;
71
+ full?: boolean
72
72
  /**
73
73
  * Hover/touch/focus intent: the prefetch rides the scheduler's reserved
74
74
  * Intent lane (most-recently-hovered link starts immediately, ahead of
75
75
  * queued viewport prefetches).
76
76
  */
77
- intent?: boolean;
77
+ intent?: boolean
78
78
  /**
79
79
  * unstable_dynamicOnHover upgrade: when the route's static shell is already
80
80
  * cached, ask the server for the dynamic continuation only (the response
81
81
  * must not re-send static content the client already holds) and merge it
82
82
  * into the cached shell.
83
83
  */
84
- hoverResume?: boolean;
84
+ hoverResume?: boolean
85
85
  /** Called once when this prefetch is invalidated. */
86
- onInvalidate?: () => void;
86
+ onInvalidate?: () => void
87
87
  /**
88
88
  * Seed the prefetch for the URL the browser is ALREADY on. Next embeds a runtime-prefetch stream in
89
89
  * the initial HTML of an allow-runtime route; pnext asks the server for the same payload instead,
90
90
  * which means prefetching the current URL - the one case the same-URL guards must not elide.
91
91
  */
92
- currentUrl?: boolean;
92
+ currentUrl?: boolean
93
93
  }
94
94
 
95
95
  export interface SoftNavigateOptions extends NavigationScrollOptions {
96
- replace?: boolean;
96
+ replace?: boolean
97
97
  /** Parallel-route state to send instead of the current document's (popstate). */
98
- navState?: DocumentNavState;
98
+ navState?: DocumentNavState
99
99
  /** Restore this document without fetching (popstate to a cached entry). */
100
- cachedPage?: PrefetchedPage;
100
+ cachedPage?: PrefetchedPage
101
101
  /** router.refresh()/revalidation surface: bypass caches, fetch fresh (internal). */
102
- refreshLike?: boolean;
102
+ refreshLike?: boolean
103
103
  /**
104
104
  * A same-URL LINK click: refresh the PAGE segments only. It takes the refresh-like path (no loading
105
105
  * flash, caches evicted, no new history entry) but KEEPS the live layout segments, so the request
106
106
  * may skip shared layouts exactly like any other navigation.
107
107
  */
108
- pageRefresh?: boolean;
108
+ pageRefresh?: boolean
109
109
  /**
110
110
  * Remount everything the incoming document renders - no client-page preservation. An error
111
111
  * boundary's reset() refreshes precisely to throw the failed tree away, so keeping it alive would
112
112
  * replay the error.
113
113
  */
114
- remount?: boolean;
114
+ remount?: boolean
115
115
  /**
116
116
  * The incoming document is freshly rendered server data that supersedes the live tree (the response
117
117
  * to a revalidating action, or the document a post-action redirect landed on): take ALL of its
118
118
  * server segments instead of grafting the live layouts over them, or the write would be invisible.
119
119
  * Island preservation is unaffected - useActionState must survive.
120
120
  */
121
- freshSegments?: boolean;
121
+ freshSegments?: boolean
122
122
  }
123
123
 
124
124
  /** Mirrors NavState in src/types.ts (kept local: this file ships to browsers). */
125
125
  export interface DocumentNavState {
126
- children?: string;
126
+ children?: string
127
127
  /** Search string the children tree rendered with (refetch-URL semantics). */
128
- childrenSearch?: string;
128
+ childrenSearch?: string
129
129
  /** Slot dir -> source URL (`path` or `path?query`) its content rendered from. */
130
- slots?: Record<string, string>;
130
+ slots?: Record<string, string>
131
131
  /**
132
132
  * The document is an interception HOST render (server-stamped): the URL is the intercepted target
133
133
  * but the children tree kept rendering the host page. Such a render is host-bound - never
134
134
  * origin-agnostic, never a direct target render.
135
135
  */
136
- hostRender?: boolean;
136
+ hostRender?: boolean
137
137
  }
138
138
 
139
139
  export interface ActiveEntry {
140
140
  /** `keepRoots`: live island roots the next document reuses — do not unmount. */
141
- unmount?: (keepRoots?: Set<Element>) => void;
141
+ unmount?: (keepRoots?: Set<Element>) => void
142
142
  }
143
143
 
144
144
  /** Mount container of a whole-page client route (element or marker-range proxy). */
145
145
  export interface ClientPageRoot {
146
- isConnected?: boolean;
146
+ isConnected?: boolean
147
147
  /** Page-slot comment anchors when the entry dissolved `div#pnext-page`. */
148
- __pnextAnchors?: [Comment, Comment];
148
+ __pnextAnchors?: [Comment, Comment]
149
149
  }
150
150
 
151
151
  export interface EntryModule {
152
- mountRoute?: () => Promise<unknown> | void;
152
+ mountRoute?: () => Promise<unknown> | void
153
153
  }
154
154
 
155
+ /** Mirror of core's PrefetchMode; the router keeps no imports outside its chunk. */
156
+ export type LinkPrefetchMode = false | 'intent' | 'visible' | 'load'
157
+
155
158
  declare global {
156
159
  interface Window {
157
- __PNEXT_ROUTER_INSTALLED__?: boolean;
158
- __PNEXT_ROUTER_IMPORTS__?: number;
159
- __PNEXT_ACTIVE_ENTRY__?: ActiveEntry;
160
+ /** App-wide default prefetch mode (config `prefetch`), injected by the server. */
161
+ __PNEXT_PREFETCH__?: LinkPrefetchMode
162
+ __PNEXT_ROUTER_INSTALLED__?: boolean
163
+ __PNEXT_ROUTER_IMPORTS__?: number
164
+ __PNEXT_ACTIVE_ENTRY__?: ActiveEntry
160
165
  /** The entry's guarded remount hook — mounts only what a prior pass missed. */
161
- __PNEXT_MOUNT_ISLANDS__?: () => unknown;
166
+ __PNEXT_MOUNT_ISLANDS__?: () => unknown
162
167
  /**
163
168
  * The container a whole-page `'use client'` route is mounted on. A real
164
169
  * `#pnext-page` element in a nested/segment context; otherwise the virtual
165
170
  * container the entry builds over the dissolved page's comment anchors
166
171
  * (carried on `__pnextAnchors`). See matchPreservedClientPage.
167
172
  */
168
- __PNEXT_CLIENT_PAGE_ROOT__?: ClientPageRoot;
169
- __PNEXT_LOCATION_LISTENERS__?: Set<() => void>;
173
+ __PNEXT_CLIENT_PAGE_ROOT__?: ClientPageRoot
174
+ __PNEXT_LOCATION_LISTENERS__?: Set<() => void>
170
175
  next?: {
171
176
  router?: {
172
- push?: (href: string) => Promise<void>;
173
- replace?: (href: string) => Promise<void>;
174
- prefetch?: (href: string) => Promise<PrefetchedPage | null>;
175
- };
176
- };
177
+ push?: (href: string) => Promise<void>
178
+ replace?: (href: string) => Promise<void>
179
+ prefetch?: (href: string) => Promise<PrefetchedPage | null>
180
+ }
181
+ }
177
182
  }
178
183
  }
179
184
 
180
-
181
185
  export interface SegmentCacheRecord {
182
186
  /** Requested pathname (percent-encoding preserved). */
183
- pathname: string;
187
+ pathname: string
184
188
  /** Requested query string (leading `?` included, `_rsc` still present). */
185
- search: string;
189
+ search: string
186
190
  /** Segment request key the response answered (`/_index`, `/_head`, …). */
187
- segmentPath: string;
191
+ segmentPath: string
188
192
  /**
189
193
  * Wire shape of `body`: a framed segment payload (a prefetch response) or a
190
194
  * whole HTML document (a navigation response / the hard-loaded page). The
191
195
  * policy decodes its vary metadata differently for each.
192
196
  */
193
- kind?: 'segment' | 'document';
197
+ kind?: 'segment' | 'document'
194
198
  /** The raw segment payload text, for the policy's own decoding. */
195
- body: string;
199
+ body: string
196
200
  /** The payload the router committed for this segment. */
197
- html: string;
201
+ html: string
198
202
  /** Reuse window in milliseconds. */
199
- staleTimeMs: number;
203
+ staleTimeMs: number
200
204
  /** True when the payload is a whole document, not a truncated shell. */
201
- complete: boolean;
205
+ complete: boolean
202
206
  /** True when the bytes are a pure function of the URL (a prerender). */
203
- static: boolean;
207
+ static: boolean
204
208
  /** True when the payload came from a runtime (request-sampled) prefetch. */
205
- runtime: boolean;
209
+ runtime: boolean
206
210
  }
207
211
 
208
212
  export interface SegmentCacheLookup {
209
- pathname: string;
210
- search: string;
211
- segmentPath: string;
213
+ pathname: string
214
+ search: string
215
+ segmentPath: string
212
216
  }
213
217
 
214
218
  export interface SegmentCacheHit {
215
- html: string;
219
+ html: string
216
220
  /** True when this hit may commit a navigation with no network request. */
217
- networkFree: boolean;
221
+ networkFree: boolean
218
222
  /**
219
223
  * True when a PREFETCH of this URL has nothing left to fetch. Weaker than
220
224
  * `networkFree`: a shell shared across params satisfies the prefetch (its
221
225
  * static half is already cached) while the NAVIGATION still fetches the
222
226
  * dynamic remainder. Absent (older policies) reads as `networkFree`.
223
227
  */
224
- prefetchSatisfied?: boolean;
228
+ prefetchSatisfied?: boolean
225
229
  }
226
230
 
227
231
  export interface SegmentCachePolicy {
228
- record: (input: SegmentCacheRecord) => void;
229
- take: (input: SegmentCacheLookup) => SegmentCacheHit | null;
232
+ record: (input: SegmentCacheRecord) => void
233
+ take: (input: SegmentCacheLookup) => SegmentCacheHit | null
230
234
  /**
231
235
  * The route pattern (colon form) the server resolved `pathname` to, or null
232
236
  * when this exact pathname was never answered. The route-tree cache uses it
233
237
  * as its static-sibling guard.
234
238
  */
235
- routeFor?: (pathname: string) => string | null;
239
+ routeFor?: (pathname: string) => string | null
236
240
  /** True when the colon-form `route` pattern covers `pathname`. */
237
- matchesRoute?: (route: string, pathname: string) => boolean;
241
+ matchesRoute?: (route: string, pathname: string) => boolean
238
242
  /**
239
243
  * The cached bytes a PREFETCH of this segment would re-fetch verbatim: a DIFFERENT URL's entry whose
240
244
  * published vary set covers this one. Weaker than `take` - the entry may be a postponed shell, so it
241
245
  * never commits - but it is byte-identical by the server's own assertion, so the request is skipped.
242
246
  */
243
- prefetchCovered?: (input: SegmentCacheLookup) => { html: string } | null;
247
+ prefetchCovered?: (input: SegmentCacheLookup) => { html: string } | null
244
248
  /**
245
249
  * w9-segment-split: the PAGE frame is cached but the LAYOUT frame is not,
246
250
  * so only `/_layout` has to come off the network.
247
251
  */
248
- needsLayoutFrameOnly?: (input: { pathname: string; search: string }) => boolean;
252
+ needsLayoutFrameOnly?: (input: { pathname: string; search: string }) => boolean
249
253
  /**
250
254
  * Join a `/_layout` response with this URL's cached PAGE frame into the whole
251
255
  * document. Null when the two cannot be proven to line up.
252
256
  */
253
257
  composeLayoutFrame?: (input: {
254
- pathname: string;
255
- search: string;
256
- layoutHtml: string;
257
- }) => string | null;
258
+ pathname: string
259
+ search: string
260
+ layoutHtml: string
261
+ }) => string | null
258
262
  /**
259
263
  * True when a RUNTIME-prefetched page frame already covers this URL. Such a route's layout is not
260
264
  * statically prefetchable (only the page opted into allow-runtime), so a page-frame hit leaves the
261
265
  * prefetch with nothing to fetch - the layout arrives with the navigation's dynamic stage.
262
266
  */
263
- runtimePageFrameSatisfied?: (input: { pathname: string; search: string }) => boolean;
267
+ runtimePageFrameSatisfied?: (input: { pathname: string; search: string }) => boolean
264
268
  /**
265
269
  * w9-segment-split (G2): this URL's LAYOUT chain is already cached (or, for a
266
270
  * same-URL navigation, already on screen), so the navigation may fetch the
267
271
  * `/_page` frame alone. `sameUrl` is what authorises the live document's own
268
272
  * layout as the frame.
269
273
  */
270
- needsPageFrameOnly?: (input: {
271
- pathname: string;
272
- search: string;
273
- sameUrl: boolean;
274
- }) => boolean;
274
+ needsPageFrameOnly?: (input: { pathname: string; search: string; sameUrl: boolean }) => boolean
275
275
  /**
276
276
  * Splice a `/_page` response into that cached layout frame. Null means the
277
277
  * two could not be proven to line up — the caller fetches the whole document.
278
278
  */
279
279
  composePageFrame?: (input: {
280
- pathname: string;
281
- search: string;
282
- sameUrl: boolean;
283
- pageHtml: string;
284
- }) => string | null;
280
+ pathname: string
281
+ search: string
282
+ sameUrl: boolean
283
+ pageHtml: string
284
+ }) => string | null
285
285
  /**
286
286
  * File the LAYOUT frame of a committed whole document, so a later same-URL
287
287
  * navigation can refresh the page segments without re-fetching the layouts.
288
288
  */
289
289
  recordDocumentLayout?: (input: {
290
- pathname: string;
291
- search: string;
292
- html: string;
293
- staleTimeMs: number;
294
- }) => void;
290
+ pathname: string
291
+ search: string
292
+ html: string
293
+ staleTimeMs: number
294
+ }) => void
295
295
  /** A same-URL navigation refreshes page segments only. */
296
- evictPageSegments: () => void;
296
+ evictPageSegments: () => void
297
297
  /** A revalidation invalidates every segment entry. */
298
- clear: () => void;
298
+ clear: () => void
299
299
  }
@@ -1,11 +1,11 @@
1
- import path from 'node:path';
2
- import { realpathSync } from 'node:fs';
3
- import type { Plugin } from 'esbuild';
4
- import { readText } from '../../utils/fs';
5
- import { escapeRegex } from '../../utils/source';
6
- import { actionId } from './ids';
7
- import { moduleActionExports, moduleLevelUseCache, moduleLevelUseServer } from './detect';
8
- import { clientStubSource } from './client-stub';
1
+ import path from 'node:path'
2
+ import { realpathSync } from 'node:fs'
3
+ import type { Plugin } from 'esbuild'
4
+ import { readText } from '../../utils/fs'
5
+ import { escapeRegex } from '../../utils/code'
6
+ import { actionId } from './ids'
7
+ import { moduleActionExports, moduleLevelUseCache, moduleLevelUseServer } from './detect'
8
+ import { clientStubSource } from './client-stub'
9
9
 
10
10
  /**
11
11
  * Process-level set of `'use server'` module source paths (absolute) that the
@@ -18,24 +18,23 @@ import { clientStubSource } from './client-stub';
18
18
  * emits ids that match the server registry.
19
19
  */
20
20
  interface ClientActionState {
21
- root: string;
21
+ root: string
22
22
  /** Original (as-discovered) absolute paths — used for import identity. */
23
- files: Set<string>;
23
+ files: Set<string>
24
24
  /** Realpath-canonical paths — used to match esbuild's resolved paths. */
25
- canonicalFiles: Set<string>;
25
+ canonicalFiles: Set<string>
26
26
  }
27
27
 
28
- let clientActionState: ClientActionState | undefined;
28
+ let clientActionState: ClientActionState | undefined
29
29
 
30
30
  export function setClientActionModules(root: string, files: Iterable<string>) {
31
- const originals = new Set<string>();
32
- const canonicalFiles = new Set<string>();
31
+ const originals = new Set<string>()
32
+ const canonicalFiles = new Set<string>()
33
33
  for (const file of files) {
34
- originals.add(path.resolve(file));
35
- canonicalFiles.add(canonical(file));
34
+ originals.add(path.resolve(file))
35
+ canonicalFiles.add(canonical(file))
36
36
  }
37
- clientActionState =
38
- originals.size > 0 ? { root, files: originals, canonicalFiles } : undefined;
37
+ clientActionState = originals.size > 0 ? { root, files: originals, canonicalFiles } : undefined
39
38
  }
40
39
 
41
40
  // esbuild reports resolved paths through the OS realpath (e.g. /private on
@@ -43,50 +42,50 @@ export function setClientActionModules(root: string, files: Iterable<string>) {
43
42
  // used for id computation so the build, the client stub, and the render-side
44
43
  // form tagging all derive the same wire id from the same (realpath) basis.
45
44
  export function canonical(file: string) {
46
- const abs = path.resolve(file);
45
+ const abs = path.resolve(file)
47
46
  try {
48
- return realpathSync.native(abs);
47
+ return realpathSync.native(abs)
49
48
  } catch {
50
- return abs;
49
+ return abs
51
50
  }
52
51
  }
53
52
 
54
53
  export function clearClientActionModules() {
55
- clientActionState = undefined;
54
+ clientActionState = undefined
56
55
  }
57
56
 
58
57
  export function hasClientActionModules() {
59
- return clientActionState !== undefined && clientActionState.files.size > 0;
58
+ return clientActionState !== undefined && clientActionState.files.size > 0
60
59
  }
61
60
 
62
61
  function isActionModule(file: string) {
63
- if (!clientActionState) return false;
62
+ if (!clientActionState) return false
64
63
  // Match both the original and the realpath-canonical form: render passes the
65
64
  // original path; esbuild passes the realpath.
66
65
  return (
67
66
  clientActionState.files.has(path.resolve(file)) ||
68
67
  clientActionState.canonicalFiles.has(canonical(file))
69
- );
68
+ )
70
69
  }
71
70
 
72
71
  /** True when `file` is a discovered client-replaced action module. */
73
72
  export function isClientActionModule(file: string) {
74
- return isActionModule(file);
73
+ return isActionModule(file)
75
74
  }
76
75
 
77
76
  /** Root the client action ids were computed against (for stub id parity). */
78
77
  export function clientActionModulesRoot() {
79
- return clientActionState?.root;
78
+ return clientActionState?.root
80
79
  }
81
80
 
82
81
  /** All discovered action module source paths (absolute). */
83
82
  export function clientActionModuleFiles(): string[] {
84
- return clientActionState ? [...clientActionState.files] : [];
83
+ return clientActionState ? [...clientActionState.files] : []
85
84
  }
86
85
 
87
86
  /** Generate the client fetch-stub source for an action module file. */
88
87
  export function actionStubSourceFor(file: string, root?: string) {
89
- return stubSourceFor(file, root ?? clientActionState?.root);
88
+ return stubSourceFor(file, root ?? clientActionState?.root)
90
89
  }
91
90
 
92
91
  /**
@@ -99,30 +98,30 @@ export function actionStubSourceFor(file: string, root?: string) {
99
98
  export function actionClientStubPlugin(): Plugin {
100
99
  const paths = clientActionState
101
100
  ? [...clientActionState.files, ...clientActionState.canonicalFiles]
102
- : [];
103
- const filter = new RegExp(`^(?:${[...new Set(paths)].map(escapeRegex).join('|')})$`);
101
+ : []
102
+ const filter = new RegExp(`^(?:${[...new Set(paths)].map(escapeRegex).join('|')})$`)
104
103
  return {
105
104
  name: 'pnext-action-client-stub',
106
105
  setup(build) {
107
- if (paths.length === 0) return;
106
+ if (paths.length === 0) return
108
107
  build.onLoad({ filter, namespace: 'file' }, async args => {
109
- if (!isActionModule(args.path)) return undefined;
108
+ if (!isActionModule(args.path)) return undefined
110
109
  return {
111
110
  contents: await stubSourceFor(args.path, clientActionState?.root),
112
111
  loader: 'js',
113
- };
114
- });
112
+ }
113
+ })
115
114
  },
116
- };
115
+ }
117
116
  }
118
117
 
119
118
  async function stubSourceFor(file: string, root?: string) {
120
- const source = await readText(file);
121
- if (!moduleLevelUseServer(source) && !moduleLevelUseCache(source)) return 'export {};';
122
- const exports = moduleActionExports(source);
123
- const actionIds: Record<string, string> = {};
124
- for (const name of exports) actionIds[name] = canonicalActionId(file, name, root);
125
- return clientStubSource({ modulePath: file, exports, actionIds });
119
+ const source = await readText(file)
120
+ if (!moduleLevelUseServer(source) && !moduleLevelUseCache(source)) return 'export {};'
121
+ const exports = moduleActionExports(source)
122
+ const actionIds: Record<string, string> = {}
123
+ for (const name of exports) actionIds[name] = canonicalActionId(file, name, root)
124
+ return clientStubSource({ modulePath: file, exports, actionIds })
126
125
  }
127
126
 
128
127
  /**
@@ -131,5 +130,5 @@ async function stubSourceFor(file: string, root?: string) {
131
130
  * symlink/realpath differences (e.g. /private on macOS temp dirs).
132
131
  */
133
132
  export function canonicalActionId(file: string, exportName: string, root?: string): string {
134
- return actionId(canonical(file), exportName, root ? canonical(root) : undefined);
133
+ return actionId(canonical(file), exportName, root ? canonical(root) : undefined)
135
134
  }
@@ -4,9 +4,9 @@
4
4
  * and the precomputed wire id for each.
5
5
  */
6
6
  export interface ClientStubModule {
7
- modulePath: string;
8
- exports: readonly string[];
9
- actionIds: Record<string, string>;
7
+ modulePath: string
8
+ exports: readonly string[]
9
+ actionIds: Record<string, string>
10
10
  }
11
11
 
12
12
  /**
@@ -20,20 +20,20 @@ export interface ClientStubModule {
20
20
  * self-contained ES module with no imports, so it can be emitted to disk and bundled as-is.
21
21
  */
22
22
  export function clientStubSource(module: ClientStubModule): string {
23
- const lines: string[] = [];
23
+ const lines: string[] = []
24
24
 
25
- lines.push(`// Generated pnext server-action client stub.`);
26
- lines.push(`// Module: ${sanitizeComment(module.modulePath)}`);
27
- lines.push(RUNTIME);
25
+ lines.push(`// Generated pnext server-action client stub.`)
26
+ lines.push(`// Module: ${sanitizeComment(module.modulePath)}`)
27
+ lines.push(RUNTIME)
28
28
 
29
29
  for (const name of module.exports) {
30
- const id = module.actionIds[name];
31
- if (!id) continue;
32
- const decl = name === 'default' ? 'export default' : `export const ${name} =`;
33
- lines.push(`${decl} __pnextAction(${JSON.stringify(id)});`);
30
+ const id = module.actionIds[name]
31
+ if (!id) continue
32
+ const decl = name === 'default' ? 'export default' : `export const ${name} =`
33
+ lines.push(`${decl} __pnextAction(${JSON.stringify(id)});`)
34
34
  }
35
35
 
36
- return lines.join('\n') + '\n';
36
+ return lines.join('\n') + '\n'
37
37
  }
38
38
 
39
39
  const RUNTIME = `
@@ -58,8 +58,8 @@ function __pnextAction(id) {
58
58
  action.$$pnextActionId = id;
59
59
  return action;
60
60
  }
61
- `;
61
+ `
62
62
 
63
63
  function sanitizeComment(value: string): string {
64
- return value.replace(/\*\//g, '*\\/').replace(/[\r\n]/g, ' ');
64
+ return value.replace(/\*\//g, '*\\/').replace(/[\r\n]/g, ' ')
65
65
  }