@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
@@ -4,93 +4,92 @@
4
4
  // pnext.config.ts, .gitignore, next-env.d.ts). Application source is never
5
5
  // rewritten: it is scanned and reported so the user stays in control.
6
6
 
7
- import { existsSync } from 'node:fs';
8
- import { appendFile, readFile, rm, writeFile } from 'node:fs/promises';
9
- import path from 'node:path';
10
- import { bold } from '../../utils/ansi';
11
- import { migratePackageJson, readPackageJson } from './package-json';
12
- import { emptyResult, printHeader, printResult, type MigrationResult } from './report';
13
- import { scanSources } from './scan';
14
- import { withSpinner } from './spinner';
15
- import { migrateTsconfig } from './tsconfig';
7
+ import { existsSync } from 'node:fs'
8
+ import { appendFile, readFile, rm, writeFile } from 'node:fs/promises'
9
+ import path from 'node:path'
10
+ import { bold } from '../../utils/ansi'
11
+ import { migratePackageJson, readPackageJson } from './package-json'
12
+ import { emptyResult, printHeader, printResult, type MigrationResult } from './report'
13
+ import { scanSources } from './scan'
14
+ import { withSpinner } from './spinner'
15
+ import { migrateTsconfig } from './tsconfig'
16
16
 
17
- const NEXT_CONFIG_FILES = ['next.config.ts', 'next.config.js', 'next.config.mjs', 'next.config.cjs'];
18
- const PNEXT_CONFIG_FILES = ['pnext.config.ts', 'pnext.config.js', 'pnext.config.mjs'];
17
+ const NEXT_CONFIG_FILES = ['next.config.ts', 'next.config.js', 'next.config.mjs', 'next.config.cjs']
18
+ const PNEXT_CONFIG_FILES = ['pnext.config.ts', 'pnext.config.js', 'pnext.config.mjs']
19
19
 
20
20
  export async function migrateApp(directory: string | undefined, options: { dryRun: boolean }) {
21
- const root = path.resolve(directory ?? process.cwd());
22
- const pkg = await readPackageJson(root);
21
+ const root = path.resolve(directory ?? process.cwd())
22
+ const pkg = await readPackageJson(root)
23
23
  const hasNextDependency = Boolean(
24
- pkg &&
25
- (hasDependency(pkg.dependencies, 'next') || hasDependency(pkg.devDependencies, 'next')),
26
- );
27
- const hasNextConfig = NEXT_CONFIG_FILES.some(name => existsSync(path.join(root, name)));
24
+ pkg && (hasDependency(pkg.dependencies, 'next') || hasDependency(pkg.devDependencies, 'next')),
25
+ )
26
+ const hasNextConfig = NEXT_CONFIG_FILES.some(name => existsSync(path.join(root, name)))
28
27
 
29
28
  if (!hasNextDependency && !hasNextConfig) {
30
29
  console.error(
31
30
  `${bold('Not a Next.js app')}: ${root}\n` +
32
31
  ` - ${pkg ? 'package.json has no "next" dependency' : 'no readable package.json'}\n` +
33
32
  ' - no next.config.{ts,js,mjs,cjs}',
34
- );
35
- return 1;
33
+ )
34
+ return 1
36
35
  }
37
36
 
38
- printHeader(root, options.dryRun);
39
- const result = emptyResult();
40
- if (pkg) await migratePackageJson(root, pkg, result, options.dryRun);
41
- await createPnextConfig(root, result, options.dryRun);
42
- await migrateTsconfig(root, result, options.dryRun);
43
- await removeNextEnv(root, result, options.dryRun);
44
- await updateGitignore(root, result, options.dryRun);
45
- await withSpinner('Scanning sources ...', () => scanSources(root, result));
37
+ printHeader(root, options.dryRun)
38
+ const result = emptyResult()
39
+ if (pkg) await migratePackageJson(root, pkg, result, options.dryRun)
40
+ await createPnextConfig(root, result, options.dryRun)
41
+ await migrateTsconfig(root, result, options.dryRun)
42
+ await removeNextEnv(root, result, options.dryRun)
43
+ await updateGitignore(root, result, options.dryRun)
44
+ await withSpinner('Scanning sources ...', () => scanSources(root, result))
46
45
 
47
- printResult(result, { install: installCommand(root) });
48
- return 0;
46
+ printResult(result, { install: installCommand(root) })
47
+ return 0
49
48
  }
50
49
 
51
50
  async function createPnextConfig(root: string, result: MigrationResult, dryRun: boolean) {
52
- const existing = PNEXT_CONFIG_FILES.find(name => existsSync(path.join(root, name)));
51
+ const existing = PNEXT_CONFIG_FILES.find(name => existsSync(path.join(root, name)))
53
52
  if (existing) {
54
53
  result.reports.push({
55
54
  title: `${existing} already exists`,
56
55
  detail: 'Make sure it sets compat: { next: true }. See reference/compat.md.',
57
- });
58
- return;
56
+ })
57
+ return
59
58
  }
60
59
  if (!dryRun) {
61
60
  await writeFile(
62
61
  path.join(root, 'pnext.config.ts'),
63
62
  'export default { compat: { next: true } };\n',
64
- );
63
+ )
65
64
  }
66
- result.edits.push({ file: 'pnext.config.ts', description: 'created with compat.next enabled' });
65
+ result.edits.push({ file: 'pnext.config.ts', description: 'created with compat.next enabled' })
67
66
  }
68
67
 
69
68
  async function removeNextEnv(root: string, result: MigrationResult, dryRun: boolean) {
70
- const file = path.join(root, 'next-env.d.ts');
71
- if (!existsSync(file)) return;
72
- if (!dryRun) await rm(file);
73
- result.edits.push({ file: 'next-env.d.ts', description: 'deleted' });
69
+ const file = path.join(root, 'next-env.d.ts')
70
+ if (!existsSync(file)) return
71
+ if (!dryRun) await rm(file)
72
+ result.edits.push({ file: 'next-env.d.ts', description: 'deleted' })
74
73
  }
75
74
 
76
75
  async function updateGitignore(root: string, result: MigrationResult, dryRun: boolean) {
77
- const file = path.join(root, '.gitignore');
78
- if (!existsSync(file)) return;
79
- const text = await readFile(file, 'utf8');
80
- if (text.split(/\r?\n/).some(line => line.trim() === '.pnext/')) return;
81
- if (!dryRun) await appendFile(file, `${text.endsWith('\n') || text === '' ? '' : '\n'}.pnext/\n`);
82
- result.edits.push({ file: '.gitignore', description: 'appended .pnext/' });
76
+ const file = path.join(root, '.gitignore')
77
+ if (!existsSync(file)) return
78
+ const text = await readFile(file, 'utf8')
79
+ if (text.split(/\r?\n/).some(line => line.trim() === '.pnext/')) return
80
+ if (!dryRun) await appendFile(file, `${text.endsWith('\n') || text === '' ? '' : '\n'}.pnext/\n`)
81
+ result.edits.push({ file: '.gitignore', description: 'appended .pnext/' })
83
82
  }
84
83
 
85
84
  function installCommand(root: string) {
86
85
  if (existsSync(path.join(root, 'bun.lock')) || existsSync(path.join(root, 'bun.lockb'))) {
87
- return 'bun install';
86
+ return 'bun install'
88
87
  }
89
- if (existsSync(path.join(root, 'pnpm-lock.yaml'))) return 'pnpm install';
90
- if (existsSync(path.join(root, 'yarn.lock'))) return 'yarn';
91
- return 'npm install';
88
+ if (existsSync(path.join(root, 'pnpm-lock.yaml'))) return 'pnpm install'
89
+ if (existsSync(path.join(root, 'yarn.lock'))) return 'yarn'
90
+ return 'npm install'
92
91
  }
93
92
 
94
93
  function hasDependency(bucket: unknown, name: string) {
95
- return typeof bucket === 'object' && bucket !== null && name in bucket;
94
+ return typeof bucket === 'object' && bucket !== null && name in bucket
96
95
  }
@@ -2,12 +2,12 @@
2
2
  // from regexes over application code; text checks here only classify what to
3
3
  // report and never drive a rewrite.
4
4
 
5
- import { existsSync } from 'node:fs';
6
- import { readdir, readFile } from 'node:fs/promises';
7
- import path from 'node:path';
8
- import type { MigrationResult } from './report';
5
+ import { existsSync } from 'node:fs'
6
+ import { readdir, readFile } from 'node:fs/promises'
7
+ import path from 'node:path'
8
+ import type { MigrationResult } from './report'
9
9
 
10
- const SKIP_DIRS = new Set(['node_modules', '.next', '.pnext', '.git', 'dist', 'build']);
10
+ const SKIP_DIRS = new Set(['node_modules', '.next', '.pnext', '.git', 'dist', 'build'])
11
11
  const LOADERS: Record<string, 'ts' | 'tsx' | 'js' | 'jsx'> = {
12
12
  '.ts': 'ts',
13
13
  '.tsx': 'tsx',
@@ -15,39 +15,39 @@ const LOADERS: Record<string, 'ts' | 'tsx' | 'js' | 'jsx'> = {
15
15
  '.js': 'js',
16
16
  '.mjs': 'js',
17
17
  '.cjs': 'js',
18
- };
19
- const STREAMING_APIS = ['renderToReadableStream', 'renderToPipeableStream'];
20
- const SPECIAL_PAGES = ['_app', '_document', '_error'];
18
+ }
19
+ const STREAMING_APIS = ['renderToReadableStream', 'renderToPipeableStream']
20
+ const SPECIAL_PAGES = ['_app', '_document', '_error']
21
21
 
22
22
  export async function scanSources(root: string, result: MigrationResult) {
23
- const { SHIMMED_NEXT_DIST_PATHS } = await import('../../compat');
24
- const shimmed = new Set<string>(SHIMMED_NEXT_DIST_PATHS);
25
- const deepImports: string[] = [];
26
- const streaming: string[] = [];
27
- const headImports: string[] = [];
23
+ const { SHIMMED_NEXT_DIST_PATHS } = await import('../../compat/aliases')
24
+ const shimmed = new Set<string>(SHIMMED_NEXT_DIST_PATHS)
25
+ const deepImports: string[] = []
26
+ const streaming: string[] = []
27
+ const headImports: string[] = []
28
28
 
29
29
  for await (const file of walk(root)) {
30
- const loader = LOADERS[path.extname(file)];
31
- if (!loader) continue;
32
- const text = await readFile(file, 'utf8');
33
- let specifiers: string[];
30
+ const loader = LOADERS[path.extname(file)]
31
+ if (!loader) continue
32
+ const text = await readFile(file, 'utf8')
33
+ let specifiers: string[]
34
34
  try {
35
- specifiers = new Bun.Transpiler({ loader }).scanImports(text).map(item => item.path);
35
+ specifiers = new Bun.Transpiler({ loader }).scanImports(text).map(item => item.path)
36
36
  } catch {
37
- continue; // unparseable source is the app's problem, not migrate's
37
+ continue // unparseable source is the app's problem, not migrate's
38
38
  }
39
- const relative = path.relative(root, file);
39
+ const relative = path.relative(root, file)
40
40
  for (const specifier of specifiers) {
41
41
  if (specifier.startsWith('next/dist/') && !shimmed.has(specifier.replace(/\.js$/, ''))) {
42
- deepImports.push(`${relative} → ${specifier}`);
42
+ deepImports.push(`${relative} → ${specifier}`)
43
43
  }
44
44
  if (
45
45
  /^react-dom\/server(\.|\/|$)/.test(specifier) &&
46
46
  STREAMING_APIS.some(api => text.includes(api))
47
47
  ) {
48
- streaming.push(relative);
48
+ streaming.push(relative)
49
49
  }
50
- if (specifier === 'next/head') headImports.push(relative);
50
+ if (specifier === 'next/head') headImports.push(relative)
51
51
  }
52
52
  }
53
53
 
@@ -57,7 +57,7 @@ export async function scanSources(root: string, result: MigrationResult) {
57
57
  detail:
58
58
  'Only five next/dist paths are shimmed — replace these with public APIs. See reference/compat.md ("Smaller surfaces").',
59
59
  files: deepImports,
60
- });
60
+ })
61
61
  }
62
62
  if (streaming.length > 0) {
63
63
  result.reports.push({
@@ -65,7 +65,7 @@ export async function scanSources(root: string, result: MigrationResult) {
65
65
  detail:
66
66
  'preact/compat does not provide renderToReadableStream/renderToPipeableStream — use pnext rendering instead. See reference/compat.md.',
67
67
  files: [...new Set(streaming)],
68
- });
68
+ })
69
69
  }
70
70
 
71
71
  if (headImports.length > 0) {
@@ -74,62 +74,62 @@ export async function scanSources(root: string, result: MigrationResult) {
74
74
  detail:
75
75
  'Move these tags to metadata exports (or the root layout <head>) — next/head is a silent no-op under pnext. See reference/compat.md.',
76
76
  files: [...new Set(headImports)],
77
- });
77
+ })
78
78
  }
79
79
 
80
- scanSpecialPages(root, result);
81
- await scanNextConfig(root, result);
80
+ scanSpecialPages(root, result)
81
+ await scanNextConfig(root, result)
82
82
  }
83
83
 
84
84
  function scanSpecialPages(root: string, result: MigrationResult) {
85
- const found: string[] = [];
85
+ const found: string[] = []
86
86
  for (const base of ['pages', path.join('src', 'pages')]) {
87
87
  for (const name of SPECIAL_PAGES) {
88
88
  for (const extension of ['.tsx', '.ts', '.jsx', '.js']) {
89
- const relative = path.join(base, `${name}${extension}`);
90
- if (existsSync(path.join(root, relative))) found.push(relative);
89
+ const relative = path.join(base, `${name}${extension}`)
90
+ if (existsSync(path.join(root, relative))) found.push(relative)
91
91
  }
92
92
  }
93
93
  }
94
- if (found.length === 0) return;
94
+ if (found.length === 0) return
95
95
  result.reports.push({
96
96
  title: 'pages/_app, _document and _error are ignored',
97
97
  detail:
98
98
  'Move this setup into the app-router root layout — pnext never loads these files. See reference/compat.md.',
99
99
  files: found,
100
- });
100
+ })
101
101
  }
102
102
 
103
103
  async function scanNextConfig(root: string, result: MigrationResult) {
104
104
  for (const name of ['next.config.ts', 'next.config.js', 'next.config.mjs', 'next.config.cjs']) {
105
- const file = path.join(root, name);
106
- if (!existsSync(file)) continue;
107
- const text = await readFile(file, 'utf8');
108
- if (!text.includes('webpack:') && !text.includes('webpack(')) return;
109
- const svgr = text.includes('@svgr/webpack');
105
+ const file = path.join(root, name)
106
+ if (!existsSync(file)) continue
107
+ const text = await readFile(file, 'utf8')
108
+ if (!text.includes('webpack:') && !text.includes('webpack(')) return
109
+ const svgr = text.includes('@svgr/webpack')
110
110
  result.reports.push({
111
111
  title: `${name} defines a webpack function`,
112
112
  detail: svgr
113
113
  ? 'The webpack function is never executed; SVGR is auto-detected from @svgr/webpack, so SVG imports keep working. See reference/compat.md.'
114
114
  : 'The webpack function is never executed — port any custom loaders/plugins to pnext config. See reference/compat.md.',
115
- });
116
- return;
115
+ })
116
+ return
117
117
  }
118
118
  }
119
119
 
120
120
  async function* walk(dir: string): AsyncGenerator<string> {
121
- let entries: import('node:fs').Dirent[];
121
+ let entries: import('node:fs').Dirent[]
122
122
  try {
123
- entries = await readdir(dir, { withFileTypes: true });
123
+ entries = await readdir(dir, { withFileTypes: true })
124
124
  } catch {
125
- return;
125
+ return
126
126
  }
127
127
  for (const entry of entries) {
128
128
  if (entry.isDirectory()) {
129
- if (SKIP_DIRS.has(entry.name)) continue;
130
- yield* walk(path.join(dir, entry.name));
129
+ if (SKIP_DIRS.has(entry.name)) continue
130
+ yield* walk(path.join(dir, entry.name))
131
131
  } else if (entry.isFile()) {
132
- yield path.join(dir, entry.name);
132
+ yield path.join(dir, entry.name)
133
133
  }
134
134
  }
135
135
  }
@@ -1,20 +1,20 @@
1
1
  // Minimal braille spinner for the one step that can take a while (the source
2
2
  // scan over a large app). TTY-only, so piped/CI output stays clean.
3
3
 
4
- const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
4
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
5
5
 
6
6
  export async function withSpinner<T>(label: string, run: () => Promise<T>): Promise<T> {
7
- if (!process.stdout.isTTY) return run();
7
+ if (!process.stdout.isTTY) return run()
8
8
 
9
- let frame = 0;
9
+ let frame = 0
10
10
  const timer = setInterval(() => {
11
- process.stdout.write(`\r${FRAMES[frame % FRAMES.length]} ${label}`);
12
- frame += 1;
13
- }, 80);
11
+ process.stdout.write(`\r${FRAMES[frame % FRAMES.length]} ${label}`)
12
+ frame += 1
13
+ }, 80)
14
14
  try {
15
- return await run();
15
+ return await run()
16
16
  } finally {
17
- clearInterval(timer);
18
- process.stdout.write('\r\x1b[2K');
17
+ clearInterval(timer)
18
+ process.stdout.write('\r\x1b[2K')
19
19
  }
20
20
  }
@@ -3,75 +3,75 @@
3
3
  // never rewritten — the same bail compat/tsconfig-defaults.ts takes, since a
4
4
  // JSON round-trip would strip the user's comments.
5
5
 
6
- import { existsSync } from 'node:fs';
7
- import { readFile, writeFile } from 'node:fs/promises';
8
- import path from 'node:path';
9
- import type { MigrationResult } from './report';
6
+ import { existsSync } from 'node:fs'
7
+ import { readFile, writeFile } from 'node:fs/promises'
8
+ import path from 'node:path'
9
+ import type { MigrationResult } from './report'
10
10
 
11
11
  const MANUAL_STEPS =
12
- 'remove { "name": "next" } from compilerOptions.plugins and replace ".next/types" includes with ".pnext/types/**/*.ts".';
12
+ 'remove { "name": "next" } from compilerOptions.plugins and replace ".next/types" includes with ".pnext/types/**/*.ts".'
13
13
 
14
14
  export async function migrateTsconfig(root: string, result: MigrationResult, dryRun: boolean) {
15
- const file = path.join(root, 'tsconfig.json');
16
- if (!existsSync(file)) return;
17
- const text = await readFile(file, 'utf8');
15
+ const file = path.join(root, 'tsconfig.json')
16
+ if (!existsSync(file)) return
17
+ const text = await readFile(file, 'utf8')
18
18
 
19
- let config: Record<string, unknown>;
19
+ let config: Record<string, unknown>
20
20
  try {
21
- config = JSON.parse(text) as Record<string, unknown>;
21
+ config = JSON.parse(text) as Record<string, unknown>
22
22
  } catch {
23
23
  result.reports.push({
24
24
  title: 'tsconfig.json has comments (JSONC) — not edited',
25
25
  detail: `Apply by hand: ${MANUAL_STEPS}`,
26
- });
27
- return;
26
+ })
27
+ return
28
28
  }
29
- if (typeof config !== 'object' || config === null) return;
29
+ if (typeof config !== 'object' || config === null) return
30
30
 
31
- const changes: string[] = [];
32
- const compilerOptions = config.compilerOptions;
31
+ const changes: string[] = []
32
+ const compilerOptions = config.compilerOptions
33
33
  if (isObject(compilerOptions) && Array.isArray(compilerOptions.plugins)) {
34
34
  const kept = compilerOptions.plugins.filter(
35
35
  plugin => !(isObject(plugin) && plugin.name === 'next'),
36
- );
36
+ )
37
37
  if (kept.length !== compilerOptions.plugins.length) {
38
- if (kept.length === 0) delete compilerOptions.plugins;
39
- else compilerOptions.plugins = kept;
40
- changes.push('next TypeScript plugin removed');
38
+ if (kept.length === 0) delete compilerOptions.plugins
39
+ else compilerOptions.plugins = kept
40
+ changes.push('next TypeScript plugin removed')
41
41
  }
42
42
  }
43
43
 
44
44
  if (Array.isArray(config.include)) {
45
- const seen = new Set<string>();
46
- const include: unknown[] = [];
47
- let repointed = false;
45
+ const seen = new Set<string>()
46
+ const include: unknown[] = []
47
+ let repointed = false
48
48
  for (const entry of config.include) {
49
49
  if (typeof entry !== 'string') {
50
- include.push(entry);
51
- continue;
50
+ include.push(entry)
51
+ continue
52
52
  }
53
53
  const next =
54
54
  entry.includes('.next/types') || entry.includes('.next/dev/types')
55
55
  ? '.pnext/types/**/*.ts'
56
- : entry;
57
- if (next !== entry) repointed = true;
58
- if (seen.has(next)) continue;
59
- seen.add(next);
60
- include.push(next);
56
+ : entry
57
+ if (next !== entry) repointed = true
58
+ if (seen.has(next)) continue
59
+ seen.add(next)
60
+ include.push(next)
61
61
  }
62
62
  if (repointed) {
63
- config.include = include;
64
- changes.push('type includes repointed at .pnext/types');
63
+ config.include = include
64
+ changes.push('type includes repointed at .pnext/types')
65
65
  }
66
66
  }
67
67
 
68
- if (changes.length === 0) return;
69
- if (!dryRun) await writeFile(file, `${JSON.stringify(config, null, 2)}\n`);
68
+ if (changes.length === 0) return
69
+ if (!dryRun) await writeFile(file, `${JSON.stringify(config, null, 2)}\n`)
70
70
  for (const change of changes) {
71
- result.edits.push({ file: 'tsconfig.json', description: change });
71
+ result.edits.push({ file: 'tsconfig.json', description: change })
72
72
  }
73
73
  }
74
74
 
75
75
  function isObject(value: unknown): value is Record<string, unknown> {
76
- return typeof value === 'object' && value !== null && !Array.isArray(value);
76
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
77
77
  }