@wular/pnext 0.0.4 → 0.0.7

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 (395) hide show
  1. package/README.md +22 -16
  2. package/bin/pnext +6 -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 +87 -22
  8. package/reference/config.md +40 -93
  9. package/reference/css.md +42 -33
  10. package/reference/dev.md +26 -33
  11. package/reference/env.md +18 -20
  12. package/reference/getting-started.md +132 -0
  13. package/reference/metadata.md +31 -46
  14. package/reference/navigation.md +65 -105
  15. package/reference/performance.md +21 -142
  16. package/reference/rendering.md +78 -75
  17. package/reference/routing.md +97 -107
  18. package/reference/typegen.md +27 -29
  19. package/src/api/cache.ts +36 -37
  20. package/src/api/client-cache.ts +2 -2
  21. package/src/api/client-navigation.ts +121 -114
  22. package/src/api/dynamic.tsx +58 -55
  23. package/src/api/link.tsx +52 -53
  24. package/src/api/navigation.ts +59 -58
  25. package/src/api/server.ts +152 -144
  26. package/src/api/suspense.ts +4 -4
  27. package/src/cli/adapters/vercel-warm.ts +126 -121
  28. package/src/cli/adapters/vercel.ts +437 -443
  29. package/src/cli/analyze.ts +333 -144
  30. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  31. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  32. package/src/cli/build.ts +976 -978
  33. package/src/cli/create.ts +72 -64
  34. package/src/cli/dev.ts +116 -116
  35. package/src/cli/index.ts +94 -85
  36. package/src/cli/migrate/package-json.ts +73 -71
  37. package/src/cli/migrate/report.ts +32 -33
  38. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  39. package/src/cli/migrate/scan.ts +46 -46
  40. package/src/cli/migrate/spinner.ts +9 -9
  41. package/src/cli/migrate/tsconfig.ts +35 -35
  42. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  43. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  44. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  45. package/src/cli/start.ts +65 -66
  46. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  47. package/src/client/build.ts +802 -768
  48. package/src/client/chunk-fold.ts +245 -240
  49. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  50. package/src/client/entry.ts +162 -147
  51. package/src/client/prebuilt.ts +231 -223
  52. package/src/client/profile.ts +29 -29
  53. package/src/client/react-compiler.ts +20 -15
  54. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  55. package/src/client/reference-stub.ts +51 -51
  56. package/src/client/reference.ts +19 -19
  57. package/src/{api → client}/router/events.ts +32 -17
  58. package/src/{api → client}/router/history.ts +16 -16
  59. package/src/{api → client}/router/hub.ts +52 -53
  60. package/src/{api/router.ts → client/router/index.ts} +61 -60
  61. package/src/{api → client}/router/policies.ts +24 -24
  62. package/src/{api → client}/router/runtime.ts +2022 -1995
  63. package/src/{api → client}/router/types.ts +98 -98
  64. package/src/compat/actions/client-plugin.ts +42 -43
  65. package/src/compat/actions/client-stub.ts +14 -14
  66. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  67. package/src/compat/actions/config.ts +63 -64
  68. package/src/compat/actions/detect.ts +68 -68
  69. package/src/compat/actions/discovery.ts +105 -105
  70. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  71. package/src/compat/actions/early-submit.ts +1 -1
  72. package/src/compat/actions/endpoint.ts +198 -198
  73. package/src/compat/actions/extensions.ts +811 -0
  74. package/src/compat/actions/flight.ts +23 -23
  75. package/src/compat/actions/form-state.ts +34 -34
  76. package/src/compat/actions/hoist.ts +382 -236
  77. package/src/compat/actions/ids.ts +7 -12
  78. package/src/compat/actions/index.ts +8 -8
  79. package/src/compat/actions/instances.ts +46 -46
  80. package/src/compat/actions/origin.ts +47 -48
  81. package/src/compat/actions/protocol.ts +22 -22
  82. package/src/compat/actions/registry.ts +19 -19
  83. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  84. package/src/compat/actions/rewrite.ts +125 -125
  85. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  86. package/src/compat/actions/serve.ts +132 -136
  87. package/src/compat/actions/server-tag.ts +4 -4
  88. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  89. package/src/compat/actions/unrecognized-error.ts +4 -4
  90. package/src/compat/{index.ts → aliases.ts} +112 -109
  91. package/src/compat/bundler/bun-externals.ts +18 -18
  92. package/src/compat/bundler/cjs-exports.ts +271 -223
  93. package/src/compat/bundler/config.ts +116 -111
  94. package/src/compat/bundler/externals.ts +12 -12
  95. package/src/compat/bundler/import-meta-url.ts +19 -19
  96. package/src/compat/bundler/modularize-imports.ts +36 -33
  97. package/src/compat/bundler/new-url-asset.ts +22 -24
  98. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  99. package/src/compat/bundler/polyfill.ts +28 -28
  100. package/src/compat/bundler/react-compiler.ts +35 -29
  101. package/src/compat/bundler/react-profiler.tsx +11 -11
  102. package/src/compat/bundler/relay-transform.ts +48 -47
  103. package/src/compat/bundler/require-context.ts +119 -113
  104. package/src/compat/bundler/resolve-extensions.ts +19 -19
  105. package/src/compat/bundler/source-cache.ts +25 -25
  106. package/src/compat/bundler/static-imports.ts +7 -7
  107. package/src/compat/bundler/symlink-imports.ts +46 -46
  108. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  109. package/src/compat/bundler/wasm.ts +58 -60
  110. package/src/compat/bundler/webpack-loaders.ts +254 -241
  111. package/src/compat/bundler/worker.ts +101 -104
  112. package/src/compat/cache/build-flags.ts +29 -29
  113. package/src/compat/cache/build-prerender-errors.ts +40 -44
  114. package/src/compat/cache/custom-handler.ts +60 -53
  115. package/src/compat/cache/fetch-patch.ts +240 -240
  116. package/src/compat/cache/handler.ts +27 -31
  117. package/src/compat/cache/modern-handler.ts +148 -126
  118. package/src/compat/cache/resume-data-cache.ts +47 -45
  119. package/src/compat/cache/revalidate.ts +233 -232
  120. package/src/compat/cache/runtime-error.ts +35 -35
  121. package/src/compat/cache/use-cache-transform.ts +442 -417
  122. package/src/compat/cache/use-cache.ts +650 -614
  123. package/src/compat/cache-control.ts +140 -142
  124. package/src/compat/client/base-path.ts +21 -20
  125. package/src/compat/client/css-order.ts +18 -18
  126. package/src/compat/client/errors/bare-boundary.ts +11 -11
  127. package/src/compat/client/errors/control-flow.ts +23 -23
  128. package/src/compat/client/errors/error-boundary.ts +61 -61
  129. package/src/compat/client/errors/global-error.ts +101 -91
  130. package/src/compat/client/errors/install.ts +71 -72
  131. package/src/compat/client/errors/lazy.ts +23 -23
  132. package/src/compat/client/errors/primitive-throw.ts +47 -45
  133. package/src/compat/client/errors/soft-refresh.ts +4 -4
  134. package/src/compat/client/link-status.ts +33 -33
  135. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  136. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  137. package/src/compat/client/navigation-scroll.ts +63 -63
  138. package/src/compat/client/optimistic-routing.ts +93 -88
  139. package/src/compat/client/prefetch-cache.ts +23 -24
  140. package/src/compat/client/route-announcer.ts +35 -35
  141. package/src/compat/client/segment-cache-policy.ts +20 -20
  142. package/src/compat/client/segment-cache.ts +309 -315
  143. package/src/compat/client/segment-prefetch.ts +127 -132
  144. package/src/compat/client/trailing-slash.ts +5 -4
  145. package/src/compat/css/chunking.ts +113 -116
  146. package/src/compat/css/inline-css.ts +21 -21
  147. package/src/compat/css/lightningcss.ts +37 -38
  148. package/src/compat/css/modules.ts +161 -175
  149. package/src/compat/css/nonce.ts +7 -7
  150. package/src/compat/css/sass-plugin.ts +18 -21
  151. package/src/compat/css/sass.ts +150 -152
  152. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  153. package/src/compat/css/styled-jsx.ts +21 -21
  154. package/src/compat/edge-runtime.ts +27 -27
  155. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  156. package/src/compat/export/client.ts +29 -31
  157. package/src/compat/export/{index.ts → emit.ts} +111 -110
  158. package/src/compat/export/standalone.ts +62 -54
  159. package/src/compat/image-optimizer/cache.ts +51 -49
  160. package/src/compat/image-optimizer/detect.ts +52 -52
  161. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  162. package/src/compat/image-optimizer/source.ts +77 -80
  163. package/src/compat/lifecycle/after-scope.ts +26 -26
  164. package/src/compat/lifecycle/after.ts +48 -45
  165. package/src/compat/lifecycle/error-funnel.ts +98 -102
  166. package/src/compat/lifecycle/error-serialize.ts +30 -26
  167. package/src/compat/lifecycle/error-ui.ts +67 -32
  168. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  169. package/src/compat/lifecycle/instrumentation.ts +85 -85
  170. package/src/compat/lifecycle/node-console.ts +11 -11
  171. package/src/compat/lifecycle/testmode.ts +160 -132
  172. package/src/compat/mdx/compile.ts +60 -57
  173. package/src/compat/mdx/plugin.ts +11 -11
  174. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  175. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  176. package/src/compat/metadata.ts +75 -81
  177. package/src/compat/next/cache.ts +68 -69
  178. package/src/compat/next/canonical-url.ts +9 -9
  179. package/src/compat/next/client-cache.ts +19 -19
  180. package/src/compat/next/client-navigation.ts +112 -116
  181. package/src/compat/next/client-only.ts +1 -1
  182. package/src/compat/next/client-script.tsx +99 -93
  183. package/src/compat/next/client-server.ts +10 -10
  184. package/src/compat/next/config-loader.ts +176 -173
  185. package/src/compat/next/config.ts +7 -7
  186. package/src/compat/next/constants.cjs +6 -6
  187. package/src/compat/next/constants.ts +6 -6
  188. package/src/compat/next/custom-server.ts +26 -24
  189. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  190. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  191. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  192. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  193. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  194. package/src/compat/next/dynamic.tsx +21 -18
  195. package/src/compat/next/error.tsx +52 -52
  196. package/src/compat/next/font/cache.ts +74 -74
  197. package/src/compat/next/font/google.ts +2 -2
  198. package/src/compat/next/font/index.ts +1 -1
  199. package/src/compat/next/font/local.ts +3 -3
  200. package/src/compat/next/font/runtime-client.ts +17 -15
  201. package/src/compat/next/font/runtime.ts +443 -408
  202. package/src/compat/next/font/shared.ts +120 -108
  203. package/src/compat/next/form.tsx +63 -63
  204. package/src/compat/next/head.tsx +2 -2
  205. package/src/compat/next/headers.ts +103 -95
  206. package/src/compat/next/image/client.tsx +220 -0
  207. package/src/compat/next/image/config.ts +56 -58
  208. package/src/compat/next/image/optimizer.ts +40 -36
  209. package/src/compat/next/image/patterns.ts +37 -40
  210. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  211. package/src/compat/next/image/shared.ts +65 -57
  212. package/src/compat/next/image/static-metadata.ts +98 -107
  213. package/src/compat/next/image/validate.ts +79 -88
  214. package/src/compat/next/image.tsx +19 -23
  215. package/src/compat/next/index.ts +1 -1
  216. package/src/compat/next/legacy-image.tsx +59 -60
  217. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  218. package/src/compat/next/link.tsx +158 -158
  219. package/src/compat/next/navigation.cjs +12 -3
  220. package/src/compat/next/navigation.ts +48 -50
  221. package/src/compat/next/offline.ts +27 -27
  222. package/src/compat/next/og.ts +121 -124
  223. package/src/compat/next/preferred-region.ts +13 -14
  224. package/src/compat/next/redirects.ts +58 -56
  225. package/src/compat/next/resource-hints.ts +73 -76
  226. package/src/compat/next/rewrites.ts +130 -133
  227. package/src/compat/next/root-params.ts +45 -45
  228. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  229. package/src/compat/next/router.cjs +4 -2
  230. package/src/compat/next/router.ts +58 -61
  231. package/src/compat/next/script.tsx +108 -108
  232. package/src/compat/next/server-only.ts +1 -1
  233. package/src/compat/next/server.ts +19 -19
  234. package/src/compat/next/svgr.ts +18 -17
  235. package/src/compat/next/telemetry.ts +24 -24
  236. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  237. package/src/compat/next/user-agent.ts +53 -49
  238. package/src/compat/next/web-vitals.ts +22 -24
  239. package/src/compat/otel/api.ts +41 -41
  240. package/src/compat/otel/client-trace-metadata.ts +25 -27
  241. package/src/compat/otel/fetch-span.ts +29 -29
  242. package/src/compat/otel/tracer.ts +331 -331
  243. package/src/compat/pages/api.ts +456 -0
  244. package/src/compat/pages/client-plugin.ts +36 -36
  245. package/src/compat/pages/router-state.ts +34 -34
  246. package/src/compat/pages/{index.ts → router.ts} +130 -135
  247. package/src/compat/ppr/io.ts +12 -12
  248. package/src/compat/ppr/missing-root-params.ts +34 -38
  249. package/src/compat/ppr/root-params-scan.ts +66 -66
  250. package/src/compat/ppr/root-params-transform.ts +24 -26
  251. package/src/compat/ppr/root-params.ts +30 -30
  252. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  253. package/src/compat/protocol.ts +71 -70
  254. package/src/compat/react/action-state.ts +47 -48
  255. package/src/compat/react/client-lite.ts +15 -15
  256. package/src/compat/react/client.ts +4 -4
  257. package/src/compat/react/compiler-runtime.ts +11 -11
  258. package/src/compat/react/dom-client.ts +44 -44
  259. package/src/compat/react/dom-react-server.ts +10 -16
  260. package/src/compat/react/dom-server.ts +10 -10
  261. package/src/compat/react/dom.ts +52 -52
  262. package/src/compat/react/hooks-extra.ts +34 -35
  263. package/src/compat/react/parity.ts +64 -61
  264. package/src/compat/react/preact.ts +81 -82
  265. package/src/compat/react/react-server.ts +28 -28
  266. package/src/compat/react/router-shim.ts +1 -1
  267. package/src/compat/react/server-component-use.ts +8 -8
  268. package/src/compat/react/server-inserted-html.ts +30 -31
  269. package/src/compat/react/server.ts +53 -55
  270. package/src/compat/react/use.ts +32 -32
  271. package/src/compat/react/view-transition.ts +20 -20
  272. package/src/compat/register/actions.ts +35 -824
  273. package/src/compat/register/boot.ts +41 -41
  274. package/src/compat/register/build-tier.ts +5 -5
  275. package/src/compat/register/build.ts +74 -70
  276. package/src/compat/register/bundler.ts +161 -156
  277. package/src/compat/register/cache.ts +20 -20
  278. package/src/compat/register/client-errors.ts +3 -3
  279. package/src/compat/register/config.ts +6 -6
  280. package/src/compat/register/css-extras.ts +30 -34
  281. package/src/compat/register/edge-runtime.ts +3 -3
  282. package/src/compat/register/errors.ts +10 -12
  283. package/src/compat/register/export.ts +16 -16
  284. package/src/compat/register/font.ts +11 -11
  285. package/src/compat/register/hooks.ts +2 -2
  286. package/src/compat/register/image.ts +40 -40
  287. package/src/compat/register/index.ts +59 -62
  288. package/src/compat/register/instrumentation-client.ts +10 -10
  289. package/src/compat/register/lifecycle.ts +25 -28
  290. package/src/compat/register/mdx.ts +10 -10
  291. package/src/compat/register/middleware.ts +226 -16
  292. package/src/compat/register/otel.ts +80 -88
  293. package/src/compat/register/pages-api.ts +10 -463
  294. package/src/compat/register/ppr.ts +16 -16
  295. package/src/compat/register/protocol.ts +17 -18
  296. package/src/compat/register/proxy.ts +49 -51
  297. package/src/compat/register/render.ts +79 -76
  298. package/src/compat/register/routing.ts +162 -159
  299. package/src/compat/register/segment.ts +24 -1897
  300. package/src/compat/register/static-image.ts +3 -3
  301. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  302. package/src/compat/register/typed-routes.ts +14 -14
  303. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  304. package/src/compat/register/validation.ts +18 -18
  305. package/src/compat/segment/loading-boundary.ts +43 -45
  306. package/src/compat/segment/page-slot.ts +69 -69
  307. package/src/compat/segment/serve.ts +1884 -0
  308. package/src/compat/segment/tree.ts +113 -112
  309. package/src/compat/segment/vary-key.ts +38 -38
  310. package/src/compat/segment/vary-params.ts +138 -142
  311. package/src/compat/static-params.ts +14 -12
  312. package/src/compat/tsconfig-defaults.ts +87 -91
  313. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  314. package/src/compat/typecheck/worker.ts +15 -12
  315. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  316. package/src/compat/typed-routes/manifest.ts +174 -170
  317. package/src/compat/typed-routes/typegen.ts +127 -110
  318. package/src/compat/validation/errors.ts +16 -19
  319. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  320. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  321. package/src/compat-bootstrap.ts +16 -16
  322. package/src/config.ts +86 -69
  323. package/src/css/build.ts +230 -227
  324. package/src/css/postcss.ts +79 -80
  325. package/src/css/worker.ts +14 -15
  326. package/src/dev/client-actions.ts +10 -10
  327. package/src/dev/client-chunk-store.ts +27 -27
  328. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  329. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  330. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  331. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  332. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  333. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  334. package/src/dev/server.ts +804 -820
  335. package/src/env.ts +46 -43
  336. package/src/extensions.ts +491 -478
  337. package/src/index.ts +8 -8
  338. package/src/internal.ts +20 -23
  339. package/src/{islands → render}/boundary-error.ts +3 -3
  340. package/src/render/hooks.ts +71 -71
  341. package/src/render/island-context.ts +14 -14
  342. package/src/render/metadata.ts +310 -310
  343. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  344. package/src/{ppr.ts → render/ppr.ts} +244 -245
  345. package/src/render/renderer.ts +2087 -2082
  346. package/src/render/resource-hints.ts +16 -17
  347. package/src/render/slots.tsx +224 -235
  348. package/src/{islands → render}/static-children.ts +9 -12
  349. package/src/{islands → render}/static-slots.ts +37 -37
  350. package/src/{cache/context.ts → request/cache.ts} +20 -20
  351. package/src/request/context.ts +107 -107
  352. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  353. package/src/resolve/engine.ts +90 -77
  354. package/src/resolve/imports.ts +475 -463
  355. package/src/resolve/scan-facts.ts +318 -296
  356. package/src/resolve/source-text.ts +37 -37
  357. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  358. package/src/routing/forwarded.ts +19 -19
  359. package/src/routing/handler.ts +84 -91
  360. package/src/routing/href.ts +87 -70
  361. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  362. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  363. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  364. package/src/routing/routes.ts +827 -815
  365. package/src/routing/slots.ts +164 -160
  366. package/src/runtime/loader.ts +954 -0
  367. package/src/{dev → runtime}/module-cache.ts +309 -287
  368. package/src/{dev → runtime}/module-generations.ts +9 -9
  369. package/src/{dev → runtime}/module-transform.ts +81 -72
  370. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  371. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  372. package/src/runtime/vendor.ts +428 -406
  373. package/src/styles.d.ts +9 -0
  374. package/src/types.ts +324 -335
  375. package/src/utils/ansi.ts +5 -5
  376. package/src/utils/{source.ts → code.ts} +15 -12
  377. package/src/utils/content-type.ts +3 -3
  378. package/src/utils/decode.ts +2 -2
  379. package/src/utils/dev-profile.ts +13 -13
  380. package/src/utils/error-log.ts +6 -6
  381. package/src/utils/esbuild.ts +18 -18
  382. package/src/utils/fs-cache.ts +13 -13
  383. package/src/utils/fs.ts +57 -49
  384. package/src/utils/html.ts +20 -24
  385. package/src/utils/native-require.ts +8 -8
  386. package/src/utils/serialize.ts +139 -146
  387. package/src/utils/verbose.ts +18 -18
  388. package/reference/overview.md +0 -35
  389. package/src/cli/analyze-print.ts +0 -181
  390. package/src/compat/middleware/manifest.ts +0 -210
  391. package/src/compat/next/image-client.tsx +0 -215
  392. package/src/compat/next/link-usage.ts +0 -29
  393. package/src/css/index.ts +0 -2
  394. package/src/render/index.ts +0 -1
  395. package/src/style-modules.d.ts +0 -9
@@ -3,78 +3,77 @@
3
3
  // hand. The body of the output is identical under --dry-run — only the header
4
4
  // says whether anything was written.
5
5
 
6
- import { bold, cyan, dim, green } from '../../utils/ansi';
6
+ import { bold, cyan, dim, green } from '../../utils/ansi'
7
7
 
8
8
  /** Amber for warnings — ansi.ts has no yellow, so hand-roll the same shape. */
9
- const amber = (value: string) =>
10
- process.stdout.isTTY ? `\x1b[38;5;214m${value}\x1b[39m` : value;
9
+ const amber = (value: string) => (process.stdout.isTTY ? `\x1b[38;5;214m${value}\x1b[39m` : value)
11
10
 
12
11
  export interface Edit {
13
- file: string;
12
+ file: string
14
13
  /** Short phrase joined into the file's summary line. */
15
- description: string;
14
+ description: string
16
15
  /** Dim lines printed under the summary. */
17
- details?: string[];
16
+ details?: string[]
18
17
  }
19
18
 
20
19
  export interface ReportItem {
21
- title: string;
22
- detail: string;
23
- files?: string[];
20
+ title: string
21
+ detail: string
22
+ files?: string[]
24
23
  }
25
24
 
26
25
  export interface MigrationResult {
27
- edits: Edit[];
28
- reports: ReportItem[];
26
+ edits: Edit[]
27
+ reports: ReportItem[]
29
28
  }
30
29
 
31
30
  export function emptyResult(): MigrationResult {
32
- return { edits: [], reports: [] };
31
+ return { edits: [], reports: [] }
33
32
  }
34
33
 
35
34
  export function printHeader(root: string, dryRun: boolean) {
36
- const suffix = dryRun ? 'dry run, nothing will be written' : root;
37
- console.log(`\n${cyan('▲')} ${bold('pnext migrate')} ${dim(`— ${suffix}`)}`);
35
+ const suffix = dryRun ? 'dry run, nothing will be written' : root
36
+ console.log(`\n${cyan('▲')} ${bold('pnext migrate')} ${dim(`— ${suffix}`)}`)
38
37
  }
39
38
 
40
39
  export function printResult(result: MigrationResult, options: { install: string }) {
41
- const lines: string[] = [];
40
+ const lines: string[] = []
42
41
 
43
- lines.push(`\n${bold('Changes')}`);
42
+ lines.push(`\n${bold('Changes')}`)
44
43
  if (result.edits.length === 0) {
45
- lines.push(` ${dim('nothing to change')}`);
44
+ lines.push(` ${dim('nothing to change')}`)
46
45
  }
47
46
  for (const [file, edits] of groupByFile(result.edits)) {
48
47
  lines.push(
49
48
  `${green('✓')} ${bold(file)} ${dim(`— ${edits.map(edit => edit.description).join(', ')}`)}`,
50
- );
49
+ )
51
50
  for (const edit of edits) {
52
- for (const detail of edit.details ?? []) lines.push(` ${dim(detail)}`);
51
+ for (const detail of edit.details ?? []) lines.push(` ${dim(detail)}`)
53
52
  }
54
53
  }
55
54
 
56
- lines.push(`\n${bold('Review')}${result.reports.length > 0 ? ` (${result.reports.length})` : ''}`);
55
+ lines.push(`\n${bold('Review')}${result.reports.length > 0 ? ` (${result.reports.length})` : ''}`)
57
56
  if (result.reports.length === 0) {
58
- lines.push(` ${dim('nothing flagged')}`);
57
+ lines.push(` ${dim('nothing flagged')}`)
59
58
  }
60
59
  for (const item of result.reports) {
61
- lines.push(`${amber('!')} ${bold(item.title)}`);
62
- lines.push(` ${dim(item.detail)}`);
63
- for (const file of item.files ?? []) lines.push(` ${dim(`· ${file}`)}`);
60
+ lines.push(`${amber('!')} ${bold(item.title)}`)
61
+ lines.push(` ${dim(item.detail)}`)
62
+ for (const file of item.files ?? []) lines.push(` ${dim(`· ${file}`)}`)
64
63
  }
65
64
 
66
- lines.push(`\n${bold('Next steps')}`);
67
- lines.push(` Run ${cyan(options.install)} to install the new dependencies.`);
68
- lines.push(` ${cyan('pnext dev')} to start the app.`);
69
- console.log(lines.join('\n'));
65
+ lines.push(`\n${bold('Next steps')}`)
66
+ lines.push(` Run ${cyan(options.install)} to install the new dependencies.`)
67
+ lines.push(` ${cyan('pnext dev')} to start the app.`)
68
+ console.log(lines.join('\n'))
70
69
  }
71
70
 
72
71
  function groupByFile(edits: Edit[]) {
73
- const grouped = new Map<string, Edit[]>();
72
+ const grouped = new Map<string, Edit[]>()
74
73
  for (const edit of edits) {
75
- const bucket = grouped.get(edit.file);
76
- if (bucket) bucket.push(edit);
77
- else grouped.set(edit.file, [edit]);
74
+ const bucket = grouped.get(edit.file)
75
+ if (bucket) bucket.push(edit)
76
+ else grouped.set(edit.file, [edit])
78
77
  }
79
- return grouped;
78
+ return grouped
80
79
  }
@@ -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
  }