@wular/pnext 0.0.4 → 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 -1992
  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 -1897
  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} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  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 +827 -815
  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
@@ -9,196 +9,195 @@
9
9
  // Lazy: the oxc-parser native binding costs ~12.6 MB RSS; load it only when a parse happens.
10
10
  const parseSync: typeof import('oxc-parser').parseSync = (...args) =>
11
11
  // eslint-disable-next-line @typescript-eslint/no-require-imports
12
- loadNative(() => require('oxc-parser') as typeof import('oxc-parser')).parseSync(...args);
13
- import { loadNative } from '../../utils/native-require';
14
- import { rewriteFacts } from '../../resolve/scan-facts';
12
+ loadNative(() => require('oxc-parser') as typeof import('oxc-parser')).parseSync(...args)
13
+ import { loadNative } from '../../utils/native-require'
14
+ import { rewriteFacts } from '../../resolve/scan-facts'
15
15
 
16
- const marker = '__pnextLegacyChildKind';
16
+ const marker = '__pnextLegacyChildKind'
17
17
 
18
18
  interface Node {
19
- type: string;
20
- start: number;
21
- end: number;
22
- [key: string]: unknown;
19
+ type: string
20
+ start: number
21
+ end: number
22
+ [key: string]: unknown
23
23
  }
24
24
 
25
25
  interface JsxName {
26
- type: string;
27
- name?: string;
28
- start: number;
29
- end: number;
26
+ type: string
27
+ name?: string
28
+ start: number
29
+ end: number
30
30
  }
31
31
 
32
32
  interface JsxOpeningElement extends Node {
33
- name: JsxName;
34
- attributes: Node[];
35
- selfClosing: boolean;
33
+ name: JsxName
34
+ attributes: Node[]
35
+ selfClosing: boolean
36
36
  }
37
37
 
38
38
  interface JsxElement extends Node {
39
- openingElement: JsxOpeningElement;
40
- children: Node[];
41
- closingElement: Node | null;
39
+ openingElement: JsxOpeningElement
40
+ children: Node[]
41
+ closingElement: Node | null
42
42
  }
43
43
 
44
44
  export function rewriteLegacyLinkValidation(source: string, file: string): string {
45
- if (!source.includes('Link') && !source.includes('legacyBehavior')) return source;
46
- const imports = rewriteFacts(file, source).imports;
45
+ if (!source.includes('Link') && !source.includes('legacyBehavior')) return source
46
+ const imports = rewriteFacts(file, source).imports
47
47
  const directLink =
48
48
  imports.some(statement => statement.specifier === 'next/link') &&
49
- source.includes('legacyBehavior');
49
+ source.includes('legacyBehavior')
50
50
  const asyncLinkWrapper =
51
51
  imports.some(statement =>
52
52
  statement.bindings.some(binding => !binding.type && binding.local.endsWith('Link')),
53
53
  ) &&
54
54
  /<[A-Za-z_$][\w$]*Link\b/.test(source) &&
55
- /\basync\s+function\b/.test(source);
56
- if (!directLink && !asyncLinkWrapper) return source;
55
+ /\basync\s+function\b/.test(source)
56
+ if (!directLink && !asyncLinkWrapper) return source
57
57
 
58
58
  const program = parseSync(file, source, { lang: langForFile(file) }).program as unknown as {
59
- body: Node[];
60
- };
61
- const linkNames = new Set<string>();
62
- const asyncNames = new Set<string>();
63
- const functionNames = new Set<string>();
64
- const lazyNames = new Set<string>();
65
- const edits: { at: number; text: string }[] = [];
59
+ body: Node[]
60
+ }
61
+ const linkNames = new Set<string>()
62
+ const asyncNames = new Set<string>()
63
+ const functionNames = new Set<string>()
64
+ const lazyNames = new Set<string>()
65
+ const edits: { at: number; text: string }[] = []
66
66
  const isClient = program.body.some(
67
- statement =>
68
- statement.type === 'ExpressionStatement' && statement.directive === 'use client',
69
- );
67
+ statement => statement.type === 'ExpressionStatement' && statement.directive === 'use client',
68
+ )
70
69
 
71
70
  for (const statement of program.body) {
72
71
  if (statement.type === 'ImportDeclaration' && sourceValue(statement) === 'next/link') {
73
72
  for (const specifier of (statement.specifiers as Node[] | undefined) ?? []) {
74
- const local = identifierName(specifier.local);
75
- if (!local) continue;
76
- if (specifier.type === 'ImportDefaultSpecifier') linkNames.add(local);
77
- else if (identifierName(specifier.imported) === 'Link') linkNames.add(local);
73
+ const local = identifierName(specifier.local)
74
+ if (!local) continue
75
+ if (specifier.type === 'ImportDefaultSpecifier') linkNames.add(local)
76
+ else if (identifierName(specifier.imported) === 'Link') linkNames.add(local)
78
77
  }
79
78
  }
80
79
  if (statement.type === 'FunctionDeclaration') {
81
- const name = identifierName(statement.id);
80
+ const name = identifierName(statement.id)
82
81
  if (name) {
83
- functionNames.add(name);
84
- if (statement.async === true) asyncNames.add(name);
82
+ functionNames.add(name)
83
+ if (statement.async === true) asyncNames.add(name)
85
84
  }
86
85
  }
87
86
  if (statement.type === 'VariableDeclaration') {
88
87
  for (const declarator of (statement.declarations as Node[] | undefined) ?? []) {
89
- const name = identifierName(declarator.id);
90
- const init = declarator.init as Node | null;
91
- if (!name || !init) continue;
88
+ const name = identifierName(declarator.id)
89
+ const init = declarator.init as Node | null
90
+ if (!name || !init) continue
92
91
  if (init.type === 'ArrowFunctionExpression' || init.type === 'FunctionExpression') {
93
- functionNames.add(name);
94
- if (init.async === true) asyncNames.add(name);
92
+ functionNames.add(name)
93
+ if (init.async === true) asyncNames.add(name)
95
94
  }
96
- if (isLazyCall(init)) lazyNames.add(name);
95
+ if (isLazyCall(init)) lazyNames.add(name)
97
96
  }
98
97
  }
99
98
  }
100
99
 
101
100
  // Only elements with a body can have the single child this annotates.
102
101
  walk(program.body, node => {
103
- if (node.type !== 'JSXElement') return;
104
- const element = node as unknown as JsxElement;
105
- if (element.closingElement === null) return;
106
- annotate(element);
107
- });
102
+ if (node.type !== 'JSXElement') return
103
+ const element = node as unknown as JsxElement
104
+ if (element.closingElement === null) return
105
+ annotate(element)
106
+ })
108
107
 
109
108
  function annotate(element: JsxElement): void {
110
- const opening = element.openingElement;
111
- if (opening.name.type !== 'JSXIdentifier' || hasMarker(opening)) return;
112
- const parent = opening.name.name ?? '';
113
- const isLink = linkNames.has(parent);
114
- if (!isLink && !parent.endsWith('Link')) return;
115
- const children = element.children.filter(isMeaningfulChild);
116
- if (children.length !== 1) return;
117
- const kind = childKind(children[0]!);
118
- if (!kind || (!isLink && kind !== 'server-async')) return;
109
+ const opening = element.openingElement
110
+ if (opening.name.type !== 'JSXIdentifier' || hasMarker(opening)) return
111
+ const parent = opening.name.name ?? ''
112
+ const isLink = linkNames.has(parent)
113
+ if (!isLink && !parent.endsWith('Link')) return
114
+ const children = element.children.filter(isMeaningfulChild)
115
+ if (children.length !== 1) return
116
+ const kind = childKind(children[0]!)
117
+ if (!kind || (!isLink && kind !== 'server-async')) return
119
118
  const annotatedKind = !isLink
120
119
  ? 'server-async-through-client'
121
120
  : isClient && kind === 'lazy'
122
121
  ? 'client-lazy'
123
- : kind;
124
- edits.push({ at: opening.name.end, text: ` ${marker}="${annotatedKind}"` });
122
+ : kind
123
+ edits.push({ at: opening.name.end, text: ` ${marker}="${annotatedKind}"` })
125
124
  }
126
125
 
127
126
  function childKind(child: Node): 'server-sync' | 'server-async' | 'lazy' | undefined {
128
- let name: string | undefined;
127
+ let name: string | undefined
129
128
  if (child.type === 'JSXElement') {
130
- const opening = (child as unknown as JsxElement).openingElement;
131
- if (opening.name.type === 'JSXIdentifier') name = opening.name.name;
129
+ const opening = (child as unknown as JsxElement).openingElement
130
+ if (opening.name.type === 'JSXIdentifier') name = opening.name.name
132
131
  } else if (child.type === 'JSXExpressionContainer') {
133
- const expression = child.expression as Node | undefined;
134
- if (expression?.type === 'Identifier') name = expression.name as string;
132
+ const expression = child.expression as Node | undefined
133
+ if (expression?.type === 'Identifier') name = expression.name as string
135
134
  }
136
- if (!name) return undefined;
137
- if (lazyNames.has(name)) return 'lazy';
138
- if (asyncNames.has(name)) return 'server-async';
139
- if (!isClient && functionNames.has(name)) return 'server-sync';
140
- return undefined;
135
+ if (!name) return undefined
136
+ if (lazyNames.has(name)) return 'lazy'
137
+ if (asyncNames.has(name)) return 'server-async'
138
+ if (!isClient && functionNames.has(name)) return 'server-sync'
139
+ return undefined
141
140
  }
142
141
 
143
- if (edits.length === 0) return source;
144
- let output = source;
142
+ if (edits.length === 0) return source
143
+ let output = source
145
144
  for (const edit of edits.sort((a, b) => b.at - a.at)) {
146
- output = output.slice(0, edit.at) + edit.text + output.slice(edit.at);
145
+ output = output.slice(0, edit.at) + edit.text + output.slice(edit.at)
147
146
  }
148
- return output;
147
+ return output
149
148
  }
150
149
 
151
150
  function isMeaningfulChild(child: Node): boolean {
152
151
  if (child.type === 'JSXText') {
153
- return typeof child.value === 'string' && child.value.trim().length > 0;
152
+ return typeof child.value === 'string' && child.value.trim().length > 0
154
153
  }
155
154
  if (child.type === 'JSXExpressionContainer') {
156
- return (child.expression as Node | undefined)?.type !== 'JSXEmptyExpression';
155
+ return (child.expression as Node | undefined)?.type !== 'JSXEmptyExpression'
157
156
  }
158
- return true;
157
+ return true
159
158
  }
160
159
 
161
160
  function hasMarker(opening: JsxOpeningElement): boolean {
162
161
  return opening.attributes.some(
163
162
  attribute =>
164
163
  attribute.type === 'JSXAttribute' && (attribute.name as JsxName | undefined)?.name === marker,
165
- );
164
+ )
166
165
  }
167
166
 
168
167
  function isLazyCall(expression: Node): boolean {
169
- if (expression.type !== 'CallExpression') return false;
170
- const callee = expression.callee as Node | undefined;
171
- if (!callee) return false;
172
- if (callee.type === 'Identifier') return callee.name === 'lazy';
173
- return callee.type === 'MemberExpression' && identifierName(callee.property) === 'lazy';
168
+ if (expression.type !== 'CallExpression') return false
169
+ const callee = expression.callee as Node | undefined
170
+ if (!callee) return false
171
+ if (callee.type === 'Identifier') return callee.name === 'lazy'
172
+ return callee.type === 'MemberExpression' && identifierName(callee.property) === 'lazy'
174
173
  }
175
174
 
176
175
  function identifierName(node: unknown): string | undefined {
177
- const named = node as { type?: string; name?: unknown } | null | undefined;
178
- return typeof named?.name === 'string' ? named.name : undefined;
176
+ const named = node as { type?: string; name?: unknown } | null | undefined
177
+ return typeof named?.name === 'string' ? named.name : undefined
179
178
  }
180
179
 
181
180
  function sourceValue(statement: Node): string | undefined {
182
- const literal = statement.source as { value?: unknown } | undefined;
183
- return typeof literal?.value === 'string' ? literal.value : undefined;
181
+ const literal = statement.source as { value?: unknown } | undefined
182
+ return typeof literal?.value === 'string' ? literal.value : undefined
184
183
  }
185
184
 
186
185
  /** Depth-first over every AST node — this only runs for a file that uses Link. */
187
186
  function walk(node: unknown, visit: (node: Node) => void): void {
188
187
  if (Array.isArray(node)) {
189
- for (const item of node) walk(item, visit);
190
- return;
188
+ for (const item of node) walk(item, visit)
189
+ return
191
190
  }
192
- if (!node || typeof node !== 'object') return;
193
- const candidate = node as Node;
194
- if (typeof candidate.type === 'string') visit(candidate);
191
+ if (!node || typeof node !== 'object') return
192
+ const candidate = node as Node
193
+ if (typeof candidate.type === 'string') visit(candidate)
195
194
  for (const key in candidate) {
196
- if (key !== 'type') walk(candidate[key], visit);
195
+ if (key !== 'type') walk(candidate[key], visit)
197
196
  }
198
197
  }
199
198
 
200
199
  // `.ts` forbids JSX (`<T>value` is a type assertion); everything else parses as
201
200
  // the tsx superset, matching the scan-facts language rule.
202
201
  function langForFile(file: string): 'ts' | 'tsx' {
203
- return /\.[cm]?ts$/.test(file) ? 'ts' : 'tsx';
202
+ return /\.[cm]?ts$/.test(file) ? 'ts' : 'tsx'
204
203
  }