@wular/pnext 0.0.3 → 0.0.6

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 (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -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 +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1961
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1887
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +833 -848
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -1,8 +1,8 @@
1
- import { existsSync } from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
- import { pathToFileHref } from '../../config';
5
- import { DEFAULT_BODY_LIMIT_BYTES } from './endpoint';
1
+ import { existsSync } from 'node:fs'
2
+ import { createRequire } from 'node:module'
3
+ import path from 'node:path'
4
+ import { pathToFileHref } from '../../config'
5
+ import { DEFAULT_BODY_LIMIT_BYTES } from './endpoint'
6
6
 
7
7
  /**
8
8
  * Server-actions options read from the app's next.config in compat mode:
@@ -11,33 +11,33 @@ import { DEFAULT_BODY_LIMIT_BYTES } from './endpoint';
11
11
  * message - the size-limit e2e suite asserts the text.
12
12
  */
13
13
  export const SIZE_LIMIT_ERROR =
14
- 'Server Actions Size Limit must be a valid number or filesize format larger than 1MB';
14
+ 'Server Actions Size Limit must be a valid number or filesize format larger than 1MB'
15
15
 
16
16
  export interface ServerActionsConfig {
17
- bodySizeLimitBytes: number;
17
+ bodySizeLimitBytes: number
18
18
  }
19
19
 
20
20
  export interface NextConfigShape {
21
- serverActions?: { bodySizeLimit?: unknown };
22
- experimental?: { serverActions?: { bodySizeLimit?: unknown } | boolean };
23
- rewrites?: () => unknown;
24
- redirects?: () => unknown;
21
+ serverActions?: { bodySizeLimit?: unknown }
22
+ experimental?: { serverActions?: { bodySizeLimit?: unknown } | boolean }
23
+ rewrites?: () => unknown
24
+ redirects?: () => unknown
25
25
  }
26
26
 
27
27
  export async function loadServerActionsConfig(root: string): Promise<ServerActionsConfig> {
28
- const config = await loadResolvedNextConfig(root);
29
- const experimental = config?.experimental;
28
+ const config = await loadResolvedNextConfig(root)
29
+ const experimental = config?.experimental
30
30
  const limit =
31
31
  config?.serverActions?.bodySizeLimit ??
32
32
  (experimental && typeof experimental === 'object' && experimental.serverActions
33
33
  ? (experimental.serverActions as { bodySizeLimit?: unknown }).bodySizeLimit
34
- : undefined);
35
- if (limit === undefined) return { bodySizeLimitBytes: DEFAULT_BODY_LIMIT_BYTES };
36
- return { bodySizeLimitBytes: parseBodySizeLimit(limit) };
34
+ : undefined)
35
+ if (limit === undefined) return { bodySizeLimitBytes: DEFAULT_BODY_LIMIT_BYTES }
36
+ return { bodySizeLimitBytes: parseBodySizeLimit(limit) }
37
37
  }
38
38
 
39
39
  export async function loadResolvedNextConfig(root: string): Promise<NextConfigShape | undefined> {
40
- return (await loadNextConfigFromStore()) ?? (await loadNextConfig(root));
40
+ return (await loadNextConfigFromStore()) ?? (await loadNextConfig(root))
41
41
  }
42
42
 
43
43
  /**
@@ -50,51 +50,51 @@ export async function loadResolvedNextConfig(root: string): Promise<NextConfigSh
50
50
  */
51
51
  async function loadNextConfigFromStore(): Promise<NextConfigShape | undefined> {
52
52
  try {
53
- const { getNextConfig } = await import('../next/config-loader');
54
- const store: NextConfigShape = getNextConfig();
55
- return store && Object.keys(store).length > 0 ? store : undefined;
53
+ const { getNextConfig } = await import('../next/config-loader')
54
+ const store: NextConfigShape = getNextConfig()
55
+ return store && Object.keys(store).length > 0 ? store : undefined
56
56
  } catch {
57
- return undefined;
57
+ return undefined
58
58
  }
59
59
  }
60
60
 
61
61
  export async function loadNextConfig(root: string): Promise<NextConfigShape | undefined> {
62
62
  for (const name of ['next.config.js', 'next.config.mjs', 'next.config.cjs']) {
63
- const file = path.join(root, name);
64
- if (!existsSync(file)) continue;
63
+ const file = path.join(root, name)
64
+ if (!existsSync(file)) continue
65
65
  try {
66
66
  if (name.endsWith('.js') || name.endsWith('.cjs')) {
67
- const requireFrom = createRequire(path.join(root, 'noop.js'));
68
- delete requireFrom.cache[requireFrom.resolve(file)];
69
- const required: unknown = requireFrom(file);
67
+ const requireFrom = createRequire(path.join(root, 'noop.js'))
68
+ delete requireFrom.cache[requireFrom.resolve(file)]
69
+ const required: unknown = requireFrom(file)
70
70
  let value =
71
71
  required && typeof required === 'object' && 'default' in required
72
72
  ? required.default
73
- : required;
73
+ : required
74
74
  if (typeof value === 'function') {
75
75
  value = await (value as (phase: string, ctx: { defaultConfig: object }) => unknown)(
76
76
  'phase-production-server',
77
77
  { defaultConfig: {} },
78
- );
78
+ )
79
79
  }
80
- return value ?? undefined;
80
+ return value ?? undefined
81
81
  }
82
82
  const loaded = (await import(`${pathToFileHref(file)}?v=${Date.now()}`)) as {
83
- default?: unknown;
84
- };
85
- let value: unknown = loaded.default ?? loaded;
83
+ default?: unknown
84
+ }
85
+ let value: unknown = loaded.default ?? loaded
86
86
  if (typeof value === 'function') {
87
87
  value = await (value as (phase: string, ctx: { defaultConfig: object }) => unknown)(
88
88
  'phase-production-server',
89
89
  { defaultConfig: {} },
90
- );
90
+ )
91
91
  }
92
- return (value ?? undefined);
92
+ return value ?? undefined
93
93
  } catch {
94
- return undefined;
94
+ return undefined
95
95
  }
96
96
  }
97
- return undefined;
97
+ return undefined
98
98
  }
99
99
 
100
100
  /**
@@ -107,58 +107,57 @@ export async function loadNextConfig(root: string): Promise<NextConfigShape | un
107
107
  * skipped here - the lazy per-request path still validates.
108
108
  */
109
109
  export function validateServerActionsConfigSync(root: string): void {
110
- let config: NextConfigShape | undefined;
111
- const requireFrom = createRequire(path.join(root, 'noop.js'));
110
+ let config: NextConfigShape | undefined
111
+ const requireFrom = createRequire(path.join(root, 'noop.js'))
112
112
  for (const name of ['next.config.js', 'next.config.cjs']) {
113
- const file = path.join(root, name);
114
- if (!existsSync(file)) continue;
113
+ const file = path.join(root, name)
114
+ if (!existsSync(file)) continue
115
115
  try {
116
- delete requireFrom.cache[requireFrom.resolve(file)];
117
- let value: unknown = requireFrom(file);
116
+ delete requireFrom.cache[requireFrom.resolve(file)]
117
+ let value: unknown = requireFrom(file)
118
118
  if (value && typeof value === 'object' && 'default' in value) {
119
- value = (value as { default?: unknown }).default;
119
+ value = (value as { default?: unknown }).default
120
120
  }
121
121
  if (typeof value === 'function') {
122
122
  value = (value as (phase: string, ctx: { defaultConfig: object }) => unknown)(
123
123
  'phase-production-server',
124
124
  { defaultConfig: {} },
125
- );
125
+ )
126
126
  }
127
- config = value as NextConfigShape | undefined;
127
+ config = value as NextConfigShape | undefined
128
128
  } catch (error) {
129
129
  // A malformed limit surfaced synchronously from require's module eval is
130
130
  // unlikely; any load failure means we can't validate here — defer.
131
- if (error instanceof Error && error.message === SIZE_LIMIT_ERROR) throw error;
132
- return;
131
+ if (error instanceof Error && error.message === SIZE_LIMIT_ERROR) throw error
132
+ return
133
133
  }
134
- break;
134
+ break
135
135
  }
136
- if (!config) return;
137
- const experimental = config.experimental;
136
+ if (!config) return
137
+ const experimental = config.experimental
138
138
  const limit =
139
139
  config.serverActions?.bodySizeLimit ??
140
140
  (experimental && typeof experimental === 'object' && experimental.serverActions
141
141
  ? (experimental.serverActions as { bodySizeLimit?: unknown }).bodySizeLimit
142
- : undefined);
143
- if (limit === undefined) return;
144
- parseBodySizeLimit(limit);
142
+ : undefined)
143
+ if (limit === undefined) return
144
+ parseBodySizeLimit(limit)
145
145
  }
146
146
 
147
147
  /** Parse '2mb' / '500kb' / bytes number into bytes; throw SIZE_LIMIT_ERROR. */
148
148
  export function parseBodySizeLimit(value: unknown): number {
149
149
  if (typeof value === 'number') {
150
- if (!Number.isFinite(value) || value <= 0) throw new Error(SIZE_LIMIT_ERROR);
151
- return Math.floor(value);
150
+ if (!Number.isFinite(value) || value <= 0) throw new Error(SIZE_LIMIT_ERROR)
151
+ return Math.floor(value)
152
152
  }
153
153
  if (typeof value === 'string') {
154
- const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i.exec(value.trim());
155
- if (!match) throw new Error(SIZE_LIMIT_ERROR);
156
- const amount = Number(match[1]);
157
- if (!Number.isFinite(amount) || amount <= 0) throw new Error(SIZE_LIMIT_ERROR);
158
- const unit = (match[2] ?? 'b').toLowerCase();
159
- const factor =
160
- unit === 'gb' ? 1024 ** 3 : unit === 'mb' ? 1024 ** 2 : unit === 'kb' ? 1024 : 1;
161
- return Math.floor(amount * factor);
154
+ const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i.exec(value.trim())
155
+ if (!match) throw new Error(SIZE_LIMIT_ERROR)
156
+ const amount = Number(match[1])
157
+ if (!Number.isFinite(amount) || amount <= 0) throw new Error(SIZE_LIMIT_ERROR)
158
+ const unit = (match[2] ?? 'b').toLowerCase()
159
+ const factor = unit === 'gb' ? 1024 ** 3 : unit === 'mb' ? 1024 ** 2 : unit === 'kb' ? 1024 : 1
160
+ return Math.floor(amount * factor)
162
161
  }
163
- throw new Error(SIZE_LIMIT_ERROR);
162
+ throw new Error(SIZE_LIMIT_ERROR)
164
163
  }
@@ -7,10 +7,10 @@
7
7
  * file with named exports; inline actions inside components are best-effort.
8
8
  */
9
9
 
10
- export { actionId, workspaceRelative } from './ids';
10
+ export { actionId, workspaceRelative } from './ids'
11
11
 
12
- const DIRECTIVE = /^(['"])use server\1\s*;?$/;
13
- const CACHE_DIRECTIVE = /^(['"])use cache\1\s*;?$/;
12
+ const DIRECTIVE = /^(['"])use server\1\s*;?$/
13
+ const CACHE_DIRECTIVE = /^(['"])use cache\1\s*;?$/
14
14
 
15
15
  /**
16
16
  * True when the file's FIRST statement is a 'use server' directive, marking the
@@ -20,8 +20,8 @@ const CACHE_DIRECTIVE = /^(['"])use cache\1\s*;?$/;
20
20
  * a real JS engine would when looking for a directive prologue.
21
21
  */
22
22
  export function moduleLevelUseServer(source: string): boolean {
23
- const first = firstStatementText(stripLeading(source));
24
- return first !== undefined && DIRECTIVE.test(first.trim());
23
+ const first = firstStatementText(stripLeading(source))
24
+ return first !== undefined && DIRECTIVE.test(first.trim())
25
25
  }
26
26
 
27
27
  /**
@@ -31,19 +31,19 @@ export function moduleLevelUseServer(source: string): boolean {
31
31
  * variants are function-level only in practice and excluded.
32
32
  */
33
33
  export function moduleLevelUseCache(source: string): boolean {
34
- const first = firstStatementText(stripLeading(source));
35
- return first !== undefined && CACHE_DIRECTIVE.test(first.trim());
34
+ const first = firstStatementText(stripLeading(source))
35
+ return first !== undefined && CACHE_DIRECTIVE.test(first.trim())
36
36
  }
37
37
 
38
38
  export interface InlineAction {
39
39
  /** Local (and, when exported, exported) name of the action function. */
40
- name: string;
40
+ name: string
41
41
  /** True when the function is a named export (`export ...` / re-exported). */
42
- exported: boolean;
42
+ exported: boolean
43
43
  /** Character offset of the start of the matched declaration in `source`. */
44
- start: number;
44
+ start: number
45
45
  /** Character offset just past the `"use server"` directive that marked it. */
46
- directiveEnd: number;
46
+ directiveEnd: number
47
47
  }
48
48
 
49
49
  /**
@@ -66,27 +66,27 @@ export interface InlineAction {
66
66
  * module-level 'use server' file for the reliable wire path.
67
67
  */
68
68
  export function inlineUseServerFunctions(source: string): InlineAction[] {
69
- const found: InlineAction[] = [];
70
- const seen = new Set<string>();
69
+ const found: InlineAction[] = []
70
+ const seen = new Set<string>()
71
71
 
72
72
  // Shape 1: [export] [async] function NAME(...) { "use server"
73
73
  const fnDecl =
74
- /(\bexport\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*\{\s*(['"])use server\3\s*;?/g;
75
- collect(fnDecl, source, found, seen, { nameGroup: 2, exportGroup: 1, dirGroup: 3 });
74
+ /(\bexport\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*\{\s*(['"])use server\3\s*;?/g
75
+ collect(fnDecl, source, found, seen, { nameGroup: 2, exportGroup: 1, dirGroup: 3 })
76
76
 
77
77
  // Shape 2: [export] const NAME = [async] (...) => { "use server"
78
78
  // also covers `= async function (...) { "use server"`
79
79
  const arrowOrExpr =
80
- /(\bexport\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[A-Za-z_$][\w$]*|function\s*\*?\s*\([^)]*\))\s*(?:=>\s*)?\{\s*(['"])use server\3\s*;?/g;
81
- collect(arrowOrExpr, source, found, seen, { nameGroup: 2, exportGroup: 1, dirGroup: 3 });
80
+ /(\bexport\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[A-Za-z_$][\w$]*|function\s*\*?\s*\([^)]*\))\s*(?:=>\s*)?\{\s*(['"])use server\3\s*;?/g
81
+ collect(arrowOrExpr, source, found, seen, { nameGroup: 2, exportGroup: 1, dirGroup: 3 })
82
82
 
83
- return found.sort((a, b) => a.start - b.start);
83
+ return found.sort((a, b) => a.start - b.start)
84
84
  }
85
85
 
86
86
  interface Groups {
87
- nameGroup: number;
88
- exportGroup: number;
89
- dirGroup: number;
87
+ nameGroup: number
88
+ exportGroup: number
89
+ dirGroup: number
90
90
  }
91
91
 
92
92
  function collect(
@@ -96,17 +96,17 @@ function collect(
96
96
  seen: Set<string>,
97
97
  groups: Groups,
98
98
  ) {
99
- let match: RegExpExecArray | null;
99
+ let match: RegExpExecArray | null
100
100
  while ((match = pattern.exec(source))) {
101
- const name = match[groups.nameGroup];
102
- if (!name || seen.has(name)) continue;
103
- seen.add(name);
101
+ const name = match[groups.nameGroup]
102
+ if (!name || seen.has(name)) continue
103
+ seen.add(name)
104
104
  out.push({
105
105
  name,
106
106
  exported: Boolean(match[groups.exportGroup]),
107
107
  start: match.index,
108
108
  directiveEnd: match.index + match[0].length,
109
- });
109
+ })
110
110
  }
111
111
  }
112
112
 
@@ -117,39 +117,39 @@ function collect(
117
117
  * `export { a as b }`, `export default`.
118
118
  */
119
119
  export function moduleActionExports(source: string): string[] {
120
- const names = new Set<string>();
120
+ const names = new Set<string>()
121
121
 
122
122
  // export [async] function NAME / export const|let|var NAME
123
123
  const declRe =
124
- /\bexport\s+(?:async\s+)?(?:function\s*\*?\s+|const\s+|let\s+|var\s+|class\s+)([A-Za-z_$][\w$]*)/g;
125
- for (let m; (m = declRe.exec(source)); ) if (m[1]) names.add(m[1]);
124
+ /\bexport\s+(?:async\s+)?(?:function\s*\*?\s+|const\s+|let\s+|var\s+|class\s+)([A-Za-z_$][\w$]*)/g
125
+ for (let m; (m = declRe.exec(source));) if (m[1]) names.add(m[1])
126
126
 
127
127
  // export default ...
128
- if (/\bexport\s+default\b/.test(source)) names.add('default');
128
+ if (/\bexport\s+default\b/.test(source)) names.add('default')
129
129
 
130
130
  // export { a, b as c } (ignore `export type { ... }`)
131
- const listRe = /\bexport\s+(?!type\b)\{([^}]*)\}/g;
132
- for (let m; (m = listRe.exec(source)); ) {
131
+ const listRe = /\bexport\s+(?!type\b)\{([^}]*)\}/g
132
+ for (let m; (m = listRe.exec(source));) {
133
133
  for (const part of (m[1] ?? '').split(',')) {
134
- const trimmed = part.trim();
135
- if (!trimmed || trimmed.startsWith('type ')) continue;
136
- const exportedName = /\bas\s+([A-Za-z_$][\w$]*)\s*$/.exec(trimmed)?.[1];
137
- const name = exportedName ?? trimmed;
138
- if (/^[A-Za-z_$][\w$]*$/.test(name)) names.add(name);
134
+ const trimmed = part.trim()
135
+ if (!trimmed || trimmed.startsWith('type ')) continue
136
+ const exportedName = /\bas\s+([A-Za-z_$][\w$]*)\s*$/.exec(trimmed)?.[1]
137
+ const name = exportedName ?? trimmed
138
+ if (/^[A-Za-z_$][\w$]*$/.test(name)) names.add(name)
139
139
  }
140
140
  }
141
141
 
142
- return [...names];
142
+ return [...names]
143
143
  }
144
144
 
145
145
  /** Strip a leading shebang and BOM so directive detection starts at real code. */
146
146
  function stripLeading(source: string): string {
147
- let s = source.replace(/^\uFEFF/, '');
147
+ let s = source.replace(/^\uFEFF/, '')
148
148
  if (s.startsWith('#!')) {
149
- const nl = s.indexOf('\n');
150
- s = nl === -1 ? '' : s.slice(nl + 1);
149
+ const nl = s.indexOf('\n')
150
+ s = nl === -1 ? '' : s.slice(nl + 1)
151
151
  }
152
- return s;
152
+ return s
153
153
  }
154
154
 
155
155
  /**
@@ -158,34 +158,34 @@ function stripLeading(source: string): string {
158
158
  * `;`-or-newline-terminated token run.
159
159
  */
160
160
  function firstStatementText(source: string): string | undefined {
161
- let i = 0;
162
- const n = source.length;
161
+ let i = 0
162
+ const n = source.length
163
163
  while (i < n) {
164
- const ch = source[i];
164
+ const ch = source[i]
165
165
  if (ch === ' ' || ch === '\t' || ch === '\r' || ch === '\n') {
166
- i++;
167
- continue;
166
+ i++
167
+ continue
168
168
  }
169
169
  if (ch === '/' && source[i + 1] === '/') {
170
- const nl = source.indexOf('\n', i);
171
- if (nl === -1) return undefined;
172
- i = nl + 1;
173
- continue;
170
+ const nl = source.indexOf('\n', i)
171
+ if (nl === -1) return undefined
172
+ i = nl + 1
173
+ continue
174
174
  }
175
175
  if (ch === '/' && source[i + 1] === '*') {
176
- const end = source.indexOf('*/', i + 2);
177
- if (end === -1) return undefined;
178
- i = end + 2;
179
- continue;
176
+ const end = source.indexOf('*/', i + 2)
177
+ if (end === -1) return undefined
178
+ i = end + 2
179
+ continue
180
180
  }
181
- break;
181
+ break
182
182
  }
183
- if (i >= n) return undefined;
183
+ if (i >= n) return undefined
184
184
  // Read until end of line or a semicolon (directive is a single statement).
185
- let j = i;
186
- while (j < n && source[j] !== '\n' && source[j] !== ';') j++;
187
- const end = source[j] === ';' ? j + 1 : j;
188
- return source.slice(i, end);
185
+ let j = i
186
+ while (j < n && source[j] !== '\n' && source[j] !== ';') j++
187
+ const end = source[j] === ';' ? j + 1 : j
188
+ return source.slice(i, end)
189
189
  }
190
190
 
191
191
  /**
@@ -195,14 +195,14 @@ function firstStatementText(source: string): string | undefined {
195
195
  * restricted to identified actions.
196
196
  */
197
197
  export function opensWithUseServerDirective(fn: unknown): boolean {
198
- if (typeof fn !== 'function') return false;
199
- let source: string;
198
+ if (typeof fn !== 'function') return false
199
+ let source: string
200
200
  try {
201
- source = String(fn);
201
+ source = String(fn)
202
202
  } catch {
203
- return false;
203
+ return false
204
204
  }
205
- const body = source.indexOf('{', source.indexOf(')') + 1);
206
- if (body === -1) return false;
207
- return /^\s*(['"])use server\1/.test(source.slice(body + 1));
205
+ const body = source.indexOf('{', source.indexOf(')') + 1)
206
+ if (body === -1) return false
207
+ return /^\s*(['"])use server\1/.test(source.slice(body + 1))
208
208
  }