@wular/pnext 0.0.1

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 (371) hide show
  1. package/README.md +153 -0
  2. package/bin/pnext +67 -0
  3. package/config/lint/base.js +48 -0
  4. package/config/ts/base.json +26 -0
  5. package/config/ts/react.json +13 -0
  6. package/package.json +70 -0
  7. package/reference/compat.md +63 -0
  8. package/reference/config.md +120 -0
  9. package/reference/css.md +58 -0
  10. package/reference/dev.md +69 -0
  11. package/reference/env.md +40 -0
  12. package/reference/metadata.md +86 -0
  13. package/reference/navigation.md +149 -0
  14. package/reference/overview.md +35 -0
  15. package/reference/performance.md +97 -0
  16. package/reference/rendering.md +127 -0
  17. package/reference/routing.md +167 -0
  18. package/reference/typegen.md +64 -0
  19. package/src/api/cache.ts +80 -0
  20. package/src/api/client-cache.ts +9 -0
  21. package/src/api/client-navigation.ts +279 -0
  22. package/src/api/dynamic.tsx +102 -0
  23. package/src/api/link.tsx +119 -0
  24. package/src/api/navigation.ts +198 -0
  25. package/src/api/router/events.ts +53 -0
  26. package/src/api/router/history.ts +70 -0
  27. package/src/api/router/hub.ts +194 -0
  28. package/src/api/router/policies.ts +107 -0
  29. package/src/api/router/runtime.ts +5238 -0
  30. package/src/api/router/types.ts +299 -0
  31. package/src/api/router.ts +167 -0
  32. package/src/api/server.ts +323 -0
  33. package/src/api/suspense.ts +16 -0
  34. package/src/cache/context.ts +61 -0
  35. package/src/cli/adapters/vercel-warm.ts +375 -0
  36. package/src/cli/adapters/vercel.ts +1310 -0
  37. package/src/cli/analyze-print.ts +181 -0
  38. package/src/cli/analyze.ts +328 -0
  39. package/src/cli/boot-trace.ts +29 -0
  40. package/src/cli/build.ts +3114 -0
  41. package/src/cli/dev.ts +276 -0
  42. package/src/cli/index.ts +196 -0
  43. package/src/cli/named-bin.ts +119 -0
  44. package/src/cli/serve-ui.ts +160 -0
  45. package/src/cli/start.ts +1425 -0
  46. package/src/client/build.ts +2136 -0
  47. package/src/client/chunk-fold.ts +526 -0
  48. package/src/client/entry.ts +1525 -0
  49. package/src/client/paths.ts +22 -0
  50. package/src/client/prebuilt.ts +621 -0
  51. package/src/client/profile.ts +75 -0
  52. package/src/client/react-compiler.ts +94 -0
  53. package/src/client/reference-stub.ts +145 -0
  54. package/src/client/reference.ts +47 -0
  55. package/src/compat/actions/action-client.ts +531 -0
  56. package/src/compat/actions/action-dispatch.ts +676 -0
  57. package/src/compat/actions/action-router.ts +40 -0
  58. package/src/compat/actions/action-shared.ts +95 -0
  59. package/src/compat/actions/client-plugin.ts +135 -0
  60. package/src/compat/actions/client-stub.ts +65 -0
  61. package/src/compat/actions/config.ts +164 -0
  62. package/src/compat/actions/detect.ts +208 -0
  63. package/src/compat/actions/discovery.ts +244 -0
  64. package/src/compat/actions/early-submit.ts +40 -0
  65. package/src/compat/actions/endpoint.ts +602 -0
  66. package/src/compat/actions/flight.ts +52 -0
  67. package/src/compat/actions/form-state.ts +73 -0
  68. package/src/compat/actions/hoist.ts +485 -0
  69. package/src/compat/actions/ids.ts +39 -0
  70. package/src/compat/actions/index.ts +41 -0
  71. package/src/compat/actions/instances.ts +144 -0
  72. package/src/compat/actions/origin.ts +109 -0
  73. package/src/compat/actions/protocol.ts +125 -0
  74. package/src/compat/actions/registry.ts +74 -0
  75. package/src/compat/actions/rewrite.ts +282 -0
  76. package/src/compat/actions/serve.ts +414 -0
  77. package/src/compat/actions/server-tag.ts +21 -0
  78. package/src/compat/actions/unrecognized-error.ts +30 -0
  79. package/src/compat/adapter/build-complete.ts +257 -0
  80. package/src/compat/bundler/bun-externals.ts +53 -0
  81. package/src/compat/bundler/cjs-exports.ts +542 -0
  82. package/src/compat/bundler/config.ts +363 -0
  83. package/src/compat/bundler/externals.ts +34 -0
  84. package/src/compat/bundler/import-meta-url.ts +60 -0
  85. package/src/compat/bundler/modularize-imports.ts +119 -0
  86. package/src/compat/bundler/new-url-asset.ts +87 -0
  87. package/src/compat/bundler/optimize-package-imports.ts +273 -0
  88. package/src/compat/bundler/polyfill.ts +88 -0
  89. package/src/compat/bundler/react-compiler.ts +61 -0
  90. package/src/compat/bundler/react-profiler.tsx +25 -0
  91. package/src/compat/bundler/relay-transform.ts +116 -0
  92. package/src/compat/bundler/require-context.ts +281 -0
  93. package/src/compat/bundler/resolve-extensions.ts +75 -0
  94. package/src/compat/bundler/source-cache.ts +61 -0
  95. package/src/compat/bundler/static-imports.ts +25 -0
  96. package/src/compat/bundler/symlink-imports.ts +119 -0
  97. package/src/compat/bundler/tsconfig-paths.ts +50 -0
  98. package/src/compat/bundler/wasm.ts +153 -0
  99. package/src/compat/bundler/webpack-loaders.ts +685 -0
  100. package/src/compat/bundler/worker.ts +278 -0
  101. package/src/compat/cache/build-flags.ts +81 -0
  102. package/src/compat/cache/build-prerender-errors.ts +163 -0
  103. package/src/compat/cache/custom-handler.ts +159 -0
  104. package/src/compat/cache/fetch-patch.ts +745 -0
  105. package/src/compat/cache/handler.ts +100 -0
  106. package/src/compat/cache/modern-handler.ts +275 -0
  107. package/src/compat/cache/resume-data-cache.ts +143 -0
  108. package/src/compat/cache/revalidate.ts +759 -0
  109. package/src/compat/cache/runtime-error.ts +124 -0
  110. package/src/compat/cache/use-cache-transform.ts +961 -0
  111. package/src/compat/cache/use-cache.ts +1695 -0
  112. package/src/compat/cache-control.ts +269 -0
  113. package/src/compat/client/base-path.ts +64 -0
  114. package/src/compat/client/css-order.ts +36 -0
  115. package/src/compat/client/errors/control-flow.ts +92 -0
  116. package/src/compat/client/errors/error-boundary.ts +222 -0
  117. package/src/compat/client/errors/global-error.ts +238 -0
  118. package/src/compat/client/errors/install.ts +217 -0
  119. package/src/compat/client/errors/lazy.ts +53 -0
  120. package/src/compat/client/errors/primitive-throw.ts +126 -0
  121. package/src/compat/client/errors/soft-refresh.ts +14 -0
  122. package/src/compat/client/link-status.ts +86 -0
  123. package/src/compat/client/nav-compat-runtime.ts +57 -0
  124. package/src/compat/client/nav-compat.ts +42 -0
  125. package/src/compat/client/navigation-scroll.ts +154 -0
  126. package/src/compat/client/optimistic-routing.ts +206 -0
  127. package/src/compat/client/prefetch-cache.ts +111 -0
  128. package/src/compat/client/route-announcer.ts +72 -0
  129. package/src/compat/client/segment-cache-policy.ts +159 -0
  130. package/src/compat/client/segment-cache.ts +1077 -0
  131. package/src/compat/client/segment-prefetch.ts +375 -0
  132. package/src/compat/client/trailing-slash.ts +24 -0
  133. package/src/compat/css/chunking.ts +254 -0
  134. package/src/compat/css/inline-css.ts +73 -0
  135. package/src/compat/css/lightningcss.ts +90 -0
  136. package/src/compat/css/modules.ts +373 -0
  137. package/src/compat/css/nonce.ts +30 -0
  138. package/src/compat/css/sass-plugin.ts +65 -0
  139. package/src/compat/css/sass.ts +392 -0
  140. package/src/compat/css/styled-jsx-runtime.ts +80 -0
  141. package/src/compat/css/styled-jsx.ts +49 -0
  142. package/src/compat/edge-runtime.ts +71 -0
  143. package/src/compat/export/client.ts +112 -0
  144. package/src/compat/export/index.ts +272 -0
  145. package/src/compat/export/standalone.ts +207 -0
  146. package/src/compat/image-optimizer/cache.ts +119 -0
  147. package/src/compat/image-optimizer/detect.ts +143 -0
  148. package/src/compat/image-optimizer/index.ts +601 -0
  149. package/src/compat/image-optimizer/source.ts +243 -0
  150. package/src/compat/index.ts +458 -0
  151. package/src/compat/lifecycle/after-scope.ts +86 -0
  152. package/src/compat/lifecycle/after.ts +173 -0
  153. package/src/compat/lifecycle/error-funnel.ts +306 -0
  154. package/src/compat/lifecycle/error-serialize.ts +87 -0
  155. package/src/compat/lifecycle/error-ui.ts +167 -0
  156. package/src/compat/lifecycle/instrumentation-client.ts +138 -0
  157. package/src/compat/lifecycle/instrumentation.ts +277 -0
  158. package/src/compat/lifecycle/node-console.ts +19 -0
  159. package/src/compat/lifecycle/testmode.ts +263 -0
  160. package/src/compat/mdx/compile.ts +219 -0
  161. package/src/compat/mdx/next-mdx-stub.ts +46 -0
  162. package/src/compat/mdx/plugin.ts +37 -0
  163. package/src/compat/metadata-route-artifacts.ts +458 -0
  164. package/src/compat/metadata.ts +295 -0
  165. package/src/compat/middleware/manifest.ts +210 -0
  166. package/src/compat/misc/action-return.ts +173 -0
  167. package/src/compat/next/cache.ts +211 -0
  168. package/src/compat/next/canonical-url.ts +35 -0
  169. package/src/compat/next/client-cache.ts +57 -0
  170. package/src/compat/next/client-navigation.ts +313 -0
  171. package/src/compat/next/client-only.ts +3 -0
  172. package/src/compat/next/client-script.tsx +215 -0
  173. package/src/compat/next/client-server.ts +39 -0
  174. package/src/compat/next/config-loader.ts +569 -0
  175. package/src/compat/next/config.ts +29 -0
  176. package/src/compat/next/constants.cjs +6 -0
  177. package/src/compat/next/constants.ts +6 -0
  178. package/src/compat/next/custom-server.ts +236 -0
  179. package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
  180. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
  181. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
  182. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
  183. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
  184. package/src/compat/next/dynamic.tsx +46 -0
  185. package/src/compat/next/error.tsx +148 -0
  186. package/src/compat/next/font/cache.ts +171 -0
  187. package/src/compat/next/font/google.ts +2 -0
  188. package/src/compat/next/font/index.ts +8 -0
  189. package/src/compat/next/font/local.ts +5 -0
  190. package/src/compat/next/font/runtime-client.ts +71 -0
  191. package/src/compat/next/font/runtime.ts +974 -0
  192. package/src/compat/next/font/shared.ts +281 -0
  193. package/src/compat/next/form.tsx +156 -0
  194. package/src/compat/next/head.tsx +10 -0
  195. package/src/compat/next/headers.ts +247 -0
  196. package/src/compat/next/image/config.ts +196 -0
  197. package/src/compat/next/image/optimizer.ts +96 -0
  198. package/src/compat/next/image/patterns.ts +103 -0
  199. package/src/compat/next/image/shared.ts +141 -0
  200. package/src/compat/next/image/static-metadata.ts +283 -0
  201. package/src/compat/next/image/validate.ts +269 -0
  202. package/src/compat/next/image-client.tsx +215 -0
  203. package/src/compat/next/image-props.ts +575 -0
  204. package/src/compat/next/image-usage.ts +102 -0
  205. package/src/compat/next/image.tsx +56 -0
  206. package/src/compat/next/index.ts +1 -0
  207. package/src/compat/next/legacy-image.tsx +97 -0
  208. package/src/compat/next/link-usage.ts +29 -0
  209. package/src/compat/next/link-validation-transform.ts +200 -0
  210. package/src/compat/next/link.tsx +466 -0
  211. package/src/compat/next/navigation.cjs +21 -0
  212. package/src/compat/next/navigation.ts +188 -0
  213. package/src/compat/next/offline.ts +51 -0
  214. package/src/compat/next/og.ts +324 -0
  215. package/src/compat/next/optimistic-route-state.ts +188 -0
  216. package/src/compat/next/preferred-region.ts +39 -0
  217. package/src/compat/next/redirects.ts +131 -0
  218. package/src/compat/next/resource-hints.ts +136 -0
  219. package/src/compat/next/rewrites.ts +350 -0
  220. package/src/compat/next/root-params.ts +142 -0
  221. package/src/compat/next/router.cjs +49 -0
  222. package/src/compat/next/router.ts +143 -0
  223. package/src/compat/next/script.tsx +355 -0
  224. package/src/compat/next/server-only.ts +3 -0
  225. package/src/compat/next/server.ts +28 -0
  226. package/src/compat/next/svgr.ts +58 -0
  227. package/src/compat/next/telemetry.ts +77 -0
  228. package/src/compat/next/user-agent.ts +100 -0
  229. package/src/compat/next/web-vitals.ts +56 -0
  230. package/src/compat/otel/api.ts +95 -0
  231. package/src/compat/otel/client-trace-metadata.ts +71 -0
  232. package/src/compat/otel/fetch-span.ts +77 -0
  233. package/src/compat/otel/tracer.ts +944 -0
  234. package/src/compat/pages/client-plugin.ts +108 -0
  235. package/src/compat/pages/index.ts +527 -0
  236. package/src/compat/pages/router-state.ts +94 -0
  237. package/src/compat/ppr/io.ts +38 -0
  238. package/src/compat/ppr/missing-root-params.ts +105 -0
  239. package/src/compat/ppr/root-params-scan.ts +164 -0
  240. package/src/compat/ppr/root-params-transform.ts +75 -0
  241. package/src/compat/ppr/root-params.ts +129 -0
  242. package/src/compat/ppr/segment-config-incompat.ts +34 -0
  243. package/src/compat/protocol.ts +202 -0
  244. package/src/compat/react/client.ts +59 -0
  245. package/src/compat/react/compiler-runtime.ts +60 -0
  246. package/src/compat/react/dom-client.ts +115 -0
  247. package/src/compat/react/dom-react-server.ts +20 -0
  248. package/src/compat/react/dom-server.ts +40 -0
  249. package/src/compat/react/dom.ts +154 -0
  250. package/src/compat/react/preact.ts +522 -0
  251. package/src/compat/react/react-server.ts +84 -0
  252. package/src/compat/react/router-shim.ts +26 -0
  253. package/src/compat/react/server-component-use.ts +48 -0
  254. package/src/compat/react/server-inserted-html.ts +87 -0
  255. package/src/compat/react/server.ts +156 -0
  256. package/src/compat/react/view-transition.ts +60 -0
  257. package/src/compat/register/actions.ts +875 -0
  258. package/src/compat/register/boot.ts +141 -0
  259. package/src/compat/register/build-tier.ts +11 -0
  260. package/src/compat/register/build.ts +182 -0
  261. package/src/compat/register/bundler.ts +587 -0
  262. package/src/compat/register/cache.ts +85 -0
  263. package/src/compat/register/client-errors.ts +18 -0
  264. package/src/compat/register/config.ts +17 -0
  265. package/src/compat/register/css-extras.ts +120 -0
  266. package/src/compat/register/edge-runtime.ts +6 -0
  267. package/src/compat/register/errors.ts +46 -0
  268. package/src/compat/register/export.ts +23 -0
  269. package/src/compat/register/font.ts +36 -0
  270. package/src/compat/register/hooks.ts +34 -0
  271. package/src/compat/register/image.ts +133 -0
  272. package/src/compat/register/index.ts +111 -0
  273. package/src/compat/register/instrumentation-client.ts +35 -0
  274. package/src/compat/register/lifecycle.ts +86 -0
  275. package/src/compat/register/mdx.ts +48 -0
  276. package/src/compat/register/middleware.ts +36 -0
  277. package/src/compat/register/misc.ts +44 -0
  278. package/src/compat/register/otel.ts +288 -0
  279. package/src/compat/register/pages-api.ts +473 -0
  280. package/src/compat/register/ppr.ts +56 -0
  281. package/src/compat/register/protocol.ts +57 -0
  282. package/src/compat/register/proxy.ts +127 -0
  283. package/src/compat/register/render.ts +268 -0
  284. package/src/compat/register/routing.ts +410 -0
  285. package/src/compat/register/segment.ts +1903 -0
  286. package/src/compat/register/static-image.ts +21 -0
  287. package/src/compat/register/typed-routes.ts +35 -0
  288. package/src/compat/register/usecache.ts +131 -0
  289. package/src/compat/register/validation.ts +56 -0
  290. package/src/compat/segment/loading-boundary.ts +113 -0
  291. package/src/compat/segment/page-slot.ts +200 -0
  292. package/src/compat/segment/tree.ts +481 -0
  293. package/src/compat/segment/vary-key.ts +102 -0
  294. package/src/compat/segment/vary-params.ts +551 -0
  295. package/src/compat/static-params.ts +33 -0
  296. package/src/compat/tsconfig-defaults.ts +301 -0
  297. package/src/compat/typecheck/index.ts +1481 -0
  298. package/src/compat/typecheck/worker.ts +26 -0
  299. package/src/compat/typed-routes/index.ts +92 -0
  300. package/src/compat/typed-routes/manifest.ts +356 -0
  301. package/src/compat/typed-routes/typegen.ts +566 -0
  302. package/src/compat/validation/errors.ts +159 -0
  303. package/src/compat/validation/index.ts +1770 -0
  304. package/src/compat/validation/prerender-diagnostics.ts +1508 -0
  305. package/src/compat-bootstrap.ts +67 -0
  306. package/src/config.ts +218 -0
  307. package/src/css/build.ts +697 -0
  308. package/src/css/index.ts +2 -0
  309. package/src/css/postcss.ts +236 -0
  310. package/src/css/worker.ts +34 -0
  311. package/src/dev/client-actions.ts +35 -0
  312. package/src/dev/client-chunk-store.ts +92 -0
  313. package/src/dev/client-key-cache.ts +178 -0
  314. package/src/dev/global-css-cache.ts +212 -0
  315. package/src/dev/imports.ts +2430 -0
  316. package/src/dev/module-cache.ts +721 -0
  317. package/src/dev/module-generations.ts +38 -0
  318. package/src/dev/module-transform.ts +188 -0
  319. package/src/dev/node-module-bundle-cache.ts +63 -0
  320. package/src/dev/restart-cache.ts +10 -0
  321. package/src/dev/route-bundle-key-cache.ts +154 -0
  322. package/src/dev/route-facts-cache.ts +223 -0
  323. package/src/dev/server.ts +1710 -0
  324. package/src/dynamic/source.ts +307 -0
  325. package/src/dynamic/tree-shake.ts +262 -0
  326. package/src/env.ts +92 -0
  327. package/src/extensions.ts +1898 -0
  328. package/src/index.ts +34 -0
  329. package/src/internal.ts +43 -0
  330. package/src/islands/boundary-error.ts +8 -0
  331. package/src/islands/static-children.ts +37 -0
  332. package/src/islands/static-slots.ts +106 -0
  333. package/src/ppr-postpone.ts +24 -0
  334. package/src/ppr.ts +784 -0
  335. package/src/proxy.ts +752 -0
  336. package/src/render/hooks.ts +384 -0
  337. package/src/render/index.ts +1 -0
  338. package/src/render/island-context.ts +47 -0
  339. package/src/render/metadata.ts +857 -0
  340. package/src/render/renderer.ts +7391 -0
  341. package/src/render/resource-hints.ts +44 -0
  342. package/src/render/slots.tsx +679 -0
  343. package/src/request/context.ts +396 -0
  344. package/src/resolve/engine.ts +219 -0
  345. package/src/resolve/imports.ts +1104 -0
  346. package/src/resolve/scan-facts.ts +474 -0
  347. package/src/resolve/source-text.ts +86 -0
  348. package/src/routing/forwarded.ts +41 -0
  349. package/src/routing/handler.ts +271 -0
  350. package/src/routing/href.ts +203 -0
  351. package/src/routing/metadata.ts +1018 -0
  352. package/src/routing/request-runtime.ts +43 -0
  353. package/src/routing/routes.ts +2560 -0
  354. package/src/routing/slots.ts +432 -0
  355. package/src/runtime/server.ts +3453 -0
  356. package/src/runtime/vendor.ts +1160 -0
  357. package/src/style-modules.d.ts +9 -0
  358. package/src/typegen.ts +151 -0
  359. package/src/types.ts +725 -0
  360. package/src/utils/ansi.ts +9 -0
  361. package/src/utils/content-type.ts +31 -0
  362. package/src/utils/decode.ts +7 -0
  363. package/src/utils/dev-profile.ts +31 -0
  364. package/src/utils/error-log.ts +29 -0
  365. package/src/utils/fs-cache.ts +31 -0
  366. package/src/utils/fs.ts +119 -0
  367. package/src/utils/html.ts +46 -0
  368. package/src/utils/serialize.ts +378 -0
  369. package/src/utils/source.ts +35 -0
  370. package/src/utils/verbose.ts +39 -0
  371. package/tsconfig.json +10 -0
@@ -0,0 +1,282 @@
1
+ import { inlineUseServerFunctions, moduleLevelUseServer } from './detect';
2
+ import { workspaceRelative } from './ids';
3
+
4
+ /**
5
+ * Compile-time tagging for MODULE-SCOPE inline server actions: top-level functions whose body opens
6
+ * with 'use server' in a file that is NOT a module-level 'use server' module. Inserts a tagging call
7
+ * immediately after each declaration, which registers the live instance under a stable id and attaches
8
+ * React-compatible `$$id` metadata.
9
+ *
10
+ * The tag is placed right after the declaration, not at module end, so any module-scope code that
11
+ * reads `fn.$$id` after declaring the action sees it already set. Function-scope inline actions are
12
+ * untouched - they register per render through the render-scoped instance registry.
13
+ */
14
+ export function rewriteInlineActionTags(source: string, file: string, root?: string): string {
15
+ if (!source.includes('use server')) return source;
16
+ if (moduleLevelUseServer(source)) return source;
17
+
18
+ const topLevel = inlineUseServerFunctions(source).filter(
19
+ action => action.start === 0 || source[action.start - 1] === '\n',
20
+ );
21
+ if (topLevel.length === 0) return source;
22
+
23
+ const key = workspaceRelative(file, root);
24
+ const insertions: { at: number; text: string }[] = [];
25
+ const fallbacks: string[] = [];
26
+ for (const action of topLevel) {
27
+ const id = inlineActionId(key, action.name);
28
+ const tag = `\n;typeof ${action.name} === 'function' && globalThis.__pnextTagInlineAction && globalThis.__pnextTagInlineAction(${action.name}, ${JSON.stringify(id)});`;
29
+ const at = declarationEnd(source, action.directiveEnd);
30
+ if (at === undefined) fallbacks.push(tag);
31
+ else insertions.push({ at, text: tag });
32
+ }
33
+ let out = source;
34
+ for (const { at, text } of insertions.sort((a, b) => b.at - a.at)) {
35
+ out = out.slice(0, at) + text + out.slice(at);
36
+ }
37
+ if (fallbacks.length > 0) out = `${out}\n${fallbacks.join('\n')}\n`;
38
+ return out;
39
+ }
40
+
41
+ /**
42
+ * Compile-time marking for ANONYMOUS inline server actions: function expressions whose body opens with
43
+ * 'use server' and that are passed directly as a prop/argument. They have no name to tag a stable id
44
+ * on, and the directive does not survive to String(fn) - the loader that evaluates the compiled module
45
+ * drops directive prologues - so serialization has nothing to distinguish them from an ordinary client
46
+ * handler. Wrapping the expression in a marking call leaves a mark on the live function that survives
47
+ * compilation.
48
+ *
49
+ * Same heuristic-not-a-parser caveats as the rest of this module: only real function expressions in
50
+ * expression position are wrapped, and a `'use server'` string right after an unrelated brace can match.
51
+ */
52
+ export function rewriteAnonymousInlineActionMarks(source: string): string {
53
+ if (!source.includes('use server')) return source;
54
+ if (moduleLevelUseServer(source)) return source;
55
+
56
+ const wraps = anonymousInlineActionSpans(source);
57
+ if (wraps.length === 0) return source;
58
+
59
+ let out = source;
60
+ for (const { start, end } of wraps.sort((a, b) => b.start - a.start)) {
61
+ const fn = out.slice(start, end);
62
+ out = `${out.slice(0, start)}(globalThis.__pnextMarkInlineAction ? globalThis.__pnextMarkInlineAction(${fn}) : ${fn})${out.slice(end)}`;
63
+ }
64
+ return out;
65
+ }
66
+
67
+ /** One anonymous inline action: the span of its whole function expression. */
68
+ export interface AnonymousActionSpan {
69
+ /** Offset of the first character of the function expression. */
70
+ start: number;
71
+ /** Offset just past its closing `}`. */
72
+ end: number;
73
+ /** Offset just past the `'use server'` directive that identified it. */
74
+ directiveEnd: number;
75
+ }
76
+
77
+ /**
78
+ * Spans of every anonymous inline server action in `source` - the shared scan behind both the mark
79
+ * rewrite and the hoist pass. Nested actions are reported too; callers that can only handle outermost
80
+ * ones filter themselves.
81
+ */
82
+ export function anonymousInlineActionSpans(source: string): AnonymousActionSpan[] {
83
+ const directive = /\{\s*(['"])use server\1\s*;?/g;
84
+ const spans: AnonymousActionSpan[] = [];
85
+ for (let match; (match = directive.exec(source)); ) {
86
+ const start = functionExpressionStart(source, match.index);
87
+ if (start === undefined) continue;
88
+ const end = bodyEnd(source, match.index);
89
+ if (end === undefined) continue;
90
+ spans.push({ start, end, directiveEnd: match.index + match[0].length });
91
+ }
92
+ return spans;
93
+ }
94
+
95
+ /**
96
+ * Start offset of the function expression whose body opens at `open`, or
97
+ * undefined when the construct is not a wrappable expression (a `function`
98
+ * *declaration*, an object method, or a plain block).
99
+ */
100
+ function functionExpressionStart(source: string, open: number): number | undefined {
101
+ let i = skipBackWhitespace(source, open - 1);
102
+ if (source[i] === '>' && source[i - 1] === '=') {
103
+ // arrow: `(...) =>` or `param =>`
104
+ i = skipBackWhitespace(source, i - 2);
105
+ const head = source[i] === ')' ? matchingOpenParen(source, i) : identifierStart(source, i);
106
+ if (head === undefined) return undefined;
107
+ i = head;
108
+ } else if (source[i] === ')') {
109
+ // function expression: `function [name](...)`
110
+ const paren = matchingOpenParen(source, i);
111
+ if (paren === undefined) return undefined;
112
+ let j = skipBackWhitespace(source, paren - 1);
113
+ const name = identifierStart(source, j);
114
+ if (name === undefined) return undefined;
115
+ if (source.slice(name, j + 1) !== 'function') {
116
+ j = skipBackWhitespace(source, name - 1);
117
+ const keyword = identifierStart(source, j);
118
+ if (keyword === undefined || source.slice(keyword, j + 1) !== 'function') return undefined;
119
+ i = keyword;
120
+ } else {
121
+ i = name;
122
+ }
123
+ } else {
124
+ return undefined;
125
+ }
126
+ const withAsync = precedingKeyword(source, i, 'async');
127
+ if (withAsync !== undefined) i = withAsync;
128
+ // Only expression position: a `function`/`const` declaration statement or a
129
+ // bare block must not be wrapped.
130
+ const before = skipBackWhitespace(source, i - 1);
131
+ if (before < 0) return undefined;
132
+ if (source[before] === '{') return isJsxExpressionContainer(source, before) ? i : undefined;
133
+ return '(,:[=?&|'.includes(source[before] ?? '') ? i : undefined;
134
+ }
135
+
136
+ /**
137
+ * True when the brace at `open` opens a JSX expression container - the way an action normally reaches a
138
+ * prop - or JSX children. A brace that opens a *block* (a component body, an `if`) must be told apart
139
+ * from those: a `'use server'` function declared directly in a component body is a declaration whose
140
+ * name the component still references, so rewriting it in place would leave that name unbound.
141
+ */
142
+ function isJsxExpressionContainer(source: string, open: number): boolean {
143
+ const before = skipBackWhitespace(source, open - 1);
144
+ if (before < 0) return false;
145
+ const ch = source[before];
146
+ // `prop={…` (attribute) or `<div>{…` (children) — but not `=>{` (arrow body)
147
+ // and not `==`/`>=` style operators.
148
+ if (source[before - 1] === '=') return false;
149
+ return ch === '=' || ch === '>';
150
+ }
151
+
152
+ function skipBackWhitespace(source: string, from: number): number {
153
+ let i = from;
154
+ while (i >= 0 && /\s/.test(source[i] ?? '')) i--;
155
+ return i;
156
+ }
157
+
158
+ function identifierStart(source: string, end: number): number | undefined {
159
+ if (!/[\w$]/.test(source[end] ?? '')) return undefined;
160
+ let i = end;
161
+ while (i >= 0 && /[\w$]/.test(source[i] ?? '')) i--;
162
+ return i + 1;
163
+ }
164
+
165
+ function matchingOpenParen(source: string, close: number): number | undefined {
166
+ let depth = 0;
167
+ for (let i = close; i >= 0; i--) {
168
+ if (source[i] === ')') depth++;
169
+ else if (source[i] === '(') {
170
+ depth--;
171
+ if (depth === 0) return i;
172
+ }
173
+ }
174
+ return undefined;
175
+ }
176
+
177
+ /** Start offset of `keyword` when it directly precedes `at`, else undefined. */
178
+ function precedingKeyword(source: string, at: number, keyword: string): number | undefined {
179
+ const end = skipBackWhitespace(source, at - 1);
180
+ const start = identifierStart(source, end);
181
+ if (start === undefined || source.slice(start, end + 1) !== keyword) return undefined;
182
+ return start;
183
+ }
184
+
185
+ /** Offset just past the `}` closing the function body that opens at `open`. */
186
+ function bodyEnd(source: string, open: number): number | undefined {
187
+ const end = declarationEnd(source, open + 1);
188
+ if (end === undefined) return undefined;
189
+ return source[end - 1] === ';' ? end - 1 : end;
190
+ }
191
+
192
+ function declarationEnd(source: string, directiveEnd: number): number | undefined {
193
+ // The body-open `{` is the last `{` at or before the directive.
194
+ let open = -1;
195
+ for (let i = directiveEnd - 1; i >= 0; i--) {
196
+ if (source[i] === '{') {
197
+ open = i;
198
+ break;
199
+ }
200
+ }
201
+ if (open === -1) return undefined;
202
+ let depth = 0;
203
+ for (let i = open; i < source.length; i++) {
204
+ const ch = source[i];
205
+ // Skip string/template/comment spans so their braces don't miscount and
206
+ // shift the insertion point into the middle of an expression.
207
+ if (ch === '"' || ch === "'" || ch === '`') {
208
+ i = skipString(source, i, ch);
209
+ continue;
210
+ }
211
+ if (ch === '/' && source[i + 1] === '/') {
212
+ const nl = source.indexOf('\n', i + 2);
213
+ if (nl === -1) return undefined;
214
+ i = nl;
215
+ continue;
216
+ }
217
+ if (ch === '/' && source[i + 1] === '*') {
218
+ const end = source.indexOf('*/', i + 2);
219
+ if (end === -1) return undefined;
220
+ i = end + 1;
221
+ continue;
222
+ }
223
+ if (ch === '{') depth++;
224
+ else if (ch === '}') {
225
+ depth--;
226
+ if (depth === 0) {
227
+ let end = i + 1;
228
+ if (source[end] === ';') end += 1;
229
+ return end;
230
+ }
231
+ }
232
+ }
233
+ return undefined;
234
+ }
235
+
236
+ /** Return the index of the closing quote of a string/template starting at `i`. */
237
+ function skipString(source: string, i: number, quote: string): number {
238
+ for (let j = i + 1; j < source.length; j++) {
239
+ const ch = source[j];
240
+ if (ch === '\\') {
241
+ j += 1;
242
+ continue;
243
+ }
244
+ if (ch === quote) return j;
245
+ // Nested `${...}` in template literals can contain braces/strings; a
246
+ // conservative bail (treat the rest as opaque) is safer than miscounting.
247
+ if (quote === '`' && ch === '$' && source[j + 1] === '{') {
248
+ let depth = 1;
249
+ j += 2;
250
+ while (j < source.length && depth > 0) {
251
+ if (source[j] === '{') depth++;
252
+ else if (source[j] === '}') depth--;
253
+ j++;
254
+ }
255
+ j -= 1;
256
+ }
257
+ }
258
+ return source.length;
259
+ }
260
+
261
+ function inlineActionId(fileKey: string, name: string): string {
262
+ // 'if:' ids embed the module key so a cold lookup can import the module
263
+ // (running the injected registration) and retry — see resolveAction.
264
+ return `if:${encodeURIComponent(fileKey)}:${encodeURIComponent(name)}`;
265
+ }
266
+
267
+ /** Parse the module key out of an 'if:' inline-action id. */
268
+ export function inlineActionModuleKey(id: string): string | undefined {
269
+ if (!id.startsWith('if:')) return undefined;
270
+ const rest = id.slice(3);
271
+ const separator = rest.lastIndexOf(':');
272
+ if (separator === -1) return undefined;
273
+ try {
274
+ return decodeURIComponent(rest.slice(0, separator));
275
+ } catch {
276
+ return undefined;
277
+ }
278
+ }
279
+
280
+ export function isInlineActionId(id: string): boolean {
281
+ return id.startsWith('if:');
282
+ }