@wular/pnext 0.0.1

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 (371) hide show
  1. package/README.md +153 -0
  2. package/bin/pnext +67 -0
  3. package/config/lint/base.js +48 -0
  4. package/config/ts/base.json +26 -0
  5. package/config/ts/react.json +13 -0
  6. package/package.json +70 -0
  7. package/reference/compat.md +63 -0
  8. package/reference/config.md +120 -0
  9. package/reference/css.md +58 -0
  10. package/reference/dev.md +69 -0
  11. package/reference/env.md +40 -0
  12. package/reference/metadata.md +86 -0
  13. package/reference/navigation.md +149 -0
  14. package/reference/overview.md +35 -0
  15. package/reference/performance.md +97 -0
  16. package/reference/rendering.md +127 -0
  17. package/reference/routing.md +167 -0
  18. package/reference/typegen.md +64 -0
  19. package/src/api/cache.ts +80 -0
  20. package/src/api/client-cache.ts +9 -0
  21. package/src/api/client-navigation.ts +279 -0
  22. package/src/api/dynamic.tsx +102 -0
  23. package/src/api/link.tsx +119 -0
  24. package/src/api/navigation.ts +198 -0
  25. package/src/api/router/events.ts +53 -0
  26. package/src/api/router/history.ts +70 -0
  27. package/src/api/router/hub.ts +194 -0
  28. package/src/api/router/policies.ts +107 -0
  29. package/src/api/router/runtime.ts +5238 -0
  30. package/src/api/router/types.ts +299 -0
  31. package/src/api/router.ts +167 -0
  32. package/src/api/server.ts +323 -0
  33. package/src/api/suspense.ts +16 -0
  34. package/src/cache/context.ts +61 -0
  35. package/src/cli/adapters/vercel-warm.ts +375 -0
  36. package/src/cli/adapters/vercel.ts +1310 -0
  37. package/src/cli/analyze-print.ts +181 -0
  38. package/src/cli/analyze.ts +328 -0
  39. package/src/cli/boot-trace.ts +29 -0
  40. package/src/cli/build.ts +3114 -0
  41. package/src/cli/dev.ts +276 -0
  42. package/src/cli/index.ts +196 -0
  43. package/src/cli/named-bin.ts +119 -0
  44. package/src/cli/serve-ui.ts +160 -0
  45. package/src/cli/start.ts +1425 -0
  46. package/src/client/build.ts +2136 -0
  47. package/src/client/chunk-fold.ts +526 -0
  48. package/src/client/entry.ts +1525 -0
  49. package/src/client/paths.ts +22 -0
  50. package/src/client/prebuilt.ts +621 -0
  51. package/src/client/profile.ts +75 -0
  52. package/src/client/react-compiler.ts +94 -0
  53. package/src/client/reference-stub.ts +145 -0
  54. package/src/client/reference.ts +47 -0
  55. package/src/compat/actions/action-client.ts +531 -0
  56. package/src/compat/actions/action-dispatch.ts +676 -0
  57. package/src/compat/actions/action-router.ts +40 -0
  58. package/src/compat/actions/action-shared.ts +95 -0
  59. package/src/compat/actions/client-plugin.ts +135 -0
  60. package/src/compat/actions/client-stub.ts +65 -0
  61. package/src/compat/actions/config.ts +164 -0
  62. package/src/compat/actions/detect.ts +208 -0
  63. package/src/compat/actions/discovery.ts +244 -0
  64. package/src/compat/actions/early-submit.ts +40 -0
  65. package/src/compat/actions/endpoint.ts +602 -0
  66. package/src/compat/actions/flight.ts +52 -0
  67. package/src/compat/actions/form-state.ts +73 -0
  68. package/src/compat/actions/hoist.ts +485 -0
  69. package/src/compat/actions/ids.ts +39 -0
  70. package/src/compat/actions/index.ts +41 -0
  71. package/src/compat/actions/instances.ts +144 -0
  72. package/src/compat/actions/origin.ts +109 -0
  73. package/src/compat/actions/protocol.ts +125 -0
  74. package/src/compat/actions/registry.ts +74 -0
  75. package/src/compat/actions/rewrite.ts +282 -0
  76. package/src/compat/actions/serve.ts +414 -0
  77. package/src/compat/actions/server-tag.ts +21 -0
  78. package/src/compat/actions/unrecognized-error.ts +30 -0
  79. package/src/compat/adapter/build-complete.ts +257 -0
  80. package/src/compat/bundler/bun-externals.ts +53 -0
  81. package/src/compat/bundler/cjs-exports.ts +542 -0
  82. package/src/compat/bundler/config.ts +363 -0
  83. package/src/compat/bundler/externals.ts +34 -0
  84. package/src/compat/bundler/import-meta-url.ts +60 -0
  85. package/src/compat/bundler/modularize-imports.ts +119 -0
  86. package/src/compat/bundler/new-url-asset.ts +87 -0
  87. package/src/compat/bundler/optimize-package-imports.ts +273 -0
  88. package/src/compat/bundler/polyfill.ts +88 -0
  89. package/src/compat/bundler/react-compiler.ts +61 -0
  90. package/src/compat/bundler/react-profiler.tsx +25 -0
  91. package/src/compat/bundler/relay-transform.ts +116 -0
  92. package/src/compat/bundler/require-context.ts +281 -0
  93. package/src/compat/bundler/resolve-extensions.ts +75 -0
  94. package/src/compat/bundler/source-cache.ts +61 -0
  95. package/src/compat/bundler/static-imports.ts +25 -0
  96. package/src/compat/bundler/symlink-imports.ts +119 -0
  97. package/src/compat/bundler/tsconfig-paths.ts +50 -0
  98. package/src/compat/bundler/wasm.ts +153 -0
  99. package/src/compat/bundler/webpack-loaders.ts +685 -0
  100. package/src/compat/bundler/worker.ts +278 -0
  101. package/src/compat/cache/build-flags.ts +81 -0
  102. package/src/compat/cache/build-prerender-errors.ts +163 -0
  103. package/src/compat/cache/custom-handler.ts +159 -0
  104. package/src/compat/cache/fetch-patch.ts +745 -0
  105. package/src/compat/cache/handler.ts +100 -0
  106. package/src/compat/cache/modern-handler.ts +275 -0
  107. package/src/compat/cache/resume-data-cache.ts +143 -0
  108. package/src/compat/cache/revalidate.ts +759 -0
  109. package/src/compat/cache/runtime-error.ts +124 -0
  110. package/src/compat/cache/use-cache-transform.ts +961 -0
  111. package/src/compat/cache/use-cache.ts +1695 -0
  112. package/src/compat/cache-control.ts +269 -0
  113. package/src/compat/client/base-path.ts +64 -0
  114. package/src/compat/client/css-order.ts +36 -0
  115. package/src/compat/client/errors/control-flow.ts +92 -0
  116. package/src/compat/client/errors/error-boundary.ts +222 -0
  117. package/src/compat/client/errors/global-error.ts +238 -0
  118. package/src/compat/client/errors/install.ts +217 -0
  119. package/src/compat/client/errors/lazy.ts +53 -0
  120. package/src/compat/client/errors/primitive-throw.ts +126 -0
  121. package/src/compat/client/errors/soft-refresh.ts +14 -0
  122. package/src/compat/client/link-status.ts +86 -0
  123. package/src/compat/client/nav-compat-runtime.ts +57 -0
  124. package/src/compat/client/nav-compat.ts +42 -0
  125. package/src/compat/client/navigation-scroll.ts +154 -0
  126. package/src/compat/client/optimistic-routing.ts +206 -0
  127. package/src/compat/client/prefetch-cache.ts +111 -0
  128. package/src/compat/client/route-announcer.ts +72 -0
  129. package/src/compat/client/segment-cache-policy.ts +159 -0
  130. package/src/compat/client/segment-cache.ts +1077 -0
  131. package/src/compat/client/segment-prefetch.ts +375 -0
  132. package/src/compat/client/trailing-slash.ts +24 -0
  133. package/src/compat/css/chunking.ts +254 -0
  134. package/src/compat/css/inline-css.ts +73 -0
  135. package/src/compat/css/lightningcss.ts +90 -0
  136. package/src/compat/css/modules.ts +373 -0
  137. package/src/compat/css/nonce.ts +30 -0
  138. package/src/compat/css/sass-plugin.ts +65 -0
  139. package/src/compat/css/sass.ts +392 -0
  140. package/src/compat/css/styled-jsx-runtime.ts +80 -0
  141. package/src/compat/css/styled-jsx.ts +49 -0
  142. package/src/compat/edge-runtime.ts +71 -0
  143. package/src/compat/export/client.ts +112 -0
  144. package/src/compat/export/index.ts +272 -0
  145. package/src/compat/export/standalone.ts +207 -0
  146. package/src/compat/image-optimizer/cache.ts +119 -0
  147. package/src/compat/image-optimizer/detect.ts +143 -0
  148. package/src/compat/image-optimizer/index.ts +601 -0
  149. package/src/compat/image-optimizer/source.ts +243 -0
  150. package/src/compat/index.ts +458 -0
  151. package/src/compat/lifecycle/after-scope.ts +86 -0
  152. package/src/compat/lifecycle/after.ts +173 -0
  153. package/src/compat/lifecycle/error-funnel.ts +306 -0
  154. package/src/compat/lifecycle/error-serialize.ts +87 -0
  155. package/src/compat/lifecycle/error-ui.ts +167 -0
  156. package/src/compat/lifecycle/instrumentation-client.ts +138 -0
  157. package/src/compat/lifecycle/instrumentation.ts +277 -0
  158. package/src/compat/lifecycle/node-console.ts +19 -0
  159. package/src/compat/lifecycle/testmode.ts +263 -0
  160. package/src/compat/mdx/compile.ts +219 -0
  161. package/src/compat/mdx/next-mdx-stub.ts +46 -0
  162. package/src/compat/mdx/plugin.ts +37 -0
  163. package/src/compat/metadata-route-artifacts.ts +458 -0
  164. package/src/compat/metadata.ts +295 -0
  165. package/src/compat/middleware/manifest.ts +210 -0
  166. package/src/compat/misc/action-return.ts +173 -0
  167. package/src/compat/next/cache.ts +211 -0
  168. package/src/compat/next/canonical-url.ts +35 -0
  169. package/src/compat/next/client-cache.ts +57 -0
  170. package/src/compat/next/client-navigation.ts +313 -0
  171. package/src/compat/next/client-only.ts +3 -0
  172. package/src/compat/next/client-script.tsx +215 -0
  173. package/src/compat/next/client-server.ts +39 -0
  174. package/src/compat/next/config-loader.ts +569 -0
  175. package/src/compat/next/config.ts +29 -0
  176. package/src/compat/next/constants.cjs +6 -0
  177. package/src/compat/next/constants.ts +6 -0
  178. package/src/compat/next/custom-server.ts +236 -0
  179. package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
  180. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
  181. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
  182. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
  183. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
  184. package/src/compat/next/dynamic.tsx +46 -0
  185. package/src/compat/next/error.tsx +148 -0
  186. package/src/compat/next/font/cache.ts +171 -0
  187. package/src/compat/next/font/google.ts +2 -0
  188. package/src/compat/next/font/index.ts +8 -0
  189. package/src/compat/next/font/local.ts +5 -0
  190. package/src/compat/next/font/runtime-client.ts +71 -0
  191. package/src/compat/next/font/runtime.ts +974 -0
  192. package/src/compat/next/font/shared.ts +281 -0
  193. package/src/compat/next/form.tsx +156 -0
  194. package/src/compat/next/head.tsx +10 -0
  195. package/src/compat/next/headers.ts +247 -0
  196. package/src/compat/next/image/config.ts +196 -0
  197. package/src/compat/next/image/optimizer.ts +96 -0
  198. package/src/compat/next/image/patterns.ts +103 -0
  199. package/src/compat/next/image/shared.ts +141 -0
  200. package/src/compat/next/image/static-metadata.ts +283 -0
  201. package/src/compat/next/image/validate.ts +269 -0
  202. package/src/compat/next/image-client.tsx +215 -0
  203. package/src/compat/next/image-props.ts +575 -0
  204. package/src/compat/next/image-usage.ts +102 -0
  205. package/src/compat/next/image.tsx +56 -0
  206. package/src/compat/next/index.ts +1 -0
  207. package/src/compat/next/legacy-image.tsx +97 -0
  208. package/src/compat/next/link-usage.ts +29 -0
  209. package/src/compat/next/link-validation-transform.ts +200 -0
  210. package/src/compat/next/link.tsx +466 -0
  211. package/src/compat/next/navigation.cjs +21 -0
  212. package/src/compat/next/navigation.ts +188 -0
  213. package/src/compat/next/offline.ts +51 -0
  214. package/src/compat/next/og.ts +324 -0
  215. package/src/compat/next/optimistic-route-state.ts +188 -0
  216. package/src/compat/next/preferred-region.ts +39 -0
  217. package/src/compat/next/redirects.ts +131 -0
  218. package/src/compat/next/resource-hints.ts +136 -0
  219. package/src/compat/next/rewrites.ts +350 -0
  220. package/src/compat/next/root-params.ts +142 -0
  221. package/src/compat/next/router.cjs +49 -0
  222. package/src/compat/next/router.ts +143 -0
  223. package/src/compat/next/script.tsx +355 -0
  224. package/src/compat/next/server-only.ts +3 -0
  225. package/src/compat/next/server.ts +28 -0
  226. package/src/compat/next/svgr.ts +58 -0
  227. package/src/compat/next/telemetry.ts +77 -0
  228. package/src/compat/next/user-agent.ts +100 -0
  229. package/src/compat/next/web-vitals.ts +56 -0
  230. package/src/compat/otel/api.ts +95 -0
  231. package/src/compat/otel/client-trace-metadata.ts +71 -0
  232. package/src/compat/otel/fetch-span.ts +77 -0
  233. package/src/compat/otel/tracer.ts +944 -0
  234. package/src/compat/pages/client-plugin.ts +108 -0
  235. package/src/compat/pages/index.ts +527 -0
  236. package/src/compat/pages/router-state.ts +94 -0
  237. package/src/compat/ppr/io.ts +38 -0
  238. package/src/compat/ppr/missing-root-params.ts +105 -0
  239. package/src/compat/ppr/root-params-scan.ts +164 -0
  240. package/src/compat/ppr/root-params-transform.ts +75 -0
  241. package/src/compat/ppr/root-params.ts +129 -0
  242. package/src/compat/ppr/segment-config-incompat.ts +34 -0
  243. package/src/compat/protocol.ts +202 -0
  244. package/src/compat/react/client.ts +59 -0
  245. package/src/compat/react/compiler-runtime.ts +60 -0
  246. package/src/compat/react/dom-client.ts +115 -0
  247. package/src/compat/react/dom-react-server.ts +20 -0
  248. package/src/compat/react/dom-server.ts +40 -0
  249. package/src/compat/react/dom.ts +154 -0
  250. package/src/compat/react/preact.ts +522 -0
  251. package/src/compat/react/react-server.ts +84 -0
  252. package/src/compat/react/router-shim.ts +26 -0
  253. package/src/compat/react/server-component-use.ts +48 -0
  254. package/src/compat/react/server-inserted-html.ts +87 -0
  255. package/src/compat/react/server.ts +156 -0
  256. package/src/compat/react/view-transition.ts +60 -0
  257. package/src/compat/register/actions.ts +875 -0
  258. package/src/compat/register/boot.ts +141 -0
  259. package/src/compat/register/build-tier.ts +11 -0
  260. package/src/compat/register/build.ts +182 -0
  261. package/src/compat/register/bundler.ts +587 -0
  262. package/src/compat/register/cache.ts +85 -0
  263. package/src/compat/register/client-errors.ts +18 -0
  264. package/src/compat/register/config.ts +17 -0
  265. package/src/compat/register/css-extras.ts +120 -0
  266. package/src/compat/register/edge-runtime.ts +6 -0
  267. package/src/compat/register/errors.ts +46 -0
  268. package/src/compat/register/export.ts +23 -0
  269. package/src/compat/register/font.ts +36 -0
  270. package/src/compat/register/hooks.ts +34 -0
  271. package/src/compat/register/image.ts +133 -0
  272. package/src/compat/register/index.ts +111 -0
  273. package/src/compat/register/instrumentation-client.ts +35 -0
  274. package/src/compat/register/lifecycle.ts +86 -0
  275. package/src/compat/register/mdx.ts +48 -0
  276. package/src/compat/register/middleware.ts +36 -0
  277. package/src/compat/register/misc.ts +44 -0
  278. package/src/compat/register/otel.ts +288 -0
  279. package/src/compat/register/pages-api.ts +473 -0
  280. package/src/compat/register/ppr.ts +56 -0
  281. package/src/compat/register/protocol.ts +57 -0
  282. package/src/compat/register/proxy.ts +127 -0
  283. package/src/compat/register/render.ts +268 -0
  284. package/src/compat/register/routing.ts +410 -0
  285. package/src/compat/register/segment.ts +1903 -0
  286. package/src/compat/register/static-image.ts +21 -0
  287. package/src/compat/register/typed-routes.ts +35 -0
  288. package/src/compat/register/usecache.ts +131 -0
  289. package/src/compat/register/validation.ts +56 -0
  290. package/src/compat/segment/loading-boundary.ts +113 -0
  291. package/src/compat/segment/page-slot.ts +200 -0
  292. package/src/compat/segment/tree.ts +481 -0
  293. package/src/compat/segment/vary-key.ts +102 -0
  294. package/src/compat/segment/vary-params.ts +551 -0
  295. package/src/compat/static-params.ts +33 -0
  296. package/src/compat/tsconfig-defaults.ts +301 -0
  297. package/src/compat/typecheck/index.ts +1481 -0
  298. package/src/compat/typecheck/worker.ts +26 -0
  299. package/src/compat/typed-routes/index.ts +92 -0
  300. package/src/compat/typed-routes/manifest.ts +356 -0
  301. package/src/compat/typed-routes/typegen.ts +566 -0
  302. package/src/compat/validation/errors.ts +159 -0
  303. package/src/compat/validation/index.ts +1770 -0
  304. package/src/compat/validation/prerender-diagnostics.ts +1508 -0
  305. package/src/compat-bootstrap.ts +67 -0
  306. package/src/config.ts +218 -0
  307. package/src/css/build.ts +697 -0
  308. package/src/css/index.ts +2 -0
  309. package/src/css/postcss.ts +236 -0
  310. package/src/css/worker.ts +34 -0
  311. package/src/dev/client-actions.ts +35 -0
  312. package/src/dev/client-chunk-store.ts +92 -0
  313. package/src/dev/client-key-cache.ts +178 -0
  314. package/src/dev/global-css-cache.ts +212 -0
  315. package/src/dev/imports.ts +2430 -0
  316. package/src/dev/module-cache.ts +721 -0
  317. package/src/dev/module-generations.ts +38 -0
  318. package/src/dev/module-transform.ts +188 -0
  319. package/src/dev/node-module-bundle-cache.ts +63 -0
  320. package/src/dev/restart-cache.ts +10 -0
  321. package/src/dev/route-bundle-key-cache.ts +154 -0
  322. package/src/dev/route-facts-cache.ts +223 -0
  323. package/src/dev/server.ts +1710 -0
  324. package/src/dynamic/source.ts +307 -0
  325. package/src/dynamic/tree-shake.ts +262 -0
  326. package/src/env.ts +92 -0
  327. package/src/extensions.ts +1898 -0
  328. package/src/index.ts +34 -0
  329. package/src/internal.ts +43 -0
  330. package/src/islands/boundary-error.ts +8 -0
  331. package/src/islands/static-children.ts +37 -0
  332. package/src/islands/static-slots.ts +106 -0
  333. package/src/ppr-postpone.ts +24 -0
  334. package/src/ppr.ts +784 -0
  335. package/src/proxy.ts +752 -0
  336. package/src/render/hooks.ts +384 -0
  337. package/src/render/index.ts +1 -0
  338. package/src/render/island-context.ts +47 -0
  339. package/src/render/metadata.ts +857 -0
  340. package/src/render/renderer.ts +7391 -0
  341. package/src/render/resource-hints.ts +44 -0
  342. package/src/render/slots.tsx +679 -0
  343. package/src/request/context.ts +396 -0
  344. package/src/resolve/engine.ts +219 -0
  345. package/src/resolve/imports.ts +1104 -0
  346. package/src/resolve/scan-facts.ts +474 -0
  347. package/src/resolve/source-text.ts +86 -0
  348. package/src/routing/forwarded.ts +41 -0
  349. package/src/routing/handler.ts +271 -0
  350. package/src/routing/href.ts +203 -0
  351. package/src/routing/metadata.ts +1018 -0
  352. package/src/routing/request-runtime.ts +43 -0
  353. package/src/routing/routes.ts +2560 -0
  354. package/src/routing/slots.ts +432 -0
  355. package/src/runtime/server.ts +3453 -0
  356. package/src/runtime/vendor.ts +1160 -0
  357. package/src/style-modules.d.ts +9 -0
  358. package/src/typegen.ts +151 -0
  359. package/src/types.ts +725 -0
  360. package/src/utils/ansi.ts +9 -0
  361. package/src/utils/content-type.ts +31 -0
  362. package/src/utils/decode.ts +7 -0
  363. package/src/utils/dev-profile.ts +31 -0
  364. package/src/utils/error-log.ts +29 -0
  365. package/src/utils/fs-cache.ts +31 -0
  366. package/src/utils/fs.ts +119 -0
  367. package/src/utils/html.ts +46 -0
  368. package/src/utils/serialize.ts +378 -0
  369. package/src/utils/source.ts +35 -0
  370. package/src/utils/verbose.ts +39 -0
  371. package/tsconfig.json +10 -0
@@ -0,0 +1,301 @@
1
+ // tsconfig.json configuration defaults (COMPAT).
2
+ //
3
+ // Mirrors Next's `writeConfigurationDefaults`: on build, missing suggested options are added and
4
+ // mandatory options are forced into the app's tsconfig.json, logging the same "suggested values" /
5
+ // "mandatory changes" summaries the suites assert on. Notably, when the app uses `module: "preserve"`,
6
+ // `moduleResolution`, `esModuleInterop` and `resolveJsonModule` are implied and must NOT be added or
7
+ // mentioned.
8
+ //
9
+ // Deliberate deviations from Next, all no-op-preserving: configs with comments (JSONC) are left untouched
10
+ // (bailing is safe because a failed parse only skips the rewrite), and the test-glob exclusions are not
11
+ // applied.
12
+ //
13
+ // When no tsconfig.json exists but the project contains TypeScript sources, one is created from scratch.
14
+
15
+ import { existsSync, readdirSync } from 'node:fs';
16
+ import { readFile, writeFile } from 'node:fs/promises';
17
+ import { createRequire } from 'node:module';
18
+ import path from 'node:path';
19
+ import type { ResolvedConfig } from '../config';
20
+ import { getNextConfig } from './next/config-loader';
21
+
22
+ interface SuggestedOption {
23
+ suggested: unknown;
24
+ reason?: string;
25
+ }
26
+ interface RequiredOption {
27
+ parsedValue?: unknown;
28
+ parsedValues?: unknown[];
29
+ value: unknown;
30
+ reason: string;
31
+ }
32
+ type DesiredOption = SuggestedOption | RequiredOption;
33
+
34
+ interface TsconfigShape {
35
+ compilerOptions?: Record<string, unknown>;
36
+ include?: unknown;
37
+ exclude?: unknown;
38
+ [key: string]: unknown;
39
+ }
40
+
41
+ // Whether the project carries any .ts/.tsx source (bounded walk skipping
42
+ // node_modules/dot-dirs) — Next's TS-detection gate for first-time setup.
43
+ function hasTypescriptSources(root: string, depth = 0): boolean {
44
+ if (depth > 6) return false;
45
+ let entries: import('node:fs').Dirent[];
46
+ try {
47
+ entries = readdirSync(root, { withFileTypes: true });
48
+ } catch {
49
+ return false;
50
+ }
51
+ for (const entry of entries) {
52
+ if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
53
+ if (entry.isFile() && /\.(ts|tsx|mts|cts)$/.test(entry.name) && !entry.name.endsWith('.d.ts')) {
54
+ return true;
55
+ }
56
+ if (entry.isDirectory() && hasTypescriptSources(path.join(root, entry.name), depth + 1)) {
57
+ return true;
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+
63
+ // The app's typescript version, else pnext's own. Read from package.json rather
64
+ // than `ts.version` so the 8 MB compiler never loads for a version string —
65
+ // nothing outside the typecheck step should pull `typescript` in at all.
66
+ function appTypescriptVersion(root: string): string {
67
+ for (const base of [root, import.meta.dirname]) {
68
+ try {
69
+ const require = createRequire(path.join(base, 'noop.js'));
70
+ const pkg = require('typescript/package.json') as { version?: string };
71
+ if (typeof pkg.version === 'string') return pkg.version;
72
+ } catch {
73
+ // keep looking
74
+ }
75
+ }
76
+ return '5.9.0';
77
+ }
78
+
79
+ function versionGte(version: string, major: number, minor: number): boolean {
80
+ const [maj = 0, min = 0] = version.split('.').map(part => Number.parseInt(part, 10));
81
+ return maj > major || (maj === major && min >= minor);
82
+ }
83
+
84
+ function getDesiredCompilerOptions(
85
+ typescriptVersion: string,
86
+ userTsConfig: TsconfigShape,
87
+ ): Record<string, DesiredOption> {
88
+ const configuredModule =
89
+ typeof userTsConfig.compilerOptions?.module === 'string'
90
+ ? userTsConfig.compilerOptions.module.toLowerCase()
91
+ : undefined;
92
+ const preferBundlerResolution =
93
+ versionGte(typescriptVersion, 5, 0) &&
94
+ configuredModule !== 'commonjs' &&
95
+ configuredModule !== 'amd';
96
+ const modulePreserve = versionGte(typescriptVersion, 5, 4) && configuredModule === 'preserve';
97
+
98
+ return {
99
+ target: {
100
+ suggested: 'ES2017',
101
+ reason: 'For top-level `await`. Note: Next.js only polyfills for the esmodules target.',
102
+ },
103
+ lib: { suggested: ['dom', 'dom.iterable', 'esnext'] },
104
+ allowJs: { suggested: true },
105
+ skipLibCheck: { suggested: true },
106
+ strict: { suggested: false },
107
+ noEmit: { suggested: true },
108
+ incremental: { suggested: true },
109
+ module: {
110
+ parsedValue: 'esnext',
111
+ parsedValues: [
112
+ ...(versionGte(typescriptVersion, 5, 4) ? ['preserve'] : []),
113
+ 'es2020',
114
+ 'esnext',
115
+ 'commonjs',
116
+ 'amd',
117
+ 'nodenext',
118
+ 'node16',
119
+ ],
120
+ value: 'esnext',
121
+ reason: 'for dynamic import() support',
122
+ },
123
+ // `module: "preserve"` implies moduleResolution: bundler, esModuleInterop
124
+ // and resolveJsonModule — the app does not need (and must not be told to
125
+ // add) any of them.
126
+ ...(modulePreserve
127
+ ? {}
128
+ : {
129
+ esModuleInterop: { value: true, reason: 'requirement for SWC / babel' },
130
+ moduleResolution: {
131
+ parsedValue: preferBundlerResolution ? 'bundler' : 'node',
132
+ parsedValues: preferBundlerResolution
133
+ ? ['node16', 'nodenext', 'bundler']
134
+ : ['node', 'node12', 'node16', 'nodenext'],
135
+ value: preferBundlerResolution ? 'bundler' : 'node',
136
+ reason: preferBundlerResolution
137
+ ? 'to match modern bundler resolution'
138
+ : 'to match webpack resolution',
139
+ },
140
+ resolveJsonModule: { value: true, reason: 'to match webpack resolution' },
141
+ }),
142
+ ...(userTsConfig.compilerOptions?.verbatimModuleSyntax === true
143
+ ? {}
144
+ : { isolatedModules: { value: true, reason: 'requirement for SWC / Babel' } }),
145
+ jsx: {
146
+ parsedValue: 'react-jsx',
147
+ value: 'react-jsx',
148
+ reason: 'next.js uses the React automatic runtime',
149
+ },
150
+ };
151
+ }
152
+
153
+ // `<distDir>/types/**` plus the dev-mode variant, shortest first (Next sorts by
154
+ // length so dev/build runs produce identical include arrays).
155
+ function typeDefinitionGlobPatterns(distDir: string): string[] {
156
+ return [`${distDir}/types/**/*.ts`, `${distDir}/dev/types/**/*.ts`].sort(
157
+ (a, b) => a.length - b.length,
158
+ );
159
+ }
160
+
161
+ /**
162
+ * Patch the app's tsconfig.json with Next's suggested/mandatory compiler
163
+ * options and log the changes the way `next build` does. No-op when the config
164
+ * is absent, extends another config, is unparseable, or already satisfies
165
+ * every requirement.
166
+ */
167
+ export async function writeTsconfigDefaults(config: ResolvedConfig): Promise<void> {
168
+ const tsConfigPath = path.join(config.root, 'tsconfig.json');
169
+ let isFirstTimeSetup = false;
170
+ if (!existsSync(tsConfigPath)) {
171
+ if (!hasTypescriptSources(config.root)) return;
172
+ isFirstTimeSetup = true;
173
+ await writeFile(tsConfigPath, '{}\n');
174
+ }
175
+
176
+ let userTsConfig: TsconfigShape;
177
+ try {
178
+ userTsConfig = JSON.parse(await readFile(tsConfigPath, 'utf8')) as TsconfigShape;
179
+ } catch {
180
+ return; // JSONC / invalid — leave the user's file alone
181
+ }
182
+ if (userTsConfig === null || typeof userTsConfig !== 'object') return;
183
+ // Automatic setup would clobber inherited options; Next bails here too.
184
+ if ('extends' in userTsConfig || 'references' in userTsConfig) return;
185
+
186
+ if (userTsConfig.compilerOptions == null) userTsConfig.compilerOptions = {};
187
+ const compilerOptions = userTsConfig.compilerOptions;
188
+
189
+ const desired = getDesiredCompilerOptions(appTypescriptVersion(config.root), userTsConfig);
190
+
191
+ const suggestedActions: string[] = [];
192
+ const requiredActions: string[] = [];
193
+ for (const [optionKey, check] of Object.entries(desired)) {
194
+ if ('suggested' in check) {
195
+ if (!(optionKey in compilerOptions)) {
196
+ compilerOptions[optionKey] = check.suggested;
197
+ suggestedActions.push(
198
+ `${optionKey} was set to ${JSON.stringify(check.suggested)}` +
199
+ (check.reason ? ` (${check.reason})` : ''),
200
+ );
201
+ }
202
+ continue;
203
+ }
204
+ let existingValue = compilerOptions[optionKey];
205
+ if (typeof existingValue === 'string') existingValue = existingValue.toLowerCase();
206
+ const satisfied = check.parsedValues
207
+ ? check.parsedValues.includes(existingValue)
208
+ : (check.parsedValue ?? check.value) === existingValue;
209
+ if (!satisfied) {
210
+ compilerOptions[optionKey] = check.value;
211
+ requiredActions.push(`${optionKey} was set to ${String(check.value)} (${check.reason})`);
212
+ }
213
+ }
214
+
215
+ const hasAppDir =
216
+ existsSync(path.join(config.root, 'app')) || existsSync(path.join(config.root, 'src', 'app'));
217
+ const hasPagesDir =
218
+ existsSync(path.join(config.root, 'pages')) ||
219
+ existsSync(path.join(config.root, 'src', 'pages'));
220
+ // eslint-disable-next-line turbo/no-undeclared-env-vars
221
+ const strictRouteTypes = process.env.__NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES === 'true';
222
+ const distDir =
223
+ typeof getNextConfig().distDir === 'string' ? (getNextConfig().distDir as string) : '.next';
224
+ const nextTypes = typeDefinitionGlobPatterns(distDir);
225
+
226
+ if (!('include' in userTsConfig)) {
227
+ const defaultInclude =
228
+ hasAppDir && !strictRouteTypes
229
+ ? ['next-env.d.ts', ...nextTypes, '**/*.mts', '**/*.ts', '**/*.tsx']
230
+ : ['next-env.d.ts', '**/*.mts', '**/*.ts', '**/*.tsx'];
231
+ userTsConfig.include = defaultInclude;
232
+ suggestedActions.push(
233
+ `include was set to [${defaultInclude.map(type => `'${type}'`).join(', ')}]`,
234
+ );
235
+ } else if (hasAppDir && !strictRouteTypes && Array.isArray(userTsConfig.include)) {
236
+ for (const type of nextTypes) {
237
+ if (!userTsConfig.include.includes(type)) {
238
+ userTsConfig.include.push(type);
239
+ suggestedActions.push(`include was updated to add '${type}'`);
240
+ }
241
+ }
242
+ }
243
+
244
+ if (hasAppDir) {
245
+ const plugins = [
246
+ ...(Array.isArray(userTsConfig.plugins) ? (userTsConfig.plugins as unknown[]) : []),
247
+ ...(Array.isArray(compilerOptions.plugins) ? (compilerOptions.plugins as unknown[]) : []),
248
+ ] as { name?: string }[];
249
+ if (!plugins.some(plugin => plugin?.name === 'next')) {
250
+ if (!Array.isArray(compilerOptions.plugins)) compilerOptions.plugins = [];
251
+ (compilerOptions.plugins as unknown[]).push({ name: 'next' });
252
+ suggestedActions.push(`plugins was updated to add { name: 'next' }`);
253
+ }
254
+ if (
255
+ hasPagesDir &&
256
+ !compilerOptions.strict &&
257
+ !('strictNullChecks' in compilerOptions)
258
+ ) {
259
+ compilerOptions.strictNullChecks = true;
260
+ suggestedActions.push('strictNullChecks was set to true');
261
+ }
262
+ }
263
+
264
+ if (!('exclude' in userTsConfig)) {
265
+ userTsConfig.exclude = ['node_modules'];
266
+ suggestedActions.push(`exclude was set to ['node_modules']`);
267
+ }
268
+
269
+ if (suggestedActions.length === 0 && requiredActions.length === 0) return;
270
+
271
+ await writeFile(tsConfigPath, `${JSON.stringify(userTsConfig, null, 2)}\n`);
272
+
273
+ if (isFirstTimeSetup) {
274
+ console.log(
275
+ '\nWe detected TypeScript in your project and created a tsconfig.json file for you.',
276
+ );
277
+ return;
278
+ }
279
+
280
+ const lines = [
281
+ '',
282
+ `We detected TypeScript in your project and reconfigured your tsconfig.json file for you.${
283
+ compilerOptions.strict ? '' : ' Strict-mode is set to false by default.'
284
+ }`,
285
+ ];
286
+ if (suggestedActions.length > 0) {
287
+ lines.push(
288
+ `The following suggested values were added to your tsconfig.json. These values can be changed to fit your project's needs:\n`,
289
+ ...suggestedActions.map(action => `\t- ${action}`),
290
+ '',
291
+ );
292
+ }
293
+ if (requiredActions.length > 0) {
294
+ lines.push(
295
+ `The following mandatory changes were made to your tsconfig.json:\n`,
296
+ ...requiredActions.map(action => `\t- ${action}`),
297
+ '',
298
+ );
299
+ }
300
+ console.log(lines.join('\n'));
301
+ }