@wular/pnext 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1992
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1897
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +827 -815
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -13,25 +13,25 @@
13
13
  // export / top-level await / dynamic import() and CJS+ESM authoring styles.
14
14
  // ---------------------------------------------------------------------------
15
15
 
16
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
17
- import { createRequire } from 'node:module';
18
- import path from 'node:path';
19
- import { pathToFileURL } from 'node:url';
20
- import { build } from '../../utils/esbuild';
21
- import { setConfig } from './config';
22
- import { setCacheComponents } from '../../ppr';
23
- import { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_BUILD } from './constants';
24
- import { nextMdxConfigStubPlugin } from '../mdx/next-mdx-stub';
25
- import { collectImagesConfigErrors } from './image/validate';
26
- import { setSvgAsComponentEnabled, webpackReferencesSvgr } from './svgr';
27
- import { emitBuildFeatureUsageTelemetry, emitSessionStartedTelemetry } from './telemetry';
28
-
29
- export type NextConfigObject = Record<string, unknown>;
16
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
17
+ import { createRequire } from 'node:module'
18
+ import path from 'node:path'
19
+ import { pathToFileURL } from 'node:url'
20
+ import { build } from '../../utils/esbuild'
21
+ import { setConfig } from './config'
22
+ import { setCacheComponents } from '../../render/ppr'
23
+ import { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_BUILD } from './constants'
24
+ import { nextMdxConfigStubPlugin } from '../mdx/stub'
25
+ import { collectImagesConfigErrors } from './image/validate'
26
+ import { setSvgAsComponentEnabled, webpackReferencesSvgr } from './svgr'
27
+ import { emitBuildFeatureUsageTelemetry, emitSessionStartedTelemetry } from './telemetry'
28
+
29
+ export type NextConfigObject = Record<string, unknown>
30
30
  type NextConfigFn = (
31
31
  phase: string,
32
32
  context: { defaultConfig: NextConfigObject },
33
- ) => NextConfigObject | Promise<NextConfigObject>;
34
- type NextConfigExport = NextConfigObject | NextConfigFn | Promise<NextConfigObject>;
33
+ ) => NextConfigObject | Promise<NextConfigObject>
34
+ type NextConfigExport = NextConfigObject | NextConfigFn | Promise<NextConfigObject>
35
35
 
36
36
  const CONFIG_BASENAMES = [
37
37
  'next.config.ts',
@@ -40,13 +40,13 @@ const CONFIG_BASENAMES = [
40
40
  'next.config.js',
41
41
  'next.config.mjs',
42
42
  'next.config.cjs',
43
- ];
43
+ ]
44
44
 
45
- let store: NextConfigObject = {};
45
+ let store: NextConfigObject = {}
46
46
 
47
47
  /** The full loaded next.config object; empty until loadNextConfig runs. */
48
48
  export function getNextConfig(): NextConfigObject {
49
- return store;
49
+ return store
50
50
  }
51
51
 
52
52
  /**
@@ -60,70 +60,70 @@ export function getNextConfig(): NextConfigObject {
60
60
  */
61
61
  function readCacheComponentsFlag(config: NextConfigObject): boolean {
62
62
  // eslint-disable-next-line turbo/no-undeclared-env-vars
63
- if (process.env.__NEXT_CACHE_COMPONENTS === 'true') return true;
64
- if (config.cacheComponents === true) return true;
65
- const experimental = config.experimental as Record<string, unknown> | undefined;
66
- if (experimental?.cacheComponents === true) return true;
67
- if (experimental?.dynamicIO === true) return true;
68
- return false;
63
+ if (process.env.__NEXT_CACHE_COMPONENTS === 'true') return true
64
+ if (config.cacheComponents === true) return true
65
+ const experimental = config.experimental as Record<string, unknown> | undefined
66
+ if (experimental?.cacheComponents === true) return true
67
+ if (experimental?.dynamicIO === true) return true
68
+ return false
69
69
  }
70
70
 
71
71
  export function setNextConfig(config: NextConfigObject): void {
72
- store = config;
72
+ store = config
73
73
  // Derived per config load, never a process one-shot: a second build in the
74
74
  // same process (dev server, programmatic API, test suite) must see its OWN
75
75
  // app's flag, not the previous app's.
76
- setCacheComponents(readCacheComponentsFlag(config));
77
- setSvgAsComponentEnabled(webpackReferencesSvgr(config));
76
+ setCacheComponents(readCacheComponentsFlag(config))
77
+ setSvgAsComponentEnabled(webpackReferencesSvgr(config))
78
78
  // Expose basePath to server-side render code through the isomorphic
79
79
  // globalThis global (compat/client/base-path.ts reads it). The client reads
80
80
  // the window global the render layer injects instead; keeping both in sync
81
81
  // lets Link/redirect/nav prefix basePath identically on server and client.
82
- (globalThis as { __PNEXT_BASE_PATH__?: string }).__PNEXT_BASE_PATH__ =
83
- typeof config.basePath === 'string' ? config.basePath : '';
82
+ ;(globalThis as { __PNEXT_BASE_PATH__?: string }).__PNEXT_BASE_PATH__ =
83
+ typeof config.basePath === 'string' ? config.basePath : ''
84
84
  // Expose skipTrailingSlashRedirect the same way so server-rendered Links skip
85
85
  // trailing-slash normalization (the client reads the injected window global).
86
- (globalThis as { __PNEXT_SKIP_TRAILING_SLASH__?: boolean }).__PNEXT_SKIP_TRAILING_SLASH__ =
87
- config.skipTrailingSlashRedirect === true;
88
- (globalThis as { __PNEXT_TRAILING_SLASH__?: boolean }).__PNEXT_TRAILING_SLASH__ =
89
- config.trailingSlash === true;
86
+ ;(globalThis as { __PNEXT_SKIP_TRAILING_SLASH__?: boolean }).__PNEXT_SKIP_TRAILING_SLASH__ =
87
+ config.skipTrailingSlashRedirect === true
88
+ ;(globalThis as { __PNEXT_TRAILING_SLASH__?: boolean }).__PNEXT_TRAILING_SLASH__ =
89
+ config.trailingSlash === true
90
90
  }
91
91
 
92
92
  /** Overrides mapped onto pnext's resolved core config. */
93
93
  export interface NextConfigCoreOverrides {
94
- basePath?: string;
95
- trailingSlash?: boolean;
96
- skipTrailingSlashRedirect?: boolean;
97
- outDir?: string;
98
- assetPrefix?: string;
99
- productionBrowserSourceMaps?: boolean;
94
+ basePath?: string
95
+ trailingSlash?: boolean
96
+ skipTrailingSlashRedirect?: boolean
97
+ outDir?: string
98
+ assetPrefix?: string
99
+ productionBrowserSourceMaps?: boolean
100
100
  }
101
101
 
102
102
  export interface LoadNextConfigResult {
103
- config: NextConfigObject;
104
- overrides: NextConfigCoreOverrides;
103
+ config: NextConfigObject
104
+ overrides: NextConfigCoreOverrides
105
105
  }
106
106
 
107
107
  function findConfigPath(root: string): string | undefined {
108
108
  for (const name of CONFIG_BASENAMES) {
109
- const candidate = path.join(root, name);
110
- if (existsSync(candidate)) return candidate;
109
+ const candidate = path.join(root, name)
110
+ if (existsSync(candidate)) return candidate
111
111
  }
112
- return undefined;
112
+ return undefined
113
113
  }
114
114
 
115
115
  /** Stable per config content, so the emitted bundle keeps one name per boot. */
116
116
  function configSourceKey(configPath: string): string {
117
117
  try {
118
- return Bun.hash(readFileSync(configPath)).toString(36);
118
+ return Bun.hash(readFileSync(configPath)).toString(36)
119
119
  } catch {
120
- return 'config';
120
+ return 'config'
121
121
  }
122
122
  }
123
123
 
124
124
  function findTsconfig(root: string): string | undefined {
125
- const candidate = path.join(root, 'tsconfig.json');
126
- return existsSync(candidate) ? candidate : undefined;
125
+ const candidate = path.join(root, 'tsconfig.json')
126
+ return existsSync(candidate) ? candidate : undefined
127
127
  }
128
128
 
129
129
  /**
@@ -136,23 +136,26 @@ async function importConfigModule(
136
136
  root: string,
137
137
  dev: boolean,
138
138
  ): Promise<NextConfigExport> {
139
- const cjs = cjsConfigFormat(configPath, root);
139
+ const cjs = cjsConfigFormat(configPath, root)
140
140
  if (process.env.PNEXT_CONFIG_FAST !== '0' && selfContainedConfig(configPath)) {
141
141
  // Nothing left for the bundle pass to do, and Bun loads every supported config format natively -
142
142
  // so skip it. Worth a special case because this is the common shape and the pass is not cheap:
143
143
  // it loads esbuild and spawns its service child on the dev/start boot critical path.
144
- if (cjs) return createRequire(pathToFileURL(configPath))(configPath) as NextConfigExport;
145
- const module = (await import(pathToFileURL(configPath).href)) as { default?: NextConfigExport };
146
- return module.default ?? {};
144
+ if (cjs) return createRequire(pathToFileURL(configPath))(configPath) as NextConfigExport
145
+ const module = (await import(pathToFileURL(configPath).href)) as { default?: NextConfigExport }
146
+ return module.default ?? {}
147
147
  }
148
148
  // Dev keeps its scratch bundle in its own subtree; a concurrent build wipes
149
149
  // only the build-owned `config/`.
150
- const outDir = path.join(root, '.pnext', ...(dev ? ['dev'] : []), 'config');
151
- mkdirSync(outDir, { recursive: true });
150
+ const outDir = path.join(root, '.pnext', ...(dev ? ['dev'] : []), 'config')
151
+ mkdirSync(outDir, { recursive: true })
152
152
  // Content-addressed, not timestamped: a per-boot name leaked one bundle per
153
153
  // dev start and put a path that changes every boot into the module graph,
154
154
  // which renamed every artifact that could reach it.
155
- const outfile = path.join(outDir, `next.config.${configSourceKey(configPath)}.${cjs ? 'cjs' : 'mjs'}`);
155
+ const outfile = path.join(
156
+ outDir,
157
+ `next.config.${configSourceKey(configPath)}.${cjs ? 'cjs' : 'mjs'}`,
158
+ )
156
159
  try {
157
160
  await build({
158
161
  entryPoints: [configPath],
@@ -195,15 +198,15 @@ async function importConfigModule(
195
198
  logLevel: 'silent',
196
199
  sourcemap: false,
197
200
  metafile: false,
198
- });
201
+ })
199
202
  if (cjs) {
200
- const require = createRequire(pathToFileURL(outfile));
201
- return require(outfile) as NextConfigExport;
203
+ const require = createRequire(pathToFileURL(outfile))
204
+ return require(outfile) as NextConfigExport
202
205
  }
203
- const module = (await import(pathToFileURL(outfile).href)) as { default?: NextConfigExport };
204
- return module.default ?? {};
206
+ const module = (await import(pathToFileURL(outfile).href)) as { default?: NextConfigExport }
207
+ return module.default ?? {}
205
208
  } finally {
206
- rmSync(outfile, { force: true });
209
+ rmSync(outfile, { force: true })
207
210
  }
208
211
  }
209
212
 
@@ -214,23 +217,23 @@ async function importConfigModule(
214
217
  */
215
218
  function selfContainedConfig(configPath: string): boolean {
216
219
  try {
217
- const source = readFileSync(configPath, 'utf8').replaceAll('import.meta', '');
218
- return !/\b(?:import|require|__dirname|__filename)\b/.test(source);
220
+ const source = readFileSync(configPath, 'utf8').replaceAll('import.meta', '')
221
+ return !/\b(?:import|require|__dirname|__filename)\b/.test(source)
219
222
  } catch {
220
- return false;
223
+ return false
221
224
  }
222
225
  }
223
226
 
224
227
  function cjsConfigFormat(configPath: string, root: string): boolean {
225
- if (configPath.endsWith('.cjs') || configPath.endsWith('.cts')) return true;
226
- if (!configPath.endsWith('.js')) return false;
228
+ if (configPath.endsWith('.cjs') || configPath.endsWith('.cts')) return true
229
+ if (!configPath.endsWith('.js')) return false
227
230
  try {
228
231
  const pkg = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8')) as {
229
- type?: unknown;
230
- };
231
- return pkg.type !== 'module';
232
+ type?: unknown
233
+ }
234
+ return pkg.type !== 'module'
232
235
  } catch {
233
- return true;
236
+ return true
234
237
  }
235
238
  }
236
239
 
@@ -242,7 +245,7 @@ function cjsConfigFormat(configPath: string, root: string): boolean {
242
245
  // `next/*` config helpers stay external.
243
246
  const NEXT_DIST_STUB_CONTENTS =
244
247
  'class PNextConfigStub {}\n' +
245
- 'module.exports = new Proxy(PNextConfigStub, { get: (t, k) => (k === "default" ? PNextConfigStub : t[k] ?? PNextConfigStub) });\n';
248
+ 'module.exports = new Proxy(PNextConfigStub, { get: (t, k) => (k === "default" ? PNextConfigStub : t[k] ?? PNextConfigStub) });\n'
246
249
 
247
250
  function nextDistStubPlugin(outDir: string): import('esbuild').Plugin {
248
251
  return {
@@ -252,41 +255,41 @@ function nextDistStubPlugin(outDir: string): import('esbuild').Plugin {
252
255
  if (args.kind === 'require-resolve') {
253
256
  // Preserve the requested module path under the stub root so loaders
254
257
  // downstream can still recognize WHICH next internal was meant.
255
- const stubPath = path.join(outDir, 'next-dist-stub', `${args.path}.cjs`);
256
- mkdirSync(path.dirname(stubPath), { recursive: true });
257
- writeFileSync(stubPath, NEXT_DIST_STUB_CONTENTS);
258
- return { path: stubPath, external: true };
258
+ const stubPath = path.join(outDir, 'next-dist-stub', `${args.path}.cjs`)
259
+ mkdirSync(path.dirname(stubPath), { recursive: true })
260
+ writeFileSync(stubPath, NEXT_DIST_STUB_CONTENTS)
261
+ return { path: stubPath, external: true }
259
262
  }
260
- return { path: args.path, namespace: 'pnext-next-dist-stub' };
261
- });
263
+ return { path: args.path, namespace: 'pnext-next-dist-stub' }
264
+ })
262
265
  build.onLoad({ filter: /.*/, namespace: 'pnext-next-dist-stub' }, () => ({
263
266
  contents: NEXT_DIST_STUB_CONTENTS,
264
267
  loader: 'js',
265
- }));
268
+ }))
266
269
  },
267
- };
270
+ }
268
271
  }
269
272
 
270
273
  function currentPhase(dev: boolean): string {
271
- return dev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_BUILD;
274
+ return dev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_BUILD
272
275
  }
273
276
 
274
277
  /** A missing-module resolution failure (vs a genuine config error to surface). */
275
278
  function isModuleNotFoundError(error: unknown): boolean {
276
- if (!error || typeof error !== 'object') return false;
277
- const code = (error as { code?: unknown }).code;
278
- if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') return true;
279
- const message = (error as { message?: unknown }).message;
280
- return typeof message === 'string' && /Cannot find (?:module|package)/.test(message);
279
+ if (!error || typeof error !== 'object') return false
280
+ const code = (error as { code?: unknown }).code
281
+ if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') return true
282
+ const message = (error as { message?: unknown }).message
283
+ return typeof message === 'string' && /Cannot find (?:module|package)/.test(message)
281
284
  }
282
285
 
283
286
  function describeMissingModule(error: unknown): string {
284
- const message = (error as { message?: unknown }).message;
287
+ const message = (error as { message?: unknown }).message
285
288
  const match =
286
289
  typeof message === 'string'
287
290
  ? /Cannot find (?:module|package) ['"]([^'"]+)['"]/.exec(message)
288
- : null;
289
- return match ? `${match[1]} not installed` : 'a required module is not installed';
291
+ : null
292
+ return match ? `${match[1]} not installed` : 'a required module is not installed'
290
293
  }
291
294
 
292
295
  async function resolveConfigExport(
@@ -296,21 +299,21 @@ async function resolveConfigExport(
296
299
  const value =
297
300
  typeof exported === 'function'
298
301
  ? await exported(currentPhase(dev), { defaultConfig: {} })
299
- : await exported;
300
- return value ?? {};
302
+ : await exported
303
+ return value ?? {}
301
304
  }
302
305
 
303
306
  function mapOverrides(config: NextConfigObject): NextConfigCoreOverrides {
304
- const overrides: NextConfigCoreOverrides = {};
305
- if (typeof config.basePath === 'string') overrides.basePath = config.basePath;
307
+ const overrides: NextConfigCoreOverrides = {}
308
+ if (typeof config.basePath === 'string') overrides.basePath = config.basePath
306
309
  if (typeof config.assetPrefix === 'string' && config.assetPrefix.length > 0) {
307
- overrides.assetPrefix = config.assetPrefix;
310
+ overrides.assetPrefix = config.assetPrefix
308
311
  }
309
- if (typeof config.trailingSlash === 'boolean') overrides.trailingSlash = config.trailingSlash;
312
+ if (typeof config.trailingSlash === 'boolean') overrides.trailingSlash = config.trailingSlash
310
313
  if (typeof config.skipTrailingSlashRedirect === 'boolean')
311
- overrides.skipTrailingSlashRedirect = config.skipTrailingSlashRedirect;
314
+ overrides.skipTrailingSlashRedirect = config.skipTrailingSlashRedirect
312
315
  if (typeof config.productionBrowserSourceMaps === 'boolean')
313
- overrides.productionBrowserSourceMaps = config.productionBrowserSourceMaps;
316
+ overrides.productionBrowserSourceMaps = config.productionBrowserSourceMaps
314
317
  // Next's distDir maps onto pnext's outDir. pnext's default output dir is .pnext; only override when
315
318
  // the app explicitly sets distDir. Under `output: 'export'` a custom distDir is the EXPORT
316
319
  // destination instead - the build keeps its default dir and the static export tree lands in distDir.
@@ -319,36 +322,36 @@ function mapOverrides(config: NextConfigObject): NextConfigCoreOverrides {
319
322
  config.distDir.length > 0 &&
320
323
  config.output !== 'export'
321
324
  ) {
322
- overrides.outDir = config.distDir;
325
+ overrides.outDir = config.distDir
323
326
  }
324
- return overrides;
327
+ return overrides
325
328
  }
326
329
 
327
330
  function normalizeCacheHandlerPath(config: NextConfigObject, root: string): NextConfigObject {
328
- const value = config.cacheHandler;
329
- const cacheHandlers = config.cacheHandlers;
330
- let next = config;
331
+ const value = config.cacheHandler
332
+ const cacheHandlers = config.cacheHandlers
333
+ let next = config
331
334
  if (typeof value === 'string' && isRelativePathSpecifier(value)) {
332
- next = { ...next, cacheHandler: path.resolve(root, value) };
335
+ next = { ...next, cacheHandler: path.resolve(root, value) }
333
336
  }
334
337
  if (cacheHandlers && typeof cacheHandlers === 'object' && !Array.isArray(cacheHandlers)) {
335
- const normalized: Record<string, unknown> = {};
336
- let changed = false;
338
+ const normalized: Record<string, unknown> = {}
339
+ let changed = false
337
340
  for (const [key, handlerPath] of Object.entries(cacheHandlers as Record<string, unknown>)) {
338
341
  if (typeof handlerPath === 'string' && isRelativePathSpecifier(handlerPath)) {
339
- normalized[key] = path.resolve(root, handlerPath);
340
- changed = true;
342
+ normalized[key] = path.resolve(root, handlerPath)
343
+ changed = true
341
344
  } else {
342
- normalized[key] = handlerPath;
345
+ normalized[key] = handlerPath
343
346
  }
344
347
  }
345
- if (changed) next = { ...next, cacheHandlers: normalized };
348
+ if (changed) next = { ...next, cacheHandlers: normalized }
346
349
  }
347
- return next;
350
+ return next
348
351
  }
349
352
 
350
353
  function isRelativePathSpecifier(value: string): boolean {
351
- return value === '.' || value === '..' || value.startsWith('./') || value.startsWith('../');
354
+ return value === '.' || value === '..' || value.startsWith('./') || value.startsWith('../')
352
355
  }
353
356
 
354
357
  /**
@@ -357,20 +360,20 @@ function isRelativePathSpecifier(value: string): boolean {
357
360
  * app). Values already present in the environment win.
358
361
  */
359
362
  function applyEnv(config: NextConfigObject): void {
360
- const env = config.env;
361
- if (!env || typeof env !== 'object') return;
363
+ const env = config.env
364
+ if (!env || typeof env !== 'object') return
362
365
  for (const [key, value] of Object.entries(env as Record<string, unknown>)) {
363
- if (value === undefined || value === null) continue;
364
- if (process.env[key] !== undefined) continue;
365
- process.env[key] = typeof value === 'string' ? value : (JSON.stringify(value) ?? '');
366
+ if (value === undefined || value === null) continue
367
+ if (process.env[key] !== undefined) continue
368
+ process.env[key] = typeof value === 'string' ? value : (JSON.stringify(value) ?? '')
366
369
  }
367
370
  }
368
371
 
369
372
  /** Feed next/config's getConfig() from the loaded config's runtime configs. */
370
373
  function applyRuntimeConfig(config: NextConfigObject): void {
371
- const serverRuntimeConfig = config.serverRuntimeConfig;
372
- const publicRuntimeConfig = config.publicRuntimeConfig;
373
- if (!serverRuntimeConfig && !publicRuntimeConfig) return;
374
+ const serverRuntimeConfig = config.serverRuntimeConfig
375
+ const publicRuntimeConfig = config.publicRuntimeConfig
376
+ if (!serverRuntimeConfig && !publicRuntimeConfig) return
374
377
  setConfig({
375
378
  ...(serverRuntimeConfig && typeof serverRuntimeConfig === 'object'
376
379
  ? { serverRuntimeConfig: serverRuntimeConfig as Record<string, unknown> }
@@ -378,7 +381,7 @@ function applyRuntimeConfig(config: NextConfigObject): void {
378
381
  ...(publicRuntimeConfig && typeof publicRuntimeConfig === 'object'
379
382
  ? { publicRuntimeConfig: publicRuntimeConfig as Record<string, unknown> }
380
383
  : {}),
381
- });
384
+ })
382
385
  }
383
386
 
384
387
  const VALID_DEV_INDICATOR_POSITIONS = new Set([
@@ -386,7 +389,7 @@ const VALID_DEV_INDICATOR_POSITIONS = new Set([
386
389
  'top-right',
387
390
  'bottom-left',
388
391
  'bottom-right',
389
- ]);
392
+ ])
390
393
 
391
394
  const KNOWN_TOP_LEVEL_CONFIG_KEYS = new Set([
392
395
  'adapterPath',
@@ -428,7 +431,7 @@ const KNOWN_TOP_LEVEL_CONFIG_KEYS = new Set([
428
431
  'typedRoutes',
429
432
  'typescript',
430
433
  'webpack',
431
- ]);
434
+ ])
432
435
 
433
436
  // Deprecated next.config options and the exact warning Next emits for each. The
434
437
  // deprecation-warnings e2e suite asserts these substrings appear on the CLI when
@@ -459,55 +462,55 @@ const DEPRECATED_CONFIG_OPTIONS: readonly { key: string; reason: (file: string)
459
462
  reason: file =>
460
463
  `\`experimental.instrumentationHook\` is no longer needed, because \`instrumentation.js\` is available by default. You can remove it from ${file}.`,
461
464
  },
462
- ];
465
+ ]
463
466
 
464
467
  // Config-warning de-dup: loadNextConfig runs several times per process, but Next emits each
465
468
  // next.config validation warning only ONCE per process. Track which config files have already been
466
469
  // warned about so repeated loads within a single process stay silent. Fatal validation is intentionally
467
470
  // re-run every call - it throws.
468
- const warnedConfigPaths = new Set<string>();
471
+ const warnedConfigPaths = new Set<string>()
469
472
 
470
473
  function validateConfig(config: NextConfigObject, configPath: string): void {
471
474
  if (!warnedConfigPaths.has(configPath)) {
472
- warnedConfigPaths.add(configPath);
473
- const configFileName = path.basename(configPath);
474
- warnUnknownConfigKeys(config);
475
- warnEsmExternalsFalse(config);
476
- warnDeprecatedConfigOptions(config, configFileName);
477
- warnWebpackCompat(config, configFileName);
475
+ warnedConfigPaths.add(configPath)
476
+ const configFileName = path.basename(configPath)
477
+ warnUnknownConfigKeys(config)
478
+ warnEsmExternalsFalse(config)
479
+ warnDeprecatedConfigOptions(config, configFileName)
480
+ warnWebpackCompat(config, configFileName)
478
481
  }
479
- validateDevIndicatorPosition(config);
480
- const imageErrors = collectImagesConfigErrors(config, path.dirname(configPath));
482
+ validateDevIndicatorPosition(config)
483
+ const imageErrors = collectImagesConfigErrors(config, path.dirname(configPath))
481
484
  if (imageErrors.length > 0) {
482
485
  throw new Error(
483
486
  `Invalid next.config.js options detected: \n${imageErrors.map(e => ` ${e}`).join('\n')}\nSee more info here: https://nextjs.org/docs/messages/invalid-next-config`,
484
- );
487
+ )
485
488
  }
486
489
  }
487
490
 
488
491
  /** True when a dotted key path (e.g. `experimental.instrumentationHook`) is set. */
489
492
  function hasNestedKey(config: NextConfigObject, dottedKey: string): boolean {
490
- let current: unknown = config;
493
+ let current: unknown = config
491
494
  for (const key of dottedKey.split('.')) {
492
- if (!current || typeof current !== 'object') return false;
493
- current = (current as Record<string, unknown>)[key];
494
- if (current === undefined) return false;
495
+ if (!current || typeof current !== 'object') return false
496
+ current = (current as Record<string, unknown>)[key]
497
+ if (current === undefined) return false
495
498
  }
496
- return true;
499
+ return true
497
500
  }
498
501
 
499
502
  function warnDeprecatedConfigOptions(config: NextConfigObject, configFileName: string): void {
500
503
  for (const { key, reason } of DEPRECATED_CONFIG_OPTIONS) {
501
- if (hasNestedKey(config, key)) console.warn(reason(configFileName));
504
+ if (hasNestedKey(config, key)) console.warn(reason(configFileName))
502
505
  }
503
506
  }
504
507
 
505
508
  function warnUnknownConfigKeys(config: NextConfigObject): void {
506
- const invalid = Object.keys(config).filter(key => !KNOWN_TOP_LEVEL_CONFIG_KEYS.has(key));
507
- if (invalid.length === 0) return;
509
+ const invalid = Object.keys(config).filter(key => !KNOWN_TOP_LEVEL_CONFIG_KEYS.has(key))
510
+ if (invalid.length === 0) return
508
511
  console.warn(
509
512
  `Invalid next.config.js options detected: ${invalid.map(key => `"${key}"`).join(', ')}`,
510
- );
513
+ )
511
514
  }
512
515
 
513
516
  /**
@@ -516,37 +519,37 @@ function warnUnknownConfigKeys(config: NextConfigObject): void {
516
519
  * the common `@svgr/webpack` case, but the function itself is still never executed).
517
520
  */
518
521
  function warnWebpackCompat(config: NextConfigObject, configFileName: string): void {
519
- if (typeof config.webpack !== 'function') return;
522
+ if (typeof config.webpack !== 'function') return
520
523
  console.warn(
521
524
  `\`webpack\` in ${configFileName} is not executed by pnext — esbuild is the only bundler. ` +
522
525
  '`transpilePackages`, `experimental.optimizePackageImports`, and `turbopack.resolveAlias` are ' +
523
526
  'supported natively; see reference/compat.md.',
524
- );
527
+ )
525
528
  if (webpackReferencesSvgr(config)) {
526
529
  console.info(
527
530
  'pnext detected @svgr/webpack in `webpack()` and will compile `.svg` imports to inline Preact ' +
528
531
  'components instead (see reference/compat.md).',
529
- );
532
+ )
530
533
  }
531
534
  }
532
535
 
533
536
  function warnEsmExternalsFalse(config: NextConfigObject): void {
534
- const experimental = config.experimental;
535
- if (!experimental || typeof experimental !== 'object') return;
536
- if ((experimental as { esmExternals?: unknown }).esmExternals !== false) return;
537
+ const experimental = config.experimental
538
+ if (!experimental || typeof experimental !== 'object') return
539
+ if ((experimental as { esmExternals?: unknown }).esmExternals !== false) return
537
540
  console.warn(
538
541
  'The "experimental.esmExternals" option has been modified. experimental.esmExternals is not recommended to be modified as it may disrupt module resolution. It should be removed from your next.config.js',
539
- );
542
+ )
540
543
  }
541
544
 
542
545
  function validateDevIndicatorPosition(config: NextConfigObject): void {
543
- const devIndicators = config.devIndicators;
544
- if (!devIndicators || typeof devIndicators !== 'object') return;
545
- const position = (devIndicators as { position?: unknown }).position;
546
- if (typeof position !== 'string' || VALID_DEV_INDICATOR_POSITIONS.has(position)) return;
546
+ const devIndicators = config.devIndicators
547
+ if (!devIndicators || typeof devIndicators !== 'object') return
548
+ const position = (devIndicators as { position?: unknown }).position
549
+ if (typeof position !== 'string' || VALID_DEV_INDICATOR_POSITIONS.has(position)) return
547
550
  throw new Error(
548
551
  `Invalid "devIndicator.position" provided, expected one of top-left, top-right, bottom-left, bottom-right, received ${position}`,
549
- );
552
+ )
550
553
  }
551
554
 
552
555
  /**
@@ -558,15 +561,15 @@ export async function loadNextConfig(
558
561
  root: string,
559
562
  options: { dev?: boolean } = {},
560
563
  ): Promise<LoadNextConfigResult> {
561
- const configPath = findConfigPath(root);
564
+ const configPath = findConfigPath(root)
562
565
  if (!configPath) {
563
- setNextConfig({});
564
- emitSessionStartedTelemetry({});
565
- return { config: {}, overrides: {} };
566
+ setNextConfig({})
567
+ emitSessionStartedTelemetry({})
568
+ return { config: {}, overrides: {} }
566
569
  }
567
- let exported: NextConfigExport;
570
+ let exported: NextConfigExport
568
571
  try {
569
- exported = await importConfigModule(configPath, root, Boolean(options.dev));
572
+ exported = await importConfigModule(configPath, root, Boolean(options.dev))
570
573
  } catch (error) {
571
574
  // A next.config that pulls in an optional wrapper dependency not installed
572
575
  // in this app (e.g. @next/mdx when deps are declared but not installed)
@@ -576,22 +579,22 @@ export async function loadNextConfig(
576
579
  console.warn(
577
580
  `pnext: could not load ${path.relative(root, configPath)} ` +
578
581
  `(${describeMissingModule(error)}); continuing with default config`,
579
- );
580
- setNextConfig({});
581
- emitSessionStartedTelemetry({});
582
- return { config: {}, overrides: {} };
582
+ )
583
+ setNextConfig({})
584
+ emitSessionStartedTelemetry({})
585
+ return { config: {}, overrides: {} }
583
586
  }
584
- throw error;
587
+ throw error
585
588
  }
586
589
  const config = normalizeCacheHandlerPath(
587
590
  await resolveConfigExport(exported, Boolean(options.dev)),
588
591
  root,
589
- );
590
- validateConfig(config, configPath);
591
- setNextConfig(config);
592
- applyEnv(config);
593
- applyRuntimeConfig(config);
594
- emitSessionStartedTelemetry(config);
595
- emitBuildFeatureUsageTelemetry(config);
596
- return { config, overrides: mapOverrides(config) };
592
+ )
593
+ validateConfig(config, configPath)
594
+ setNextConfig(config)
595
+ applyEnv(config)
596
+ applyRuntimeConfig(config)
597
+ emitSessionStartedTelemetry(config)
598
+ emitBuildFeatureUsageTelemetry(config)
599
+ return { config, overrides: mapOverrides(config) }
597
600
  }
@@ -1,13 +1,13 @@
1
1
  export interface RuntimeConfig {
2
- serverRuntimeConfig: Record<string, unknown>;
3
- publicRuntimeConfig: Record<string, unknown>;
2
+ serverRuntimeConfig: Record<string, unknown>
3
+ publicRuntimeConfig: Record<string, unknown>
4
4
  }
5
5
 
6
6
  // Client-graph bundler defines (see compat/register/bundler.ts). Mirrors the image-config
7
7
  // pattern: the boolean twin gates the branch on a literal so the ?? never has to fold an
8
8
  // object define, and the define is only emitted when publicRuntimeConfig is non-empty.
9
- declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINE__: Record<string, unknown>;
10
- declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINED__: boolean;
9
+ declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINE__: Record<string, unknown>
10
+ declare const __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINED__: boolean
11
11
 
12
12
  // Server: populated by config-loader's setConfig() at config load time. Client: inlined at
13
13
  // build time from next.config's publicRuntimeConfig; serverRuntimeConfig never reaches the
@@ -18,12 +18,12 @@ const runtimeConfig: RuntimeConfig = {
18
18
  typeof __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINED__ === 'boolean'
19
19
  ? __PNEXT_PUBLIC_RUNTIME_CONFIG_INLINE__
20
20
  : {},
21
- };
21
+ }
22
22
 
23
23
  export default function getConfig(): RuntimeConfig {
24
- return runtimeConfig;
24
+ return runtimeConfig
25
25
  }
26
26
 
27
27
  export function setConfig(config: Partial<RuntimeConfig>) {
28
- Object.assign(runtimeConfig, config);
28
+ Object.assign(runtimeConfig, config)
29
29
  }