@wular/pnext 0.0.4 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/README.md +22 -16
  2. package/bin/pnext +6 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +87 -22
  8. package/reference/config.md +40 -93
  9. package/reference/css.md +42 -33
  10. package/reference/dev.md +26 -33
  11. package/reference/env.md +18 -20
  12. package/reference/getting-started.md +132 -0
  13. package/reference/metadata.md +31 -46
  14. package/reference/navigation.md +65 -105
  15. package/reference/performance.md +21 -142
  16. package/reference/rendering.md +78 -75
  17. package/reference/routing.md +97 -107
  18. package/reference/typegen.md +27 -29
  19. package/src/api/cache.ts +36 -37
  20. package/src/api/client-cache.ts +2 -2
  21. package/src/api/client-navigation.ts +121 -114
  22. package/src/api/dynamic.tsx +58 -55
  23. package/src/api/link.tsx +52 -53
  24. package/src/api/navigation.ts +59 -58
  25. package/src/api/server.ts +152 -144
  26. package/src/api/suspense.ts +4 -4
  27. package/src/cli/adapters/vercel-warm.ts +126 -121
  28. package/src/cli/adapters/vercel.ts +437 -443
  29. package/src/cli/analyze.ts +333 -144
  30. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  31. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  32. package/src/cli/build.ts +976 -978
  33. package/src/cli/create.ts +72 -64
  34. package/src/cli/dev.ts +116 -116
  35. package/src/cli/index.ts +94 -85
  36. package/src/cli/migrate/package-json.ts +73 -71
  37. package/src/cli/migrate/report.ts +32 -33
  38. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  39. package/src/cli/migrate/scan.ts +46 -46
  40. package/src/cli/migrate/spinner.ts +9 -9
  41. package/src/cli/migrate/tsconfig.ts +35 -35
  42. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  43. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  44. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  45. package/src/cli/start.ts +65 -66
  46. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  47. package/src/client/build.ts +802 -768
  48. package/src/client/chunk-fold.ts +245 -240
  49. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  50. package/src/client/entry.ts +162 -147
  51. package/src/client/prebuilt.ts +231 -223
  52. package/src/client/profile.ts +29 -29
  53. package/src/client/react-compiler.ts +20 -15
  54. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  55. package/src/client/reference-stub.ts +51 -51
  56. package/src/client/reference.ts +19 -19
  57. package/src/{api → client}/router/events.ts +32 -17
  58. package/src/{api → client}/router/history.ts +16 -16
  59. package/src/{api → client}/router/hub.ts +52 -53
  60. package/src/{api/router.ts → client/router/index.ts} +61 -60
  61. package/src/{api → client}/router/policies.ts +24 -24
  62. package/src/{api → client}/router/runtime.ts +2022 -1995
  63. package/src/{api → client}/router/types.ts +98 -98
  64. package/src/compat/actions/client-plugin.ts +42 -43
  65. package/src/compat/actions/client-stub.ts +14 -14
  66. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  67. package/src/compat/actions/config.ts +63 -64
  68. package/src/compat/actions/detect.ts +68 -68
  69. package/src/compat/actions/discovery.ts +105 -105
  70. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  71. package/src/compat/actions/early-submit.ts +1 -1
  72. package/src/compat/actions/endpoint.ts +198 -198
  73. package/src/compat/actions/extensions.ts +811 -0
  74. package/src/compat/actions/flight.ts +23 -23
  75. package/src/compat/actions/form-state.ts +34 -34
  76. package/src/compat/actions/hoist.ts +382 -236
  77. package/src/compat/actions/ids.ts +7 -12
  78. package/src/compat/actions/index.ts +8 -8
  79. package/src/compat/actions/instances.ts +46 -46
  80. package/src/compat/actions/origin.ts +47 -48
  81. package/src/compat/actions/protocol.ts +22 -22
  82. package/src/compat/actions/registry.ts +19 -19
  83. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  84. package/src/compat/actions/rewrite.ts +125 -125
  85. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  86. package/src/compat/actions/serve.ts +132 -136
  87. package/src/compat/actions/server-tag.ts +4 -4
  88. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  89. package/src/compat/actions/unrecognized-error.ts +4 -4
  90. package/src/compat/{index.ts → aliases.ts} +112 -109
  91. package/src/compat/bundler/bun-externals.ts +18 -18
  92. package/src/compat/bundler/cjs-exports.ts +271 -223
  93. package/src/compat/bundler/config.ts +116 -111
  94. package/src/compat/bundler/externals.ts +12 -12
  95. package/src/compat/bundler/import-meta-url.ts +19 -19
  96. package/src/compat/bundler/modularize-imports.ts +36 -33
  97. package/src/compat/bundler/new-url-asset.ts +22 -24
  98. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  99. package/src/compat/bundler/polyfill.ts +28 -28
  100. package/src/compat/bundler/react-compiler.ts +35 -29
  101. package/src/compat/bundler/react-profiler.tsx +11 -11
  102. package/src/compat/bundler/relay-transform.ts +48 -47
  103. package/src/compat/bundler/require-context.ts +119 -113
  104. package/src/compat/bundler/resolve-extensions.ts +19 -19
  105. package/src/compat/bundler/source-cache.ts +25 -25
  106. package/src/compat/bundler/static-imports.ts +7 -7
  107. package/src/compat/bundler/symlink-imports.ts +46 -46
  108. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  109. package/src/compat/bundler/wasm.ts +58 -60
  110. package/src/compat/bundler/webpack-loaders.ts +254 -241
  111. package/src/compat/bundler/worker.ts +101 -104
  112. package/src/compat/cache/build-flags.ts +29 -29
  113. package/src/compat/cache/build-prerender-errors.ts +40 -44
  114. package/src/compat/cache/custom-handler.ts +60 -53
  115. package/src/compat/cache/fetch-patch.ts +240 -240
  116. package/src/compat/cache/handler.ts +27 -31
  117. package/src/compat/cache/modern-handler.ts +148 -126
  118. package/src/compat/cache/resume-data-cache.ts +47 -45
  119. package/src/compat/cache/revalidate.ts +233 -232
  120. package/src/compat/cache/runtime-error.ts +35 -35
  121. package/src/compat/cache/use-cache-transform.ts +442 -417
  122. package/src/compat/cache/use-cache.ts +650 -614
  123. package/src/compat/cache-control.ts +140 -142
  124. package/src/compat/client/base-path.ts +21 -20
  125. package/src/compat/client/css-order.ts +18 -18
  126. package/src/compat/client/errors/bare-boundary.ts +11 -11
  127. package/src/compat/client/errors/control-flow.ts +23 -23
  128. package/src/compat/client/errors/error-boundary.ts +61 -61
  129. package/src/compat/client/errors/global-error.ts +101 -91
  130. package/src/compat/client/errors/install.ts +71 -72
  131. package/src/compat/client/errors/lazy.ts +23 -23
  132. package/src/compat/client/errors/primitive-throw.ts +47 -45
  133. package/src/compat/client/errors/soft-refresh.ts +4 -4
  134. package/src/compat/client/link-status.ts +33 -33
  135. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  136. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  137. package/src/compat/client/navigation-scroll.ts +63 -63
  138. package/src/compat/client/optimistic-routing.ts +93 -88
  139. package/src/compat/client/prefetch-cache.ts +23 -24
  140. package/src/compat/client/route-announcer.ts +35 -35
  141. package/src/compat/client/segment-cache-policy.ts +20 -20
  142. package/src/compat/client/segment-cache.ts +309 -315
  143. package/src/compat/client/segment-prefetch.ts +127 -132
  144. package/src/compat/client/trailing-slash.ts +5 -4
  145. package/src/compat/css/chunking.ts +113 -116
  146. package/src/compat/css/inline-css.ts +21 -21
  147. package/src/compat/css/lightningcss.ts +37 -38
  148. package/src/compat/css/modules.ts +161 -175
  149. package/src/compat/css/nonce.ts +7 -7
  150. package/src/compat/css/sass-plugin.ts +18 -21
  151. package/src/compat/css/sass.ts +150 -152
  152. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  153. package/src/compat/css/styled-jsx.ts +21 -21
  154. package/src/compat/edge-runtime.ts +27 -27
  155. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  156. package/src/compat/export/client.ts +29 -31
  157. package/src/compat/export/{index.ts → emit.ts} +111 -110
  158. package/src/compat/export/standalone.ts +62 -54
  159. package/src/compat/image-optimizer/cache.ts +51 -49
  160. package/src/compat/image-optimizer/detect.ts +52 -52
  161. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  162. package/src/compat/image-optimizer/source.ts +77 -80
  163. package/src/compat/lifecycle/after-scope.ts +26 -26
  164. package/src/compat/lifecycle/after.ts +48 -45
  165. package/src/compat/lifecycle/error-funnel.ts +98 -102
  166. package/src/compat/lifecycle/error-serialize.ts +30 -26
  167. package/src/compat/lifecycle/error-ui.ts +67 -32
  168. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  169. package/src/compat/lifecycle/instrumentation.ts +85 -85
  170. package/src/compat/lifecycle/node-console.ts +11 -11
  171. package/src/compat/lifecycle/testmode.ts +160 -132
  172. package/src/compat/mdx/compile.ts +60 -57
  173. package/src/compat/mdx/plugin.ts +11 -11
  174. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  175. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  176. package/src/compat/metadata.ts +75 -81
  177. package/src/compat/next/cache.ts +68 -69
  178. package/src/compat/next/canonical-url.ts +9 -9
  179. package/src/compat/next/client-cache.ts +19 -19
  180. package/src/compat/next/client-navigation.ts +112 -116
  181. package/src/compat/next/client-only.ts +1 -1
  182. package/src/compat/next/client-script.tsx +99 -93
  183. package/src/compat/next/client-server.ts +10 -10
  184. package/src/compat/next/config-loader.ts +176 -173
  185. package/src/compat/next/config.ts +7 -7
  186. package/src/compat/next/constants.cjs +6 -6
  187. package/src/compat/next/constants.ts +6 -6
  188. package/src/compat/next/custom-server.ts +26 -24
  189. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  190. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  191. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  192. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  193. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  194. package/src/compat/next/dynamic.tsx +21 -18
  195. package/src/compat/next/error.tsx +52 -52
  196. package/src/compat/next/font/cache.ts +74 -74
  197. package/src/compat/next/font/google.ts +2 -2
  198. package/src/compat/next/font/index.ts +1 -1
  199. package/src/compat/next/font/local.ts +3 -3
  200. package/src/compat/next/font/runtime-client.ts +17 -15
  201. package/src/compat/next/font/runtime.ts +443 -408
  202. package/src/compat/next/font/shared.ts +120 -108
  203. package/src/compat/next/form.tsx +63 -63
  204. package/src/compat/next/head.tsx +2 -2
  205. package/src/compat/next/headers.ts +103 -95
  206. package/src/compat/next/image/client.tsx +220 -0
  207. package/src/compat/next/image/config.ts +56 -58
  208. package/src/compat/next/image/optimizer.ts +40 -36
  209. package/src/compat/next/image/patterns.ts +37 -40
  210. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  211. package/src/compat/next/image/shared.ts +65 -57
  212. package/src/compat/next/image/static-metadata.ts +98 -107
  213. package/src/compat/next/image/validate.ts +79 -88
  214. package/src/compat/next/image.tsx +19 -23
  215. package/src/compat/next/index.ts +1 -1
  216. package/src/compat/next/legacy-image.tsx +59 -60
  217. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  218. package/src/compat/next/link.tsx +158 -158
  219. package/src/compat/next/navigation.cjs +12 -3
  220. package/src/compat/next/navigation.ts +48 -50
  221. package/src/compat/next/offline.ts +27 -27
  222. package/src/compat/next/og.ts +121 -124
  223. package/src/compat/next/preferred-region.ts +13 -14
  224. package/src/compat/next/redirects.ts +58 -56
  225. package/src/compat/next/resource-hints.ts +73 -76
  226. package/src/compat/next/rewrites.ts +130 -133
  227. package/src/compat/next/root-params.ts +45 -45
  228. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  229. package/src/compat/next/router.cjs +4 -2
  230. package/src/compat/next/router.ts +58 -61
  231. package/src/compat/next/script.tsx +108 -108
  232. package/src/compat/next/server-only.ts +1 -1
  233. package/src/compat/next/server.ts +19 -19
  234. package/src/compat/next/svgr.ts +18 -17
  235. package/src/compat/next/telemetry.ts +24 -24
  236. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  237. package/src/compat/next/user-agent.ts +53 -49
  238. package/src/compat/next/web-vitals.ts +22 -24
  239. package/src/compat/otel/api.ts +41 -41
  240. package/src/compat/otel/client-trace-metadata.ts +25 -27
  241. package/src/compat/otel/fetch-span.ts +29 -29
  242. package/src/compat/otel/tracer.ts +331 -331
  243. package/src/compat/pages/api.ts +456 -0
  244. package/src/compat/pages/client-plugin.ts +36 -36
  245. package/src/compat/pages/router-state.ts +34 -34
  246. package/src/compat/pages/{index.ts → router.ts} +130 -135
  247. package/src/compat/ppr/io.ts +12 -12
  248. package/src/compat/ppr/missing-root-params.ts +34 -38
  249. package/src/compat/ppr/root-params-scan.ts +66 -66
  250. package/src/compat/ppr/root-params-transform.ts +24 -26
  251. package/src/compat/ppr/root-params.ts +30 -30
  252. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  253. package/src/compat/protocol.ts +71 -70
  254. package/src/compat/react/action-state.ts +47 -48
  255. package/src/compat/react/client-lite.ts +15 -15
  256. package/src/compat/react/client.ts +4 -4
  257. package/src/compat/react/compiler-runtime.ts +11 -11
  258. package/src/compat/react/dom-client.ts +44 -44
  259. package/src/compat/react/dom-react-server.ts +10 -16
  260. package/src/compat/react/dom-server.ts +10 -10
  261. package/src/compat/react/dom.ts +52 -52
  262. package/src/compat/react/hooks-extra.ts +34 -35
  263. package/src/compat/react/parity.ts +64 -61
  264. package/src/compat/react/preact.ts +81 -82
  265. package/src/compat/react/react-server.ts +28 -28
  266. package/src/compat/react/router-shim.ts +1 -1
  267. package/src/compat/react/server-component-use.ts +8 -8
  268. package/src/compat/react/server-inserted-html.ts +30 -31
  269. package/src/compat/react/server.ts +53 -55
  270. package/src/compat/react/use.ts +32 -32
  271. package/src/compat/react/view-transition.ts +20 -20
  272. package/src/compat/register/actions.ts +35 -824
  273. package/src/compat/register/boot.ts +41 -41
  274. package/src/compat/register/build-tier.ts +5 -5
  275. package/src/compat/register/build.ts +74 -70
  276. package/src/compat/register/bundler.ts +161 -156
  277. package/src/compat/register/cache.ts +20 -20
  278. package/src/compat/register/client-errors.ts +3 -3
  279. package/src/compat/register/config.ts +6 -6
  280. package/src/compat/register/css-extras.ts +30 -34
  281. package/src/compat/register/edge-runtime.ts +3 -3
  282. package/src/compat/register/errors.ts +10 -12
  283. package/src/compat/register/export.ts +16 -16
  284. package/src/compat/register/font.ts +11 -11
  285. package/src/compat/register/hooks.ts +2 -2
  286. package/src/compat/register/image.ts +40 -40
  287. package/src/compat/register/index.ts +59 -62
  288. package/src/compat/register/instrumentation-client.ts +10 -10
  289. package/src/compat/register/lifecycle.ts +25 -28
  290. package/src/compat/register/mdx.ts +10 -10
  291. package/src/compat/register/middleware.ts +226 -16
  292. package/src/compat/register/otel.ts +80 -88
  293. package/src/compat/register/pages-api.ts +10 -463
  294. package/src/compat/register/ppr.ts +16 -16
  295. package/src/compat/register/protocol.ts +17 -18
  296. package/src/compat/register/proxy.ts +49 -51
  297. package/src/compat/register/render.ts +79 -76
  298. package/src/compat/register/routing.ts +162 -159
  299. package/src/compat/register/segment.ts +24 -1897
  300. package/src/compat/register/static-image.ts +3 -3
  301. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  302. package/src/compat/register/typed-routes.ts +14 -14
  303. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  304. package/src/compat/register/validation.ts +18 -18
  305. package/src/compat/segment/loading-boundary.ts +43 -45
  306. package/src/compat/segment/page-slot.ts +69 -69
  307. package/src/compat/segment/serve.ts +1884 -0
  308. package/src/compat/segment/tree.ts +113 -112
  309. package/src/compat/segment/vary-key.ts +38 -38
  310. package/src/compat/segment/vary-params.ts +138 -142
  311. package/src/compat/static-params.ts +14 -12
  312. package/src/compat/tsconfig-defaults.ts +87 -91
  313. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  314. package/src/compat/typecheck/worker.ts +15 -12
  315. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  316. package/src/compat/typed-routes/manifest.ts +174 -170
  317. package/src/compat/typed-routes/typegen.ts +127 -110
  318. package/src/compat/validation/errors.ts +16 -19
  319. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  320. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  321. package/src/compat-bootstrap.ts +16 -16
  322. package/src/config.ts +86 -69
  323. package/src/css/build.ts +230 -227
  324. package/src/css/postcss.ts +79 -80
  325. package/src/css/worker.ts +14 -15
  326. package/src/dev/client-actions.ts +10 -10
  327. package/src/dev/client-chunk-store.ts +27 -27
  328. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  329. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  330. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  331. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  332. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  333. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  334. package/src/dev/server.ts +804 -820
  335. package/src/env.ts +46 -43
  336. package/src/extensions.ts +491 -478
  337. package/src/index.ts +8 -8
  338. package/src/internal.ts +20 -23
  339. package/src/{islands → render}/boundary-error.ts +3 -3
  340. package/src/render/hooks.ts +71 -71
  341. package/src/render/island-context.ts +14 -14
  342. package/src/render/metadata.ts +310 -310
  343. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  344. package/src/{ppr.ts → render/ppr.ts} +244 -245
  345. package/src/render/renderer.ts +2087 -2082
  346. package/src/render/resource-hints.ts +16 -17
  347. package/src/render/slots.tsx +224 -235
  348. package/src/{islands → render}/static-children.ts +9 -12
  349. package/src/{islands → render}/static-slots.ts +37 -37
  350. package/src/{cache/context.ts → request/cache.ts} +20 -20
  351. package/src/request/context.ts +107 -107
  352. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  353. package/src/resolve/engine.ts +90 -77
  354. package/src/resolve/imports.ts +475 -463
  355. package/src/resolve/scan-facts.ts +318 -296
  356. package/src/resolve/source-text.ts +37 -37
  357. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  358. package/src/routing/forwarded.ts +19 -19
  359. package/src/routing/handler.ts +84 -91
  360. package/src/routing/href.ts +87 -70
  361. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  362. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  363. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  364. package/src/routing/routes.ts +827 -815
  365. package/src/routing/slots.ts +164 -160
  366. package/src/runtime/loader.ts +954 -0
  367. package/src/{dev → runtime}/module-cache.ts +309 -287
  368. package/src/{dev → runtime}/module-generations.ts +9 -9
  369. package/src/{dev → runtime}/module-transform.ts +81 -72
  370. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  371. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  372. package/src/runtime/vendor.ts +428 -406
  373. package/src/styles.d.ts +9 -0
  374. package/src/types.ts +324 -335
  375. package/src/utils/ansi.ts +5 -5
  376. package/src/utils/{source.ts → code.ts} +15 -12
  377. package/src/utils/content-type.ts +3 -3
  378. package/src/utils/decode.ts +2 -2
  379. package/src/utils/dev-profile.ts +13 -13
  380. package/src/utils/error-log.ts +6 -6
  381. package/src/utils/esbuild.ts +18 -18
  382. package/src/utils/fs-cache.ts +13 -13
  383. package/src/utils/fs.ts +57 -49
  384. package/src/utils/html.ts +20 -24
  385. package/src/utils/native-require.ts +8 -8
  386. package/src/utils/serialize.ts +139 -146
  387. package/src/utils/verbose.ts +18 -18
  388. package/reference/overview.md +0 -35
  389. package/src/cli/analyze-print.ts +0 -181
  390. package/src/compat/middleware/manifest.ts +0 -210
  391. package/src/compat/next/image-client.tsx +0 -215
  392. package/src/compat/next/link-usage.ts +0 -29
  393. package/src/css/index.ts +0 -2
  394. package/src/render/index.ts +0 -1
  395. package/src/style-modules.d.ts +0 -9
@@ -1,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
+ ])