@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
@@ -1,16 +1,16 @@
1
- import { dynamicCallFacts, rewriteFacts, type DynamicCallFact } from '../resolve/scan-facts';
1
+ import { dynamicCallFacts, rewriteFacts, type DynamicCallFact } from './scan-facts'
2
2
 
3
3
  export interface DynamicCall {
4
- index: number;
5
- name: string;
6
- open: number;
7
- close: number;
8
- source: string;
4
+ index: number
5
+ name: string
6
+ open: number
7
+ close: number
8
+ source: string
9
9
  }
10
10
 
11
11
  /** Cheap gate: a `dynamic` binding can only come from one of these specifiers. */
12
12
  export function sourceHasDynamicImport(source: string) {
13
- return source.includes('@wular/pnext') || source.includes('next/dynamic');
13
+ return source.includes('@wular/pnext') || source.includes('next/dynamic')
14
14
  }
15
15
 
16
16
  /**
@@ -19,55 +19,55 @@ export function sourceHasDynamicImport(source: string) {
19
19
  * scanning below stays textual.
20
20
  */
21
21
  export function pnextDynamicImportNames(source: string, file = 'module.tsx') {
22
- const names = new Set<string>();
23
- if (!sourceHasDynamicImport(source)) return names;
22
+ const names = new Set<string>()
23
+ if (!sourceHasDynamicImport(source)) return names
24
24
  for (const statement of rewriteFacts(file, source).imports) {
25
- const { specifier } = statement;
26
- const pnext = specifier === '@wular/pnext' || specifier === '@wular/pnext/dynamic';
25
+ const { specifier } = statement
26
+ const pnext = specifier === '@wular/pnext' || specifier === '@wular/pnext/dynamic'
27
27
  // The compat alias rewrite may already have turned `next/dynamic` into the
28
28
  // shim's own file path/href before this scan runs.
29
29
  const nextDynamic =
30
- specifier === 'next/dynamic' || /compat\/next\/dynamic(?:\.tsx)?$/.test(specifier);
31
- if (!pnext && !nextDynamic) continue;
30
+ specifier === 'next/dynamic' || /compat\/next\/dynamic(?:\.tsx)?$/.test(specifier)
31
+ if (!pnext && !nextDynamic) continue
32
32
  for (const binding of statement.bindings) {
33
- if (binding.type) continue;
33
+ if (binding.type) continue
34
34
  if (pnext ? binding.imported === 'dynamic' : binding.imported === 'default') {
35
- names.add(binding.local);
35
+ names.add(binding.local)
36
36
  }
37
37
  }
38
38
  }
39
- return names;
39
+ return names
40
40
  }
41
41
 
42
42
  export function dynamicCallsFromSource(source: string, dynamicNames: Set<string>) {
43
- const calls: DynamicCall[] = [];
44
- if (dynamicNames.size === 0) return calls;
43
+ const calls: DynamicCall[] = []
44
+ if (dynamicNames.size === 0) return calls
45
45
 
46
- let index = 0;
46
+ let index = 0
47
47
 
48
48
  while ((index = nextDynamicCallIndex(source, dynamicNames, index)) !== -1) {
49
- const name = dynamicNameAt(source, dynamicNames, index);
49
+ const name = dynamicNameAt(source, dynamicNames, index)
50
50
  if (!name) {
51
- index += 1;
52
- continue;
51
+ index += 1
52
+ continue
53
53
  }
54
- const before = source[index - 1];
55
- const after = source[index + name.length];
54
+ const before = source[index - 1]
55
+ const after = source[index + name.length]
56
56
  if ((before && /[\w$]/.test(before)) || (after && /[\w$]/.test(after))) {
57
- index += name.length;
58
- continue;
57
+ index += name.length
58
+ continue
59
59
  }
60
60
 
61
- const open = source.indexOf('(', index + name.length);
61
+ const open = source.indexOf('(', index + name.length)
62
62
  if (open === -1 || source.slice(index + name.length, open).trim()) {
63
- index += name.length;
64
- continue;
63
+ index += name.length
64
+ continue
65
65
  }
66
66
 
67
- const close = matchingParen(source, open);
67
+ const close = matchingParen(source, open)
68
68
  if (close === -1) {
69
- index = open + 1;
70
- continue;
69
+ index = open + 1
70
+ continue
71
71
  }
72
72
 
73
73
  calls.push({
@@ -76,36 +76,36 @@ export function dynamicCallsFromSource(source: string, dynamicNames: Set<string>
76
76
  open,
77
77
  close,
78
78
  source: source.slice(index, close + 1),
79
- });
80
- index = close + 1;
79
+ })
80
+ index = close + 1
81
81
  }
82
82
 
83
- return calls;
83
+ return calls
84
84
  }
85
85
 
86
86
  export function rewriteLiteralDynamicCalls(source: string, file?: string) {
87
- const dynamicNames = pnextDynamicImportNames(source, file);
88
- if (dynamicNames.size === 0) return source;
89
- const facts = dynamicCallFacts(source, file);
87
+ const dynamicNames = pnextDynamicImportNames(source, file)
88
+ if (dynamicNames.size === 0) return source
89
+ const facts = dynamicCallFacts(source, file)
90
90
 
91
- const edits: { start: number; end: number; value: string }[] = [];
91
+ const edits: { start: number; end: number; value: string }[] = []
92
92
  for (const call of dynamicCallsFromSource(source, dynamicNames)) {
93
- const fact = factForCall(facts, call);
94
- if (!fact?.literal) continue;
93
+ const fact = factForCall(facts, call)
94
+ if (!fact?.literal) continue
95
95
  edits.push({
96
96
  start: fact.specifierStart,
97
97
  end: fact.specifierEnd,
98
98
  value: `() => import(${source.slice(fact.specifierStart, fact.specifierEnd)})`,
99
- });
99
+ })
100
100
  }
101
101
 
102
- if (edits.length === 0) return source;
102
+ if (edits.length === 0) return source
103
103
 
104
- let next = source;
104
+ let next = source
105
105
  for (const edit of edits.reverse()) {
106
- next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`;
106
+ next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`
107
107
  }
108
- return next;
108
+ return next
109
109
  }
110
110
 
111
111
  // Server compiles append the statically-resolved import target as a third
@@ -118,39 +118,39 @@ export function rewriteDynamicCallTargets(
118
118
  resolve: (specifier: string) => string | undefined,
119
119
  file?: string,
120
120
  ) {
121
- const dynamicNames = pnextDynamicImportNames(source, file);
122
- if (dynamicNames.size === 0) return source;
123
- const facts = dynamicCallFacts(source, file);
121
+ const dynamicNames = pnextDynamicImportNames(source, file)
122
+ if (dynamicNames.size === 0) return source
123
+ const facts = dynamicCallFacts(source, file)
124
124
 
125
- const edits: { at: number; value: string }[] = [];
125
+ const edits: { at: number; value: string }[] = []
126
126
  for (const call of dynamicCallsFromSource(source, dynamicNames)) {
127
- const target = loaderImportTargetForCall(call, facts);
128
- if (!target) continue;
129
- const file = resolve(target.specifier);
130
- if (!file) continue;
131
-
132
- const args = source.slice(call.open + 1, call.close);
133
- const argCount = topLevelArgCount(args);
134
- if (argCount < 1 || argCount > 2) continue;
135
- const literal = JSON.stringify({ file, exportName: target.exportName });
136
- const separator = /,\s*$/.test(args) ? '' : ', ';
127
+ const target = loaderImportTargetForCall(call, facts)
128
+ if (!target) continue
129
+ const file = resolve(target.specifier)
130
+ if (!file) continue
131
+
132
+ const args = source.slice(call.open + 1, call.close)
133
+ const argCount = topLevelArgCount(args)
134
+ if (argCount < 1 || argCount > 2) continue
135
+ const literal = JSON.stringify({ file, exportName: target.exportName })
136
+ const separator = /,\s*$/.test(args) ? '' : ', '
137
137
  edits.push({
138
138
  at: call.close,
139
139
  value: `${separator}${argCount === 1 ? 'undefined, ' : ''}${literal}`,
140
- });
140
+ })
141
141
  }
142
142
 
143
- if (edits.length === 0) return source;
143
+ if (edits.length === 0) return source
144
144
 
145
- let next = source;
145
+ let next = source
146
146
  for (const edit of edits.reverse()) {
147
- next = `${next.slice(0, edit.at)}${edit.value}${next.slice(edit.at)}`;
147
+ next = `${next.slice(0, edit.at)}${edit.value}${next.slice(edit.at)}`
148
148
  }
149
- return next;
149
+ return next
150
150
  }
151
151
 
152
152
  function factForCall(facts: DynamicCallFact[], call: DynamicCall) {
153
- return facts.find(fact => fact.start === call.index);
153
+ return facts.find(fact => fact.start === call.index)
154
154
  }
155
155
 
156
156
  /**
@@ -159,14 +159,14 @@ function factForCall(facts: DynamicCallFact[], call: DynamicCall) {
159
159
  * calls (`dynamic('./x')`) answer undefined — they carry no `import()` yet.
160
160
  */
161
161
  function loaderImportTargetForCall(call: DynamicCall, facts: DynamicCallFact[]) {
162
- const fact = factForCall(facts, call);
163
- return fact && !fact.literal ? fact : undefined;
162
+ const fact = factForCall(facts, call)
163
+ return fact && !fact.literal ? fact : undefined
164
164
  }
165
165
 
166
166
  /** Dev split of `dynamic(ssr:false)` targets; `PNEXT_DYNAMIC_SPLIT=0` restores eager builds. */
167
167
  export function devDynamicSplitEnabled() {
168
168
  // eslint-disable-next-line turbo/no-undeclared-env-vars
169
- return process.env.PNEXT_DYNAMIC_SPLIT !== '0';
169
+ return process.env.PNEXT_DYNAMIC_SPLIT !== '0'
170
170
  }
171
171
 
172
172
  /**
@@ -180,28 +180,28 @@ export function rewriteDeferredDynamicImports(
180
180
  resolve: (specifier: string) => string | undefined,
181
181
  href: (target: { file: string; exportName: string }) => string | undefined,
182
182
  ) {
183
- const dynamicNames = pnextDynamicImportNames(source, file);
184
- if (dynamicNames.size === 0) return source;
185
- const deferred = deferredDynamicImportSpecifiers(source, file);
186
- if (deferred.size === 0) return source;
187
- const facts = dynamicCallFacts(source, file);
183
+ const dynamicNames = pnextDynamicImportNames(source, file)
184
+ if (dynamicNames.size === 0) return source
185
+ const deferred = deferredDynamicImportSpecifiers(source, file)
186
+ if (deferred.size === 0) return source
187
+ const facts = dynamicCallFacts(source, file)
188
188
 
189
- const edits: { start: number; end: number; value: string }[] = [];
189
+ const edits: { start: number; end: number; value: string }[] = []
190
190
  for (const call of dynamicCallsFromSource(source, dynamicNames)) {
191
- const target = loaderImportTargetForCall(call, facts);
192
- if (!target || !deferred.has(target.specifier)) continue;
193
- const resolved = resolve(target.specifier);
194
- if (!resolved) continue;
195
- const url = href({ file: resolved, exportName: target.exportName });
196
- if (!url) continue;
197
- edits.push({ start: target.specifierStart + 1, end: target.specifierEnd - 1, value: url });
191
+ const target = loaderImportTargetForCall(call, facts)
192
+ if (!target || !deferred.has(target.specifier)) continue
193
+ const resolved = resolve(target.specifier)
194
+ if (!resolved) continue
195
+ const url = href({ file: resolved, exportName: target.exportName })
196
+ if (!url) continue
197
+ edits.push({ start: target.specifierStart + 1, end: target.specifierEnd - 1, value: url })
198
198
  }
199
- if (edits.length === 0) return source;
200
- let next = source;
199
+ if (edits.length === 0) return source
200
+ let next = source
201
201
  for (const edit of edits.sort((a, b) => b.start - a.start)) {
202
- next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`;
202
+ next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`
203
203
  }
204
- return next;
204
+ return next
205
205
  }
206
206
 
207
207
  /**
@@ -209,108 +209,108 @@ export function rewriteDeferredDynamicImports(
209
209
  * without `ssr: true`) - the dev split points: their target modules compile on browser demand, not eagerly.
210
210
  */
211
211
  export function deferredDynamicImportSpecifiers(source: string, file?: string) {
212
- const deferred = new Set<string>();
213
- const dynamicNames = pnextDynamicImportNames(source, file);
214
- if (dynamicNames.size === 0) return deferred;
212
+ const deferred = new Set<string>()
213
+ const dynamicNames = pnextDynamicImportNames(source, file)
214
+ if (dynamicNames.size === 0) return deferred
215
215
 
216
216
  // `const opts = { ssr: false }` option objects referenced by name.
217
- const optionConsts = new Map<string, string>();
218
- const constPattern = /const\s+([A-Za-z_$][\w$]*)\s*=\s*({[\s\S]*?})\s*(?:as\s+const\s*)?;/g;
219
- let constMatch: RegExpExecArray | null;
217
+ const optionConsts = new Map<string, string>()
218
+ const constPattern = /const\s+([A-Za-z_$][\w$]*)\s*=\s*({[\s\S]*?})\s*(?:as\s+const\s*)?;/g
219
+ let constMatch: RegExpExecArray | null
220
220
  while ((constMatch = constPattern.exec(source))) {
221
- if (constMatch[1] && constMatch[2]) optionConsts.set(constMatch[1], constMatch[2]);
221
+ if (constMatch[1] && constMatch[2]) optionConsts.set(constMatch[1], constMatch[2])
222
222
  }
223
223
 
224
- const facts = dynamicCallFacts(source, file);
224
+ const facts = dynamicCallFacts(source, file)
225
225
  for (const call of dynamicCallsFromSource(source, dynamicNames)) {
226
- const target = loaderImportTargetForCall(call, facts);
227
- if (!target) continue;
226
+ const target = loaderImportTargetForCall(call, facts)
227
+ if (!target) continue
228
228
  // Token scan over the call plus any named option consts it references —
229
229
  // tolerant of the compile-appended target argument (rewriteDynamicCallTargets).
230
- const tail = source.slice(target.loaderEnd, call.close);
231
- let options = tail;
230
+ const tail = source.slice(target.loaderEnd, call.close)
231
+ let options = tail
232
232
  for (const identifier of tail.match(/[A-Za-z_$][\w$]*/g) ?? []) {
233
- const named = optionConsts.get(identifier);
234
- if (named) options += `\n${named}`;
233
+ const named = optionConsts.get(identifier)
234
+ if (named) options += `\n${named}`
235
235
  }
236
- const ssrFalse = /\bssr\s*:\s*false\b/.test(options);
236
+ const ssrFalse = /\bssr\s*:\s*false\b/.test(options)
237
237
  const visible =
238
- /\bload\s*:\s*['"]visible['"]/.test(options) && !/\bssr\s*:\s*true\b/.test(options);
239
- if (ssrFalse || visible) deferred.add(target.specifier);
238
+ /\bload\s*:\s*['"]visible['"]/.test(options) && !/\bssr\s*:\s*true\b/.test(options)
239
+ if (ssrFalse || visible) deferred.add(target.specifier)
240
240
  }
241
- return deferred;
241
+ return deferred
242
242
  }
243
243
 
244
244
  function topLevelArgCount(args: string) {
245
- let count = 0;
246
- let depth = 0;
247
- let quote: string | null = null;
248
- let sawArg = false;
245
+ let count = 0
246
+ let depth = 0
247
+ let quote: string | null = null
248
+ let sawArg = false
249
249
 
250
250
  for (let index = 0; index < args.length; index += 1) {
251
- const char = args[index];
251
+ const char = args[index]
252
252
  if (quote) {
253
- if (char === quote && args[index - 1] !== '\\') quote = null;
254
- continue;
253
+ if (char === quote && args[index - 1] !== '\\') quote = null
254
+ continue
255
255
  }
256
256
  if (char === '"' || char === "'" || char === '`') {
257
- quote = char;
258
- sawArg = true;
259
- continue;
257
+ quote = char
258
+ sawArg = true
259
+ continue
260
260
  }
261
- if (char === '(' || char === '[' || char === '{') depth += 1;
262
- if (char === ')' || char === ']' || char === '}') depth -= 1;
261
+ if (char === '(' || char === '[' || char === '{') depth += 1
262
+ if (char === ')' || char === ']' || char === '}') depth -= 1
263
263
  if (char === ',' && depth === 0) {
264
- if (sawArg) count += 1;
265
- sawArg = false;
266
- continue;
264
+ if (sawArg) count += 1
265
+ sawArg = false
266
+ continue
267
267
  }
268
- if (!/\s/.test(char ?? '')) sawArg = true;
268
+ if (!/\s/.test(char ?? '')) sawArg = true
269
269
  }
270
270
 
271
- return sawArg ? count + 1 : count;
271
+ return sawArg ? count + 1 : count
272
272
  }
273
273
 
274
274
  function matchingParen(source: string, open: number) {
275
- let depth = 0;
276
- let quote: string | null = null;
275
+ let depth = 0
276
+ let quote: string | null = null
277
277
 
278
278
  for (let index = open; index < source.length; index += 1) {
279
- const char = source[index];
280
- const previous = source[index - 1];
279
+ const char = source[index]
280
+ const previous = source[index - 1]
281
281
 
282
282
  if (quote) {
283
- if (char === quote && previous !== '\\') quote = null;
284
- continue;
283
+ if (char === quote && previous !== '\\') quote = null
284
+ continue
285
285
  }
286
286
 
287
287
  if (char === '"' || char === "'" || char === '`') {
288
- quote = char;
289
- continue;
288
+ quote = char
289
+ continue
290
290
  }
291
291
 
292
- if (char === '(') depth += 1;
292
+ if (char === '(') depth += 1
293
293
  if (char === ')') {
294
- depth -= 1;
295
- if (depth === 0) return index;
294
+ depth -= 1
295
+ if (depth === 0) return index
296
296
  }
297
297
  }
298
298
 
299
- return -1;
299
+ return -1
300
300
  }
301
301
 
302
302
  function nextDynamicCallIndex(source: string, dynamicNames: Set<string>, fromIndex: number) {
303
- let next = -1;
303
+ let next = -1
304
304
  for (const name of dynamicNames) {
305
- const index = source.indexOf(name, fromIndex);
306
- if (index !== -1 && (next === -1 || index < next)) next = index;
305
+ const index = source.indexOf(name, fromIndex)
306
+ if (index !== -1 && (next === -1 || index < next)) next = index
307
307
  }
308
- return next;
308
+ return next
309
309
  }
310
310
 
311
311
  function dynamicNameAt(source: string, dynamicNames: Set<string>, index: number) {
312
312
  for (const name of dynamicNames) {
313
- if (source.startsWith(name, index)) return name;
313
+ if (source.startsWith(name, index)) return name
314
314
  }
315
- return undefined;
315
+ return undefined
316
316
  }