@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,5 +1,5 @@
1
- import { inlineUseServerFunctions, moduleLevelUseServer } from './detect';
2
- import { anonymousInlineActionSpans } from './rewrite';
1
+ import { inlineUseServerFunctions, moduleLevelUseServer } from './detect'
2
+ import { anonymousInlineActionSpans } from './rewrite'
3
3
 
4
4
  /**
5
5
  * Hoist anonymous inline server actions that capture nothing to module-scope consts, which
@@ -12,22 +12,22 @@ import { anonymousInlineActionSpans } from './rewrite';
12
12
  * (`this`, `arguments`, destructured params, JSX) leaves the action on the per-render path.
13
13
  */
14
14
  export function hoistNonCapturingInlineActions(source: string): string {
15
- if (!source.includes('use server')) return source;
16
- if (moduleLevelUseServer(source)) return source;
15
+ if (!source.includes('use server')) return source
16
+ if (moduleLevelUseServer(source)) return source
17
17
  // Some pipelines transform a module twice (a bundled external is rewritten on
18
18
  // load and again on its esbuild output). The pass must be idempotent: a second
19
19
  // hoist would re-emit declarations under names the first pass already used.
20
- if (source.includes(HOIST_PREFIX)) return source;
20
+ if (source.includes(HOIST_PREFIX)) return source
21
21
 
22
- const spans = anonymousInlineActionSpans(source);
23
- if (spans.length === 0) return source;
22
+ const spans = anonymousInlineActionSpans(source)
23
+ if (spans.length === 0) return source
24
24
 
25
25
  // The span scan is text-based, so `'use server'` inside a STRING (a codegen
26
26
  // template, a test fixture, a docs snippet) looks exactly like an action. This
27
27
  // pass moves code, so acting on one would rewrite the string's contents:
28
28
  // require every hoisted span to start at real, unquoted code.
29
- const masked = blankLiterals(source);
30
- if (masked === undefined) return source;
29
+ const masked = blankLiterals(source)
30
+ if (masked === undefined) return source
31
31
 
32
32
  // Skip actions a NAMED declaration already covers (`const a = async () => {
33
33
  // 'use server' }`). At module scope rewriteInlineActionTags already gives them
@@ -35,7 +35,7 @@ export function hoistNonCapturingInlineActions(source: string): string {
35
35
  // surrounding code refers to, so moving the initializer only adds an alias.
36
36
  // Not line-anchored: bundled output indents module-scope declarations, and
37
37
  // hoisting one there would also read the binding before its declaration.
38
- const named = inlineUseServerFunctions(source);
38
+ const named = inlineUseServerFunctions(source)
39
39
  const candidates = spans.filter(
40
40
  span =>
41
41
  masked[span.start] === source[span.start] &&
@@ -43,22 +43,22 @@ export function hoistNonCapturingInlineActions(source: string): string {
43
43
  // Outermost only: an action declared inside another action's body would be
44
44
  // hoisted out of a scope that is itself a function.
45
45
  !spans.some(other => other !== span && other.start <= span.start && other.end >= span.end),
46
- );
47
- if (candidates.length === 0) return source;
46
+ )
47
+ if (candidates.length === 0) return source
48
48
 
49
- const moduleBindings = moduleScopeBindings(source);
50
- const hoists: { start: number; end: number; name: string }[] = [];
49
+ const moduleBindings = moduleScopeBindings(source)
50
+ const hoists: { start: number; end: number; name: string }[] = []
51
51
  for (const span of candidates) {
52
- if (!capturesNothing(source.slice(span.start, span.end), moduleBindings)) continue;
53
- hoists.push({ start: span.start, end: span.end, name: `${HOIST_PREFIX}${hoists.length}` });
52
+ if (!capturesNothing(source.slice(span.start, span.end), moduleBindings)) continue
53
+ hoists.push({ start: span.start, end: span.end, name: `${HOIST_PREFIX}${hoists.length}` })
54
54
  }
55
- if (hoists.length === 0) return source;
55
+ if (hoists.length === 0) return source
56
56
 
57
- let out = source;
58
- const declarations: string[] = [];
57
+ let out = source
58
+ const declarations: string[] = []
59
59
  for (const { start, end, name } of [...hoists].sort((a, b) => b.start - a.start)) {
60
- declarations.unshift(`const ${name} = ${out.slice(start, end)};`);
61
- out = `${out.slice(0, start)}${name}${out.slice(end)}`;
60
+ declarations.unshift(`const ${name} = ${out.slice(start, end)};`)
61
+ out = `${out.slice(0, start)}${name}${out.slice(end)}`
62
62
  }
63
63
  // Emitted at the TOP of the module (just after any directive prologue), each on its own line so
64
64
  // rewriteInlineActionTags - which only tags line-anchored declarations - picks them up. Top, not
@@ -66,8 +66,8 @@ export function hoistNonCapturingInlineActions(source: string): string {
66
66
  // declared below that point would still be in its temporal dead zone. Import bindings are
67
67
  // initialized before the module body runs, and everything else the body reads is only reached when
68
68
  // the action is called.
69
- const at = prologueEnd(out);
70
- return `${out.slice(0, at)}\n${declarations.join('\n')}\n${out.slice(at)}`;
69
+ const at = prologueEnd(out)
70
+ return `${out.slice(0, at)}\n${declarations.join('\n')}\n${out.slice(at)}`
71
71
  }
72
72
 
73
73
  /**
@@ -75,28 +75,28 @@ export function hoistNonCapturingInlineActions(source: string): string {
75
75
  * point at which a statement may be inserted without displacing a directive.
76
76
  */
77
77
  function prologueEnd(source: string): number {
78
- let i = source.startsWith('') ? 1 : 0;
78
+ let i = source.startsWith('') ? 1 : 0
79
79
  if (source.startsWith('#!', i)) {
80
- const nl = source.indexOf('\n', i);
81
- i = nl === -1 ? source.length : nl + 1;
80
+ const nl = source.indexOf('\n', i)
81
+ i = nl === -1 ? source.length : nl + 1
82
82
  }
83
83
  for (;;) {
84
- let j = i;
85
- while (j < source.length && /\s/.test(source[j] ?? '')) j++;
84
+ let j = i
85
+ while (j < source.length && /\s/.test(source[j] ?? '')) j++
86
86
  if (source.startsWith('//', j)) {
87
- const nl = source.indexOf('\n', j);
88
- i = nl === -1 ? source.length : nl + 1;
89
- continue;
87
+ const nl = source.indexOf('\n', j)
88
+ i = nl === -1 ? source.length : nl + 1
89
+ continue
90
90
  }
91
91
  if (source.startsWith('/*', j)) {
92
- const end = source.indexOf('*/', j + 2);
93
- if (end === -1) return i;
94
- i = end + 2;
95
- continue;
92
+ const end = source.indexOf('*/', j + 2)
93
+ if (end === -1) return i
94
+ i = end + 2
95
+ continue
96
96
  }
97
- const directive = /^(['"])[^'"\n]*\1\s*;?/.exec(source.slice(j));
98
- if (!directive) return i;
99
- i = j + directive[0].length;
97
+ const directive = /^(['"])[^'"\n]*\1\s*;?/.exec(source.slice(j))
98
+ if (!directive) return i
99
+ i = j + directive[0].length
100
100
  }
101
101
  }
102
102
 
@@ -109,28 +109,28 @@ function capturesNothing(text: string, moduleBindings: Set<string>): boolean {
109
109
  // neither the identifier scan nor the parameter scan can read code out of a
110
110
  // string, comment, or regex. Template `${...}` interpolations are kept: the
111
111
  // identifiers in them are real references.
112
- const code = blankLiterals(text);
113
- if (code === undefined) return false;
114
- const tokens = identifierTokens(code);
115
- if (tokens === undefined) return false;
116
- const locals = localBindings(code, tokens);
117
- if (locals === undefined) return false;
112
+ const code = blankLiterals(text)
113
+ if (code === undefined) return false
114
+ const tokens = identifierTokens(code)
115
+ if (tokens === undefined) return false
116
+ const locals = localBindings(code, tokens)
117
+ if (locals === undefined) return false
118
118
  return tokens.every(
119
119
  token =>
120
120
  token.kind !== 'reference' ||
121
121
  locals.has(token.value) ||
122
122
  moduleBindings.has(token.value) ||
123
123
  GLOBALS.has(token.value),
124
- );
124
+ )
125
125
  }
126
126
 
127
- type TokenKind = 'reference' | 'property' | 'key' | 'keyword';
127
+ type TokenKind = 'reference' | 'property' | 'key' | 'keyword'
128
128
 
129
129
  interface Token {
130
- value: string;
131
- kind: TokenKind;
130
+ value: string
131
+ kind: TokenKind
132
132
  /** Offset of the identifier's first character within the scanned text. */
133
- at: number;
133
+ at: number
134
134
  }
135
135
 
136
136
  /**
@@ -138,38 +138,38 @@ interface Token {
138
138
  * construct whose scoping this scanner cannot reason about.
139
139
  */
140
140
  function identifierTokens(code: string): Token[] | undefined {
141
- const tokens: Token[] = [];
142
- let previous = '';
143
- let i = 0;
141
+ const tokens: Token[] = []
142
+ let previous = ''
143
+ let i = 0
144
144
  while (i < code.length) {
145
- const ch = code[i] ?? '';
145
+ const ch = code[i] ?? ''
146
146
  if (/\s/.test(ch)) {
147
- i++;
148
- continue;
147
+ i++
148
+ continue
149
149
  }
150
150
  if (!/[A-Za-z_$]/.test(ch)) {
151
- previous = ch;
152
- i++;
153
- continue;
151
+ previous = ch
152
+ i++
153
+ continue
154
154
  }
155
- let j = i;
156
- while (j < code.length && /[\w$]/.test(code[j] ?? '')) j++;
157
- const value = code.slice(i, j);
158
- if (OPAQUE.has(value)) return undefined;
159
- let k = j;
160
- while (k < code.length && /\s/.test(code[k] ?? '')) k++;
155
+ let j = i
156
+ while (j < code.length && /[\w$]/.test(code[j] ?? '')) j++
157
+ const value = code.slice(i, j)
158
+ if (OPAQUE.has(value)) return undefined
159
+ let k = j
160
+ while (k < code.length && /\s/.test(code[k] ?? '')) k++
161
161
  const kind: TokenKind = KEYWORDS.has(value)
162
162
  ? 'keyword'
163
163
  : previous === '.'
164
164
  ? 'property'
165
165
  : code[k] === ':' && (previous === '{' || previous === ',')
166
166
  ? 'key'
167
- : 'reference';
168
- tokens.push({ value, kind, at: i });
169
- previous = 'a';
170
- i = j;
167
+ : 'reference'
168
+ tokens.push({ value, kind, at: i })
169
+ previous = 'a'
170
+ i = j
171
171
  }
172
- return tokens;
172
+ return tokens
173
173
  }
174
174
 
175
175
  /**
@@ -178,34 +178,34 @@ function identifierTokens(code: string): Token[] | undefined {
178
178
  * defaults) - guessing either way risks hoisting a function that does capture.
179
179
  */
180
180
  function localBindings(code: string, tokens: Token[]): Set<string> | undefined {
181
- const locals = new Set<string>();
181
+ const locals = new Set<string>()
182
182
  for (let index = 0; index < tokens.length; index++) {
183
- const token = tokens[index];
184
- if (token?.kind !== 'keyword') continue;
183
+ const token = tokens[index]
184
+ if (token?.kind !== 'keyword') continue
185
185
  if (token.value === 'const' || token.value === 'let' || token.value === 'var') {
186
- const bound = declaredName(code, token);
187
- if (bound === undefined) return undefined;
188
- locals.add(bound);
186
+ const bound = declaredName(code, token)
187
+ if (bound === undefined) return undefined
188
+ locals.add(bound)
189
189
  } else if (token.value === 'function' || token.value === 'class' || token.value === 'catch') {
190
- const next = tokens[index + 1];
191
- if (next?.kind === 'reference') locals.add(next.value);
190
+ const next = tokens[index + 1]
191
+ if (next?.kind === 'reference') locals.add(next.value)
192
192
  }
193
193
  }
194
194
  for (const params of parameterLists(code)) {
195
- if (params === undefined) return undefined;
196
- for (const name of params) locals.add(name);
195
+ if (params === undefined) return undefined
196
+ for (const name of params) locals.add(name)
197
197
  }
198
- return locals;
198
+ return locals
199
199
  }
200
200
 
201
201
  /** The single name bound by the `const`/`let`/`var` at `token`, if simple. */
202
202
  function declaredName(code: string, token: Token): string | undefined {
203
- let i = token.at + token.value.length;
204
- while (i < code.length && /\s/.test(code[i] ?? '')) i++;
205
- if (!/[A-Za-z_$]/.test(code[i] ?? '')) return undefined; // destructuring pattern
206
- let j = i;
207
- while (j < code.length && /[\w$]/.test(code[j] ?? '')) j++;
208
- return code.slice(i, j);
203
+ let i = token.at + token.value.length
204
+ while (i < code.length && /\s/.test(code[i] ?? '')) i++
205
+ if (!/[A-Za-z_$]/.test(code[i] ?? '')) return undefined // destructuring pattern
206
+ let j = i
207
+ while (j < code.length && /[\w$]/.test(code[j] ?? '')) j++
208
+ return code.slice(i, j)
209
209
  }
210
210
 
211
211
  /**
@@ -213,25 +213,25 @@ function declaredName(code: string, token: Token): string | undefined {
213
213
  * for a list this scanner will not read precisely, which makes the whole function unhoistable.
214
214
  */
215
215
  function* parameterLists(code: string): Generator<string[] | undefined> {
216
- const arrow = /=>/g;
217
- for (let match; (match = arrow.exec(code)); ) {
218
- let i = match.index - 1;
219
- while (i >= 0 && /\s/.test(code[i] ?? '')) i--;
216
+ const arrow = /=>/g
217
+ for (let match; (match = arrow.exec(code));) {
218
+ let i = match.index - 1
219
+ while (i >= 0 && /\s/.test(code[i] ?? '')) i--
220
220
  if (code[i] === ')') {
221
- const open = matchingOpenParen(code, i);
222
- yield open === undefined ? undefined : parameterNames(code.slice(open + 1, i));
223
- continue;
221
+ const open = matchingOpenParen(code, i)
222
+ yield open === undefined ? undefined : parameterNames(code.slice(open + 1, i))
223
+ continue
224
224
  }
225
- let j = i;
226
- while (j >= 0 && /[\w$]/.test(code[j] ?? '')) j--;
227
- const name = code.slice(j + 1, i + 1);
228
- yield /^[A-Za-z_$][\w$]*$/.test(name) ? [name] : undefined;
225
+ let j = i
226
+ while (j >= 0 && /[\w$]/.test(code[j] ?? '')) j--
227
+ const name = code.slice(j + 1, i + 1)
228
+ yield /^[A-Za-z_$][\w$]*$/.test(name) ? [name] : undefined
229
229
  }
230
- const fnDecl = /\bfunction\b\s*\*?\s*(?:[A-Za-z_$][\w$]*)?\s*\(/g;
231
- for (let match; (match = fnDecl.exec(code)); ) {
232
- const open = match.index + match[0].length - 1;
233
- const close = matchingCloseParen(code, open);
234
- yield close === undefined ? undefined : parameterNames(code.slice(open + 1, close));
230
+ const fnDecl = /\bfunction\b\s*\*?\s*(?:[A-Za-z_$][\w$]*)?\s*\(/g
231
+ for (let match; (match = fnDecl.exec(code));) {
232
+ const open = match.index + match[0].length - 1
233
+ const close = matchingCloseParen(code, open)
234
+ yield close === undefined ? undefined : parameterNames(code.slice(open + 1, close))
235
235
  }
236
236
  }
237
237
 
@@ -240,18 +240,18 @@ function* parameterLists(code: string): Generator<string[] | undefined> {
240
240
  * nested function type - forms where a name in the list is not simply a binding.
241
241
  */
242
242
  function parameterNames(params: string): string[] | undefined {
243
- const stripped = params.trim();
244
- if (stripped === '') return [];
245
- if (/[{}[\]=(]/.test(stripped)) return undefined;
246
- const names: string[] = [];
243
+ const stripped = params.trim()
244
+ if (stripped === '') return []
245
+ if (/[{}[\]=(]/.test(stripped)) return undefined
246
+ const names: string[] = []
247
247
  for (const part of stripped.split(',')) {
248
248
  // `name: Type` (TS annotation) binds `name`; the annotation is types only.
249
- const name = (part.split(':')[0] ?? '').trim().replace(/^\.\.\./, '');
250
- if (name === '') continue;
251
- if (!/^[A-Za-z_$][\w$]*$/.test(name)) return undefined;
252
- names.push(name);
249
+ const name = (part.split(':')[0] ?? '').trim().replace(/^\.\.\./, '')
250
+ if (name === '') continue
251
+ if (!/^[A-Za-z_$][\w$]*$/.test(name)) return undefined
252
+ names.push(name)
253
253
  }
254
- return names;
254
+ return names
255
255
  }
256
256
 
257
257
  /**
@@ -260,28 +260,28 @@ function parameterNames(params: string): string[] | undefined {
260
260
  * one a hoisted function could still reach.
261
261
  */
262
262
  function moduleScopeBindings(source: string): Set<string> {
263
- const names = new Set<string>();
263
+ const names = new Set<string>()
264
264
  const declaration =
265
- /^(?:export\s+)?(?:declare\s+)?(?:async\s+)?(?:const|let|var|function\s*\*?|class)\s+([A-Za-z_$][\w$]*)/gm;
266
- for (let match; (match = declaration.exec(source)); ) if (match[1]) names.add(match[1]);
265
+ /^(?:export\s+)?(?:declare\s+)?(?:async\s+)?(?:const|let|var|function\s*\*?|class)\s+([A-Za-z_$][\w$]*)/gm
266
+ for (let match; (match = declaration.exec(source));) if (match[1]) names.add(match[1])
267
267
 
268
- const importClause = /^import\s+(?!type\b)([\s\S]*?)\s+from\s+['"]/gm;
269
- for (let match; (match = importClause.exec(source)); ) {
270
- const clause = match[1] ?? '';
271
- const namespace = /\*\s+as\s+([A-Za-z_$][\w$]*)/.exec(clause);
272
- if (namespace?.[1]) names.add(namespace[1]);
273
- const defaultName = /^([A-Za-z_$][\w$]*)/.exec(clause.trim());
274
- if (defaultName?.[1]) names.add(defaultName[1]);
275
- const braced = /\{([^}]*)\}/.exec(clause);
268
+ const importClause = /^import\s+(?!type\b)([\s\S]*?)\s+from\s+['"]/gm
269
+ for (let match; (match = importClause.exec(source));) {
270
+ const clause = match[1] ?? ''
271
+ const namespace = /\*\s+as\s+([A-Za-z_$][\w$]*)/.exec(clause)
272
+ if (namespace?.[1]) names.add(namespace[1])
273
+ const defaultName = /^([A-Za-z_$][\w$]*)/.exec(clause.trim())
274
+ if (defaultName?.[1]) names.add(defaultName[1])
275
+ const braced = /\{([^}]*)\}/.exec(clause)
276
276
  for (const part of (braced?.[1] ?? '').split(',')) {
277
- const trimmed = part.trim();
278
- if (trimmed === '' || trimmed.startsWith('type ')) continue;
279
- const renamed = /\bas\s+([A-Za-z_$][\w$]*)\s*$/.exec(trimmed);
280
- const name = renamed?.[1] ?? trimmed;
281
- if (/^[A-Za-z_$][\w$]*$/.test(name)) names.add(name);
277
+ const trimmed = part.trim()
278
+ if (trimmed === '' || trimmed.startsWith('type ')) continue
279
+ const renamed = /\bas\s+([A-Za-z_$][\w$]*)\s*$/.exec(trimmed)
280
+ const name = renamed?.[1] ?? trimmed
281
+ if (/^[A-Za-z_$][\w$]*$/.test(name)) names.add(name)
282
282
  }
283
283
  }
284
- return names;
284
+ return names
285
285
  }
286
286
 
287
287
  /**
@@ -291,195 +291,341 @@ function moduleScopeBindings(source: string): Set<string> {
291
291
  * literal chunks. `undefined` when a literal is unterminated.
292
292
  */
293
293
  function blankLiterals(text: string): string | undefined {
294
- const out = text.split('');
294
+ const out = text.split('')
295
295
  const blank = (from: number, to: number) => {
296
- for (let i = from; i < to; i++) if (out[i] !== '\n') out[i] = ' ';
297
- };
296
+ for (let i = from; i < to; i++) if (out[i] !== '\n') out[i] = ' '
297
+ }
298
298
  // Template nesting: 'template' = inside literal text, 'interp' = inside a
299
299
  // `${...}` (which is ordinary code and may itself open a template).
300
- const stack: ({ kind: 'template' } | { kind: 'interp'; depth: number })[] = [];
301
- let previous = '';
302
- let i = 0;
300
+ const stack: ({ kind: 'template' } | { kind: 'interp'; depth: number })[] = []
301
+ let previous = ''
302
+ let i = 0
303
303
  while (i < text.length) {
304
- const ch = text[i] ?? '';
305
- const top = stack[stack.length - 1];
304
+ const ch = text[i] ?? ''
305
+ const top = stack[stack.length - 1]
306
306
  if (top?.kind === 'template') {
307
307
  if (ch === '\\') {
308
- blank(i, i + 2);
309
- i += 2;
308
+ blank(i, i + 2)
309
+ i += 2
310
310
  } else if (ch === '`') {
311
- stack.pop();
312
- previous = '`';
313
- i++;
311
+ stack.pop()
312
+ previous = '`'
313
+ i++
314
314
  } else if (ch === '$' && text[i + 1] === '{') {
315
315
  // Blank the `${` delimiter too — only the expression inside it is code.
316
- stack.push({ kind: 'interp', depth: 0 });
317
- blank(i, i + 2);
318
- previous = '(';
319
- i += 2;
316
+ stack.push({ kind: 'interp', depth: 0 })
317
+ blank(i, i + 2)
318
+ previous = '('
319
+ i += 2
320
320
  } else {
321
- blank(i, i + 1);
322
- i++;
321
+ blank(i, i + 1)
322
+ i++
323
323
  }
324
- continue;
324
+ continue
325
325
  }
326
326
  if (ch === '/' && text[i + 1] === '/') {
327
- const nl = text.indexOf('\n', i);
328
- const end = nl === -1 ? text.length : nl;
329
- blank(i, end);
330
- i = end;
331
- continue;
327
+ const nl = text.indexOf('\n', i)
328
+ const end = nl === -1 ? text.length : nl
329
+ blank(i, end)
330
+ i = end
331
+ continue
332
332
  }
333
333
  if (ch === '/' && text[i + 1] === '*') {
334
- const end = text.indexOf('*/', i + 2);
335
- if (end === -1) return undefined;
336
- blank(i, end + 2);
337
- i = end + 2;
338
- continue;
334
+ const end = text.indexOf('*/', i + 2)
335
+ if (end === -1) return undefined
336
+ blank(i, end + 2)
337
+ i = end + 2
338
+ continue
339
339
  }
340
340
  if (ch === '"' || ch === "'") {
341
- const end = endOfQuoted(text, i, ch);
341
+ const end = endOfQuoted(text, i, ch)
342
342
  if (end === undefined) {
343
343
  // No closing quote before the newline, so this is not a string at all —
344
344
  // most often an apostrophe in JSX text (`<p>don't</p>`). Treating it as
345
345
  // one would mask the rest of the file.
346
- previous = ch;
347
- i++;
348
- continue;
346
+ previous = ch
347
+ i++
348
+ continue
349
349
  }
350
- blank(i + 1, end - 1);
351
- previous = ch;
352
- i = end;
353
- continue;
350
+ blank(i + 1, end - 1)
351
+ previous = ch
352
+ i = end
353
+ continue
354
354
  }
355
355
  if (ch === '/' && REGEX_PRECEDERS.has(previous)) {
356
- const end = endOfRegex(text, i);
356
+ const end = endOfRegex(text, i)
357
357
  if (end === undefined) {
358
358
  // Not a regex after all — in TSX this is nearly always a JSX slash
359
359
  // (`<p />`, `</p>`), whose preceding character looks like an operator.
360
- previous = ch;
361
- i++;
362
- continue;
360
+ previous = ch
361
+ i++
362
+ continue
363
363
  }
364
- blank(i, end);
365
- previous = ' ';
366
- i = end;
367
- continue;
364
+ blank(i, end)
365
+ previous = ' '
366
+ i = end
367
+ continue
368
368
  }
369
- if (ch === '`') stack.push({ kind: 'template' });
369
+ if (ch === '`') stack.push({ kind: 'template' })
370
370
  else if (top?.kind === 'interp') {
371
- if (ch === '{') top.depth++;
371
+ if (ch === '{') top.depth++
372
372
  else if (ch === '}') {
373
373
  if (top.depth === 0) {
374
- stack.pop();
375
- blank(i, i + 1);
376
- } else top.depth--;
374
+ stack.pop()
375
+ blank(i, i + 1)
376
+ } else top.depth--
377
377
  }
378
378
  }
379
- previous = ch;
380
- i++;
379
+ previous = ch
380
+ i++
381
381
  }
382
- return stack.length === 0 ? out.join('') : undefined;
382
+ return stack.length === 0 ? out.join('') : undefined
383
383
  }
384
384
 
385
385
  /** Offset just past the string starting at `i`, or undefined if unterminated. */
386
386
  function endOfQuoted(text: string, i: number, quote: string): number | undefined {
387
387
  for (let j = i + 1; j < text.length; j++) {
388
388
  if (text[j] === '\\') {
389
- j++;
390
- continue;
389
+ j++
390
+ continue
391
391
  }
392
- if (text[j] === quote) return j + 1;
393
- if (text[j] === '\n') return undefined;
392
+ if (text[j] === quote) return j + 1
393
+ if (text[j] === '\n') return undefined
394
394
  }
395
- return undefined;
395
+ return undefined
396
396
  }
397
397
 
398
398
  /** Offset just past the regex literal (with flags) starting at `i`. */
399
399
  function endOfRegex(text: string, i: number): number | undefined {
400
- let inClass = false;
400
+ let inClass = false
401
401
  for (let j = i + 1; j < text.length; j++) {
402
- const ch = text[j];
402
+ const ch = text[j]
403
403
  if (ch === '\\') {
404
- j++;
405
- continue;
404
+ j++
405
+ continue
406
406
  }
407
- if (ch === '\n') return undefined;
408
- if (ch === '[') inClass = true;
409
- else if (ch === ']') inClass = false;
407
+ if (ch === '\n') return undefined
408
+ if (ch === '[') inClass = true
409
+ else if (ch === ']') inClass = false
410
410
  else if (ch === '/' && !inClass) {
411
- let k = j + 1;
412
- while (k < text.length && /[a-z]/.test(text[k] ?? '')) k++;
413
- return k;
411
+ let k = j + 1
412
+ while (k < text.length && /[a-z]/.test(text[k] ?? '')) k++
413
+ return k
414
414
  }
415
415
  }
416
- return undefined;
416
+ return undefined
417
417
  }
418
418
 
419
419
  function matchingOpenParen(text: string, close: number): number | undefined {
420
- let depth = 0;
420
+ let depth = 0
421
421
  for (let i = close; i >= 0; i--) {
422
- if (text[i] === ')') depth++;
422
+ if (text[i] === ')') depth++
423
423
  else if (text[i] === '(') {
424
- depth--;
425
- if (depth === 0) return i;
424
+ depth--
425
+ if (depth === 0) return i
426
426
  }
427
427
  }
428
- return undefined;
428
+ return undefined
429
429
  }
430
430
 
431
431
  function matchingCloseParen(text: string, open: number): number | undefined {
432
- let depth = 0;
432
+ let depth = 0
433
433
  for (let i = open; i < text.length; i++) {
434
- if (text[i] === '(') depth++;
434
+ if (text[i] === '(') depth++
435
435
  else if (text[i] === ')') {
436
- depth--;
437
- if (depth === 0) return i;
436
+ depth--
437
+ if (depth === 0) return i
438
438
  }
439
439
  }
440
- return undefined;
440
+ return undefined
441
441
  }
442
442
 
443
443
  /** Name prefix of every hoisted declaration; also the idempotence marker. */
444
- const HOIST_PREFIX = '__pnextInlineAction$';
444
+ const HOIST_PREFIX = '__pnextInlineAction$'
445
445
 
446
446
  /** Constructs whose scoping this scanner refuses to reason about. */
447
- const OPAQUE = new Set(['this', 'arguments', 'super', 'eval', 'with']);
447
+ const OPAQUE = new Set(['this', 'arguments', 'super', 'eval', 'with'])
448
448
 
449
449
  const KEYWORDS = new Set([
450
- 'as', 'async', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger',
451
- 'default', 'delete', 'do', 'else', 'export', 'extends', 'finally', 'for', 'from', 'function',
452
- 'if', 'import', 'in', 'instanceof', 'let', 'new', 'of', 'return', 'satisfies', 'static',
453
- 'switch', 'throw', 'try', 'typeof', 'var', 'void', 'while', 'yield',
450
+ 'as',
451
+ 'async',
452
+ 'await',
453
+ 'break',
454
+ 'case',
455
+ 'catch',
456
+ 'class',
457
+ 'const',
458
+ 'continue',
459
+ 'debugger',
460
+ 'default',
461
+ 'delete',
462
+ 'do',
463
+ 'else',
464
+ 'export',
465
+ 'extends',
466
+ 'finally',
467
+ 'for',
468
+ 'from',
469
+ 'function',
470
+ 'if',
471
+ 'import',
472
+ 'in',
473
+ 'instanceof',
474
+ 'let',
475
+ 'new',
476
+ 'of',
477
+ 'return',
478
+ 'satisfies',
479
+ 'static',
480
+ 'switch',
481
+ 'throw',
482
+ 'try',
483
+ 'typeof',
484
+ 'var',
485
+ 'void',
486
+ 'while',
487
+ 'yield',
454
488
  // TS type positions the scanner walks through without resolving.
455
- 'any', 'asserts', 'bigint', 'boolean', 'declare', 'enum', 'infer', 'interface', 'is', 'keyof',
456
- 'namespace', 'never', 'number', 'object', 'readonly', 'string', 'symbol', 'type', 'undefined',
457
- 'unique', 'unknown',
458
- ]);
489
+ 'any',
490
+ 'asserts',
491
+ 'bigint',
492
+ 'boolean',
493
+ 'declare',
494
+ 'enum',
495
+ 'infer',
496
+ 'interface',
497
+ 'is',
498
+ 'keyof',
499
+ 'namespace',
500
+ 'never',
501
+ 'number',
502
+ 'object',
503
+ 'readonly',
504
+ 'string',
505
+ 'symbol',
506
+ 'type',
507
+ 'undefined',
508
+ 'unique',
509
+ 'unknown',
510
+ ])
459
511
 
460
512
  /** Globals a module-scope function reaches exactly as an inner one would. */
461
513
  const GLOBALS = new Set([
462
- 'AbortController', 'AbortSignal', 'AggregateError', 'Array', 'ArrayBuffer', 'Atomics',
463
- 'BigInt', 'BigInt64Array', 'BigUint64Array', 'Blob', 'Boolean', 'Buffer',
464
- 'DataView', 'Date', 'Error', 'EvalError', 'Event', 'EventTarget',
465
- 'File', 'FinalizationRegistry', 'Float32Array', 'Float64Array', 'FormData', 'Function',
466
- 'Headers', 'Infinity', 'Int16Array', 'Int32Array', 'Int8Array', 'Intl', 'Iterator',
467
- 'JSON', 'Map', 'Math', 'NaN', 'Number', 'Object', 'Promise', 'Proxy',
468
- 'RangeError', 'ReadableStream', 'ReferenceError', 'Reflect', 'RegExp', 'Request', 'Response',
469
- 'Set', 'SharedArrayBuffer', 'String', 'Symbol', 'SyntaxError', 'TextDecoder', 'TextEncoder',
470
- 'TransformStream', 'TypeError', 'URIError', 'URL', 'URLSearchParams', 'Uint16Array',
471
- 'Uint32Array', 'Uint8Array', 'Uint8ClampedArray', 'WeakMap', 'WeakRef', 'WeakSet',
472
- 'WritableStream', 'atob', 'btoa', 'clearInterval', 'clearTimeout', 'console', 'crypto',
473
- 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'fetch', 'globalThis',
474
- 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'performance', 'process', 'queueMicrotask',
475
- 'setInterval', 'setTimeout', 'structuredClone',
476
- ]);
514
+ 'AbortController',
515
+ 'AbortSignal',
516
+ 'AggregateError',
517
+ 'Array',
518
+ 'ArrayBuffer',
519
+ 'Atomics',
520
+ 'BigInt',
521
+ 'BigInt64Array',
522
+ 'BigUint64Array',
523
+ 'Blob',
524
+ 'Boolean',
525
+ 'Buffer',
526
+ 'DataView',
527
+ 'Date',
528
+ 'Error',
529
+ 'EvalError',
530
+ 'Event',
531
+ 'EventTarget',
532
+ 'File',
533
+ 'FinalizationRegistry',
534
+ 'Float32Array',
535
+ 'Float64Array',
536
+ 'FormData',
537
+ 'Function',
538
+ 'Headers',
539
+ 'Infinity',
540
+ 'Int16Array',
541
+ 'Int32Array',
542
+ 'Int8Array',
543
+ 'Intl',
544
+ 'Iterator',
545
+ 'JSON',
546
+ 'Map',
547
+ 'Math',
548
+ 'NaN',
549
+ 'Number',
550
+ 'Object',
551
+ 'Promise',
552
+ 'Proxy',
553
+ 'RangeError',
554
+ 'ReadableStream',
555
+ 'ReferenceError',
556
+ 'Reflect',
557
+ 'RegExp',
558
+ 'Request',
559
+ 'Response',
560
+ 'Set',
561
+ 'SharedArrayBuffer',
562
+ 'String',
563
+ 'Symbol',
564
+ 'SyntaxError',
565
+ 'TextDecoder',
566
+ 'TextEncoder',
567
+ 'TransformStream',
568
+ 'TypeError',
569
+ 'URIError',
570
+ 'URL',
571
+ 'URLSearchParams',
572
+ 'Uint16Array',
573
+ 'Uint32Array',
574
+ 'Uint8Array',
575
+ 'Uint8ClampedArray',
576
+ 'WeakMap',
577
+ 'WeakRef',
578
+ 'WeakSet',
579
+ 'WritableStream',
580
+ 'atob',
581
+ 'btoa',
582
+ 'clearInterval',
583
+ 'clearTimeout',
584
+ 'console',
585
+ 'crypto',
586
+ 'decodeURI',
587
+ 'decodeURIComponent',
588
+ 'encodeURI',
589
+ 'encodeURIComponent',
590
+ 'fetch',
591
+ 'globalThis',
592
+ 'isFinite',
593
+ 'isNaN',
594
+ 'parseFloat',
595
+ 'parseInt',
596
+ 'performance',
597
+ 'process',
598
+ 'queueMicrotask',
599
+ 'setInterval',
600
+ 'setTimeout',
601
+ 'structuredClone',
602
+ ])
477
603
 
478
604
  /**
479
605
  * Characters after which a `/` opens a regex literal rather than dividing. An
480
606
  * identifier or literal never precedes a regex, so the default is division.
481
607
  */
482
608
  const REGEX_PRECEDERS = new Set([
483
- '', '(', ',', '=', ':', '[', '!', '&', '|', '?', '{', '}', ';', '+', '-', '*', '%', '<', '>',
484
- '~', '^', '\n',
485
- ]);
609
+ '',
610
+ '(',
611
+ ',',
612
+ '=',
613
+ ':',
614
+ '[',
615
+ '!',
616
+ '&',
617
+ '|',
618
+ '?',
619
+ '{',
620
+ '}',
621
+ ';',
622
+ '+',
623
+ '-',
624
+ '*',
625
+ '%',
626
+ '<',
627
+ '>',
628
+ '~',
629
+ '^',
630
+ '\n',
631
+ ])