@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
@@ -6,25 +6,25 @@
6
6
  // exactly once at init and consults it - a no-op when no proxy info is active. Gated on
7
7
  // experimental.testProxy in next.config.
8
8
 
9
- import { PassThrough } from 'node:stream';
10
- import type * as http from 'node:http';
11
- import type * as https from 'node:https';
12
- import type { IncomingMessage } from 'node:http';
13
- import { createRequire } from 'node:module';
14
- import { currentRequest, getWorkUnit } from '../../request/context';
9
+ import { PassThrough } from 'node:stream'
10
+ import type * as http from 'node:http'
11
+ import type * as https from 'node:https'
12
+ import type { IncomingMessage } from 'node:http'
13
+ import { createRequire } from 'node:module'
14
+ import { currentRequest, getWorkUnit } from '../../request/context'
15
15
 
16
16
  // `import * as http` yields a frozen ES module namespace object under strict
17
17
  // runtimes (Bun); assigning to `.get` on it throws "Attempted to assign to
18
18
  // readonly property." `require()` returns the real, mutable CJS exports
19
19
  // object that node/http/https resolve `.get` calls through at runtime, so
20
20
  // patch that instead of the namespace binding.
21
- const requireNode = createRequire(import.meta.url);
22
- const httpModule = requireNode('node:http') as typeof http;
23
- const httpsModule = requireNode('node:https') as typeof https;
21
+ const requireNode = createRequire(import.meta.url)
22
+ const httpModule = requireNode('node:http') as typeof http
23
+ const httpsModule = requireNode('node:https') as typeof https
24
24
 
25
25
  interface TestProxyInfo {
26
- proxyPort: number;
27
- testData: string;
26
+ proxyPort: number
27
+ testData: string
28
28
  }
29
29
 
30
30
  /**
@@ -32,54 +32,54 @@ interface TestProxyInfo {
32
32
  * private ALS, so the patched global.fetch - invoked deep inside a render or handler - can recover it
33
33
  * via getWorkUnit(). The interceptor sets it before matching; the fetch patch reads it.
34
34
  */
35
- const TEST_PROXY_KEY = Symbol.for('pnext.testProxy');
35
+ const TEST_PROXY_KEY = Symbol.for('pnext.testProxy')
36
36
 
37
37
  /** Extract proxy info from a request's Next-Test-* headers, if present. */
38
38
  export function readTestProxyInfo(headers: Headers): TestProxyInfo | undefined {
39
- const portHeader = headers.get('next-test-proxy-port');
40
- if (!portHeader) return undefined;
41
- return { proxyPort: Number(portHeader), testData: headers.get('next-test-data') ?? '' };
39
+ const portHeader = headers.get('next-test-proxy-port')
40
+ if (!portHeader) return undefined
41
+ return { proxyPort: Number(portHeader), testData: headers.get('next-test-data') ?? '' }
42
42
  }
43
43
 
44
44
  /** Record the request's test-proxy info onto the active work unit (if any). */
45
45
  export function activateTestProxy(headers: Headers): void {
46
- const info = readTestProxyInfo(headers);
47
- if (!info) return;
48
- const unit = getWorkUnit();
49
- if (!unit) return;
50
- (unit.compat ??= {})[TEST_PROXY_KEY] = info;
46
+ const info = readTestProxyInfo(headers)
47
+ if (!info) return
48
+ const unit = getWorkUnit()
49
+ if (!unit) return
50
+ ;(unit.compat ??= {})[TEST_PROXY_KEY] = info
51
51
  }
52
52
 
53
53
  function currentTestProxyInfo(): TestProxyInfo | undefined {
54
- const workUnitInfo = getWorkUnit()?.compat?.[TEST_PROXY_KEY] as TestProxyInfo | undefined;
55
- if (workUnitInfo) return workUnitInfo;
56
- const request = currentRequest();
57
- if (!request) return undefined;
58
- return readTestProxyInfo(request.headers);
54
+ const workUnitInfo = getWorkUnit()?.compat?.[TEST_PROXY_KEY] as TestProxyInfo | undefined
55
+ if (workUnitInfo) return workUnitInfo
56
+ const request = currentRequest()
57
+ if (!request) return undefined
58
+ return readTestProxyInfo(request.headers)
59
59
  }
60
60
 
61
61
  // pnext marks its own proxy round-trips via `next.internal` so the patched
62
62
  // fetch (below) doesn't re-intercept them. The `next` field is typed as
63
63
  // NextFetchRequestConfig globally, so extend it via intersection rather than
64
64
  // interface-extends (which errors on the conflicting `next` property).
65
- type InternalInit = RequestInit & { next?: { internal?: boolean } };
65
+ type InternalInit = RequestInit & { next?: { internal?: boolean } }
66
66
 
67
67
  interface ProxyFetchRequest {
68
- testData: string;
69
- api: 'fetch';
68
+ testData: string
69
+ api: 'fetch'
70
70
  request: {
71
- url: string;
72
- method: string;
73
- headers: [string, string][];
74
- body: string | null;
75
- cache: RequestCache;
76
- credentials: RequestCredentials;
77
- integrity: string;
78
- mode: RequestMode;
79
- redirect: RequestRedirect;
80
- referrer: string;
81
- referrerPolicy: ReferrerPolicy;
82
- };
71
+ url: string
72
+ method: string
73
+ headers: [string, string][]
74
+ body: string | null
75
+ cache: RequestCache
76
+ credentials: RequestCredentials
77
+ integrity: string
78
+ mode: RequestMode
79
+ redirect: RequestRedirect
80
+ referrer: string
81
+ referrerPolicy: ReferrerPolicy
82
+ }
83
83
  }
84
84
 
85
85
  async function buildProxyRequest(testData: string, request: Request): Promise<ProxyFetchRequest> {
@@ -89,10 +89,7 @@ async function buildProxyRequest(testData: string, request: Request): Promise<Pr
89
89
  request: {
90
90
  url: request.url,
91
91
  method: request.method,
92
- headers: [
93
- ...Array.from(request.headers),
94
- ['next-test-stack', getTestStack()],
95
- ],
92
+ headers: [...Array.from(request.headers), ['next-test-stack', getTestStack()]],
96
93
  body: request.body ? Buffer.from(await request.arrayBuffer()).toString('base64') : null,
97
94
  cache: request.cache,
98
95
  credentials: request.credentials,
@@ -107,27 +104,27 @@ async function buildProxyRequest(testData: string, request: Request): Promise<Pr
107
104
  referrer: request.referrer,
108
105
  referrerPolicy: request.referrerPolicy,
109
106
  },
110
- };
107
+ }
111
108
  }
112
109
 
113
110
  function getTestStack(): string {
114
- let stack = (new Error().stack ?? '').split('\n');
111
+ let stack = (new Error().stack ?? '').split('\n')
115
112
  for (let i = 1; i < stack.length; i++) {
116
- const line = stack[i];
113
+ const line = stack[i]
117
114
  if (line && line.length > 0) {
118
- stack = stack.slice(i);
119
- break;
115
+ stack = stack.slice(i)
116
+ break
120
117
  }
121
118
  }
122
- stack = stack.filter(item => !item.includes('/next/dist/'));
123
- stack = stack.slice(0, 5);
124
- stack = stack.map(line => line.replace('webpack-internal:///(rsc)/', '').trim());
125
- return stack.join(' ');
119
+ stack = stack.filter(item => !item.includes('/next/dist/'))
120
+ stack = stack.slice(0, 5)
121
+ stack = stack.map(line => line.replace('webpack-internal:///(rsc)/', '').trim())
122
+ return stack.join(' ')
126
123
  }
127
124
 
128
125
  interface ProxyResponse {
129
- api: 'continue' | 'abort' | 'unhandled' | 'fetch';
130
- response?: { status: number; headers: [string, string][]; body: string | null };
126
+ api: 'continue' | 'abort' | 'unhandled' | 'fetch'
127
+ response?: { status: number; headers: [string, string][]; body: string | null }
131
128
  }
132
129
 
133
130
  async function handleProxiedFetch(
@@ -135,129 +132,160 @@ async function handleProxiedFetch(
135
132
  info: TestProxyInfo,
136
133
  request: Request,
137
134
  ): Promise<Response> {
138
- const proxyRequest = await buildProxyRequest(info.testData, request);
135
+ const proxyRequest = await buildProxyRequest(info.testData, request)
139
136
  const resp = await originalFetch(`http://localhost:${info.proxyPort}`, {
140
137
  method: 'POST',
141
138
  body: JSON.stringify(proxyRequest),
142
139
  next: { internal: true },
143
- } as InternalInit);
144
- if (!resp.ok) throw new Error(`Proxy request failed: ${resp.status}`);
145
- const proxyResponse = (await resp.json()) as ProxyResponse;
140
+ } as InternalInit)
141
+ if (!resp.ok) throw new Error(`Proxy request failed: ${resp.status}`)
142
+ const proxyResponse = (await resp.json()) as ProxyResponse
146
143
  switch (proxyResponse.api) {
147
144
  case 'continue':
148
- return originalFetch(request);
145
+ return originalFetch(request)
149
146
  case 'fetch': {
150
- const r = proxyResponse.response!;
147
+ const r = proxyResponse.response!
151
148
  return new Response(r.body ? Buffer.from(r.body, 'base64') : null, {
152
149
  status: r.status,
153
150
  headers: new Headers(r.headers),
154
- });
151
+ })
155
152
  }
156
153
  default:
157
- throw new Error(`Proxy request aborted [${request.method} ${request.url}]`);
154
+ throw new Error(`Proxy request aborted [${request.method} ${request.url}]`)
158
155
  }
159
156
  }
160
157
 
161
- type TestGetCallback = (res: IncomingMessage) => void;
162
- type HttpGetInput = Parameters<typeof http.get>[0];
158
+ type TestGetCallback = (res: IncomingMessage) => void
159
+ type HttpGetInput = Parameters<typeof http.get>[0]
163
160
 
164
- function buildResponseMessage(responsePromise: Promise<Response>, callback?: TestGetCallback): IncomingMessage {
165
- const stream = new PassThrough();
166
- const message = stream as unknown as IncomingMessage;
167
- void responsePromise.then(async response => {
168
- const headers: Record<string, string> = {};
169
- const rawHeaders: string[] = [];
170
- for (const [name, value] of response.headers) {
171
- headers[name.toLowerCase()] = value;
172
- rawHeaders.push(name, value);
173
- }
174
- message.statusCode = response.status;
175
- message.statusMessage = response.statusText;
176
- message.headers = headers;
177
- message.rawHeaders = rawHeaders;
178
- message.complete = true;
179
- callback?.(message);
180
- const body = await response.arrayBuffer();
181
- stream.end(Buffer.from(body));
182
- }).catch(error => {
183
- stream.emit('error', error);
184
- stream.end();
185
- });
186
- return message;
161
+ function buildResponseMessage(
162
+ responsePromise: Promise<Response>,
163
+ callback?: TestGetCallback,
164
+ ): IncomingMessage {
165
+ const stream = new PassThrough()
166
+ const message = stream as unknown as IncomingMessage
167
+ void responsePromise
168
+ .then(async response => {
169
+ const headers: Record<string, string> = {}
170
+ const rawHeaders: string[] = []
171
+ for (const [name, value] of response.headers) {
172
+ headers[name.toLowerCase()] = value
173
+ rawHeaders.push(name, value)
174
+ }
175
+ message.statusCode = response.status
176
+ message.statusMessage = response.statusText
177
+ message.headers = headers
178
+ message.rawHeaders = rawHeaders
179
+ message.complete = true
180
+ callback?.(message)
181
+ const body = await response.arrayBuffer()
182
+ stream.end(Buffer.from(body))
183
+ })
184
+ .catch(error => {
185
+ stream.emit('error', error)
186
+ stream.end()
187
+ })
188
+ return message
187
189
  }
188
190
 
189
191
  function getStringForGetInput(input: HttpGetInput): string | undefined {
190
- if (typeof input === 'string' || input instanceof URL) return input.toString();
191
- const candidate = input as { href?: string; protocol?: string; hostname?: string; host?: string; path?: string; pathname?: string; search?: string; port?: number | string };
192
- if (typeof candidate.href === 'string' && /^[a-z][a-z\d+.-]*:\/\//i.test(candidate.href)) return candidate.href;
193
- const protocol = typeof candidate.protocol === 'string' ? candidate.protocol : 'http:';
194
- const host = typeof candidate.host === 'string' ? candidate.host : typeof candidate.hostname === 'string' ? candidate.hostname : undefined;
195
- if (!host) return undefined;
192
+ if (typeof input === 'string' || input instanceof URL) return input.toString()
193
+ const candidate = input as {
194
+ href?: string
195
+ protocol?: string
196
+ hostname?: string
197
+ host?: string
198
+ path?: string
199
+ pathname?: string
200
+ search?: string
201
+ port?: number | string
202
+ }
203
+ if (typeof candidate.href === 'string' && /^[a-z][a-z\d+.-]*:\/\//i.test(candidate.href))
204
+ return candidate.href
205
+ const protocol = typeof candidate.protocol === 'string' ? candidate.protocol : 'http:'
206
+ const host =
207
+ typeof candidate.host === 'string'
208
+ ? candidate.host
209
+ : typeof candidate.hostname === 'string'
210
+ ? candidate.hostname
211
+ : undefined
212
+ if (!host) return undefined
196
213
  const port =
197
- typeof candidate.port === 'number' ? `:${candidate.port}` : typeof candidate.port === 'string' ? `:${candidate.port}` : '';
198
- const path = typeof candidate.path === 'string' ? candidate.path : typeof candidate.pathname === 'string' ? candidate.pathname : '/';
199
- const search = typeof candidate.search === 'string' ? candidate.search : '';
200
- return `${protocol}//${host}${port}${path}${search}`;
214
+ typeof candidate.port === 'number'
215
+ ? `:${candidate.port}`
216
+ : typeof candidate.port === 'string'
217
+ ? `:${candidate.port}`
218
+ : ''
219
+ const path =
220
+ typeof candidate.path === 'string'
221
+ ? candidate.path
222
+ : typeof candidate.pathname === 'string'
223
+ ? candidate.pathname
224
+ : '/'
225
+ const search = typeof candidate.search === 'string' ? candidate.search : ''
226
+ return `${protocol}//${host}${port}${path}${search}`
201
227
  }
202
228
 
203
- function patchableGet(
204
- originalGet: typeof http.get,
205
- originalFetch: typeof fetch,
206
- ): typeof http.get {
229
+ function patchableGet(originalGet: typeof http.get, originalFetch: typeof fetch): typeof http.get {
207
230
  return ((input: HttpGetInput, options?: Parameters<typeof http.get>[1]) => {
208
- const callback = typeof options === 'function' ? options : undefined;
209
- const url = getStringForGetInput(input);
210
- const info = currentTestProxyInfo();
231
+ const callback = typeof options === 'function' ? options : undefined
232
+ const url = getStringForGetInput(input)
233
+ const info = currentTestProxyInfo()
211
234
  if (!url || !info) {
212
235
  if (typeof options === 'function') {
213
- return originalGet(input, options);
236
+ return originalGet(input, options)
214
237
  }
215
238
  if (options === undefined) {
216
- return originalGet(input);
239
+ return originalGet(input)
217
240
  }
218
- return originalGet(input, options);
241
+ return originalGet(input, options)
219
242
  }
220
243
  const request = new Request(url, {
221
- method: typeof options === 'object' && options && 'method' in options && typeof options.method === 'string'
222
- ? options.method
223
- : 'GET',
244
+ method:
245
+ typeof options === 'object' &&
246
+ options &&
247
+ 'method' in options &&
248
+ typeof options.method === 'string'
249
+ ? options.method
250
+ : 'GET',
224
251
  headers:
225
252
  typeof options === 'object' && options && 'headers' in options
226
253
  ? (options.headers as HeadersInit)
227
254
  : undefined,
228
- });
229
- return buildResponseMessage(handleProxiedFetch(originalFetch, info, request), callback) as unknown as ReturnType<
230
- typeof http.get
231
- >;
232
- }) as typeof http.get;
255
+ })
256
+ return buildResponseMessage(
257
+ handleProxiedFetch(originalFetch, info, request),
258
+ callback,
259
+ ) as unknown as ReturnType<typeof http.get>
260
+ }) as typeof http.get
233
261
  }
234
262
 
235
- let patched = false;
263
+ let patched = false
236
264
 
237
265
  /** Patch global.fetch and node http/https.get once for testmode outgoing requests. */
238
266
  export function installTestProxyFetch(): void {
239
- if (patched) return;
240
- patched = true;
241
- const originalFetch = globalThis.fetch.bind(globalThis);
267
+ if (patched) return
268
+ patched = true
269
+ const originalFetch = globalThis.fetch.bind(globalThis)
242
270
 
243
271
  const testFetch = function testFetch(
244
272
  input: Parameters<typeof fetch>[0],
245
273
  init?: Parameters<typeof fetch>[1],
246
274
  ): Promise<Response> {
247
- const nextInit = (init as { next?: { internal?: boolean } } | undefined)?.next;
275
+ const nextInit = (init as { next?: { internal?: boolean } } | undefined)?.next
248
276
  if (nextInit?.internal) {
249
- return originalFetch(input, init);
277
+ return originalFetch(input, init)
250
278
  }
251
- const info = currentTestProxyInfo();
252
- if (!info) return originalFetch(input, init);
253
- return handleProxiedFetch(originalFetch, info, new Request(input, init));
254
- };
279
+ const info = currentTestProxyInfo()
280
+ if (!info) return originalFetch(input, init)
281
+ return handleProxiedFetch(originalFetch, info, new Request(input, init))
282
+ }
255
283
  // Preserve fetch.preconnect (typeof fetch requires it).
256
- (testFetch as typeof fetch).preconnect = originalFetch.preconnect?.bind(originalFetch);
257
- globalThis.fetch = testFetch as typeof fetch;
284
+ ;(testFetch as typeof fetch).preconnect = originalFetch.preconnect?.bind(originalFetch)
285
+ globalThis.fetch = testFetch as typeof fetch
258
286
 
259
- const originalHttpGet = httpModule.get;
260
- const originalHttpsGet = httpsModule.get;
261
- httpModule.get = patchableGet(originalHttpGet, originalFetch);
262
- httpsModule.get = patchableGet(originalHttpsGet, originalFetch);
287
+ const originalHttpGet = httpModule.get
288
+ const originalHttpsGet = httpsModule.get
289
+ httpModule.get = patchableGet(originalHttpGet, originalFetch)
290
+ httpsModule.get = patchableGet(originalHttpsGet, originalFetch)
263
291
  }
@@ -14,32 +14,32 @@
14
14
  // `providerImportSource` is set to our components provider only when the app ships an `mdx-components`
15
15
  // file; without one, MDX emits bare host elements, which is exactly the mdx-no-mdx-components contract.
16
16
 
17
- import { existsSync } from 'node:fs';
18
- import { createRequire } from 'node:module';
19
- import path from 'node:path';
20
- import { pathToFileURL } from 'node:url';
21
- import { getNextConfig } from '../next/config-loader';
17
+ import { existsSync } from 'node:fs'
18
+ import { createRequire } from 'node:module'
19
+ import path from 'node:path'
20
+ import { pathToFileURL } from 'node:url'
21
+ import { getNextConfig } from '../next/config-loader'
22
22
 
23
23
  export interface MdxCompileResult {
24
- code: string;
24
+ code: string
25
25
  }
26
26
 
27
27
  interface MdxModule {
28
28
  compile: (
29
29
  source: string | { value: string; path?: string },
30
30
  options?: Record<string, unknown>,
31
- ) => Promise<{ toString: () => string; value: string }>;
31
+ ) => Promise<{ toString: () => string; value: string }>
32
32
  }
33
33
 
34
34
  interface MdxOptions {
35
- remarkPlugins?: unknown[];
36
- rehypePlugins?: unknown[];
37
- recmaPlugins?: unknown[];
38
- remarkRehypeOptions?: Record<string, unknown>;
39
- providerImportSource?: string;
35
+ remarkPlugins?: unknown[]
36
+ rehypePlugins?: unknown[]
37
+ recmaPlugins?: unknown[]
38
+ remarkRehypeOptions?: Record<string, unknown>
39
+ providerImportSource?: string
40
40
  }
41
41
 
42
- let cachedModule: MdxModule | null | undefined;
42
+ let cachedModule: MdxModule | null | undefined
43
43
 
44
44
  /**
45
45
  * Load `@mdx-js/mdx` lazily. Returns `null` (not throwing) when the optional
@@ -47,26 +47,26 @@ let cachedModule: MdxModule | null | undefined;
47
47
  * when an app actually imports `.mdx`.
48
48
  */
49
49
  async function loadMdx(): Promise<MdxModule | null> {
50
- if (cachedModule !== undefined) return cachedModule;
50
+ if (cachedModule !== undefined) return cachedModule
51
51
  try {
52
- const specifier = '@mdx-js/mdx';
53
- cachedModule = (await import(/* @vite-ignore */ specifier)) as MdxModule;
52
+ const specifier = '@mdx-js/mdx'
53
+ cachedModule = (await import(/* @vite-ignore */ specifier)) as MdxModule
54
54
  } catch {
55
- cachedModule = null;
55
+ cachedModule = null
56
56
  }
57
- return cachedModule;
57
+ return cachedModule
58
58
  }
59
59
 
60
60
  /** The user's mdxOptions from the wrapped next.config, normalized. */
61
61
  export function mdxOptionsFromConfig(): MdxOptions {
62
62
  const config = getNextConfig() as {
63
- mdxOptions?: MdxOptions;
64
- experimental?: { mdxRs?: unknown };
65
- };
63
+ mdxOptions?: MdxOptions
64
+ experimental?: { mdxRs?: unknown }
65
+ }
66
66
  // @next/mdx stores the merged plugin options under `mdxOptions` on the config
67
67
  // object the wrapper produces. `experimental.mdxRs` selects the Rust pipeline
68
68
  // upstream; we always use the JS pipeline, so it is intentionally ignored.
69
- return config.mdxOptions ?? {};
69
+ return config.mdxOptions ?? {}
70
70
  }
71
71
 
72
72
  /**
@@ -75,24 +75,30 @@ export function mdxOptionsFromConfig(): MdxOptions {
75
75
  * used as `providerImportSource`, or `undefined` when absent (bare host elements).
76
76
  */
77
77
  export function resolveMdxComponents(root: string): string | undefined {
78
- const bases = [root, path.join(root, 'src')];
79
- const names = ['mdx-components.tsx', 'mdx-components.ts', 'mdx-components.jsx', 'mdx-components.js', 'mdx-components.mjs'];
78
+ const bases = [root, path.join(root, 'src')]
79
+ const names = [
80
+ 'mdx-components.tsx',
81
+ 'mdx-components.ts',
82
+ 'mdx-components.jsx',
83
+ 'mdx-components.js',
84
+ 'mdx-components.mjs',
85
+ ]
80
86
  for (const base of bases) {
81
87
  for (const name of names) {
82
- const candidate = path.join(base, name);
83
- if (existsSync(candidate)) return candidate;
88
+ const candidate = path.join(base, name)
89
+ if (existsSync(candidate)) return candidate
84
90
  }
85
91
  }
86
- return undefined;
92
+ return undefined
87
93
  }
88
94
 
89
95
  function interopDefault(module: unknown): unknown {
90
- return (module as { default?: unknown })?.default ?? module;
96
+ return (module as { default?: unknown })?.default ?? module
91
97
  }
92
98
 
93
99
  // Sentinel returned when a configured plugin package can't be resolved from the
94
100
  // app, so `resolvePlugins` can filter it out.
95
- const UNRESOLVED_PLUGIN = Symbol('pnext.mdx.unresolved-plugin');
101
+ const UNRESOLVED_PLUGIN = Symbol('pnext.mdx.unresolved-plugin')
96
102
 
97
103
  /**
98
104
  * Resolve a single plugin entry to the shape `@mdx-js/mdx` expects. `@next/mdx` stores plugins as
@@ -107,21 +113,18 @@ const UNRESOLVED_PLUGIN = Symbol('pnext.mdx.unresolved-plugin');
107
113
  * all. Load failures are common when the toolchain resolves into a flat auto-install cache rather than
108
114
  * a real node_modules tree, so the real error is surfaced to the log instead of silently 500ing pages.
109
115
  */
110
- async function resolvePlugin(
111
- entry: unknown,
112
- resolveFrom: NodeRequire,
113
- ): Promise<unknown> {
114
- if (typeof entry === 'function') return entry;
116
+ async function resolvePlugin(entry: unknown, resolveFrom: NodeRequire): Promise<unknown> {
117
+ if (typeof entry === 'function') return entry
115
118
  if (typeof entry === 'string') {
116
- return loadPlugin(entry, resolveFrom);
119
+ return loadPlugin(entry, resolveFrom)
117
120
  }
118
121
  if (Array.isArray(entry) && typeof entry[0] === 'string') {
119
- const tuple = entry as unknown[];
120
- const plugin = await loadPlugin(tuple[0] as string, resolveFrom);
121
- if (plugin === UNRESOLVED_PLUGIN) return UNRESOLVED_PLUGIN;
122
- return [plugin, ...tuple.slice(1)];
122
+ const tuple = entry as unknown[]
123
+ const plugin = await loadPlugin(tuple[0] as string, resolveFrom)
124
+ if (plugin === UNRESOLVED_PLUGIN) return UNRESOLVED_PLUGIN
125
+ return [plugin, ...tuple.slice(1)]
123
126
  }
124
- return entry;
127
+ return entry
125
128
  }
126
129
 
127
130
  /**
@@ -131,32 +134,32 @@ async function resolvePlugin(
131
134
  * so the toolchain stays inside the app's node_modules.
132
135
  */
133
136
  async function loadPlugin(name: string, resolveFrom: NodeRequire): Promise<unknown> {
134
- let resolved: string;
137
+ let resolved: string
135
138
  try {
136
- resolved = resolveFrom.resolve(name);
139
+ resolved = resolveFrom.resolve(name)
137
140
  } catch {
138
141
  console.warn(
139
142
  `pnext: MDX plugin '${name}' is configured but not installed; skipping it. ` +
140
143
  'Install it to apply this remark/rehype/recma plugin.',
141
- );
142
- return UNRESOLVED_PLUGIN;
144
+ )
145
+ return UNRESOLVED_PLUGIN
143
146
  }
144
147
  try {
145
- return interopDefault(await import(pathToFileURL(resolved).href));
148
+ return interopDefault(await import(pathToFileURL(resolved).href))
146
149
  } catch (error) {
147
150
  console.warn(
148
151
  `pnext: MDX plugin '${name}' failed to load and was skipped: ` +
149
152
  `${error instanceof Error ? error.message : String(error)}. ` +
150
153
  'Ensure it is installed in the app’s node_modules (not only Bun’s auto-install cache).',
151
- );
152
- return UNRESOLVED_PLUGIN;
154
+ )
155
+ return UNRESOLVED_PLUGIN
153
156
  }
154
157
  }
155
158
 
156
159
  /** Resolve every entry of a remark/rehype/recma plugin array (skipping absent packages). */
157
160
  async function resolvePlugins(plugins: unknown[], resolveFrom: NodeRequire): Promise<unknown[]> {
158
- const resolved = await Promise.all(plugins.map(entry => resolvePlugin(entry, resolveFrom)));
159
- return resolved.filter(entry => entry !== UNRESOLVED_PLUGIN);
161
+ const resolved = await Promise.all(plugins.map(entry => resolvePlugin(entry, resolveFrom)))
162
+ return resolved.filter(entry => entry !== UNRESOLVED_PLUGIN)
160
163
  }
161
164
 
162
165
  /**
@@ -168,25 +171,25 @@ export async function compileMdx(
168
171
  filePath: string,
169
172
  root: string,
170
173
  ): Promise<MdxCompileResult> {
171
- const mdx = await loadMdx();
174
+ const mdx = await loadMdx()
172
175
  if (!mdx) {
173
176
  throw new Error(
174
177
  "MDX support requires the '@mdx-js/mdx' package. Install it to render .mdx files.",
175
- );
178
+ )
176
179
  }
177
180
 
178
- const userOptions = mdxOptionsFromConfig();
179
- const provider = resolveMdxComponents(root);
181
+ const userOptions = mdxOptionsFromConfig()
182
+ const provider = resolveMdxComponents(root)
180
183
 
181
184
  // Resolve string/tuple plugin names (@next/mdx's serialized form) to actual
182
185
  // plugin functions from the app's node_modules before handing them to MDX.
183
- const resolveFrom = createRequire(path.join(root, 'noop.js'));
186
+ const resolveFrom = createRequire(path.join(root, 'noop.js'))
184
187
 
185
188
  const [remarkPlugins, rehypePlugins, recmaPlugins] = await Promise.all([
186
189
  resolvePlugins(userOptions.remarkPlugins ?? [], resolveFrom),
187
190
  resolvePlugins(userOptions.rehypePlugins ?? [], resolveFrom),
188
191
  resolvePlugins(userOptions.recmaPlugins ?? [], resolveFrom),
189
- ]);
192
+ ])
190
193
 
191
194
  const compiled = await mdx.compile(
192
195
  { value: source, path: filePath },
@@ -213,7 +216,7 @@ export async function compileMdx(
213
216
  ? { providerImportSource: provider }
214
217
  : {}),
215
218
  },
216
- );
219
+ )
217
220
 
218
- return { code: compiled.toString() };
221
+ return { code: compiled.toString() }
219
222
  }