@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
@@ -17,12 +17,12 @@
17
17
  //
18
18
  // Zero-cost: apps without an instrumentation-client file get no bundle, no build work, no head tag.
19
19
 
20
- import { existsSync, mkdirSync } from 'node:fs';
21
- import path from 'node:path';
22
- import { build } from '../../utils/esbuild';
23
- import type { ResolvedConfig } from '../../config';
24
- import { getNextConfig } from '../next/config-loader';
25
- import { instrumentationLookupRoots } from './instrumentation';
20
+ import { existsSync, mkdirSync } from 'node:fs'
21
+ import path from 'node:path'
22
+ import { build } from '../../utils/esbuild'
23
+ import type { ResolvedConfig } from '../../config'
24
+ import { getNextConfig } from '../next/config-loader'
25
+ import { instrumentationLookupRoots } from './instrumentation'
26
26
 
27
27
  const CLIENT_BASENAMES = [
28
28
  'instrumentation-client.ts',
@@ -30,28 +30,28 @@ const CLIENT_BASENAMES = [
30
30
  'instrumentation-client.js',
31
31
  'instrumentation-client.mjs',
32
32
  'instrumentation-client.mts',
33
- ];
33
+ ]
34
34
 
35
35
  /** The served pathname of the bundled instrumentation-client asset. */
36
- export const INSTRUMENTATION_CLIENT_ASSET = 'assets/instrumentation-client.js';
36
+ export const INSTRUMENTATION_CLIENT_ASSET = 'assets/instrumentation-client.js'
37
37
 
38
38
  function findInstrumentationClient(config: ResolvedConfig): string | undefined {
39
39
  for (const root of instrumentationLookupRoots(config)) {
40
40
  for (const name of CLIENT_BASENAMES) {
41
- const candidate = path.join(root, name);
42
- if (existsSync(candidate)) return candidate;
41
+ const candidate = path.join(root, name)
42
+ if (existsSync(candidate)) return candidate
43
43
  }
44
44
  }
45
- return undefined;
45
+ return undefined
46
46
  }
47
47
 
48
48
  /** `instrumentationClientInject` module paths from next.config, root-resolved. */
49
49
  function injectEntries(config: ResolvedConfig): string[] {
50
- const value = getNextConfig().instrumentationClientInject;
51
- if (!Array.isArray(value)) return [];
50
+ const value = getNextConfig().instrumentationClientInject
51
+ if (!Array.isArray(value)) return []
52
52
  return value
53
53
  .filter((entry): entry is string => typeof entry === 'string')
54
- .map(entry => path.resolve(config.root, entry));
54
+ .map(entry => path.resolve(config.root, entry))
55
55
  }
56
56
 
57
57
  /**
@@ -61,8 +61,8 @@ function injectEntries(config: ResolvedConfig): string[] {
61
61
  function entrySource(modules: string[]): string {
62
62
  const imports = modules
63
63
  .map((file, index) => `import * as mod${index} from ${JSON.stringify(file)};`)
64
- .join('\n');
65
- const names = modules.map((_file, index) => `mod${index}`).join(', ');
64
+ .join('\n')
65
+ const names = modules.map((_file, index) => `mod${index}`).join(', ')
66
66
  return `${imports}
67
67
  const hooks = [${names}]
68
68
  .map(mod => (mod && typeof mod.onRouterTransitionStart === 'function' ? mod.onRouterTransitionStart : null))
@@ -78,7 +78,7 @@ if (hooks.length > 0) {
78
78
  }
79
79
  };
80
80
  }
81
- `;
81
+ `
82
82
  }
83
83
 
84
84
  /**
@@ -87,16 +87,16 @@ if (hooks.length > 0) {
87
87
  * step (before prerendering, so prerendered documents include the head tag).
88
88
  */
89
89
  export async function buildInstrumentationClient(config: ResolvedConfig): Promise<void> {
90
- const userFile = findInstrumentationClient(config);
91
- if (!userFile) return;
92
- const modules = [...injectEntries(config), userFile];
93
- const workDir = path.join(config.outPath, 'cache', 'instrumentation-client');
94
- mkdirSync(workDir, { recursive: true });
95
- const entryFile = path.join(workDir, 'entry.ts');
96
- const outfile = path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET);
97
- mkdirSync(path.dirname(outfile), { recursive: true });
98
- await Bun.write(entryFile, entrySource(modules));
99
- const tsconfig = path.join(config.root, 'tsconfig.json');
90
+ const userFile = findInstrumentationClient(config)
91
+ if (!userFile) return
92
+ const modules = [...injectEntries(config), userFile]
93
+ const workDir = path.join(config.outPath, 'cache', 'instrumentation-client')
94
+ mkdirSync(workDir, { recursive: true })
95
+ const entryFile = path.join(workDir, 'entry.ts')
96
+ const outfile = path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET)
97
+ mkdirSync(path.dirname(outfile), { recursive: true })
98
+ await Bun.write(entryFile, entrySource(modules))
99
+ const tsconfig = path.join(config.root, 'tsconfig.json')
100
100
  await build({
101
101
  entryPoints: [entryFile],
102
102
  outfile,
@@ -108,23 +108,21 @@ export async function buildInstrumentationClient(config: ResolvedConfig): Promis
108
108
  ...(existsSync(tsconfig) ? { tsconfig } : {}),
109
109
  logLevel: 'silent',
110
110
  sourcemap: false,
111
- });
112
- bundlePresence = true;
111
+ })
112
+ bundlePresence = true
113
113
  }
114
114
 
115
- let bundlePresence: boolean | undefined;
115
+ let bundlePresence: boolean | undefined
116
116
 
117
117
  /** Whether the built instrumentation-client bundle exists (cached). */
118
118
  function hasInstrumentationClientBundle(config: ResolvedConfig): boolean {
119
- bundlePresence ??= existsSync(
120
- path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET),
121
- );
122
- return bundlePresence;
119
+ bundlePresence ??= existsSync(path.join(config.outPath, 'public', INSTRUMENTATION_CLIENT_ASSET))
120
+ return bundlePresence
123
121
  }
124
122
 
125
123
  /** Test-only reset for the bundle-presence cache. */
126
124
  export function resetInstrumentationClientForTest(): void {
127
- bundlePresence = undefined;
125
+ bundlePresence = undefined
128
126
  }
129
127
 
130
128
  /**
@@ -132,7 +130,7 @@ export function resetInstrumentationClientForTest(): void {
132
130
  * app has none. basePath-prefixed like every other asset href.
133
131
  */
134
132
  export function instrumentationClientHeadTag(config: ResolvedConfig): string {
135
- if (!hasInstrumentationClientBundle(config)) return '';
136
- const prefix = config.basePath ?? '';
137
- return `<script type="module" src="${prefix}/${INSTRUMENTATION_CLIENT_ASSET}"></script>`;
133
+ if (!hasInstrumentationClientBundle(config)) return ''
134
+ const prefix = config.basePath ?? ''
135
+ return `<script type="module" src="${prefix}/${INSTRUMENTATION_CLIENT_ASSET}"></script>`
138
136
  }
@@ -12,15 +12,15 @@
12
12
  // separate module state) and calling its register() with NEXT_RUNTIME='edge' set for the duration.
13
13
  // Apps without edge entities never get the pass.
14
14
 
15
- import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs';
16
- import path from 'node:path';
17
- import { pathToFileURL } from 'node:url';
18
- import { createRequire } from 'node:module';
19
- import type { Plugin } from 'esbuild';
20
- import { build } from '../../utils/esbuild';
21
- import type { ResolvedConfig } from '../../config';
22
- import { resolveExternalLoadTarget } from '../../resolve/imports';
23
- import { compatAliases, reactServerLayerAliases } from '../index';
15
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs'
16
+ import path from 'node:path'
17
+ import { pathToFileURL } from 'node:url'
18
+ import { createRequire } from 'node:module'
19
+ import type { Plugin } from 'esbuild'
20
+ import { build } from '../../utils/esbuild'
21
+ import type { ResolvedConfig } from '../../config'
22
+ import { resolveExternalLoadTarget } from '../../resolve/imports'
23
+ import { compatAliases, reactServerLayerAliases } from '../aliases'
24
24
 
25
25
  const INSTRUMENTATION_BASENAMES = [
26
26
  'instrumentation.ts',
@@ -28,7 +28,7 @@ const INSTRUMENTATION_BASENAMES = [
28
28
  'instrumentation.js',
29
29
  'instrumentation.mjs',
30
30
  'instrumentation.tsx',
31
- ];
31
+ ]
32
32
 
33
33
  /**
34
34
  * The instrumentation bundle keeps node_modules external, so every bare specifier it emits is resolved
@@ -40,84 +40,84 @@ const INSTRUMENTATION_BASENAMES = [
40
40
  * server layer, so register() must observe the hook-free React.
41
41
  */
42
42
  function instrumentationAliases(config: ResolvedConfig): Record<string, string> {
43
- return { ...compatAliases(config, 'server'), ...reactServerLayerAliases(config) };
43
+ return { ...compatAliases(config, 'server'), ...reactServerLayerAliases(config) }
44
44
  }
45
45
 
46
46
  function instrumentationPlugin(root: string, config?: ResolvedConfig): Plugin {
47
- const appRequire = createRequire(path.join(root, 'package.json'));
48
- const aliases = config ? instrumentationAliases(config) : {};
47
+ const appRequire = createRequire(path.join(root, 'package.json'))
48
+ const aliases = config ? instrumentationAliases(config) : {}
49
49
  return {
50
50
  name: 'pnext-instrumentation',
51
51
  setup(builder) {
52
52
  builder.onResolve({ filter: /^[^./]/ }, args => {
53
- const alias = aliases[args.path];
54
- if (!alias) return undefined;
53
+ const alias = aliases[args.path]
54
+ if (!alias) return undefined
55
55
  return {
56
56
  path: path.isAbsolute(alias) ? pathToFileURL(alias).href : alias,
57
57
  external: true,
58
- };
59
- });
58
+ }
59
+ })
60
60
  builder.onResolve({ filter: /^server-only$/ }, () => ({
61
61
  path: 'server-only',
62
62
  namespace: 'pnext',
63
- }));
64
- builder.onLoad({ filter: /^server-only$/, namespace: 'pnext' }, () => ({ contents: '' }));
63
+ }))
64
+ builder.onLoad({ filter: /^server-only$/, namespace: 'pnext' }, () => ({ contents: '' }))
65
65
  builder.onResolve({ filter: /^@vercel\/otel$/ }, () => {
66
66
  try {
67
- appRequire.resolve('@vercel/otel');
68
- return undefined;
67
+ appRequire.resolve('@vercel/otel')
68
+ return undefined
69
69
  } catch {
70
- return { path: '@vercel/otel', namespace: 'pnext' };
70
+ return { path: '@vercel/otel', namespace: 'pnext' }
71
71
  }
72
- });
72
+ })
73
73
  builder.onLoad({ filter: /^@vercel\/otel$/, namespace: 'pnext' }, () => ({
74
74
  contents: 'export function registerOTel() {}',
75
- }));
75
+ }))
76
76
  builder.onResolve({ filter: /^[^./]/ }, args => {
77
77
  const target = resolveExternalLoadTarget({
78
78
  root,
79
79
  fromFile: args.importer || path.join(root, 'instrumentation.ts'),
80
80
  specifier: args.path,
81
81
  target: 'server',
82
- });
83
- return target ? { path: target } : undefined;
84
- });
82
+ })
83
+ return target ? { path: target } : undefined
84
+ })
85
85
  },
86
- };
86
+ }
87
87
  }
88
88
 
89
89
  export type OnRequestErrorHook = (
90
90
  error: unknown,
91
91
  request: { path: string; method: string; headers: Record<string, string> },
92
92
  context: Record<string, unknown>,
93
- ) => void | Promise<void>;
93
+ ) => void | Promise<void>
94
94
 
95
95
  interface InstrumentationModule {
96
- register?: () => void | Promise<void>;
97
- onRequestError?: OnRequestErrorHook;
96
+ register?: () => void | Promise<void>
97
+ onRequestError?: OnRequestErrorHook
98
98
  }
99
99
 
100
- let loaded: InstrumentationModule | undefined;
101
- let readyGate: Promise<void> | undefined;
100
+ let loaded: InstrumentationModule | undefined
101
+ let readyGate: Promise<void> | undefined
102
102
 
103
103
  /** The user onRequestError export, once instrumentation has loaded. */
104
104
  export function getUserOnRequestError(): OnRequestErrorHook | undefined {
105
- return loaded?.onRequestError;
105
+ return loaded?.onRequestError
106
106
  }
107
107
 
108
108
  /** Resolve once instrumentation register() has completed (or there is none). */
109
109
  export function instrumentationReady(): Promise<void> {
110
- return readyGate ?? Promise.resolve();
110
+ return readyGate ?? Promise.resolve()
111
111
  }
112
112
 
113
113
  function findInstrumentation(config: ResolvedConfig): string | undefined {
114
114
  for (const root of instrumentationLookupRoots(config)) {
115
115
  for (const name of INSTRUMENTATION_BASENAMES) {
116
- const candidate = path.join(root, name);
117
- if (existsSync(candidate)) return candidate;
116
+ const candidate = path.join(root, name)
117
+ if (existsSync(candidate)) return candidate
118
118
  }
119
119
  }
120
- return undefined;
120
+ return undefined
121
121
  }
122
122
 
123
123
  /**
@@ -126,9 +126,9 @@ function findInstrumentation(config: ResolvedConfig): string | undefined {
126
126
  * ignored). Apps without a `src/` source tree read from the project root.
127
127
  */
128
128
  export function instrumentationLookupRoots(config: ResolvedConfig): string[] {
129
- const src = path.join(config.root, 'src');
130
- const usesSrc = existsSync(path.join(src, 'app')) || existsSync(path.join(src, 'pages'));
131
- return usesSrc ? [src] : [config.root];
129
+ const src = path.join(config.root, 'src')
130
+ const usesSrc = existsSync(path.join(src, 'app')) || existsSync(path.join(src, 'pages'))
131
+ return usesSrc ? [src] : [config.root]
132
132
  }
133
133
 
134
134
  async function importInstrumentation(
@@ -136,13 +136,13 @@ async function importInstrumentation(
136
136
  config: ResolvedConfig,
137
137
  suffix = '',
138
138
  ): Promise<InstrumentationModule> {
139
- const root = config.root;
139
+ const root = config.root
140
140
  // Under config.outPath, so a dev server's scratch bundle lives in its own
141
141
  // subtree and a concurrent build never removes it mid-import.
142
- const outDir = path.join(config.outPath, 'instrumentation');
143
- mkdirSync(outDir, { recursive: true });
144
- const outfile = path.join(outDir, `instrumentation.${Date.now()}${suffix}.mjs`);
145
- const tsconfig = path.join(root, 'tsconfig.json');
142
+ const outDir = path.join(config.outPath, 'instrumentation')
143
+ mkdirSync(outDir, { recursive: true })
144
+ const outfile = path.join(outDir, `instrumentation.${Date.now()}${suffix}.mjs`)
145
+ const tsconfig = path.join(root, 'tsconfig.json')
146
146
  try {
147
147
  await build({
148
148
  entryPoints: [file],
@@ -161,10 +161,10 @@ async function importInstrumentation(
161
161
  },
162
162
  logLevel: 'silent',
163
163
  sourcemap: false,
164
- });
165
- return (await import(pathToFileURL(outfile).href)) as InstrumentationModule;
164
+ })
165
+ return (await import(pathToFileURL(outfile).href)) as InstrumentationModule
166
166
  } finally {
167
- rmSync(outfile, { force: true });
167
+ rmSync(outfile, { force: true })
168
168
  }
169
169
  }
170
170
 
@@ -174,11 +174,11 @@ async function importInstrumentation(
174
174
  * the register() completion is tracked by instrumentationReady().
175
175
  */
176
176
  export function loadInstrumentation(config: ResolvedConfig): void {
177
- if (readyGate) return;
178
- const file = findInstrumentation(config);
177
+ if (readyGate) return
178
+ const file = findInstrumentation(config)
179
179
  if (!file) {
180
- readyGate = Promise.resolve();
181
- return;
180
+ readyGate = Promise.resolve()
181
+ return
182
182
  }
183
183
  readyGate = (async () => {
184
184
  try {
@@ -187,14 +187,14 @@ export function loadInstrumentation(config: ResolvedConfig): void {
187
187
  // baseline runtime is 'nodejs' (edge-only fixtures still run here).
188
188
 
189
189
  // eslint-disable-next-line turbo/no-undeclared-env-vars
190
- if (!process.env.NEXT_RUNTIME) process.env.NEXT_RUNTIME = 'nodejs';
191
- loaded = await importInstrumentation(file, config);
192
- await loaded.register?.();
193
- if (appHasEdgeEntities(config)) await runEdgeRegisterPass(file, config);
190
+ if (!process.env.NEXT_RUNTIME) process.env.NEXT_RUNTIME = 'nodejs'
191
+ loaded = await importInstrumentation(file, config)
192
+ await loaded.register?.()
193
+ if (appHasEdgeEntities(config)) await runEdgeRegisterPass(file, config)
194
194
  } catch (error) {
195
- console.error('instrumentation register() failed:', error);
195
+ console.error('instrumentation register() failed:', error)
196
196
  }
197
- })();
197
+ })()
198
198
  }
199
199
 
200
200
  /**
@@ -204,29 +204,29 @@ export function loadInstrumentation(config: ResolvedConfig): void {
204
204
  */
205
205
  async function runEdgeRegisterPass(file: string, config: ResolvedConfig): Promise<void> {
206
206
  // eslint-disable-next-line turbo/no-undeclared-env-vars
207
- const previous = process.env.NEXT_RUNTIME;
207
+ const previous = process.env.NEXT_RUNTIME
208
208
  // eslint-disable-next-line turbo/no-undeclared-env-vars
209
- process.env.NEXT_RUNTIME = 'edge';
209
+ process.env.NEXT_RUNTIME = 'edge'
210
210
  try {
211
- const edgeInstance = await importInstrumentation(file, config, '.edge');
212
- await edgeInstance.register?.();
211
+ const edgeInstance = await importInstrumentation(file, config, '.edge')
212
+ await edgeInstance.register?.()
213
213
  } catch (error) {
214
- console.error('instrumentation register() (edge pass) failed:', error);
214
+ console.error('instrumentation register() (edge pass) failed:', error)
215
215
  } finally {
216
216
  if (previous === undefined) {
217
217
  // eslint-disable-next-line turbo/no-undeclared-env-vars
218
- delete process.env.NEXT_RUNTIME;
218
+ delete process.env.NEXT_RUNTIME
219
219
  } else {
220
220
  // eslint-disable-next-line turbo/no-undeclared-env-vars
221
- process.env.NEXT_RUNTIME = previous;
221
+ process.env.NEXT_RUNTIME = previous
222
222
  }
223
223
  }
224
224
  }
225
225
 
226
- const SOURCE_FILE_RE = /\.(?:ts|tsx|js|jsx|mjs|mts|cjs|cts)$/;
226
+ const SOURCE_FILE_RE = /\.(?:ts|tsx|js|jsx|mjs|mts|cjs|cts)$/
227
227
  // `export const runtime = 'edge'` (app router) or `config = { runtime:
228
228
  // 'edge' | 'experimental-edge' }` (pages router / API routes).
229
- const EDGE_RUNTIME_RE = /\bruntime\b\s*[:=]\s*['"](?:experimental-)?edge['"]/;
229
+ const EDGE_RUNTIME_RE = /\bruntime\b\s*[:=]\s*['"](?:experimental-)?edge['"]/
230
230
 
231
231
  /**
232
232
  * Whether the app contains anything Next would boot the edge runtime for:
@@ -235,46 +235,46 @@ const EDGE_RUNTIME_RE = /\bruntime\b\s*[:=]\s*['"](?:experimental-)?edge['"]/;
235
235
  * at boot; apps without instrumentation never pay).
236
236
  */
237
237
  function appHasEdgeEntities(config: ResolvedConfig): boolean {
238
- const roots = [config.root, path.join(config.root, 'src')];
238
+ const roots = [config.root, path.join(config.root, 'src')]
239
239
  for (const root of roots) {
240
240
  for (const name of ['middleware', 'proxy']) {
241
241
  for (const ext of ['ts', 'js', 'mts', 'mjs']) {
242
- if (existsSync(path.join(root, `${name}.${ext}`))) return true;
242
+ if (existsSync(path.join(root, `${name}.${ext}`))) return true
243
243
  }
244
244
  }
245
245
  for (const dir of ['app', 'pages']) {
246
- if (sourceTreeDeclaresEdgeRuntime(path.join(root, dir))) return true;
246
+ if (sourceTreeDeclaresEdgeRuntime(path.join(root, dir))) return true
247
247
  }
248
248
  }
249
- return false;
249
+ return false
250
250
  }
251
251
 
252
252
  function sourceTreeDeclaresEdgeRuntime(dir: string): boolean {
253
- let entries: string[];
253
+ let entries: string[]
254
254
  try {
255
- entries = readdirSync(dir);
255
+ entries = readdirSync(dir)
256
256
  } catch {
257
- return false;
257
+ return false
258
258
  }
259
259
  for (const entry of entries) {
260
- if (entry === 'node_modules' || entry.startsWith('.')) continue;
261
- const full = path.join(dir, entry);
262
- let stats;
260
+ if (entry === 'node_modules' || entry.startsWith('.')) continue
261
+ const full = path.join(dir, entry)
262
+ let stats
263
263
  try {
264
- stats = statSync(full);
264
+ stats = statSync(full)
265
265
  } catch {
266
- continue;
266
+ continue
267
267
  }
268
268
  if (stats.isDirectory()) {
269
- if (sourceTreeDeclaresEdgeRuntime(full)) return true;
270
- continue;
269
+ if (sourceTreeDeclaresEdgeRuntime(full)) return true
270
+ continue
271
271
  }
272
- if (!SOURCE_FILE_RE.test(entry)) continue;
272
+ if (!SOURCE_FILE_RE.test(entry)) continue
273
273
  try {
274
- if (EDGE_RUNTIME_RE.test(readFileSync(full, 'utf8'))) return true;
274
+ if (EDGE_RUNTIME_RE.test(readFileSync(full, 'utf8'))) return true
275
275
  } catch {
276
276
  // unreadable file — skip
277
277
  }
278
278
  }
279
- return false;
279
+ return false
280
280
  }
@@ -1,19 +1,19 @@
1
- import { format } from 'node:util';
1
+ import { format } from 'node:util'
2
2
 
3
- const installed = Symbol.for('pnext.node-console-format-installed');
3
+ const installed = Symbol.for('pnext.node-console-format-installed')
4
4
 
5
5
  export function installNodeConsoleFormat(): void {
6
- const state = globalThis as typeof globalThis & Record<symbol, true | undefined>;
7
- if (state[installed]) return;
8
- state[installed] = true;
9
- const log = console.log.bind(console);
10
- console.log = (...args: unknown[]) => log(format(...args));
6
+ const state = globalThis as typeof globalThis & Record<symbol, true | undefined>
7
+ if (state[installed]) return
8
+ state[installed] = true
9
+ const log = console.log.bind(console)
10
+ console.log = (...args: unknown[]) => log(format(...args))
11
11
  // Errors too: bun prints a thrown/logged Error as `error: message` (and uses
12
12
  // `err.name` alone for a renamed one), while Node — and therefore every Next
13
13
  // e2e expectation — prints util.inspect's `ClassName: message` /
14
14
  // `ClassName [name]: message` header followed by the stack.
15
- const error = console.error.bind(console);
16
- console.error = (...args: unknown[]) => error(format(...args));
17
- const warn = console.warn.bind(console);
18
- console.warn = (...args: unknown[]) => warn(format(...args));
15
+ const error = console.error.bind(console)
16
+ console.error = (...args: unknown[]) => error(format(...args))
17
+ const warn = console.warn.bind(console)
18
+ console.warn = (...args: unknown[]) => warn(format(...args))
19
19
  }