@payloadcms/codemod 4.0.0-internal.2f0d313 → 4.0.0-internal.31ba7ee

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 (375) hide show
  1. package/README.md +69 -39
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +28 -9
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli.parseFlags.d.ts +10 -1
  6. package/dist/cli.parseFlags.d.ts.map +1 -1
  7. package/dist/cli.parseFlags.js +16 -8
  8. package/dist/cli.parseFlags.js.map +1 -1
  9. package/dist/registry.d.ts.map +1 -1
  10. package/dist/registry.js +15 -1
  11. package/dist/registry.js.map +1 -1
  12. package/dist/runbook/payload-v4-upgrade.md +2 -2
  13. package/dist/runbook/v4.mdx +556 -31
  14. package/dist/transforms/add-override-access-true/basic.input.js +41 -0
  15. package/dist/transforms/add-override-access-true/basic.input.js.map +1 -0
  16. package/dist/transforms/add-override-access-true/basic.output.js +50 -0
  17. package/dist/transforms/add-override-access-true/basic.output.js.map +1 -0
  18. package/dist/transforms/add-override-access-true/comment-between-properties.input.js +11 -0
  19. package/dist/transforms/add-override-access-true/comment-between-properties.input.js.map +1 -0
  20. package/dist/transforms/add-override-access-true/comment-between-properties.output.js +12 -0
  21. package/dist/transforms/add-override-access-true/comment-between-properties.output.js.map +1 -0
  22. package/dist/transforms/add-override-access-true/index.d.ts +20 -0
  23. package/dist/transforms/add-override-access-true/index.d.ts.map +1 -0
  24. package/dist/transforms/add-override-access-true/index.js +208 -0
  25. package/dist/transforms/add-override-access-true/index.js.map +1 -0
  26. package/dist/transforms/add-override-access-true/javascript.input.d.ts +6 -0
  27. package/dist/transforms/add-override-access-true/javascript.input.d.ts.map +1 -0
  28. package/dist/transforms/add-override-access-true/javascript.input.js +24 -0
  29. package/dist/transforms/add-override-access-true/javascript.input.js.map +1 -0
  30. package/dist/transforms/add-override-access-true/javascript.output.d.ts +6 -0
  31. package/dist/transforms/add-override-access-true/javascript.output.d.ts.map +1 -0
  32. package/dist/transforms/add-override-access-true/javascript.output.js +26 -0
  33. package/dist/transforms/add-override-access-true/javascript.output.js.map +1 -0
  34. package/dist/transforms/add-override-access-true/non-matching.input.js +42 -0
  35. package/dist/transforms/add-override-access-true/non-matching.input.js.map +1 -0
  36. package/dist/transforms/add-override-access-true/non-matching.output.js +42 -0
  37. package/dist/transforms/add-override-access-true/non-matching.output.js.map +1 -0
  38. package/dist/transforms/add-override-access-true/single-line.input.js +13 -0
  39. package/dist/transforms/add-override-access-true/single-line.input.js.map +1 -0
  40. package/dist/transforms/add-override-access-true/single-line.output.js +17 -0
  41. package/dist/transforms/add-override-access-true/single-line.output.js.map +1 -0
  42. package/dist/transforms/add-override-access-true/trailing-comment.input.js +10 -0
  43. package/dist/transforms/add-override-access-true/trailing-comment.input.js.map +1 -0
  44. package/dist/transforms/add-override-access-true/trailing-comment.output.js +12 -0
  45. package/dist/transforms/add-override-access-true/trailing-comment.output.js.map +1 -0
  46. package/dist/transforms/migrate-aliased-exports/index.d.ts.map +1 -1
  47. package/dist/transforms/migrate-aliased-exports/index.js +6 -5
  48. package/dist/transforms/migrate-aliased-exports/index.js.map +1 -1
  49. package/dist/transforms/migrate-aliased-exports/request.input.js +6 -0
  50. package/dist/transforms/migrate-aliased-exports/request.input.js.map +1 -0
  51. package/dist/transforms/migrate-aliased-exports/request.output.js +5 -0
  52. package/dist/transforms/migrate-aliased-exports/request.output.js.map +1 -0
  53. package/dist/transforms/migrate-authorship-default/already-set.input.js +15 -0
  54. package/dist/transforms/migrate-authorship-default/already-set.input.js.map +1 -0
  55. package/dist/transforms/migrate-authorship-default/already-set.output.js +15 -0
  56. package/dist/transforms/migrate-authorship-default/already-set.output.js.map +1 -0
  57. package/dist/transforms/migrate-authorship-default/basic.input.js +16 -0
  58. package/dist/transforms/migrate-authorship-default/basic.input.js.map +1 -0
  59. package/dist/transforms/migrate-authorship-default/basic.output.js +18 -0
  60. package/dist/transforms/migrate-authorship-default/basic.output.js.map +1 -0
  61. package/dist/transforms/migrate-authorship-default/build-config.input.js +32 -0
  62. package/dist/transforms/migrate-authorship-default/build-config.input.js.map +1 -0
  63. package/dist/transforms/migrate-authorship-default/build-config.output.js +35 -0
  64. package/dist/transforms/migrate-authorship-default/build-config.output.js.map +1 -0
  65. package/dist/transforms/migrate-authorship-default/globals.input.js +16 -0
  66. package/dist/transforms/migrate-authorship-default/globals.input.js.map +1 -0
  67. package/dist/transforms/migrate-authorship-default/globals.output.js +17 -0
  68. package/dist/transforms/migrate-authorship-default/globals.output.js.map +1 -0
  69. package/dist/transforms/migrate-authorship-default/index.d.ts +11 -0
  70. package/dist/transforms/migrate-authorship-default/index.d.ts.map +1 -0
  71. package/dist/transforms/migrate-authorship-default/index.js +141 -0
  72. package/dist/transforms/migrate-authorship-default/index.js.map +1 -0
  73. package/dist/transforms/migrate-authorship-default/non-matching.input.js +18 -0
  74. package/dist/transforms/migrate-authorship-default/non-matching.input.js.map +1 -0
  75. package/dist/transforms/migrate-authorship-default/non-matching.output.js +18 -0
  76. package/dist/transforms/migrate-authorship-default/non-matching.output.js.map +1 -0
  77. package/dist/transforms/migrate-authorship-default/satisfies.input.js +11 -0
  78. package/dist/transforms/migrate-authorship-default/satisfies.input.js.map +1 -0
  79. package/dist/transforms/migrate-authorship-default/satisfies.output.js +13 -0
  80. package/dist/transforms/migrate-authorship-default/satisfies.output.js.map +1 -0
  81. package/dist/transforms/migrate-field-component-types/basic.input.js +8 -0
  82. package/dist/transforms/migrate-field-component-types/basic.input.js.map +1 -0
  83. package/dist/transforms/migrate-field-component-types/basic.output.js +8 -0
  84. package/dist/transforms/migrate-field-component-types/basic.output.js.map +1 -0
  85. package/dist/transforms/migrate-field-component-types/index.d.ts +3 -0
  86. package/dist/transforms/migrate-field-component-types/index.d.ts.map +1 -0
  87. package/dist/transforms/migrate-field-component-types/index.js +616 -0
  88. package/dist/transforms/migrate-field-component-types/index.js.map +1 -0
  89. package/dist/transforms/migrate-payload-request-creation/aliases.input.js +8 -0
  90. package/dist/transforms/migrate-payload-request-creation/aliases.input.js.map +1 -0
  91. package/dist/transforms/migrate-payload-request-creation/aliases.output.js +31 -0
  92. package/dist/transforms/migrate-payload-request-creation/aliases.output.js.map +1 -0
  93. package/dist/transforms/migrate-payload-request-creation/collision.input.js +9 -0
  94. package/dist/transforms/migrate-payload-request-creation/collision.input.js.map +1 -0
  95. package/dist/transforms/migrate-payload-request-creation/comments.input.js +9 -0
  96. package/dist/transforms/migrate-payload-request-creation/comments.input.js.map +1 -0
  97. package/dist/transforms/migrate-payload-request-creation/comments.output.js +34 -0
  98. package/dist/transforms/migrate-payload-request-creation/comments.output.js.map +1 -0
  99. package/dist/transforms/migrate-payload-request-creation/empty.input.js +5 -0
  100. package/dist/transforms/migrate-payload-request-creation/empty.input.js.map +1 -0
  101. package/dist/transforms/migrate-payload-request-creation/empty.output.js +7 -0
  102. package/dist/transforms/migrate-payload-request-creation/empty.output.js.map +1 -0
  103. package/dist/transforms/migrate-payload-request-creation/evaluation-order.input.js +10 -0
  104. package/dist/transforms/migrate-payload-request-creation/evaluation-order.input.js.map +1 -0
  105. package/dist/transforms/migrate-payload-request-creation/expression.input.js +8 -0
  106. package/dist/transforms/migrate-payload-request-creation/expression.input.js.map +1 -0
  107. package/dist/transforms/migrate-payload-request-creation/expression.output.js +8 -0
  108. package/dist/transforms/migrate-payload-request-creation/expression.output.js.map +1 -0
  109. package/dist/transforms/migrate-payload-request-creation/getters.input.js +52 -0
  110. package/dist/transforms/migrate-payload-request-creation/getters.input.js.map +1 -0
  111. package/dist/transforms/migrate-payload-request-creation/index.d.ts +3 -0
  112. package/dist/transforms/migrate-payload-request-creation/index.d.ts.map +1 -0
  113. package/dist/transforms/migrate-payload-request-creation/index.js +236 -0
  114. package/dist/transforms/migrate-payload-request-creation/index.js.map +1 -0
  115. package/dist/transforms/migrate-payload-request-creation/internal.input.js +6 -0
  116. package/dist/transforms/migrate-payload-request-creation/internal.input.js.map +1 -0
  117. package/dist/transforms/migrate-payload-request-creation/internal.output.js +6 -0
  118. package/dist/transforms/migrate-payload-request-creation/internal.output.js.map +1 -0
  119. package/dist/transforms/migrate-payload-request-creation/non-matching.input.js +5 -0
  120. package/dist/transforms/migrate-payload-request-creation/non-matching.input.js.map +1 -0
  121. package/dist/transforms/migrate-payload-request-creation/populated.input.js +7 -0
  122. package/dist/transforms/migrate-payload-request-creation/populated.input.js.map +1 -0
  123. package/dist/transforms/migrate-payload-request-creation/populated.output.js +30 -0
  124. package/dist/transforms/migrate-payload-request-creation/populated.output.js.map +1 -0
  125. package/dist/transforms/migrate-payload-request-creation/shadowed.input.js +7 -0
  126. package/dist/transforms/migrate-payload-request-creation/shadowed.input.js.map +1 -0
  127. package/dist/transforms/migrate-payload-request-creation/shadowed.output.js +9 -0
  128. package/dist/transforms/migrate-payload-request-creation/shadowed.output.js.map +1 -0
  129. package/dist/transforms/migrate-payload-request-creation/shorthand.input.js +12 -0
  130. package/dist/transforms/migrate-payload-request-creation/shorthand.input.js.map +1 -0
  131. package/dist/transforms/migrate-payload-request-creation/shorthand.output.js +12 -0
  132. package/dist/transforms/migrate-payload-request-creation/shorthand.output.js.map +1 -0
  133. package/dist/transforms/migrate-payload-request-creation/unsupported.input.js +9 -0
  134. package/dist/transforms/migrate-payload-request-creation/unsupported.input.js.map +1 -0
  135. package/dist/transforms/migrate-versions-default/index.js +5 -5
  136. package/dist/transforms/migrate-versions-default/index.js.map +1 -1
  137. package/dist/transforms/remove-default-locale-publish-option/all-value.input.js +13 -0
  138. package/dist/transforms/remove-default-locale-publish-option/all-value.input.js.map +1 -0
  139. package/dist/transforms/remove-default-locale-publish-option/basic.input.js +13 -0
  140. package/dist/transforms/remove-default-locale-publish-option/basic.input.js.map +1 -0
  141. package/dist/transforms/remove-default-locale-publish-option/basic.output.js +12 -0
  142. package/dist/transforms/remove-default-locale-publish-option/basic.output.js.map +1 -0
  143. package/dist/transforms/remove-default-locale-publish-option/dynamic.input.js +17 -0
  144. package/dist/transforms/remove-default-locale-publish-option/dynamic.input.js.map +1 -0
  145. package/dist/transforms/remove-default-locale-publish-option/index.d.ts +10 -0
  146. package/dist/transforms/remove-default-locale-publish-option/index.d.ts.map +1 -0
  147. package/dist/transforms/remove-default-locale-publish-option/index.js +103 -0
  148. package/dist/transforms/remove-default-locale-publish-option/index.js.map +1 -0
  149. package/dist/transforms/remove-default-locale-publish-option/no-match.input.js +10 -0
  150. package/dist/transforms/remove-default-locale-publish-option/no-match.input.js.map +1 -0
  151. package/dist/transforms/remove-default-locale-publish-option/no-match.output.js +10 -0
  152. package/dist/transforms/remove-default-locale-publish-option/no-match.output.js.map +1 -0
  153. package/dist/transforms/remove-default-locale-publish-option/reassigned.input.js +22 -0
  154. package/dist/transforms/remove-default-locale-publish-option/reassigned.input.js.map +1 -0
  155. package/dist/transforms/remove-default-locale-publish-option/shorthand.input.js +14 -0
  156. package/dist/transforms/remove-default-locale-publish-option/shorthand.input.js.map +1 -0
  157. package/dist/transforms/remove-default-locale-publish-option/shorthand.output.js +13 -0
  158. package/dist/transforms/remove-default-locale-publish-option/shorthand.output.js.map +1 -0
  159. package/dist/transforms/remove-publish-specific-locale/index.d.ts.map +1 -1
  160. package/dist/transforms/remove-publish-specific-locale/index.js.map +1 -1
  161. package/dist/transforms/remove-storage-always-insert-fields/aliased.input.js +11 -0
  162. package/dist/transforms/remove-storage-always-insert-fields/aliased.input.js.map +1 -0
  163. package/dist/transforms/remove-storage-always-insert-fields/aliased.output.js +10 -0
  164. package/dist/transforms/remove-storage-always-insert-fields/aliased.output.js.map +1 -0
  165. package/dist/transforms/remove-storage-always-insert-fields/basic.input.js +54 -0
  166. package/dist/transforms/remove-storage-always-insert-fields/basic.input.js.map +1 -0
  167. package/dist/transforms/remove-storage-always-insert-fields/basic.output.js +48 -0
  168. package/dist/transforms/remove-storage-always-insert-fields/basic.output.js.map +1 -0
  169. package/dist/transforms/remove-storage-always-insert-fields/index.d.ts +3 -0
  170. package/dist/transforms/remove-storage-always-insert-fields/index.d.ts.map +1 -0
  171. package/dist/transforms/remove-storage-always-insert-fields/index.js +71 -0
  172. package/dist/transforms/remove-storage-always-insert-fields/index.js.map +1 -0
  173. package/dist/transforms/remove-storage-always-insert-fields/no-match.input.js +27 -0
  174. package/dist/transforms/remove-storage-always-insert-fields/no-match.input.js.map +1 -0
  175. package/dist/transforms/remove-storage-always-insert-fields/no-match.output.js +27 -0
  176. package/dist/transforms/remove-storage-always-insert-fields/no-match.output.js.map +1 -0
  177. package/dist/transforms/remove-versions-true/index.js +4 -4
  178. package/dist/transforms/remove-versions-true/index.js.map +1 -1
  179. package/dist/transforms/rename-experimental-table-feature/alias.input.js +6 -0
  180. package/dist/transforms/rename-experimental-table-feature/alias.input.js.map +1 -0
  181. package/dist/transforms/rename-experimental-table-feature/alias.output.js +6 -0
  182. package/dist/transforms/rename-experimental-table-feature/alias.output.js.map +1 -0
  183. package/dist/transforms/rename-experimental-table-feature/basic.input.js +19 -0
  184. package/dist/transforms/rename-experimental-table-feature/basic.input.js.map +1 -0
  185. package/dist/transforms/rename-experimental-table-feature/basic.output.js +19 -0
  186. package/dist/transforms/rename-experimental-table-feature/basic.output.js.map +1 -0
  187. package/dist/transforms/rename-experimental-table-feature/collision.input.js +7 -0
  188. package/dist/transforms/rename-experimental-table-feature/collision.input.js.map +1 -0
  189. package/dist/transforms/rename-experimental-table-feature/index.d.ts +3 -0
  190. package/dist/transforms/rename-experimental-table-feature/index.d.ts.map +1 -0
  191. package/dist/transforms/rename-experimental-table-feature/index.js +44 -0
  192. package/dist/transforms/rename-experimental-table-feature/index.js.map +1 -0
  193. package/dist/transforms/rename-experimental-table-feature/no-match.input.js +9 -0
  194. package/dist/transforms/rename-experimental-table-feature/no-match.input.js.map +1 -0
  195. package/dist/upgrade/defaultTag.d.ts +9 -0
  196. package/dist/upgrade/defaultTag.d.ts.map +1 -0
  197. package/dist/upgrade/defaultTag.js +25 -0
  198. package/dist/upgrade/defaultTag.js.map +1 -0
  199. package/dist/upgrade/dispatch.d.ts +38 -0
  200. package/dist/upgrade/dispatch.d.ts.map +1 -0
  201. package/dist/upgrade/dispatch.js +132 -0
  202. package/dist/upgrade/dispatch.js.map +1 -0
  203. package/dist/upgrade/index.d.ts +2 -1
  204. package/dist/upgrade/index.d.ts.map +1 -1
  205. package/dist/upgrade/index.js +49 -24
  206. package/dist/upgrade/index.js.map +1 -1
  207. package/dist/upgrade/prompt.d.ts +6 -3
  208. package/dist/upgrade/prompt.d.ts.map +1 -1
  209. package/dist/upgrade/prompt.js +11 -9
  210. package/dist/upgrade/prompt.js.map +1 -1
  211. package/dist/upgrade/report.d.ts +3 -0
  212. package/dist/upgrade/report.d.ts.map +1 -1
  213. package/dist/upgrade/report.js +8 -2
  214. package/dist/upgrade/report.js.map +1 -1
  215. package/dist/upgrade/rewritePackageJson.d.ts +7 -0
  216. package/dist/upgrade/rewritePackageJson.d.ts.map +1 -1
  217. package/dist/upgrade/rewritePackageJson.js +24 -7
  218. package/dist/upgrade/rewritePackageJson.js.map +1 -1
  219. package/dist/upgrade/selectAgent.d.ts +45 -0
  220. package/dist/upgrade/selectAgent.d.ts.map +1 -0
  221. package/dist/upgrade/selectAgent.js +54 -0
  222. package/dist/upgrade/selectAgent.js.map +1 -0
  223. package/dist/upgrade/selfCommand.d.ts +13 -0
  224. package/dist/upgrade/selfCommand.d.ts.map +1 -0
  225. package/dist/upgrade/selfCommand.js +17 -0
  226. package/dist/upgrade/selfCommand.js.map +1 -0
  227. package/dist/upgrade/types.d.ts +5 -0
  228. package/dist/upgrade/types.d.ts.map +1 -1
  229. package/dist/upgrade/types.js +4 -0
  230. package/dist/upgrade/types.js.map +1 -1
  231. package/package.json +4 -3
  232. package/dist/cli.parseFlags.spec.d.ts +0 -2
  233. package/dist/cli.parseFlags.spec.d.ts.map +0 -1
  234. package/dist/cli.parseFlags.spec.js +0 -121
  235. package/dist/cli.parseFlags.spec.js.map +0 -1
  236. package/dist/runner.spec.d.ts +0 -2
  237. package/dist/runner.spec.d.ts.map +0 -1
  238. package/dist/runner.spec.js +0 -88
  239. package/dist/runner.spec.js.map +0 -1
  240. package/dist/transforms/example-noop/index.spec.d.ts +0 -2
  241. package/dist/transforms/example-noop/index.spec.d.ts.map +0 -1
  242. package/dist/transforms/example-noop/index.spec.js +0 -29
  243. package/dist/transforms/example-noop/index.spec.js.map +0 -1
  244. package/dist/transforms/globals-components-edit/index.spec.d.ts +0 -2
  245. package/dist/transforms/globals-components-edit/index.spec.d.ts.map +0 -1
  246. package/dist/transforms/globals-components-edit/index.spec.js +0 -37
  247. package/dist/transforms/globals-components-edit/index.spec.js.map +0 -1
  248. package/dist/transforms/migrate-after-operation-read/index.spec.d.ts +0 -2
  249. package/dist/transforms/migrate-after-operation-read/index.spec.d.ts.map +0 -1
  250. package/dist/transforms/migrate-after-operation-read/index.spec.js +0 -62
  251. package/dist/transforms/migrate-after-operation-read/index.spec.js.map +0 -1
  252. package/dist/transforms/migrate-aliased-exports/index.spec.d.ts +0 -2
  253. package/dist/transforms/migrate-aliased-exports/index.spec.d.ts.map +0 -1
  254. package/dist/transforms/migrate-aliased-exports/index.spec.js +0 -55
  255. package/dist/transforms/migrate-aliased-exports/index.spec.js.map +0 -1
  256. package/dist/transforms/migrate-azure-chunk-large-files/index.spec.d.ts +0 -2
  257. package/dist/transforms/migrate-azure-chunk-large-files/index.spec.d.ts.map +0 -1
  258. package/dist/transforms/migrate-azure-chunk-large-files/index.spec.js +0 -67
  259. package/dist/transforms/migrate-azure-chunk-large-files/index.spec.js.map +0 -1
  260. package/dist/transforms/migrate-block-references-to-blocks/index.spec.d.ts +0 -2
  261. package/dist/transforms/migrate-block-references-to-blocks/index.spec.d.ts.map +0 -1
  262. package/dist/transforms/migrate-block-references-to-blocks/index.spec.js +0 -45
  263. package/dist/transforms/migrate-block-references-to-blocks/index.spec.js.map +0 -1
  264. package/dist/transforms/migrate-build-script/index.spec.d.ts +0 -2
  265. package/dist/transforms/migrate-build-script/index.spec.d.ts.map +0 -1
  266. package/dist/transforms/migrate-build-script/index.spec.js +0 -81
  267. package/dist/transforms/migrate-build-script/index.spec.js.map +0 -1
  268. package/dist/transforms/migrate-db-types-subpath/index.spec.d.ts +0 -2
  269. package/dist/transforms/migrate-db-types-subpath/index.spec.d.ts.map +0 -1
  270. package/dist/transforms/migrate-db-types-subpath/index.spec.js +0 -46
  271. package/dist/transforms/migrate-db-types-subpath/index.spec.js.map +0 -1
  272. package/dist/transforms/migrate-disabled-fields/index.spec.d.ts +0 -2
  273. package/dist/transforms/migrate-disabled-fields/index.spec.d.ts.map +0 -1
  274. package/dist/transforms/migrate-disabled-fields/index.spec.js +0 -73
  275. package/dist/transforms/migrate-disabled-fields/index.spec.js.map +0 -1
  276. package/dist/transforms/migrate-document-title-context/index.spec.d.ts +0 -2
  277. package/dist/transforms/migrate-document-title-context/index.spec.d.ts.map +0 -1
  278. package/dist/transforms/migrate-document-title-context/index.spec.js +0 -86
  279. package/dist/transforms/migrate-document-title-context/index.spec.js.map +0 -1
  280. package/dist/transforms/migrate-force-select/index.spec.d.ts +0 -2
  281. package/dist/transforms/migrate-force-select/index.spec.d.ts.map +0 -1
  282. package/dist/transforms/migrate-force-select/index.spec.js +0 -107
  283. package/dist/transforms/migrate-force-select/index.spec.js.map +0 -1
  284. package/dist/transforms/migrate-hide-api-url/index.spec.d.ts +0 -2
  285. package/dist/transforms/migrate-hide-api-url/index.spec.d.ts.map +0 -1
  286. package/dist/transforms/migrate-hide-api-url/index.spec.js +0 -118
  287. package/dist/transforms/migrate-hide-api-url/index.spec.js.map +0 -1
  288. package/dist/transforms/migrate-import-export-hooks/index.spec.d.ts +0 -2
  289. package/dist/transforms/migrate-import-export-hooks/index.spec.d.ts.map +0 -1
  290. package/dist/transforms/migrate-import-export-hooks/index.spec.js +0 -65
  291. package/dist/transforms/migrate-import-export-hooks/index.spec.js.map +0 -1
  292. package/dist/transforms/migrate-list-view-select-api/index.spec.d.ts +0 -2
  293. package/dist/transforms/migrate-list-view-select-api/index.spec.d.ts.map +0 -1
  294. package/dist/transforms/migrate-list-view-select-api/index.spec.js +0 -37
  295. package/dist/transforms/migrate-list-view-select-api/index.spec.js.map +0 -1
  296. package/dist/transforms/migrate-next-generate-viewport-export/index.spec.d.ts +0 -2
  297. package/dist/transforms/migrate-next-generate-viewport-export/index.spec.d.ts.map +0 -1
  298. package/dist/transforms/migrate-next-generate-viewport-export/index.spec.js +0 -41
  299. package/dist/transforms/migrate-next-generate-viewport-export/index.spec.js.map +0 -1
  300. package/dist/transforms/migrate-next-subpath-exports/index.spec.d.ts +0 -2
  301. package/dist/transforms/migrate-next-subpath-exports/index.spec.d.ts.map +0 -1
  302. package/dist/transforms/migrate-next-subpath-exports/index.spec.js +0 -46
  303. package/dist/transforms/migrate-next-subpath-exports/index.spec.js.map +0 -1
  304. package/dist/transforms/migrate-slug-field/index.spec.d.ts +0 -2
  305. package/dist/transforms/migrate-slug-field/index.spec.d.ts.map +0 -1
  306. package/dist/transforms/migrate-slug-field/index.spec.js +0 -47
  307. package/dist/transforms/migrate-slug-field/index.spec.js.map +0 -1
  308. package/dist/transforms/migrate-storage-adapters-to-config/index.spec.d.ts +0 -2
  309. package/dist/transforms/migrate-storage-adapters-to-config/index.spec.d.ts.map +0 -1
  310. package/dist/transforms/migrate-storage-adapters-to-config/index.spec.js +0 -85
  311. package/dist/transforms/migrate-storage-adapters-to-config/index.spec.js.map +0 -1
  312. package/dist/transforms/migrate-versions-default/index.spec.d.ts +0 -2
  313. package/dist/transforms/migrate-versions-default/index.spec.d.ts.map +0 -1
  314. package/dist/transforms/migrate-versions-default/index.spec.js +0 -81
  315. package/dist/transforms/migrate-versions-default/index.spec.js.map +0 -1
  316. package/dist/transforms/remove-group-by-true/index.spec.d.ts +0 -2
  317. package/dist/transforms/remove-group-by-true/index.spec.d.ts.map +0 -1
  318. package/dist/transforms/remove-group-by-true/index.spec.js +0 -47
  319. package/dist/transforms/remove-group-by-true/index.spec.js.map +0 -1
  320. package/dist/transforms/remove-localize-status-config/index.spec.d.ts +0 -2
  321. package/dist/transforms/remove-localize-status-config/index.spec.d.ts.map +0 -1
  322. package/dist/transforms/remove-localize-status-config/index.spec.js +0 -38
  323. package/dist/transforms/remove-localize-status-config/index.spec.js.map +0 -1
  324. package/dist/transforms/remove-publish-specific-locale/index.spec.d.ts +0 -2
  325. package/dist/transforms/remove-publish-specific-locale/index.spec.d.ts.map +0 -1
  326. package/dist/transforms/remove-publish-specific-locale/index.spec.js +0 -47
  327. package/dist/transforms/remove-publish-specific-locale/index.spec.js.map +0 -1
  328. package/dist/transforms/remove-versions-true/index.spec.d.ts +0 -2
  329. package/dist/transforms/remove-versions-true/index.spec.d.ts.map +0 -1
  330. package/dist/transforms/remove-versions-true/index.spec.js +0 -38
  331. package/dist/transforms/remove-versions-true/index.spec.js.map +0 -1
  332. package/dist/transforms/rename-storage-adapters-to-storage/index.spec.d.ts +0 -2
  333. package/dist/transforms/rename-storage-adapters-to-storage/index.spec.d.ts.map +0 -1
  334. package/dist/transforms/rename-storage-adapters-to-storage/index.spec.js +0 -55
  335. package/dist/transforms/rename-storage-adapters-to-storage/index.spec.js.map +0 -1
  336. package/dist/transforms/rename-typescript-schema-to-json-schema/index.spec.d.ts +0 -2
  337. package/dist/transforms/rename-typescript-schema-to-json-schema/index.spec.d.ts.map +0 -1
  338. package/dist/transforms/rename-typescript-schema-to-json-schema/index.spec.js +0 -45
  339. package/dist/transforms/rename-typescript-schema-to-json-schema/index.spec.js.map +0 -1
  340. package/dist/upgrade/detectPackageManager.spec.d.ts +0 -2
  341. package/dist/upgrade/detectPackageManager.spec.d.ts.map +0 -1
  342. package/dist/upgrade/detectPackageManager.spec.js +0 -41
  343. package/dist/upgrade/detectPackageManager.spec.js.map +0 -1
  344. package/dist/upgrade/index.spec.d.ts +0 -2
  345. package/dist/upgrade/index.spec.d.ts.map +0 -1
  346. package/dist/upgrade/index.spec.js +0 -132
  347. package/dist/upgrade/index.spec.js.map +0 -1
  348. package/dist/upgrade/packaging.spec.d.ts +0 -2
  349. package/dist/upgrade/packaging.spec.d.ts.map +0 -1
  350. package/dist/upgrade/packaging.spec.js +0 -29
  351. package/dist/upgrade/packaging.spec.js.map +0 -1
  352. package/dist/upgrade/prompt.spec.d.ts +0 -2
  353. package/dist/upgrade/prompt.spec.d.ts.map +0 -1
  354. package/dist/upgrade/prompt.spec.js +0 -51
  355. package/dist/upgrade/prompt.spec.js.map +0 -1
  356. package/dist/upgrade/report.spec.d.ts +0 -2
  357. package/dist/upgrade/report.spec.d.ts.map +0 -1
  358. package/dist/upgrade/report.spec.js +0 -87
  359. package/dist/upgrade/report.spec.js.map +0 -1
  360. package/dist/upgrade/resolveVersions.spec.d.ts +0 -2
  361. package/dist/upgrade/resolveVersions.spec.d.ts.map +0 -1
  362. package/dist/upgrade/resolveVersions.spec.js +0 -82
  363. package/dist/upgrade/resolveVersions.spec.js.map +0 -1
  364. package/dist/upgrade/rewritePackageJson.spec.d.ts +0 -2
  365. package/dist/upgrade/rewritePackageJson.spec.d.ts.map +0 -1
  366. package/dist/upgrade/rewritePackageJson.spec.js +0 -108
  367. package/dist/upgrade/rewritePackageJson.spec.js.map +0 -1
  368. package/dist/upgrade/runInstall.spec.d.ts +0 -2
  369. package/dist/upgrade/runInstall.spec.d.ts.map +0 -1
  370. package/dist/upgrade/runInstall.spec.js +0 -48
  371. package/dist/upgrade/runInstall.spec.js.map +0 -1
  372. package/dist/utils/packageJson.spec.d.ts +0 -2
  373. package/dist/utils/packageJson.spec.d.ts.map +0 -1
  374. package/dist/utils/packageJson.spec.js +0 -41
  375. package/dist/utils/packageJson.spec.js.map +0 -1
@@ -0,0 +1,38 @@
1
+ import type { Agent, DispatchChoice } from './selectAgent.js';
2
+ import { runUpgrade } from './index.js';
3
+ type UpgradeFlags = Parameters<typeof runUpgrade>[0]['flags'];
4
+ type RunDispatchArgs = {
5
+ agentFlag?: string;
6
+ path: string;
7
+ upgradeFlags: UpgradeFlags;
8
+ };
9
+ export type DispatchDeps = {
10
+ detectAgents: () => Agent[];
11
+ isInteractive: boolean;
12
+ promptChoice: (agents: Agent[]) => Promise<DispatchChoice>;
13
+ renderPrompt: () => string;
14
+ runMechanical: (args: {
15
+ flags: UpgradeFlags;
16
+ path: string;
17
+ }) => Promise<{
18
+ failed: boolean;
19
+ }>;
20
+ spawnAgent: (args: {
21
+ agent: Agent;
22
+ cwd: string;
23
+ promptFilePath: string;
24
+ }) => Promise<{
25
+ code: number;
26
+ }>;
27
+ writePromptFile: (contents: string) => string;
28
+ };
29
+ /**
30
+ * Bare `upgrade`: pick how to run the full v3 -> v4 upgrade. Hands the
31
+ * orchestration prompt to a detected coding agent, runs the mechanical slice
32
+ * here, or prints the prompt for manual use.
33
+ */
34
+ export declare function runDispatch({ agentFlag, path, upgradeFlags }: RunDispatchArgs, deps?: DispatchDeps): Promise<{
35
+ failed: boolean;
36
+ }>;
37
+ export {};
38
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/upgrade/dispatch.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAKvC,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AAE7D,KAAK,eAAe,GAAG;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,KAAK,EAAE,CAAA;IAC3B,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;IAC1D,YAAY,EAAE,MAAM,MAAM,CAAA;IAC1B,aAAa,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAC5F,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QACnF,IAAI,EAAE,MAAM,CAAA;KACb,CAAC,CAAA;IACF,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAC9C,CAAA;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,eAAe,EAClD,IAAI,GAAE,YAAoC,GACzC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAmC9B"}
@@ -0,0 +1,132 @@
1
+ /* eslint-disable no-console */ import * as p from '@clack/prompts';
2
+ import { spawn } from 'node:child_process';
3
+ import { mkdtempSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join, resolve } from 'node:path';
6
+ import { runUpgrade } from './index.js';
7
+ import { renderUpgradePrompt } from './prompt.js';
8
+ import { detectInstalledAgents, selectDispatch } from './selectAgent.js';
9
+ import { resolveSelfCommand } from './selfCommand.js';
10
+ /**
11
+ * Bare `upgrade`: pick how to run the full v3 -> v4 upgrade. Hands the
12
+ * orchestration prompt to a detected coding agent, runs the mechanical slice
13
+ * here, or prints the prompt for manual use.
14
+ */ export async function runDispatch({ agentFlag, path, upgradeFlags }, deps = defaultDispatchDeps()) {
15
+ const installed = deps.detectAgents();
16
+ let choice;
17
+ try {
18
+ choice = await selectDispatch({
19
+ agentFlag,
20
+ installed,
21
+ isInteractive: deps.isInteractive,
22
+ prompt: deps.promptChoice
23
+ });
24
+ } catch (err) {
25
+ console.error(err instanceof Error ? err.message : String(err));
26
+ return {
27
+ failed: true
28
+ };
29
+ }
30
+ if (choice.kind === 'run') {
31
+ return deps.runMechanical({
32
+ flags: upgradeFlags,
33
+ path
34
+ });
35
+ }
36
+ const promptText = deps.renderPrompt();
37
+ if (choice.kind === 'print') {
38
+ console.log(promptText);
39
+ return {
40
+ failed: false
41
+ };
42
+ }
43
+ const promptFilePath = deps.writePromptFile(promptText);
44
+ console.log(`Handing the upgrade prompt to ${choice.agent.label}...`);
45
+ const { code } = await deps.spawnAgent({
46
+ agent: choice.agent,
47
+ cwd: resolve(path),
48
+ promptFilePath
49
+ });
50
+ return {
51
+ failed: code !== 0
52
+ };
53
+ }
54
+ function defaultDispatchDeps() {
55
+ return {
56
+ detectAgents: detectInstalledAgents,
57
+ isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),
58
+ promptChoice: promptChoiceFromTerminal,
59
+ renderPrompt: ()=>renderUpgradePrompt({
60
+ command: resolveSelfCommand()
61
+ }),
62
+ runMechanical: (args)=>runUpgrade(args),
63
+ spawnAgent: spawnAgentInteractive,
64
+ writePromptFile: (contents)=>{
65
+ const dir = mkdtempSync(join(tmpdir(), 'payload-v4-upgrade-'));
66
+ const filePath = join(dir, 'prompt.md');
67
+ writeFileSync(filePath, contents);
68
+ return filePath;
69
+ }
70
+ };
71
+ }
72
+ /** Clack select: each installed agent, then run the slice or print the prompt. */ async function promptChoiceFromTerminal(agents) {
73
+ p.intro('Payload v3 -> v4 upgrade');
74
+ const selection = await p.select({
75
+ message: 'How do you want to run it?',
76
+ options: [
77
+ ...agents.map((agent)=>({
78
+ hint: `hand the prompt to \`${agent.command}\``,
79
+ label: agent.label,
80
+ value: agent.id
81
+ })),
82
+ {
83
+ hint: 'pin versions, install, run the codemods now',
84
+ label: 'Run the mechanical steps',
85
+ value: 'run'
86
+ },
87
+ {
88
+ hint: 'run it yourself or paste it elsewhere',
89
+ label: 'Just print the prompt',
90
+ value: 'print'
91
+ }
92
+ ]
93
+ });
94
+ // Cancelling (Ctrl-C) falls back to printing the prompt so the user keeps it.
95
+ if (p.isCancel(selection)) {
96
+ return {
97
+ kind: 'print'
98
+ };
99
+ }
100
+ if (selection === 'run') {
101
+ return {
102
+ kind: 'run'
103
+ };
104
+ }
105
+ const agent = agents.find((a)=>a.id === selection);
106
+ return agent ? {
107
+ agent,
108
+ kind: 'agent'
109
+ } : {
110
+ kind: 'print'
111
+ };
112
+ }
113
+ /** Interactive agent session seeded with a one-line pointer to the prompt file. */ function spawnAgentInteractive({ agent, cwd, promptFilePath }) {
114
+ const launchPrompt = `Read ${promptFilePath} and follow it to upgrade this project from Payload v3 to v4.`;
115
+ return new Promise((resolveSpawn)=>{
116
+ const child = spawn(agent.command, [
117
+ launchPrompt
118
+ ], {
119
+ cwd,
120
+ shell: false,
121
+ stdio: 'inherit'
122
+ });
123
+ child.on('close', (code)=>resolveSpawn({
124
+ code: code ?? 1
125
+ }));
126
+ child.on('error', ()=>resolveSpawn({
127
+ code: 1
128
+ }));
129
+ });
130
+ }
131
+
132
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/upgrade/dispatch.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport * as p from '@clack/prompts'\nimport { spawn } from 'node:child_process'\nimport { mkdtempSync, writeFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nimport type { Agent, DispatchChoice } from './selectAgent.js'\n\nimport { runUpgrade } from './index.js'\nimport { renderUpgradePrompt } from './prompt.js'\nimport { detectInstalledAgents, selectDispatch } from './selectAgent.js'\nimport { resolveSelfCommand } from './selfCommand.js'\n\ntype UpgradeFlags = Parameters<typeof runUpgrade>[0]['flags']\n\ntype RunDispatchArgs = {\n agentFlag?: string\n path: string\n upgradeFlags: UpgradeFlags\n}\n\nexport type DispatchDeps = {\n detectAgents: () => Agent[]\n isInteractive: boolean\n promptChoice: (agents: Agent[]) => Promise<DispatchChoice>\n renderPrompt: () => string\n runMechanical: (args: { flags: UpgradeFlags; path: string }) => Promise<{ failed: boolean }>\n spawnAgent: (args: { agent: Agent; cwd: string; promptFilePath: string }) => Promise<{\n code: number\n }>\n writePromptFile: (contents: string) => string\n}\n\n/**\n * Bare `upgrade`: pick how to run the full v3 -> v4 upgrade. Hands the\n * orchestration prompt to a detected coding agent, runs the mechanical slice\n * here, or prints the prompt for manual use.\n */\nexport async function runDispatch(\n { agentFlag, path, upgradeFlags }: RunDispatchArgs,\n deps: DispatchDeps = defaultDispatchDeps(),\n): Promise<{ failed: boolean }> {\n const installed = deps.detectAgents()\n\n let choice: DispatchChoice\n try {\n choice = await selectDispatch({\n agentFlag,\n installed,\n isInteractive: deps.isInteractive,\n prompt: deps.promptChoice,\n })\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n return { failed: true }\n }\n\n if (choice.kind === 'run') {\n return deps.runMechanical({ flags: upgradeFlags, path })\n }\n\n const promptText = deps.renderPrompt()\n\n if (choice.kind === 'print') {\n console.log(promptText)\n return { failed: false }\n }\n\n const promptFilePath = deps.writePromptFile(promptText)\n console.log(`Handing the upgrade prompt to ${choice.agent.label}...`)\n const { code } = await deps.spawnAgent({\n agent: choice.agent,\n cwd: resolve(path),\n promptFilePath,\n })\n return { failed: code !== 0 }\n}\n\nfunction defaultDispatchDeps(): DispatchDeps {\n return {\n detectAgents: detectInstalledAgents,\n isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n promptChoice: promptChoiceFromTerminal,\n renderPrompt: () => renderUpgradePrompt({ command: resolveSelfCommand() }),\n runMechanical: (args) => runUpgrade(args),\n spawnAgent: spawnAgentInteractive,\n writePromptFile: (contents) => {\n const dir = mkdtempSync(join(tmpdir(), 'payload-v4-upgrade-'))\n const filePath = join(dir, 'prompt.md')\n writeFileSync(filePath, contents)\n return filePath\n },\n }\n}\n\n/** Clack select: each installed agent, then run the slice or print the prompt. */\nasync function promptChoiceFromTerminal(agents: Agent[]): Promise<DispatchChoice> {\n p.intro('Payload v3 -> v4 upgrade')\n const selection = await p.select({\n message: 'How do you want to run it?',\n options: [\n ...agents.map((agent) => ({\n hint: `hand the prompt to \\`${agent.command}\\``,\n label: agent.label,\n value: agent.id,\n })),\n {\n hint: 'pin versions, install, run the codemods now',\n label: 'Run the mechanical steps',\n value: 'run',\n },\n {\n hint: 'run it yourself or paste it elsewhere',\n label: 'Just print the prompt',\n value: 'print',\n },\n ],\n })\n\n // Cancelling (Ctrl-C) falls back to printing the prompt so the user keeps it.\n if (p.isCancel(selection)) {\n return { kind: 'print' }\n }\n if (selection === 'run') {\n return { kind: 'run' }\n }\n const agent = agents.find((a) => a.id === selection)\n return agent ? { agent, kind: 'agent' } : { kind: 'print' }\n}\n\n/** Interactive agent session seeded with a one-line pointer to the prompt file. */\nfunction spawnAgentInteractive({\n agent,\n cwd,\n promptFilePath,\n}: {\n agent: Agent\n cwd: string\n promptFilePath: string\n}): Promise<{ code: number }> {\n const launchPrompt = `Read ${promptFilePath} and follow it to upgrade this project from Payload v3 to v4.`\n return new Promise((resolveSpawn) => {\n const child = spawn(agent.command, [launchPrompt], { cwd, shell: false, stdio: 'inherit' })\n child.on('close', (code) => resolveSpawn({ code: code ?? 1 }))\n child.on('error', () => resolveSpawn({ code: 1 }))\n })\n}\n"],"names":["p","spawn","mkdtempSync","writeFileSync","tmpdir","join","resolve","runUpgrade","renderUpgradePrompt","detectInstalledAgents","selectDispatch","resolveSelfCommand","runDispatch","agentFlag","path","upgradeFlags","deps","defaultDispatchDeps","installed","detectAgents","choice","isInteractive","prompt","promptChoice","err","console","error","Error","message","String","failed","kind","runMechanical","flags","promptText","renderPrompt","log","promptFilePath","writePromptFile","agent","label","code","spawnAgent","cwd","Boolean","process","stdin","isTTY","stdout","promptChoiceFromTerminal","command","args","spawnAgentInteractive","contents","dir","filePath","agents","intro","selection","select","options","map","hint","value","id","isCancel","find","a","launchPrompt","Promise","resolveSpawn","child","shell","stdio","on"],"mappings":"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"}
@@ -3,7 +3,8 @@ import { runTransforms as defaultRunTransforms } from '../runner.js';
3
3
  export type UpgradeFlags = {
4
4
  dry: boolean;
5
5
  force: boolean;
6
- tag: string;
6
+ /** Explicit --tag; when absent the default is derived from the running version. */
7
+ tag?: string;
7
8
  };
8
9
  type RunUpgradeArgs = {
9
10
  flags: UpgradeFlags;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upgrade/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAuC,WAAW,EAAE,MAAM,YAAY,CAAA;AAGlF,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAUpE,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,YAAY,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB,aAAa,CAAC,EAAE,OAAO,oBAAoB,CAAA;CAC5C,CAAA;AAsBD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,cAAc,EAC/B,IAAI,GAAE,WAA2B,EACjC,SAAS,GAAE,mBAAwB,GAClC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAqF9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upgrade/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAuC,WAAW,EAAE,MAAM,YAAY,CAAA;AAGlF,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAepE,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,YAAY,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB,aAAa,CAAC,EAAE,OAAO,oBAAoB,CAAA;CAC5C,CAAA;AAmBD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,cAAc,EAC/B,IAAI,GAAE,WAA2B,EACjC,SAAS,GAAE,mBAAwB,GAClC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA6F9B"}
@@ -1,4 +1,5 @@
1
- /* eslint-disable no-console */ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
1
+ /* eslint-disable no-console */ import { spawn, spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
3
  import { dirname, join, resolve } from 'node:path';
3
4
  import { fileURLToPath } from 'node:url';
4
5
  import semver from 'semver';
@@ -6,12 +7,13 @@ import { transforms as registry } from '../registry.js';
6
7
  import { runTransforms as defaultRunTransforms } from '../runner.js';
7
8
  import { loadPackageJsons, serializePackageJson } from '../utils/packageJson.js';
8
9
  import { loadProject } from '../utils/project.js';
10
+ import { resolveDefaultTag } from './defaultTag.js';
9
11
  import { detectPackageManager } from './detectPackageManager.js';
10
12
  import { renderReport } from './report.js';
11
13
  import { resolveVersions } from './resolveVersions.js';
12
- import { isPayloadEslintPackage, rewritePackageJson } from './rewritePackageJson.js';
14
+ import { isPayloadEslintPackage, isPlaceholderSpec, rewritePackageJson } from './rewritePackageJson.js';
13
15
  import { runInstall } from './runInstall.js';
14
- import { RUNBOOK_RELATIVE_PATH } from './types.js';
16
+ import { MIGRATION_GUIDE_RELATIVE_PATH, RUNBOOK_RELATIVE_PATH } from './types.js';
15
17
  const defaultDeps = ()=>({
16
18
  exists: existsSync,
17
19
  fetchRegistry: async (name)=>{
@@ -21,19 +23,19 @@ const defaultDeps = ()=>({
21
23
  }
22
24
  return await res.json();
23
25
  },
24
- spawn: (command, args, options)=>import('node:child_process').then(({ spawn })=>new Promise((resolveSpawn)=>{
25
- const child = spawn(command, args, {
26
- ...options,
27
- shell: false,
28
- stdio: 'inherit'
29
- });
30
- child.on('close', (code)=>resolveSpawn({
31
- code: code ?? 1
32
- }));
33
- child.on('error', ()=>resolveSpawn({
34
- code: 1
35
- }));
36
- }))
26
+ spawn: (command, args, options)=>new Promise((resolveSpawn)=>{
27
+ const child = spawn(command, args, {
28
+ ...options,
29
+ shell: false,
30
+ stdio: 'inherit'
31
+ });
32
+ child.on('close', (code)=>resolveSpawn({
33
+ code: code ?? 1
34
+ }));
35
+ child.on('error', ()=>resolveSpawn({
36
+ code: 1
37
+ }));
38
+ })
37
39
  });
38
40
  /**
39
41
  * Compose the upgrade pipeline: preflight -> resolve -> rewrite -> install ->
@@ -55,9 +57,10 @@ const defaultDeps = ()=>({
55
57
  console.warn('Warning: git tree is dirty. Commit or stash first, or pass --force.');
56
58
  }
57
59
  // 2. RESOLVE VERSIONS
60
+ const tag = flags.tag ?? resolveDefaultTag();
58
61
  const resolved = await resolveVersions({
59
62
  fetchRegistry: deps.fetchRegistry,
60
- tag: flags.tag
63
+ tag
61
64
  });
62
65
  warnStaleNode(resolved);
63
66
  // 3. REWRITE package.json
@@ -118,17 +121,24 @@ const defaultDeps = ()=>({
118
121
  }
119
122
  }
120
123
  // 7. REPORT
124
+ const distDir = resolve(dirname(fileURLToPath(import.meta.url)), '..');
125
+ const migrationGuideAbsPath = join(distDir, MIGRATION_GUIDE_RELATIVE_PATH);
121
126
  const model = {
122
127
  floorsWritten: summary.floorsWritten,
128
+ migrationGuidePath: deps.exists(migrationGuideAbsPath) ? migrationGuideAbsPath : undefined,
123
129
  nextTarget: resolved.nextTarget,
124
130
  overridesRemoved: summary.overridesRemoved,
125
- runbookPath: resolve(dirname(fileURLToPath(import.meta.url)), '..', RUNBOOK_RELATIVE_PATH),
131
+ placeholdersSkipped: summary.placeholdersSkipped,
132
+ runbookPath: join(distDir, RUNBOOK_RELATIVE_PATH),
126
133
  transforms: results,
127
134
  versions
128
135
  };
129
136
  console.log(renderReport(model));
137
+ // A resolution mismatch means the installed tree is not confirmed v4, so the
138
+ // run failed even when every transform succeeded (resolution over intent).
139
+ const resolutionFailed = versions.some((v)=>!v.ok);
130
140
  return {
131
- failed
141
+ failed: failed || resolutionFailed
132
142
  };
133
143
  }
134
144
  function warnStaleNode(resolved) {
@@ -152,6 +162,11 @@ function verifyResolution(projectPath, data, resolved) {
152
162
  if (isPayloadEslintPackage(name)) {
153
163
  continue;
154
164
  }
165
+ // Workspace/catalog/link specs were left unpinned, so there is no exact
166
+ // version to verify against.
167
+ if (isPlaceholderSpec(deps[name])) {
168
+ continue;
169
+ }
155
170
  const installed = readInstalledVersion(projectPath, name);
156
171
  rows.push({
157
172
  name,
@@ -171,11 +186,21 @@ function readInstalledVersion(projectPath, name) {
171
186
  }
172
187
  }
173
188
  /**
174
- * Best-effort dirty-tree check. Real detection would shell out to `git
175
- * status`; until that lands, absence of a signal is treated as clean so the
176
- * warning never produces a false alarm.
177
- */ function isGitTreeDirty(_projectPath) {
178
- return false;
189
+ * Best-effort dirty-tree check via `git status --porcelain`. Any failure (not a
190
+ * repo, git missing) yields no signal and is treated as clean, so the warning
191
+ * never produces a false alarm outside a working git tree.
192
+ */ function isGitTreeDirty(projectPath) {
193
+ const result = spawnSync('git', [
194
+ 'status',
195
+ '--porcelain'
196
+ ], {
197
+ cwd: projectPath,
198
+ encoding: 'utf8'
199
+ });
200
+ if (result.error || result.status !== 0) {
201
+ return false;
202
+ }
203
+ return result.stdout.trim().length > 0;
179
204
  }
180
205
  function asRecord(value) {
181
206
  return typeof value === 'object' && value !== null ? value : {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upgrade/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport semver from 'semver'\n\nimport type { ReportModel, VersionReportRow } from './report.js'\nimport type { RegistryPackument, ResolvedVersions, UpgradeDeps } from './types.js'\n\nimport { transforms as registry } from '../registry.js'\nimport { runTransforms as defaultRunTransforms } from '../runner.js'\nimport { loadPackageJsons, serializePackageJson } from '../utils/packageJson.js'\nimport { loadProject } from '../utils/project.js'\nimport { detectPackageManager } from './detectPackageManager.js'\nimport { renderReport } from './report.js'\nimport { resolveVersions } from './resolveVersions.js'\nimport { isPayloadEslintPackage, rewritePackageJson } from './rewritePackageJson.js'\nimport { runInstall } from './runInstall.js'\nimport { RUNBOOK_RELATIVE_PATH } from './types.js'\n\nexport type UpgradeFlags = {\n dry: boolean\n force: boolean\n tag: string\n}\n\ntype RunUpgradeArgs = {\n flags: UpgradeFlags\n path: string\n}\n\ntype RunUpgradeOverrides = {\n runTransforms?: typeof defaultRunTransforms\n}\n\nconst defaultDeps = (): UpgradeDeps => ({\n exists: existsSync,\n fetchRegistry: async (name) => {\n const res = await fetch(`https://registry.npmjs.org/${name}`)\n if (!res.ok) {\n throw new Error(`Registry lookup failed for ${name}: ${res.status}`)\n }\n return (await res.json()) as RegistryPackument\n },\n spawn: (command, args, options) =>\n import('node:child_process').then(\n ({ spawn }) =>\n new Promise((resolveSpawn) => {\n const child = spawn(command, args, { ...options, shell: false, stdio: 'inherit' })\n child.on('close', (code) => resolveSpawn({ code: code ?? 1 }))\n child.on('error', () => resolveSpawn({ code: 1 }))\n }),\n ),\n})\n\n/**\n * Compose the upgrade pipeline: preflight -> resolve -> rewrite -> install ->\n * verify -> transforms -> report. Install runs before transforms so a failed\n * install aborts before any codemod touches source files.\n */\nexport async function runUpgrade(\n { flags, path }: RunUpgradeArgs,\n deps: UpgradeDeps = defaultDeps(),\n overrides: RunUpgradeOverrides = {},\n): Promise<{ failed: boolean }> {\n const runTransforms = overrides.runTransforms ?? defaultRunTransforms\n const projectPath = resolve(path)\n\n // 1. PREFLIGHT\n const packageManager = detectPackageManager(projectPath, deps.exists)\n const packageJsonPath = join(projectPath, 'package.json')\n if (!deps.exists(packageJsonPath)) {\n console.error(`No package.json found at ${packageJsonPath}.`)\n return { failed: true }\n }\n if (!flags.force && isGitTreeDirty(projectPath)) {\n console.warn('Warning: git tree is dirty. Commit or stash first, or pass --force.')\n }\n\n // 2. RESOLVE VERSIONS\n const resolved = await resolveVersions({ fetchRegistry: deps.fetchRegistry, tag: flags.tag })\n warnStaleNode(resolved)\n\n // 3. REWRITE package.json\n const original = readFileSync(packageJsonPath, 'utf8')\n const data = JSON.parse(original) as Record<string, unknown>\n const summary = rewritePackageJson({ data, resolved })\n const nextText = serializePackageJson(data, original)\n\n if (flags.dry) {\n console.log('[dry] package.json changes:')\n console.log(nextText)\n console.log(`[dry] would run: ${packageManager} install`)\n console.log('[dry] would then run Payload transforms.')\n return { failed: false }\n }\n\n writeFileSync(packageJsonPath, nextText)\n\n // 4. INSTALL\n const install = await runInstall({ packageManager, path: projectPath, spawn: deps.spawn })\n if (install.code !== 0) {\n console.error(`Install failed (exit ${install.code}). Aborting before transforms.`)\n return { failed: true }\n }\n\n // 5. VERIFY RESOLUTION\n const versions = verifyResolution(projectPath, data, resolved)\n\n // 6. RUN PAYLOAD TRANSFORMS\n // Reload package.jsons from disk so transforms see the rewritten root file\n // (and any other package.json files in the tree) with the same reference\n // semantics the bare transform path relies on for in-place mutation.\n const packageJsons = loadPackageJsons(projectPath)\n const project = loadProject(projectPath)\n const snapshot = new Map(project.getSourceFiles().map((f) => [f.getFilePath(), f.getFullText()]))\n const { failed, results } = await runTransforms({\n packageJsons: packageJsons.map(({ data: pkgData, path: pkgPath }) => ({\n data: pkgData,\n path: pkgPath,\n })),\n project,\n transforms: registry,\n })\n await Promise.all(\n project\n .getSourceFiles()\n .filter((f) => snapshot.get(f.getFilePath()) !== f.getFullText())\n .map((f) => f.save()),\n )\n for (const pkg of packageJsons) {\n const text = serializePackageJson(pkg.data, pkg.originalText)\n if (text !== pkg.originalText) {\n writeFileSync(pkg.path, text)\n }\n }\n\n // 7. REPORT\n const model: ReportModel = {\n floorsWritten: summary.floorsWritten,\n nextTarget: resolved.nextTarget,\n overridesRemoved: summary.overridesRemoved,\n runbookPath: resolve(dirname(fileURLToPath(import.meta.url)), '..', RUNBOOK_RELATIVE_PATH),\n transforms: results,\n versions,\n }\n console.log(renderReport(model))\n\n return { failed }\n}\n\nfunction warnStaleNode(resolved: ResolvedVersions): void {\n const running = process.versions.node\n if (!semver.satisfies(running, resolved.enginesNode)) {\n console.warn(\n `Warning: running Node ${running} does not satisfy ${resolved.enginesNode}. ` +\n 'Install may resolve incorrectly; switch Node before continuing.',\n )\n }\n}\n\nfunction verifyResolution(\n projectPath: string,\n data: Record<string, unknown>,\n resolved: ResolvedVersions,\n): VersionReportRow[] {\n const rows: VersionReportRow[] = []\n const deps = { ...asRecord(data.dependencies), ...asRecord(data.devDependencies) }\n for (const name of Object.keys(deps)) {\n if (name !== 'payload' && !name.startsWith('@payloadcms/')) {\n continue\n }\n // eslint packages are versioned independently, so they are not part of the\n // lockstep-pinned set and cannot be verified against the payload version.\n if (isPayloadEslintPackage(name)) {\n continue\n }\n const installed = readInstalledVersion(projectPath, name)\n rows.push({\n name,\n ok: installed === resolved.payloadVersion,\n resolved: installed,\n wrote: resolved.payloadVersion,\n })\n }\n return rows\n}\n\nfunction readInstalledVersion(projectPath: string, name: string): string | undefined {\n try {\n const pkgPath = join(projectPath, 'node_modules', name, 'package.json')\n return JSON.parse(readFileSync(pkgPath, 'utf8')).version as string\n } catch {\n return undefined\n }\n}\n\n/**\n * Best-effort dirty-tree check. Real detection would shell out to `git\n * status`; until that lands, absence of a signal is treated as clean so the\n * warning never produces a false alarm.\n */\nfunction isGitTreeDirty(_projectPath: string): boolean {\n return false\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {}\n}\n"],"names":["existsSync","readFileSync","writeFileSync","dirname","join","resolve","fileURLToPath","semver","transforms","registry","runTransforms","defaultRunTransforms","loadPackageJsons","serializePackageJson","loadProject","detectPackageManager","renderReport","resolveVersions","isPayloadEslintPackage","rewritePackageJson","runInstall","RUNBOOK_RELATIVE_PATH","defaultDeps","exists","fetchRegistry","name","res","fetch","ok","Error","status","json","spawn","command","args","options","then","Promise","resolveSpawn","child","shell","stdio","on","code","runUpgrade","flags","path","deps","overrides","projectPath","packageManager","packageJsonPath","console","error","failed","force","isGitTreeDirty","warn","resolved","tag","warnStaleNode","original","data","JSON","parse","summary","nextText","dry","log","install","versions","verifyResolution","packageJsons","project","snapshot","Map","getSourceFiles","map","f","getFilePath","getFullText","results","pkgData","pkgPath","all","filter","get","save","pkg","text","originalText","model","floorsWritten","nextTarget","overridesRemoved","runbookPath","url","running","process","node","satisfies","enginesNode","rows","asRecord","dependencies","devDependencies","Object","keys","startsWith","installed","readInstalledVersion","push","payloadVersion","wrote","version","undefined","_projectPath","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/upgrade/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { spawn, spawnSync } from 'node:child_process'\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport semver from 'semver'\n\nimport type { ReportModel, VersionReportRow } from './report.js'\nimport type { RegistryPackument, ResolvedVersions, UpgradeDeps } from './types.js'\n\nimport { transforms as registry } from '../registry.js'\nimport { runTransforms as defaultRunTransforms } from '../runner.js'\nimport { loadPackageJsons, serializePackageJson } from '../utils/packageJson.js'\nimport { loadProject } from '../utils/project.js'\nimport { resolveDefaultTag } from './defaultTag.js'\nimport { detectPackageManager } from './detectPackageManager.js'\nimport { renderReport } from './report.js'\nimport { resolveVersions } from './resolveVersions.js'\nimport {\n isPayloadEslintPackage,\n isPlaceholderSpec,\n rewritePackageJson,\n} from './rewritePackageJson.js'\nimport { runInstall } from './runInstall.js'\nimport { MIGRATION_GUIDE_RELATIVE_PATH, RUNBOOK_RELATIVE_PATH } from './types.js'\n\nexport type UpgradeFlags = {\n dry: boolean\n force: boolean\n /** Explicit --tag; when absent the default is derived from the running version. */\n tag?: string\n}\n\ntype RunUpgradeArgs = {\n flags: UpgradeFlags\n path: string\n}\n\ntype RunUpgradeOverrides = {\n runTransforms?: typeof defaultRunTransforms\n}\n\nconst defaultDeps = (): UpgradeDeps => ({\n exists: existsSync,\n fetchRegistry: async (name) => {\n const res = await fetch(`https://registry.npmjs.org/${name}`)\n if (!res.ok) {\n throw new Error(`Registry lookup failed for ${name}: ${res.status}`)\n }\n return (await res.json()) as RegistryPackument\n },\n spawn: (command, args, options) =>\n new Promise((resolveSpawn) => {\n const child = spawn(command, args, { ...options, shell: false, stdio: 'inherit' })\n child.on('close', (code) => resolveSpawn({ code: code ?? 1 }))\n child.on('error', () => resolveSpawn({ code: 1 }))\n }),\n})\n\n/**\n * Compose the upgrade pipeline: preflight -> resolve -> rewrite -> install ->\n * verify -> transforms -> report. Install runs before transforms so a failed\n * install aborts before any codemod touches source files.\n */\nexport async function runUpgrade(\n { flags, path }: RunUpgradeArgs,\n deps: UpgradeDeps = defaultDeps(),\n overrides: RunUpgradeOverrides = {},\n): Promise<{ failed: boolean }> {\n const runTransforms = overrides.runTransforms ?? defaultRunTransforms\n const projectPath = resolve(path)\n\n // 1. PREFLIGHT\n const packageManager = detectPackageManager(projectPath, deps.exists)\n const packageJsonPath = join(projectPath, 'package.json')\n if (!deps.exists(packageJsonPath)) {\n console.error(`No package.json found at ${packageJsonPath}.`)\n return { failed: true }\n }\n if (!flags.force && isGitTreeDirty(projectPath)) {\n console.warn('Warning: git tree is dirty. Commit or stash first, or pass --force.')\n }\n\n // 2. RESOLVE VERSIONS\n const tag = flags.tag ?? resolveDefaultTag()\n const resolved = await resolveVersions({ fetchRegistry: deps.fetchRegistry, tag })\n warnStaleNode(resolved)\n\n // 3. REWRITE package.json\n const original = readFileSync(packageJsonPath, 'utf8')\n const data = JSON.parse(original) as Record<string, unknown>\n const summary = rewritePackageJson({ data, resolved })\n const nextText = serializePackageJson(data, original)\n\n if (flags.dry) {\n console.log('[dry] package.json changes:')\n console.log(nextText)\n console.log(`[dry] would run: ${packageManager} install`)\n console.log('[dry] would then run Payload transforms.')\n return { failed: false }\n }\n\n writeFileSync(packageJsonPath, nextText)\n\n // 4. INSTALL\n const install = await runInstall({ packageManager, path: projectPath, spawn: deps.spawn })\n if (install.code !== 0) {\n console.error(`Install failed (exit ${install.code}). Aborting before transforms.`)\n return { failed: true }\n }\n\n // 5. VERIFY RESOLUTION\n const versions = verifyResolution(projectPath, data, resolved)\n\n // 6. RUN PAYLOAD TRANSFORMS\n // Reload package.jsons from disk so transforms see the rewritten root file\n // (and any other package.json files in the tree) with the same reference\n // semantics the bare transform path relies on for in-place mutation.\n const packageJsons = loadPackageJsons(projectPath)\n const project = loadProject(projectPath)\n const snapshot = new Map(project.getSourceFiles().map((f) => [f.getFilePath(), f.getFullText()]))\n const { failed, results } = await runTransforms({\n packageJsons: packageJsons.map(({ data: pkgData, path: pkgPath }) => ({\n data: pkgData,\n path: pkgPath,\n })),\n project,\n transforms: registry,\n })\n await Promise.all(\n project\n .getSourceFiles()\n .filter((f) => snapshot.get(f.getFilePath()) !== f.getFullText())\n .map((f) => f.save()),\n )\n for (const pkg of packageJsons) {\n const text = serializePackageJson(pkg.data, pkg.originalText)\n if (text !== pkg.originalText) {\n writeFileSync(pkg.path, text)\n }\n }\n\n // 7. REPORT\n const distDir = resolve(dirname(fileURLToPath(import.meta.url)), '..')\n const migrationGuideAbsPath = join(distDir, MIGRATION_GUIDE_RELATIVE_PATH)\n const model: ReportModel = {\n floorsWritten: summary.floorsWritten,\n migrationGuidePath: deps.exists(migrationGuideAbsPath) ? migrationGuideAbsPath : undefined,\n nextTarget: resolved.nextTarget,\n overridesRemoved: summary.overridesRemoved,\n placeholdersSkipped: summary.placeholdersSkipped,\n runbookPath: join(distDir, RUNBOOK_RELATIVE_PATH),\n transforms: results,\n versions,\n }\n console.log(renderReport(model))\n\n // A resolution mismatch means the installed tree is not confirmed v4, so the\n // run failed even when every transform succeeded (resolution over intent).\n const resolutionFailed = versions.some((v) => !v.ok)\n return { failed: failed || resolutionFailed }\n}\n\nfunction warnStaleNode(resolved: ResolvedVersions): void {\n const running = process.versions.node\n if (!semver.satisfies(running, resolved.enginesNode)) {\n console.warn(\n `Warning: running Node ${running} does not satisfy ${resolved.enginesNode}. ` +\n 'Install may resolve incorrectly; switch Node before continuing.',\n )\n }\n}\n\nfunction verifyResolution(\n projectPath: string,\n data: Record<string, unknown>,\n resolved: ResolvedVersions,\n): VersionReportRow[] {\n const rows: VersionReportRow[] = []\n const deps = { ...asRecord(data.dependencies), ...asRecord(data.devDependencies) }\n for (const name of Object.keys(deps)) {\n if (name !== 'payload' && !name.startsWith('@payloadcms/')) {\n continue\n }\n // eslint packages are versioned independently, so they are not part of the\n // lockstep-pinned set and cannot be verified against the payload version.\n if (isPayloadEslintPackage(name)) {\n continue\n }\n // Workspace/catalog/link specs were left unpinned, so there is no exact\n // version to verify against.\n if (isPlaceholderSpec(deps[name])) {\n continue\n }\n const installed = readInstalledVersion(projectPath, name)\n rows.push({\n name,\n ok: installed === resolved.payloadVersion,\n resolved: installed,\n wrote: resolved.payloadVersion,\n })\n }\n return rows\n}\n\nfunction readInstalledVersion(projectPath: string, name: string): string | undefined {\n try {\n const pkgPath = join(projectPath, 'node_modules', name, 'package.json')\n return JSON.parse(readFileSync(pkgPath, 'utf8')).version as string\n } catch {\n return undefined\n }\n}\n\n/**\n * Best-effort dirty-tree check via `git status --porcelain`. Any failure (not a\n * repo, git missing) yields no signal and is treated as clean, so the warning\n * never produces a false alarm outside a working git tree.\n */\nfunction isGitTreeDirty(projectPath: string): boolean {\n const result = spawnSync('git', ['status', '--porcelain'], {\n cwd: projectPath,\n encoding: 'utf8',\n })\n if (result.error || result.status !== 0) {\n return false\n }\n return result.stdout.trim().length > 0\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {}\n}\n"],"names":["spawn","spawnSync","existsSync","readFileSync","writeFileSync","dirname","join","resolve","fileURLToPath","semver","transforms","registry","runTransforms","defaultRunTransforms","loadPackageJsons","serializePackageJson","loadProject","resolveDefaultTag","detectPackageManager","renderReport","resolveVersions","isPayloadEslintPackage","isPlaceholderSpec","rewritePackageJson","runInstall","MIGRATION_GUIDE_RELATIVE_PATH","RUNBOOK_RELATIVE_PATH","defaultDeps","exists","fetchRegistry","name","res","fetch","ok","Error","status","json","command","args","options","Promise","resolveSpawn","child","shell","stdio","on","code","runUpgrade","flags","path","deps","overrides","projectPath","packageManager","packageJsonPath","console","error","failed","force","isGitTreeDirty","warn","tag","resolved","warnStaleNode","original","data","JSON","parse","summary","nextText","dry","log","install","versions","verifyResolution","packageJsons","project","snapshot","Map","getSourceFiles","map","f","getFilePath","getFullText","results","pkgData","pkgPath","all","filter","get","save","pkg","text","originalText","distDir","url","migrationGuideAbsPath","model","floorsWritten","migrationGuidePath","undefined","nextTarget","overridesRemoved","placeholdersSkipped","runbookPath","resolutionFailed","some","v","running","process","node","satisfies","enginesNode","rows","asRecord","dependencies","devDependencies","Object","keys","startsWith","installed","readInstalledVersion","push","payloadVersion","wrote","version","result","cwd","encoding","stdout","trim","length","value"],"mappings":"AAAA,6BAA6B,GAC7B,SAASA,KAAK,EAAEC,SAAS,QAAQ,qBAAoB;AACrD,SAASC,UAAU,EAAEC,YAAY,EAAEC,aAAa,QAAQ,UAAS;AACjE,SAASC,OAAO,EAAEC,IAAI,EAAEC,OAAO,QAAQ,YAAW;AAClD,SAASC,aAAa,QAAQ,WAAU;AACxC,OAAOC,YAAY,SAAQ;AAK3B,SAASC,cAAcC,QAAQ,QAAQ,iBAAgB;AACvD,SAASC,iBAAiBC,oBAAoB,QAAQ,eAAc;AACpE,SAASC,gBAAgB,EAAEC,oBAAoB,QAAQ,0BAAyB;AAChF,SAASC,WAAW,QAAQ,sBAAqB;AACjD,SAASC,iBAAiB,QAAQ,kBAAiB;AACnD,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,YAAY,QAAQ,cAAa;AAC1C,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SACEC,sBAAsB,EACtBC,iBAAiB,EACjBC,kBAAkB,QACb,0BAAyB;AAChC,SAASC,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,6BAA6B,EAAEC,qBAAqB,QAAQ,aAAY;AAkBjF,MAAMC,cAAc,IAAoB,CAAA;QACtCC,QAAQ1B;QACR2B,eAAe,OAAOC;YACpB,MAAMC,MAAM,MAAMC,MAAM,CAAC,2BAA2B,EAAEF,MAAM;YAC5D,IAAI,CAACC,IAAIE,EAAE,EAAE;gBACX,MAAM,IAAIC,MAAM,CAAC,2BAA2B,EAAEJ,KAAK,EAAE,EAAEC,IAAII,MAAM,EAAE;YACrE;YACA,OAAQ,MAAMJ,IAAIK,IAAI;QACxB;QACApC,OAAO,CAACqC,SAASC,MAAMC,UACrB,IAAIC,QAAQ,CAACC;gBACX,MAAMC,QAAQ1C,MAAMqC,SAASC,MAAM;oBAAE,GAAGC,OAAO;oBAAEI,OAAO;oBAAOC,OAAO;gBAAU;gBAChFF,MAAMG,EAAE,CAAC,SAAS,CAACC,OAASL,aAAa;wBAAEK,MAAMA,QAAQ;oBAAE;gBAC3DJ,MAAMG,EAAE,CAAC,SAAS,IAAMJ,aAAa;wBAAEK,MAAM;oBAAE;YACjD;IACJ,CAAA;AAEA;;;;CAIC,GACD,OAAO,eAAeC,WACpB,EAAEC,KAAK,EAAEC,IAAI,EAAkB,EAC/BC,OAAoBvB,aAAa,EACjCwB,YAAiC,CAAC,CAAC;IAEnC,MAAMvC,gBAAgBuC,UAAUvC,aAAa,IAAIC;IACjD,MAAMuC,cAAc7C,QAAQ0C;IAE5B,eAAe;IACf,MAAMI,iBAAiBnC,qBAAqBkC,aAAaF,KAAKtB,MAAM;IACpE,MAAM0B,kBAAkBhD,KAAK8C,aAAa;IAC1C,IAAI,CAACF,KAAKtB,MAAM,CAAC0B,kBAAkB;QACjCC,QAAQC,KAAK,CAAC,CAAC,yBAAyB,EAAEF,gBAAgB,CAAC,CAAC;QAC5D,OAAO;YAAEG,QAAQ;QAAK;IACxB;IACA,IAAI,CAACT,MAAMU,KAAK,IAAIC,eAAeP,cAAc;QAC/CG,QAAQK,IAAI,CAAC;IACf;IAEA,sBAAsB;IACtB,MAAMC,MAAMb,MAAMa,GAAG,IAAI5C;IACzB,MAAM6C,WAAW,MAAM1C,gBAAgB;QAAES,eAAeqB,KAAKrB,aAAa;QAAEgC;IAAI;IAChFE,cAAcD;IAEd,0BAA0B;IAC1B,MAAME,WAAW7D,aAAamD,iBAAiB;IAC/C,MAAMW,OAAOC,KAAKC,KAAK,CAACH;IACxB,MAAMI,UAAU7C,mBAAmB;QAAE0C;QAAMH;IAAS;IACpD,MAAMO,WAAWtD,qBAAqBkD,MAAMD;IAE5C,IAAIhB,MAAMsB,GAAG,EAAE;QACbf,QAAQgB,GAAG,CAAC;QACZhB,QAAQgB,GAAG,CAACF;QACZd,QAAQgB,GAAG,CAAC,CAAC,iBAAiB,EAAElB,eAAe,QAAQ,CAAC;QACxDE,QAAQgB,GAAG,CAAC;QACZ,OAAO;YAAEd,QAAQ;QAAM;IACzB;IAEArD,cAAckD,iBAAiBe;IAE/B,aAAa;IACb,MAAMG,UAAU,MAAMhD,WAAW;QAAE6B;QAAgBJ,MAAMG;QAAapD,OAAOkD,KAAKlD,KAAK;IAAC;IACxF,IAAIwE,QAAQ1B,IAAI,KAAK,GAAG;QACtBS,QAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAEgB,QAAQ1B,IAAI,CAAC,8BAA8B,CAAC;QAClF,OAAO;YAAEW,QAAQ;QAAK;IACxB;IAEA,uBAAuB;IACvB,MAAMgB,WAAWC,iBAAiBtB,aAAaa,MAAMH;IAErD,4BAA4B;IAC5B,2EAA2E;IAC3E,yEAAyE;IACzE,qEAAqE;IACrE,MAAMa,eAAe7D,iBAAiBsC;IACtC,MAAMwB,UAAU5D,YAAYoC;IAC5B,MAAMyB,WAAW,IAAIC,IAAIF,QAAQG,cAAc,GAAGC,GAAG,CAAC,CAACC,IAAM;YAACA,EAAEC,WAAW;YAAID,EAAEE,WAAW;SAAG;IAC/F,MAAM,EAAE1B,MAAM,EAAE2B,OAAO,EAAE,GAAG,MAAMxE,cAAc;QAC9C+D,cAAcA,aAAaK,GAAG,CAAC,CAAC,EAAEf,MAAMoB,OAAO,EAAEpC,MAAMqC,OAAO,EAAE,GAAM,CAAA;gBACpErB,MAAMoB;gBACNpC,MAAMqC;YACR,CAAA;QACAV;QACAlE,YAAYC;IACd;IACA,MAAM6B,QAAQ+C,GAAG,CACfX,QACGG,cAAc,GACdS,MAAM,CAAC,CAACP,IAAMJ,SAASY,GAAG,CAACR,EAAEC,WAAW,QAAQD,EAAEE,WAAW,IAC7DH,GAAG,CAAC,CAACC,IAAMA,EAAES,IAAI;IAEtB,KAAK,MAAMC,OAAOhB,aAAc;QAC9B,MAAMiB,OAAO7E,qBAAqB4E,IAAI1B,IAAI,EAAE0B,IAAIE,YAAY;QAC5D,IAAID,SAASD,IAAIE,YAAY,EAAE;YAC7BzF,cAAcuF,IAAI1C,IAAI,EAAE2C;QAC1B;IACF;IAEA,YAAY;IACZ,MAAME,UAAUvF,QAAQF,QAAQG,cAAc,YAAYuF,GAAG,IAAI;IACjE,MAAMC,wBAAwB1F,KAAKwF,SAASrE;IAC5C,MAAMwE,QAAqB;QACzBC,eAAe9B,QAAQ8B,aAAa;QACpCC,oBAAoBjD,KAAKtB,MAAM,CAACoE,yBAAyBA,wBAAwBI;QACjFC,YAAYvC,SAASuC,UAAU;QAC/BC,kBAAkBlC,QAAQkC,gBAAgB;QAC1CC,qBAAqBnC,QAAQmC,mBAAmB;QAChDC,aAAalG,KAAKwF,SAASpE;QAC3BhB,YAAY0E;QACZX;IACF;IACAlB,QAAQgB,GAAG,CAACpD,aAAa8E;IAEzB,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAMQ,mBAAmBhC,SAASiC,IAAI,CAAC,CAACC,IAAM,CAACA,EAAE1E,EAAE;IACnD,OAAO;QAAEwB,QAAQA,UAAUgD;IAAiB;AAC9C;AAEA,SAAS1C,cAAcD,QAA0B;IAC/C,MAAM8C,UAAUC,QAAQpC,QAAQ,CAACqC,IAAI;IACrC,IAAI,CAACrG,OAAOsG,SAAS,CAACH,SAAS9C,SAASkD,WAAW,GAAG;QACpDzD,QAAQK,IAAI,CACV,CAAC,sBAAsB,EAAEgD,QAAQ,kBAAkB,EAAE9C,SAASkD,WAAW,CAAC,EAAE,CAAC,GAC3E;IAEN;AACF;AAEA,SAAStC,iBACPtB,WAAmB,EACnBa,IAA6B,EAC7BH,QAA0B;IAE1B,MAAMmD,OAA2B,EAAE;IACnC,MAAM/D,OAAO;QAAE,GAAGgE,SAASjD,KAAKkD,YAAY,CAAC;QAAE,GAAGD,SAASjD,KAAKmD,eAAe,CAAC;IAAC;IACjF,KAAK,MAAMtF,QAAQuF,OAAOC,IAAI,CAACpE,MAAO;QACpC,IAAIpB,SAAS,aAAa,CAACA,KAAKyF,UAAU,CAAC,iBAAiB;YAC1D;QACF;QACA,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAIlG,uBAAuBS,OAAO;YAChC;QACF;QACA,wEAAwE;QACxE,6BAA6B;QAC7B,IAAIR,kBAAkB4B,IAAI,CAACpB,KAAK,GAAG;YACjC;QACF;QACA,MAAM0F,YAAYC,qBAAqBrE,aAAatB;QACpDmF,KAAKS,IAAI,CAAC;YACR5F;YACAG,IAAIuF,cAAc1D,SAAS6D,cAAc;YACzC7D,UAAU0D;YACVI,OAAO9D,SAAS6D,cAAc;QAChC;IACF;IACA,OAAOV;AACT;AAEA,SAASQ,qBAAqBrE,WAAmB,EAAEtB,IAAY;IAC7D,IAAI;QACF,MAAMwD,UAAUhF,KAAK8C,aAAa,gBAAgBtB,MAAM;QACxD,OAAOoC,KAAKC,KAAK,CAAChE,aAAamF,SAAS,SAASuC,OAAO;IAC1D,EAAE,OAAM;QACN,OAAOzB;IACT;AACF;AAEA;;;;CAIC,GACD,SAASzC,eAAeP,WAAmB;IACzC,MAAM0E,SAAS7H,UAAU,OAAO;QAAC;QAAU;KAAc,EAAE;QACzD8H,KAAK3E;QACL4E,UAAU;IACZ;IACA,IAAIF,OAAOtE,KAAK,IAAIsE,OAAO3F,MAAM,KAAK,GAAG;QACvC,OAAO;IACT;IACA,OAAO2F,OAAOG,MAAM,CAACC,IAAI,GAAGC,MAAM,GAAG;AACvC;AAEA,SAASjB,SAASkB,KAAc;IAC9B,OAAO,OAAOA,UAAU,YAAYA,UAAU,OAAQA,QAAoC,CAAC;AAC7F"}
@@ -4,8 +4,11 @@
4
4
  * gates, runs this package's `upgrade` command for the deterministic slice,
5
5
  * delegates Next.js to Next's own agent workflow, and points at the migration
6
6
  * guide for the judgment work rather than restating any of it. The text is
7
- * static and project-agnostic — the agent runs it from the project root. Pure:
8
- * the caller prints it.
7
+ * project-agnostic (the agent runs it from the project root). `command` is the
8
+ * token that re-invokes this CLI, so a local checkout points followers at the
9
+ * local build instead of the published package. Pure: the caller prints it.
9
10
  */
10
- export declare function renderUpgradePrompt(): string;
11
+ export declare function renderUpgradePrompt({ command, }?: {
12
+ command?: string;
13
+ }): string;
11
14
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/upgrade/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAgE5C"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/upgrade/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAmC,GACpC,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAiEpC"}
@@ -4,13 +4,14 @@
4
4
  * gates, runs this package's `upgrade` command for the deterministic slice,
5
5
  * delegates Next.js to Next's own agent workflow, and points at the migration
6
6
  * guide for the judgment work rather than restating any of it. The text is
7
- * static and project-agnostic — the agent runs it from the project root. Pure:
8
- * the caller prints it.
9
- */ export function renderUpgradePrompt() {
7
+ * project-agnostic (the agent runs it from the project root). `command` is the
8
+ * token that re-invokes this CLI, so a local checkout points followers at the
9
+ * local build instead of the published package. Pure: the caller prints it.
10
+ */ export function renderUpgradePrompt({ command = 'npx @payloadcms/codemod' } = {}) {
10
11
  return `You are upgrading this project from Payload v3 to v4, Next.js 16 included.
11
12
 
12
13
  Ground rule: resolution over intent. A step is done only when it installs, builds, and boots.
13
- Never report a task complete because the edit looks right — confirm it. A silent gap reads as
14
+ Never report a task complete because the edit looks right. Confirm it. A silent gap reads as
14
15
  "checked and fine".
15
16
 
16
17
  ## 0. Preconditions
@@ -27,15 +28,16 @@ Do not proceed to step 2 until these are complete and committed.
27
28
  ## 2. Payload mechanical slice
28
29
  Run this from the project root:
29
30
 
30
- npx @payloadcms/codemod upgrade .
31
+ ${command} upgrade run
31
32
 
32
- Add \`--tag <dist-tag>\` to resolve Payload from a non-default dist-tag (default is \`canary\`).
33
+ By default it resolves Payload from the dist-tag this CLI was installed under (\`beta\` when you
34
+ ran \`@payloadcms/codemod@beta\`, else \`canary\`). Add \`--tag <dist-tag>\` to pin a specific one.
33
35
  This pins the Payload packages to v4, removes conflicting overrides, writes the toolchain
34
36
  floors, installs, and runs the AST transforms. Read its report:
35
37
  - It prints the resolved payload version, the required Next target, and the path to the
36
38
  bundled runbook and migration guide. Use those paths below.
37
39
  - The unmet \`@payloadcms/next\` peer against Next 15 is EXPECTED at this point. Do NOT downgrade
38
- payload to satisfy it — step 3 resolves it by upgrading Next.
40
+ payload to satisfy it; step 3 resolves it by upgrading Next.
39
41
  - Do not hand-edit the versions it pinned.
40
42
 
41
43
  ## 3. Next.js 16 (delegate to Next's workflow)
@@ -50,12 +52,12 @@ afterward so the \`@payloadcms/next\` peer resolves.
50
52
 
51
53
  ## 4. Regenerate generated files
52
54
  \`payload generate:types && payload generate:importmap\`. Never hand-edit \`payload-types.ts\` or
53
- \`importMap.js\` — regenerate them.
55
+ \`importMap.js\`; regenerate them.
54
56
 
55
57
  ## 5. Fix-forward judgment work (against the now-v4 tree)
56
58
  These depend on the v4 APIs and types existing, so they follow the upgrade. Open the bundled
57
59
  migration guide (\`v4.mdx\`, path printed in step 2) and the bundled runbook
58
- (\`runbook/payload-v4-upgrade.md\`) and work the items they list — SCSS -> CSS and \`--theme-*\` ->
60
+ (\`runbook/payload-v4-upgrade.md\`) and work the items they list: SCSS -> CSS and \`--theme-*\` ->
59
61
  \`--color-*\` token renames, Lexical union type-narrowing, jobs DB migrations, strict cron parsing,
60
62
  and anything flagged in the per-transform notes. Consult the guide for each; do not guess from
61
63
  memory.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upgrade/prompt.ts"],"sourcesContent":["/**\n * Render the overarching agent prompt for a full Payload v3 -> v4 upgrade,\n * Next.js 16 included. The prompt is a thin orchestrator: it sequences the\n * gates, runs this package's `upgrade` command for the deterministic slice,\n * delegates Next.js to Next's own agent workflow, and points at the migration\n * guide for the judgment work rather than restating any of it. The text is\n * static and project-agnostic — the agent runs it from the project root. Pure:\n * the caller prints it.\n */\nexport function renderUpgradePrompt(): string {\n return `You are upgrading this project from Payload v3 to v4, Next.js 16 included.\n\nGround rule: resolution over intent. A step is done only when it installs, builds, and boots.\nNever report a task complete because the edit looks right — confirm it. A silent gap reads as\n\"checked and fine\".\n\n## 0. Preconditions\n- Work on a clean git tree or a fresh branch.\n- Use Node >=24.15 (the exact engines floor is printed by the command in step 2).\n\n## 1. Pre-upgrade migrations (do these on v3, before touching versions)\nSome migrations need the v3 tooling that v4 deletes, so they MUST run before the upgrade:\n- Slate richtext is removed in v4. Migrate Slate -> Lexical while still on v3; the migration path\n is gone once the packages are pinned to v4.\n\nDo not proceed to step 2 until these are complete and committed.\n\n## 2. Payload mechanical slice\nRun this from the project root:\n\n npx @payloadcms/codemod upgrade .\n\nAdd \\`--tag <dist-tag>\\` to resolve Payload from a non-default dist-tag (default is \\`canary\\`).\nThis pins the Payload packages to v4, removes conflicting overrides, writes the toolchain\nfloors, installs, and runs the AST transforms. Read its report:\n- It prints the resolved payload version, the required Next target, and the path to the\n bundled runbook and migration guide. Use those paths below.\n- The unmet \\`@payloadcms/next\\` peer against Next 15 is EXPECTED at this point. Do NOT downgrade\n payload to satisfy it — step 3 resolves it by upgrading Next.\n- Do not hand-edit the versions it pinned.\n\n## 3. Next.js 16 (delegate to Next's workflow)\nPayload v4 requires Next 16. The command above did not touch Next. Run Next's own recommended\nagent workflow, which bumps Next + React and migrates the code as one unit:\n<https://nextjs.org/docs/app/guides/upgrading/version-16#use-an-ai-agent-recommended>\n\nIn short: run \\`npx @next/codemod@canary upgrade latest\\`, then\n\\`npx @next/codemod@canary next-async-request-api .\\`, and follow Next's AGENTS.md workflow for\nthe rest. Keep the result within the Next target range printed in step 2's report. Reinstall\nafterward so the \\`@payloadcms/next\\` peer resolves.\n\n## 4. Regenerate generated files\n\\`payload generate:types && payload generate:importmap\\`. Never hand-edit \\`payload-types.ts\\` or\n\\`importMap.js\\` — regenerate them.\n\n## 5. Fix-forward judgment work (against the now-v4 tree)\nThese depend on the v4 APIs and types existing, so they follow the upgrade. Open the bundled\nmigration guide (\\`v4.mdx\\`, path printed in step 2) and the bundled runbook\n(\\`runbook/payload-v4-upgrade.md\\`) and work the items they list — SCSS -> CSS and \\`--theme-*\\` ->\n\\`--color-*\\` token renames, Lexical union type-narrowing, jobs DB migrations, strict cron parsing,\nand anything flagged in the per-transform notes. Consult the guide for each; do not guess from\nmemory.\n\n## 6. Verify\n- \\`tsc --noEmit\\` (delete \\`tsconfig.tsbuildinfo\\` first; set \\`checkJs: true\\` so \\`importMap.js\\` is covered).\n- Run integration and e2e tests separately.\n- Build.\n- Confirm native modules (e.g. \\`sharp\\`) still load.\n\n## 7. Report\nDistinguish verified, cannot-confirm, and broken. Do not call the upgrade complete while any\ngate fails or any generated file is stale.\n`\n}\n"],"names":["renderUpgradePrompt"],"mappings":"AAAA;;;;;;;;CAQC,GACD,OAAO,SAASA;IACd,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DV,CAAC;AACD"}
1
+ {"version":3,"sources":["../../src/upgrade/prompt.ts"],"sourcesContent":["/**\n * Render the overarching agent prompt for a full Payload v3 -> v4 upgrade,\n * Next.js 16 included. The prompt is a thin orchestrator: it sequences the\n * gates, runs this package's `upgrade` command for the deterministic slice,\n * delegates Next.js to Next's own agent workflow, and points at the migration\n * guide for the judgment work rather than restating any of it. The text is\n * project-agnostic (the agent runs it from the project root). `command` is the\n * token that re-invokes this CLI, so a local checkout points followers at the\n * local build instead of the published package. Pure: the caller prints it.\n */\nexport function renderUpgradePrompt({\n command = 'npx @payloadcms/codemod',\n}: { command?: string } = {}): string {\n return `You are upgrading this project from Payload v3 to v4, Next.js 16 included.\n\nGround rule: resolution over intent. A step is done only when it installs, builds, and boots.\nNever report a task complete because the edit looks right. Confirm it. A silent gap reads as\n\"checked and fine\".\n\n## 0. Preconditions\n- Work on a clean git tree or a fresh branch.\n- Use Node >=24.15 (the exact engines floor is printed by the command in step 2).\n\n## 1. Pre-upgrade migrations (do these on v3, before touching versions)\nSome migrations need the v3 tooling that v4 deletes, so they MUST run before the upgrade:\n- Slate richtext is removed in v4. Migrate Slate -> Lexical while still on v3; the migration path\n is gone once the packages are pinned to v4.\n\nDo not proceed to step 2 until these are complete and committed.\n\n## 2. Payload mechanical slice\nRun this from the project root:\n\n ${command} upgrade run\n\nBy default it resolves Payload from the dist-tag this CLI was installed under (\\`beta\\` when you\nran \\`@payloadcms/codemod@beta\\`, else \\`canary\\`). Add \\`--tag <dist-tag>\\` to pin a specific one.\nThis pins the Payload packages to v4, removes conflicting overrides, writes the toolchain\nfloors, installs, and runs the AST transforms. Read its report:\n- It prints the resolved payload version, the required Next target, and the path to the\n bundled runbook and migration guide. Use those paths below.\n- The unmet \\`@payloadcms/next\\` peer against Next 15 is EXPECTED at this point. Do NOT downgrade\n payload to satisfy it; step 3 resolves it by upgrading Next.\n- Do not hand-edit the versions it pinned.\n\n## 3. Next.js 16 (delegate to Next's workflow)\nPayload v4 requires Next 16. The command above did not touch Next. Run Next's own recommended\nagent workflow, which bumps Next + React and migrates the code as one unit:\n<https://nextjs.org/docs/app/guides/upgrading/version-16#use-an-ai-agent-recommended>\n\nIn short: run \\`npx @next/codemod@canary upgrade latest\\`, then\n\\`npx @next/codemod@canary next-async-request-api .\\`, and follow Next's AGENTS.md workflow for\nthe rest. Keep the result within the Next target range printed in step 2's report. Reinstall\nafterward so the \\`@payloadcms/next\\` peer resolves.\n\n## 4. Regenerate generated files\n\\`payload generate:types && payload generate:importmap\\`. Never hand-edit \\`payload-types.ts\\` or\n\\`importMap.js\\`; regenerate them.\n\n## 5. Fix-forward judgment work (against the now-v4 tree)\nThese depend on the v4 APIs and types existing, so they follow the upgrade. Open the bundled\nmigration guide (\\`v4.mdx\\`, path printed in step 2) and the bundled runbook\n(\\`runbook/payload-v4-upgrade.md\\`) and work the items they list: SCSS -> CSS and \\`--theme-*\\` ->\n\\`--color-*\\` token renames, Lexical union type-narrowing, jobs DB migrations, strict cron parsing,\nand anything flagged in the per-transform notes. Consult the guide for each; do not guess from\nmemory.\n\n## 6. Verify\n- \\`tsc --noEmit\\` (delete \\`tsconfig.tsbuildinfo\\` first; set \\`checkJs: true\\` so \\`importMap.js\\` is covered).\n- Run integration and e2e tests separately.\n- Build.\n- Confirm native modules (e.g. \\`sharp\\`) still load.\n\n## 7. Report\nDistinguish verified, cannot-confirm, and broken. Do not call the upgrade complete while any\ngate fails or any generated file is stale.\n`\n}\n"],"names":["renderUpgradePrompt","command"],"mappings":"AAAA;;;;;;;;;CASC,GACD,OAAO,SAASA,oBAAoB,EAClCC,UAAU,yBAAyB,EACd,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;IAoBN,EAAEA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2Cd,CAAC;AACD"}
@@ -7,8 +7,11 @@ export type VersionReportRow = {
7
7
  };
8
8
  export type ReportModel = {
9
9
  floorsWritten: string[];
10
+ /** Absolute path to the bundled migration guide, when it shipped with this build. */
11
+ migrationGuidePath?: string;
10
12
  nextTarget: null | string;
11
13
  overridesRemoved: string[];
14
+ placeholdersSkipped: string[];
12
15
  runbookPath: string;
13
16
  transforms: TransformRunResult[];
14
17
  versions: VersionReportRow[];
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/upgrade/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,UAAU,EAAE,IAAI,GAAG,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,kBAAkB,EAAE,CAAA;IAChC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B,CAAA;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA+CvD"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/upgrade/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,UAAU,EAAE,IAAI,GAAG,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,kBAAkB,EAAE,CAAA;IAChC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B,CAAA;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAyDvD"}
@@ -14,6 +14,9 @@
14
14
  if (model.overridesRemoved.length > 0) {
15
15
  lines.push(`Overrides removed: ${model.overridesRemoved.join(', ')}`, '');
16
16
  }
17
+ if (model.placeholdersSkipped.length > 0) {
18
+ lines.push(`Left as-is (workspace/catalog/link specs): ${model.placeholdersSkipped.join(', ')}`, '');
19
+ }
17
20
  if (model.floorsWritten.length > 0) {
18
21
  lines.push(`Floors written: ${model.floorsWritten.join(', ')}`, '');
19
22
  }
@@ -33,8 +36,11 @@
33
36
  lines.push(` Target Next version: ${model.nextTarget ?? '(see @payloadcms/next peer range)'}`);
34
37
  lines.push(' The unmet @payloadcms/next peer is expected until you upgrade Next — that is the immediate next step.');
35
38
  lines.push('');
36
- lines.push('Not done by this command — see the runbook for the remaining steps:');
37
- lines.push(` ${model.runbookPath}`);
39
+ lines.push('Not done by this command. See these for the remaining steps:');
40
+ lines.push(` runbook: ${model.runbookPath}`);
41
+ if (model.migrationGuidePath) {
42
+ lines.push(` migration guide: ${model.migrationGuidePath}`);
43
+ }
38
44
  return lines.join('\n');
39
45
  }
40
46
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upgrade/report.ts"],"sourcesContent":["import type { TransformRunResult } from '../runner.js'\n\nexport type VersionReportRow = {\n name: string\n ok: boolean\n resolved?: string\n wrote: string\n}\n\nexport type ReportModel = {\n floorsWritten: string[]\n nextTarget: null | string\n overridesRemoved: string[]\n runbookPath: string\n transforms: TransformRunResult[]\n versions: VersionReportRow[]\n}\n\n/** Build the honest end-of-run report string. Pure — the caller prints it. */\nexport function renderReport(model: ReportModel): string {\n const lines: string[] = []\n lines.push('Payload v4 upgrade — mechanical steps complete', '')\n\n lines.push('Versions written -> resolved')\n for (const v of model.versions) {\n const resolved = v.resolved ?? '(unresolved)'\n lines.push(` ${v.name} ${v.wrote} -> ${resolved} ${v.ok ? 'ok' : 'MISMATCH'}`)\n }\n const anyMismatch = model.versions.some((v) => !v.ok)\n if (anyMismatch) {\n lines.push(' ! Resolution mismatch — tree is NOT confirmed v4. Investigate before continuing.')\n }\n lines.push('')\n\n if (model.overridesRemoved.length > 0) {\n lines.push(`Overrides removed: ${model.overridesRemoved.join(', ')}`, '')\n }\n\n if (model.floorsWritten.length > 0) {\n lines.push(`Floors written: ${model.floorsWritten.join(', ')}`, '')\n }\n\n lines.push('Transforms')\n for (const r of model.transforms) {\n if (r.error) {\n lines.push(` [FAIL] ${r.name} — ${r.error.message}`)\n continue\n }\n lines.push(` [ok] ${r.name} — ${r.filesChanged.length} file(s) changed`)\n for (const note of r.notes ?? []) {\n lines.push(` note: ${note}`)\n }\n }\n lines.push('')\n\n lines.push('Next.js: not upgraded by this command')\n lines.push(` Target Next version: ${model.nextTarget ?? '(see @payloadcms/next peer range)'}`)\n lines.push(\n ' The unmet @payloadcms/next peer is expected until you upgrade Next — that is the immediate next step.',\n )\n lines.push('')\n\n lines.push('Not done by this command — see the runbook for the remaining steps:')\n lines.push(` ${model.runbookPath}`)\n\n return lines.join('\\n')\n}\n"],"names":["renderReport","model","lines","push","v","versions","resolved","name","wrote","ok","anyMismatch","some","overridesRemoved","length","join","floorsWritten","r","transforms","error","message","filesChanged","note","notes","nextTarget","runbookPath"],"mappings":"AAkBA,4EAA4E,GAC5E,OAAO,SAASA,aAAaC,KAAkB;IAC7C,MAAMC,QAAkB,EAAE;IAC1BA,MAAMC,IAAI,CAAC,kDAAkD;IAE7DD,MAAMC,IAAI,CAAC;IACX,KAAK,MAAMC,KAAKH,MAAMI,QAAQ,CAAE;QAC9B,MAAMC,WAAWF,EAAEE,QAAQ,IAAI;QAC/BJ,MAAMC,IAAI,CAAC,CAAC,EAAE,EAAEC,EAAEG,IAAI,CAAC,EAAE,EAAEH,EAAEI,KAAK,CAAC,IAAI,EAAEF,SAAS,EAAE,EAAEF,EAAEK,EAAE,GAAG,OAAO,YAAY;IAClF;IACA,MAAMC,cAAcT,MAAMI,QAAQ,CAACM,IAAI,CAAC,CAACP,IAAM,CAACA,EAAEK,EAAE;IACpD,IAAIC,aAAa;QACfR,MAAMC,IAAI,CAAC;IACb;IACAD,MAAMC,IAAI,CAAC;IAEX,IAAIF,MAAMW,gBAAgB,CAACC,MAAM,GAAG,GAAG;QACrCX,MAAMC,IAAI,CAAC,CAAC,mBAAmB,EAAEF,MAAMW,gBAAgB,CAACE,IAAI,CAAC,OAAO,EAAE;IACxE;IAEA,IAAIb,MAAMc,aAAa,CAACF,MAAM,GAAG,GAAG;QAClCX,MAAMC,IAAI,CAAC,CAAC,gBAAgB,EAAEF,MAAMc,aAAa,CAACD,IAAI,CAAC,OAAO,EAAE;IAClE;IAEAZ,MAAMC,IAAI,CAAC;IACX,KAAK,MAAMa,KAAKf,MAAMgB,UAAU,CAAE;QAChC,IAAID,EAAEE,KAAK,EAAE;YACXhB,MAAMC,IAAI,CAAC,CAAC,SAAS,EAAEa,EAAET,IAAI,CAAC,GAAG,EAAES,EAAEE,KAAK,CAACC,OAAO,EAAE;YACpD;QACF;QACAjB,MAAMC,IAAI,CAAC,CAAC,OAAO,EAAEa,EAAET,IAAI,CAAC,GAAG,EAAES,EAAEI,YAAY,CAACP,MAAM,CAAC,gBAAgB,CAAC;QACxE,KAAK,MAAMQ,QAAQL,EAAEM,KAAK,IAAI,EAAE,CAAE;YAChCpB,MAAMC,IAAI,CAAC,CAAC,YAAY,EAAEkB,MAAM;QAClC;IACF;IACAnB,MAAMC,IAAI,CAAC;IAEXD,MAAMC,IAAI,CAAC;IACXD,MAAMC,IAAI,CAAC,CAAC,uBAAuB,EAAEF,MAAMsB,UAAU,IAAI,qCAAqC;IAC9FrB,MAAMC,IAAI,CACR;IAEFD,MAAMC,IAAI,CAAC;IAEXD,MAAMC,IAAI,CAAC;IACXD,MAAMC,IAAI,CAAC,CAAC,EAAE,EAAEF,MAAMuB,WAAW,EAAE;IAEnC,OAAOtB,MAAMY,IAAI,CAAC;AACpB"}
1
+ {"version":3,"sources":["../../src/upgrade/report.ts"],"sourcesContent":["import type { TransformRunResult } from '../runner.js'\n\nexport type VersionReportRow = {\n name: string\n ok: boolean\n resolved?: string\n wrote: string\n}\n\nexport type ReportModel = {\n floorsWritten: string[]\n /** Absolute path to the bundled migration guide, when it shipped with this build. */\n migrationGuidePath?: string\n nextTarget: null | string\n overridesRemoved: string[]\n placeholdersSkipped: string[]\n runbookPath: string\n transforms: TransformRunResult[]\n versions: VersionReportRow[]\n}\n\n/** Build the honest end-of-run report string. Pure — the caller prints it. */\nexport function renderReport(model: ReportModel): string {\n const lines: string[] = []\n lines.push('Payload v4 upgrade — mechanical steps complete', '')\n\n lines.push('Versions written -> resolved')\n for (const v of model.versions) {\n const resolved = v.resolved ?? '(unresolved)'\n lines.push(` ${v.name} ${v.wrote} -> ${resolved} ${v.ok ? 'ok' : 'MISMATCH'}`)\n }\n const anyMismatch = model.versions.some((v) => !v.ok)\n if (anyMismatch) {\n lines.push(' ! Resolution mismatch — tree is NOT confirmed v4. Investigate before continuing.')\n }\n lines.push('')\n\n if (model.overridesRemoved.length > 0) {\n lines.push(`Overrides removed: ${model.overridesRemoved.join(', ')}`, '')\n }\n\n if (model.placeholdersSkipped.length > 0) {\n lines.push(\n `Left as-is (workspace/catalog/link specs): ${model.placeholdersSkipped.join(', ')}`,\n '',\n )\n }\n\n if (model.floorsWritten.length > 0) {\n lines.push(`Floors written: ${model.floorsWritten.join(', ')}`, '')\n }\n\n lines.push('Transforms')\n for (const r of model.transforms) {\n if (r.error) {\n lines.push(` [FAIL] ${r.name} — ${r.error.message}`)\n continue\n }\n lines.push(` [ok] ${r.name} — ${r.filesChanged.length} file(s) changed`)\n for (const note of r.notes ?? []) {\n lines.push(` note: ${note}`)\n }\n }\n lines.push('')\n\n lines.push('Next.js: not upgraded by this command')\n lines.push(` Target Next version: ${model.nextTarget ?? '(see @payloadcms/next peer range)'}`)\n lines.push(\n ' The unmet @payloadcms/next peer is expected until you upgrade Next — that is the immediate next step.',\n )\n lines.push('')\n\n lines.push('Not done by this command. See these for the remaining steps:')\n lines.push(` runbook: ${model.runbookPath}`)\n if (model.migrationGuidePath) {\n lines.push(` migration guide: ${model.migrationGuidePath}`)\n }\n\n return lines.join('\\n')\n}\n"],"names":["renderReport","model","lines","push","v","versions","resolved","name","wrote","ok","anyMismatch","some","overridesRemoved","length","join","placeholdersSkipped","floorsWritten","r","transforms","error","message","filesChanged","note","notes","nextTarget","runbookPath","migrationGuidePath"],"mappings":"AAqBA,4EAA4E,GAC5E,OAAO,SAASA,aAAaC,KAAkB;IAC7C,MAAMC,QAAkB,EAAE;IAC1BA,MAAMC,IAAI,CAAC,kDAAkD;IAE7DD,MAAMC,IAAI,CAAC;IACX,KAAK,MAAMC,KAAKH,MAAMI,QAAQ,CAAE;QAC9B,MAAMC,WAAWF,EAAEE,QAAQ,IAAI;QAC/BJ,MAAMC,IAAI,CAAC,CAAC,EAAE,EAAEC,EAAEG,IAAI,CAAC,EAAE,EAAEH,EAAEI,KAAK,CAAC,IAAI,EAAEF,SAAS,EAAE,EAAEF,EAAEK,EAAE,GAAG,OAAO,YAAY;IAClF;IACA,MAAMC,cAAcT,MAAMI,QAAQ,CAACM,IAAI,CAAC,CAACP,IAAM,CAACA,EAAEK,EAAE;IACpD,IAAIC,aAAa;QACfR,MAAMC,IAAI,CAAC;IACb;IACAD,MAAMC,IAAI,CAAC;IAEX,IAAIF,MAAMW,gBAAgB,CAACC,MAAM,GAAG,GAAG;QACrCX,MAAMC,IAAI,CAAC,CAAC,mBAAmB,EAAEF,MAAMW,gBAAgB,CAACE,IAAI,CAAC,OAAO,EAAE;IACxE;IAEA,IAAIb,MAAMc,mBAAmB,CAACF,MAAM,GAAG,GAAG;QACxCX,MAAMC,IAAI,CACR,CAAC,2CAA2C,EAAEF,MAAMc,mBAAmB,CAACD,IAAI,CAAC,OAAO,EACpF;IAEJ;IAEA,IAAIb,MAAMe,aAAa,CAACH,MAAM,GAAG,GAAG;QAClCX,MAAMC,IAAI,CAAC,CAAC,gBAAgB,EAAEF,MAAMe,aAAa,CAACF,IAAI,CAAC,OAAO,EAAE;IAClE;IAEAZ,MAAMC,IAAI,CAAC;IACX,KAAK,MAAMc,KAAKhB,MAAMiB,UAAU,CAAE;QAChC,IAAID,EAAEE,KAAK,EAAE;YACXjB,MAAMC,IAAI,CAAC,CAAC,SAAS,EAAEc,EAAEV,IAAI,CAAC,GAAG,EAAEU,EAAEE,KAAK,CAACC,OAAO,EAAE;YACpD;QACF;QACAlB,MAAMC,IAAI,CAAC,CAAC,OAAO,EAAEc,EAAEV,IAAI,CAAC,GAAG,EAAEU,EAAEI,YAAY,CAACR,MAAM,CAAC,gBAAgB,CAAC;QACxE,KAAK,MAAMS,QAAQL,EAAEM,KAAK,IAAI,EAAE,CAAE;YAChCrB,MAAMC,IAAI,CAAC,CAAC,YAAY,EAAEmB,MAAM;QAClC;IACF;IACApB,MAAMC,IAAI,CAAC;IAEXD,MAAMC,IAAI,CAAC;IACXD,MAAMC,IAAI,CAAC,CAAC,uBAAuB,EAAEF,MAAMuB,UAAU,IAAI,qCAAqC;IAC9FtB,MAAMC,IAAI,CACR;IAEFD,MAAMC,IAAI,CAAC;IAEXD,MAAMC,IAAI,CAAC;IACXD,MAAMC,IAAI,CAAC,CAAC,WAAW,EAAEF,MAAMwB,WAAW,EAAE;IAC5C,IAAIxB,MAAMyB,kBAAkB,EAAE;QAC5BxB,MAAMC,IAAI,CAAC,CAAC,mBAAmB,EAAEF,MAAMyB,kBAAkB,EAAE;IAC7D;IAEA,OAAOxB,MAAMY,IAAI,CAAC;AACpB"}
@@ -7,6 +7,7 @@ export type RewriteSummary = {
7
7
  floorsWritten: string[];
8
8
  overridesRemoved: string[];
9
9
  pinnedPayload: string[];
10
+ placeholdersSkipped: string[];
10
11
  };
11
12
  export declare const isPayloadPackage: (name: string) => boolean;
12
13
  /**
@@ -14,6 +15,12 @@ export declare const isPayloadPackage: (name: string) => boolean;
14
15
  * payload packages, so they are tracked on `latest` rather than lockstep-pinned.
15
16
  */
16
17
  export declare const isPayloadEslintPackage: (name: string) => boolean;
18
+ /**
19
+ * A dependency whose version is resolved by the package manager, not a semver
20
+ * range: `workspace:*`, `catalog:`, `link:`, `file:`, `npm:` aliases, URLs.
21
+ * Overwriting one with an exact version would break the link, so it is left as-is.
22
+ */
23
+ export declare const isPlaceholderSpec: (spec: unknown) => boolean;
17
24
  /**
18
25
  * Mutate `data` in place for a v4 upgrade: exact-pin payload packages, drop
19
26
  * payload dependency overrides, and write the toolchain floors. Never touches
@@ -1 +1 @@
1
- {"version":3,"file":"rewritePackageJson.d.ts","sourceRoot":"","sources":["../../src/upgrade/rewritePackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,QAAQ,EAAE,gBAAgB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB,CAAA;AAID,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,OACO,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,SAAU,MAAM,KAAG,OACf,CAAA;AAEvC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,GAAG,cAAc,CAKlF"}
1
+ {"version":3,"file":"rewritePackageJson.d.ts","sourceRoot":"","sources":["../../src/upgrade/rewritePackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,QAAQ,EAAE,gBAAgB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B,CAAA;AAOD,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,OACO,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,SAAU,MAAM,KAAG,OACf,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAU,OAAO,KAAG,OACO,CAAA;AAEzD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,GAAG,cAAc,CAKlF"}