@wular/pnext 0.0.3 → 0.0.6

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