@cmflow/cli 3.2.1 → 3.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/{.prettierrc → .oxfmtrc.json} +2 -1
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/releases/yarn-4.18.0.cjs +1000 -0
  4. package/.yarnrc.yml +8 -1
  5. package/README.md +66 -72
  6. package/bin/cm-checkfeatures.ts +10 -0
  7. package/bin/cm-clean.ts +10 -0
  8. package/bin/cm-config.ts +10 -0
  9. package/bin/cm-deploy.ts +10 -0
  10. package/bin/cm-expedit.ts +19 -0
  11. package/bin/cm-fetch.ts +10 -0
  12. package/bin/cm-finish.ts +10 -0
  13. package/bin/cm-jira-releases.ts +10 -0
  14. package/bin/cm-merge.ts +10 -0
  15. package/bin/cm-publish.ts +10 -0
  16. package/bin/cm-pull.ts +8 -0
  17. package/bin/cm-push.ts +10 -0
  18. package/bin/cm-rebase.ts +10 -0
  19. package/bin/{cmrelease.js → cm-release.ts} +0 -0
  20. package/bin/cm-republish.ts +10 -0
  21. package/bin/cm-start.ts +10 -0
  22. package/bin/cm.ts +40 -0
  23. package/dist/bin/cm.mjs +74985 -0
  24. package/dist/bin/cmrelease.mjs +72397 -0
  25. package/dist/cli-truncate-BmHD4ngn.mjs +152 -0
  26. package/dist/cli-truncate-CXNquMRK.mjs +152 -0
  27. package/dist/cli-truncate-DbOyuy2e.mjs +2 -0
  28. package/dist/cli-truncate-DbOyuy2e.mjs.map +1 -0
  29. package/dist/common-CwPbT3So.mjs +66 -0
  30. package/dist/common-CwPbT3So.mjs.map +1 -0
  31. package/dist/docker-clean-tags-Cd-E8IqJ.mjs +2 -0
  32. package/dist/docker-clean-tags-Cd-E8IqJ.mjs.map +1 -0
  33. package/dist/docker-publish-B0E0qYYB.mjs +2 -0
  34. package/dist/docker-publish-B0E0qYYB.mjs.map +1 -0
  35. package/dist/get-config-DoOyLztI.mjs +41 -0
  36. package/dist/get-config-DoOyLztI.mjs.map +1 -0
  37. package/dist/get-east-asian-width-Tfn8qoqd.mjs +2 -0
  38. package/dist/get-east-asian-width-Tfn8qoqd.mjs.map +1 -0
  39. package/dist/get-east-asian-width-eFfEkHwo.mjs +682 -0
  40. package/dist/log-update-B2GqeeDd.mjs +497 -0
  41. package/dist/log-update-BldA9lkm.mjs +497 -0
  42. package/dist/log-update-By8Z-mak.mjs +6 -0
  43. package/dist/log-update-By8Z-mak.mjs.map +1 -0
  44. package/dist/rolldown-runtime-B4iAMlE-.mjs +35 -0
  45. package/dist/semver-D8gwMSFO.mjs +2 -0
  46. package/dist/semver-D8gwMSFO.mjs.map +1 -0
  47. package/dist/src/index.mjs +18 -0
  48. package/dist/src/index.mjs.map +1 -0
  49. package/dist/src/semantic/core/analyze-commits.mjs +2 -0
  50. package/dist/src/semantic/core/analyze-commits.mjs.map +1 -0
  51. package/dist/src/semantic/core/conditional.mjs +2 -0
  52. package/dist/src/semantic/core/conditional.mjs.map +1 -0
  53. package/dist/src/semantic/core/exit.mjs +2 -0
  54. package/dist/src/semantic/core/exit.mjs.map +1 -0
  55. package/dist/src/semantic/core/prepare/bump-version.mjs +48 -0
  56. package/dist/src/semantic/core/prepare/bump-version.mjs.map +1 -0
  57. package/dist/src/semantic/core/prepare/commit.mjs +2 -0
  58. package/dist/src/semantic/core/prepare/commit.mjs.map +1 -0
  59. package/dist/src/semantic/core/prepare/release-info.mjs +2 -0
  60. package/dist/src/semantic/core/prepare/release-info.mjs.map +1 -0
  61. package/dist/src/semantic/core/run.mjs +2 -0
  62. package/dist/src/semantic/core/run.mjs.map +1 -0
  63. package/dist/src/semantic/core/sync-repository.mjs +2 -0
  64. package/dist/src/semantic/core/sync-repository.mjs.map +1 -0
  65. package/dist/src/semantic/core/verify-conditions.mjs +2 -0
  66. package/dist/src/semantic/core/verify-conditions.mjs.map +1 -0
  67. package/dist/src/semantic/core/verify-release.mjs +2 -0
  68. package/dist/src/semantic/core/verify-release.mjs.map +1 -0
  69. package/dist/src/semantic/docker/publish.mjs +2 -0
  70. package/dist/src/semantic/docker/publish.mjs.map +1 -0
  71. package/dist/src/semantic/docker/success.mjs +2 -0
  72. package/dist/src/semantic/docker/success.mjs.map +1 -0
  73. package/dist/strip-ansi-Aeu5cmZe.mjs +174 -0
  74. package/dist/strip-ansi-Cl0pRo-s.mjs +2 -0
  75. package/dist/strip-ansi-Cl0pRo-s.mjs.map +1 -0
  76. package/dist/wrap-ansi-BeIjar2W.mjs +2 -0
  77. package/dist/wrap-ansi-CWIezXNl.mjs +330 -0
  78. package/dist/wrap-ansi-DsMb4WnZ.mjs +9 -0
  79. package/dist/wrap-ansi-DsMb4WnZ.mjs.map +1 -0
  80. package/dist/wrap-ansi-T0rz0Urp.mjs +330 -0
  81. package/mise.toml +2 -0
  82. package/oxlint.json +25 -0
  83. package/package.json +65 -62
  84. package/release.config.mjs +6 -6
  85. package/src/commands/checkfeatures.ts +39 -0
  86. package/src/commands/clean.ts +36 -0
  87. package/src/commands/config.ts +31 -0
  88. package/src/commands/deploy.ts +39 -0
  89. package/src/commands/fetch.ts +30 -0
  90. package/src/commands/finish.ts +50 -0
  91. package/src/commands/{index.js → index.ts} +3 -0
  92. package/src/commands/jira-releases.ts +97 -0
  93. package/src/commands/merge.ts +58 -0
  94. package/src/commands/prompts/{branches.js → branches.ts} +13 -5
  95. package/src/commands/pull.ts +44 -0
  96. package/src/commands/push.ts +48 -0
  97. package/src/commands/rebase.ts +56 -0
  98. package/src/commands/republish.ts +34 -0
  99. package/src/commands/start.ts +123 -0
  100. package/src/commands/tasks/{merge-branch.js → merge-branch.ts} +18 -3
  101. package/src/commands/tasks/push-branch.ts +19 -0
  102. package/src/commands/tasks/{rebase-all-branches.js → rebase-all-branches.ts} +10 -2
  103. package/src/commands/tasks/{refresh-repository.js → refresh-repository.ts} +8 -4
  104. package/src/commands/tasks/run-test.ts +28 -0
  105. package/src/commands/tasks/{update-branch.js → update-branch.ts} +15 -9
  106. package/src/commands/tasks/{update-dependencies.js → update-dependencies.ts} +4 -3
  107. package/src/common/back/directus/{directus-flow.test.js → directus-flow.test.ts} +1 -0
  108. package/src/common/back/directus/{directus-flow.js → directus-flow.ts} +10 -2
  109. package/src/common/back/http/{http-proxy.js → http-proxy.ts} +7 -1
  110. package/src/common/back/http/{http-request.spec.js → http-request.spec.ts} +8 -7
  111. package/src/common/back/http/{http-request.js → http-request.ts} +16 -19
  112. package/src/common/back/jira/{get-sorted-releases.js → get-sorted-releases.ts} +2 -2
  113. package/src/common/back/jira/interfaces/JiraIIssue.d.ts +3 -3
  114. package/src/common/back/jira/{jira-releases.js → jira-releases.ts} +14 -3
  115. package/src/common/back/jira/{jira-request.js → jira-request.ts} +9 -1
  116. package/src/common/back/jira/{jira-search.js → jira-search.ts} +2 -2
  117. package/src/common/cli/{bun.test.js → bun.test.ts} +17 -10
  118. package/src/common/cli/{bun.js → bun.ts} +4 -4
  119. package/src/common/cli/cli.ts +127 -0
  120. package/src/common/cli/{docker.test.js → docker.test.ts} +22 -14
  121. package/src/common/cli/{docker.js → docker.ts} +6 -6
  122. package/src/common/cli/{git.test.js → git.test.ts} +19 -11
  123. package/src/common/cli/{git.js → git.ts} +24 -24
  124. package/src/common/cli/{lerna.test.js → lerna.test.ts} +18 -11
  125. package/src/common/cli/{lerna.js → lerna.ts} +4 -4
  126. package/src/common/cli/{npm.test.js → npm.test.ts} +17 -10
  127. package/src/common/cli/{npm.js → npm.ts} +4 -4
  128. package/src/common/cli/{pnpm.test.js → pnpm.test.ts} +17 -10
  129. package/src/common/cli/{pnpm.js → pnpm.ts} +4 -4
  130. package/src/common/cli/{yarn.test.js → yarn.test.ts} +17 -12
  131. package/src/common/cli/{yarn.js → yarn.ts} +4 -4
  132. package/src/common/configure-git-workspace.ts +39 -0
  133. package/src/common/{get-config.js → get-config.ts} +3 -1
  134. package/src/common/{get-package-json.js → get-package-json.ts} +1 -0
  135. package/src/common/{get-package-manager.js → get-package-manager.ts} +1 -0
  136. package/src/common/{get-release-config.js → get-release-config.ts} +1 -0
  137. package/src/common/{index.js → index.ts} +1 -0
  138. package/src/common/{run-command.test.js → run-command.test.ts} +1 -0
  139. package/src/common/run-command.ts +67 -0
  140. package/src/common/types.ts +26 -0
  141. package/src/common/vendor.d.ts +4 -0
  142. package/src/{index.js → index.ts} +5 -1
  143. package/src/semantic/core/{analyze-commits.js → analyze-commits.ts} +7 -3
  144. package/src/semantic/core/{conditional.js → conditional.ts} +16 -9
  145. package/src/semantic/core/{exit.js → exit.ts} +3 -2
  146. package/src/semantic/core/prepare/{bump-version.js → bump-version.ts} +11 -8
  147. package/src/semantic/core/prepare/{commit.js → commit.ts} +3 -2
  148. package/src/semantic/core/prepare/release-info.ts +6 -0
  149. package/src/semantic/core/{run.js → run.ts} +3 -2
  150. package/src/semantic/core/sync-repository.ts +55 -0
  151. package/src/semantic/core/{verify-conditions.js → verify-conditions.ts} +4 -3
  152. package/src/semantic/core/{verify-release.js → verify-release.ts} +2 -1
  153. package/src/semantic/docker/publish.ts +6 -0
  154. package/src/semantic/docker/{success.js → success.ts} +2 -1
  155. package/src/semantic/utils/__mock__/test1/package.json +7 -1
  156. package/src/semantic/utils/__mock__/test1/packages/a/package.json +9 -1
  157. package/src/semantic/utils/__mock__/test1/packages/b/package.json +7 -1
  158. package/src/semantic/utils/{bump-packages-version.test.js → bump-packages-version.test.ts} +1 -0
  159. package/src/semantic/utils/{bump-packages-version.js → bump-packages-version.ts} +12 -11
  160. package/src/semantic/utils/{calculate-snapshot-version.test.js → calculate-snapshot-version.test.ts} +10 -8
  161. package/src/semantic/utils/calculate-snapshot-version.ts +17 -0
  162. package/src/semantic/utils/display-package-info.ts +12 -0
  163. package/src/semantic/utils/display-release-info.ts +13 -0
  164. package/src/semantic/utils/{docker-clean-tags.test.js → docker-clean-tags.test.ts} +1 -0
  165. package/src/semantic/utils/{docker-clean-tags.js → docker-clean-tags.ts} +11 -4
  166. package/src/semantic/utils/{docker-publish.test.js → docker-publish.test.ts} +1 -0
  167. package/src/semantic/utils/{docker-publish.js → docker-publish.ts} +4 -3
  168. package/src/semantic/utils/{log-section.js → log-section.ts} +5 -1
  169. package/src/semantic/utils/{transform-writer.js → transform-writer.ts} +37 -13
  170. package/tsconfig.build.json +29 -0
  171. package/tsconfig.json +8 -32
  172. package/tsdown.config.ts +63 -0
  173. package/vitest.config.mts +4 -5
  174. package/.prettierignore +0 -5
  175. package/.yarn/releases/yarn-4.7.0.cjs +0 -935
  176. package/bin/checkfeatures.sh +0 -5
  177. package/bin/cm-clean.js +0 -8
  178. package/bin/cm-config.js +0 -15
  179. package/bin/cm-deploy.js +0 -8
  180. package/bin/cm-fetch.js +0 -12
  181. package/bin/cm-finish.js +0 -14
  182. package/bin/cm-jira-releases.js +0 -16
  183. package/bin/cm-merge.js +0 -12
  184. package/bin/cm-publish.js +0 -15
  185. package/bin/cm-push.js +0 -15
  186. package/bin/cm-rebase.js +0 -15
  187. package/bin/cm-republish.js +0 -12
  188. package/bin/cm-start.js +0 -21
  189. package/bin/cm.js +0 -27
  190. package/bin/cmexpedit.sh +0 -9
  191. package/bin/cmpull.sh +0 -7
  192. package/eslint.config.mjs +0 -67
  193. package/src/commands/clean.js +0 -29
  194. package/src/commands/config.js +0 -23
  195. package/src/commands/deploy.js +0 -34
  196. package/src/commands/fetch.js +0 -18
  197. package/src/commands/finish.js +0 -43
  198. package/src/commands/jira-releases.js +0 -62
  199. package/src/commands/merge.js +0 -41
  200. package/src/commands/push.js +0 -23
  201. package/src/commands/rebase.js +0 -35
  202. package/src/commands/republish.js +0 -21
  203. package/src/commands/start.js +0 -109
  204. package/src/commands/tasks/push-branch.js +0 -10
  205. package/src/commands/tasks/run-test.js +0 -21
  206. package/src/common/cli/cli.js +0 -110
  207. package/src/common/configure-git-workspace.js +0 -26
  208. package/src/common/run-command.js +0 -64
  209. package/src/semantic/core/prepare/release-info.js +0 -5
  210. package/src/semantic/core/sync-repository.js +0 -52
  211. package/src/semantic/docker/publish.js +0 -5
  212. package/src/semantic/utils/calculate-snapshot-version.js +0 -15
  213. package/src/semantic/utils/display-package-info.js +0 -11
  214. package/src/semantic/utils/display-release-info.js +0 -12
  215. /package/src/commands/{release.js → release.ts} +0 -0
  216. /package/src/commands/utils/{check-install.js → check-install.ts} +0 -0
  217. /package/src/common/back/jira/{jira-request.spec.js → jira-request.spec.ts} +0 -0
  218. /package/src/common/back/jira/{jira-search.spec.js → jira-search.spec.ts} +0 -0
  219. /package/src/semantic/{define-config.js → define-config.ts} +0 -0
  220. /package/src/semantic/utils/{release-rules.js → release-rules.ts} +0 -0
  221. /package/src/workflow/{index.js → index.ts} +0 -0
@@ -0,0 +1,330 @@
1
+ import { n as __toESM, t as __commonJSMin } from "./bin/cmrelease.mjs";
2
+ import { i as ansiRegex, t as eastAsianWidth } from "./get-east-asian-width-eFfEkHwo.mjs";
3
+ //#region node_modules/wrap-ansi/node_modules/strip-ansi/index.js
4
+ const regex = ansiRegex();
5
+ function stripAnsi(string) {
6
+ if (typeof string !== "string") throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
7
+ if (!string.includes("\x1B") && !string.includes("›")) return string;
8
+ return string.replace(regex, "");
9
+ }
10
+ //#endregion
11
+ //#region node_modules/wrap-ansi/node_modules/string-width/index.js
12
+ var import_emoji_regex = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
13
+ module.exports = () => {
14
+ return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
15
+ };
16
+ })))(), 1);
17
+ const segmenter = new Intl.Segmenter();
18
+ const defaultIgnorableCodePointRegex = /^\p{Default_Ignorable_Code_Point}$/u;
19
+ function stringWidth(string, options = {}) {
20
+ if (typeof string !== "string" || string.length === 0) return 0;
21
+ const { ambiguousIsNarrow = true, countAnsiEscapeCodes = false } = options;
22
+ if (!countAnsiEscapeCodes) string = stripAnsi(string);
23
+ if (string.length === 0) return 0;
24
+ let width = 0;
25
+ const eastAsianWidthOptions = { ambiguousAsWide: !ambiguousIsNarrow };
26
+ for (const { segment: character } of segmenter.segment(string)) {
27
+ const codePoint = character.codePointAt(0);
28
+ if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) continue;
29
+ if (codePoint >= 8203 && codePoint <= 8207 || codePoint === 65279) continue;
30
+ if (codePoint >= 768 && codePoint <= 879 || codePoint >= 6832 && codePoint <= 6911 || codePoint >= 7616 && codePoint <= 7679 || codePoint >= 8400 && codePoint <= 8447 || codePoint >= 65056 && codePoint <= 65071) continue;
31
+ if (codePoint >= 55296 && codePoint <= 57343) continue;
32
+ if (codePoint >= 65024 && codePoint <= 65039) continue;
33
+ if (defaultIgnorableCodePointRegex.test(character)) continue;
34
+ if ((0, import_emoji_regex.default)().test(character)) {
35
+ width += 2;
36
+ continue;
37
+ }
38
+ width += eastAsianWidth(codePoint, eastAsianWidthOptions);
39
+ }
40
+ return width;
41
+ }
42
+ //#endregion
43
+ //#region node_modules/wrap-ansi/node_modules/ansi-styles/index.js
44
+ const ANSI_BACKGROUND_OFFSET = 10;
45
+ const wrapAnsi16 = (offset = 0) => (code) => `\u001B[${code + offset}m`;
46
+ const wrapAnsi256 = (offset = 0) => (code) => `\u001B[${38 + offset};5;${code}m`;
47
+ const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
48
+ const styles = {
49
+ modifier: {
50
+ reset: [0, 0],
51
+ bold: [1, 22],
52
+ dim: [2, 22],
53
+ italic: [3, 23],
54
+ underline: [4, 24],
55
+ overline: [53, 55],
56
+ inverse: [7, 27],
57
+ hidden: [8, 28],
58
+ strikethrough: [9, 29]
59
+ },
60
+ color: {
61
+ black: [30, 39],
62
+ red: [31, 39],
63
+ green: [32, 39],
64
+ yellow: [33, 39],
65
+ blue: [34, 39],
66
+ magenta: [35, 39],
67
+ cyan: [36, 39],
68
+ white: [37, 39],
69
+ blackBright: [90, 39],
70
+ gray: [90, 39],
71
+ grey: [90, 39],
72
+ redBright: [91, 39],
73
+ greenBright: [92, 39],
74
+ yellowBright: [93, 39],
75
+ blueBright: [94, 39],
76
+ magentaBright: [95, 39],
77
+ cyanBright: [96, 39],
78
+ whiteBright: [97, 39]
79
+ },
80
+ bgColor: {
81
+ bgBlack: [40, 49],
82
+ bgRed: [41, 49],
83
+ bgGreen: [42, 49],
84
+ bgYellow: [43, 49],
85
+ bgBlue: [44, 49],
86
+ bgMagenta: [45, 49],
87
+ bgCyan: [46, 49],
88
+ bgWhite: [47, 49],
89
+ bgBlackBright: [100, 49],
90
+ bgGray: [100, 49],
91
+ bgGrey: [100, 49],
92
+ bgRedBright: [101, 49],
93
+ bgGreenBright: [102, 49],
94
+ bgYellowBright: [103, 49],
95
+ bgBlueBright: [104, 49],
96
+ bgMagentaBright: [105, 49],
97
+ bgCyanBright: [106, 49],
98
+ bgWhiteBright: [107, 49]
99
+ }
100
+ };
101
+ Object.keys(styles.modifier);
102
+ const foregroundColorNames = Object.keys(styles.color);
103
+ const backgroundColorNames = Object.keys(styles.bgColor);
104
+ [...foregroundColorNames, ...backgroundColorNames];
105
+ function assembleStyles() {
106
+ const codes = /* @__PURE__ */ new Map();
107
+ for (const [groupName, group] of Object.entries(styles)) {
108
+ for (const [styleName, style] of Object.entries(group)) {
109
+ styles[styleName] = {
110
+ open: `\u001B[${style[0]}m`,
111
+ close: `\u001B[${style[1]}m`
112
+ };
113
+ group[styleName] = styles[styleName];
114
+ codes.set(style[0], style[1]);
115
+ }
116
+ Object.defineProperty(styles, groupName, {
117
+ value: group,
118
+ enumerable: false
119
+ });
120
+ }
121
+ Object.defineProperty(styles, "codes", {
122
+ value: codes,
123
+ enumerable: false
124
+ });
125
+ styles.color.close = "\x1B[39m";
126
+ styles.bgColor.close = "\x1B[49m";
127
+ styles.color.ansi = wrapAnsi16();
128
+ styles.color.ansi256 = wrapAnsi256();
129
+ styles.color.ansi16m = wrapAnsi16m();
130
+ styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
131
+ styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
132
+ styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
133
+ Object.defineProperties(styles, {
134
+ rgbToAnsi256: {
135
+ value(red, green, blue) {
136
+ if (red === green && green === blue) {
137
+ if (red < 8) return 16;
138
+ if (red > 248) return 231;
139
+ return Math.round((red - 8) / 247 * 24) + 232;
140
+ }
141
+ return 16 + 36 * Math.round(red / 255 * 5) + 6 * Math.round(green / 255 * 5) + Math.round(blue / 255 * 5);
142
+ },
143
+ enumerable: false
144
+ },
145
+ hexToRgb: {
146
+ value(hex) {
147
+ const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16));
148
+ if (!matches) return [
149
+ 0,
150
+ 0,
151
+ 0
152
+ ];
153
+ let [colorString] = matches;
154
+ if (colorString.length === 3) colorString = [...colorString].map((character) => character + character).join("");
155
+ const integer = Number.parseInt(colorString, 16);
156
+ return [
157
+ integer >> 16 & 255,
158
+ integer >> 8 & 255,
159
+ integer & 255
160
+ ];
161
+ },
162
+ enumerable: false
163
+ },
164
+ hexToAnsi256: {
165
+ value: (hex) => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
166
+ enumerable: false
167
+ },
168
+ ansi256ToAnsi: {
169
+ value(code) {
170
+ if (code < 8) return 30 + code;
171
+ if (code < 16) return 90 + (code - 8);
172
+ let red;
173
+ let green;
174
+ let blue;
175
+ if (code >= 232) {
176
+ red = ((code - 232) * 10 + 8) / 255;
177
+ green = red;
178
+ blue = red;
179
+ } else {
180
+ code -= 16;
181
+ const remainder = code % 36;
182
+ red = Math.floor(code / 36) / 5;
183
+ green = Math.floor(remainder / 6) / 5;
184
+ blue = remainder % 6 / 5;
185
+ }
186
+ const value = Math.max(red, green, blue) * 2;
187
+ if (value === 0) return 30;
188
+ let result = 30 + (Math.round(blue) << 2 | Math.round(green) << 1 | Math.round(red));
189
+ if (value === 2) result += 60;
190
+ return result;
191
+ },
192
+ enumerable: false
193
+ },
194
+ rgbToAnsi: {
195
+ value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
196
+ enumerable: false
197
+ },
198
+ hexToAnsi: {
199
+ value: (hex) => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
200
+ enumerable: false
201
+ }
202
+ });
203
+ return styles;
204
+ }
205
+ const ansiStyles = assembleStyles();
206
+ //#endregion
207
+ //#region node_modules/wrap-ansi/index.js
208
+ const ESCAPES = /* @__PURE__ */ new Set(["\x1B", "›"]);
209
+ const END_CODE = 39;
210
+ const ANSI_ESCAPE_BELL = "\x07";
211
+ const ANSI_CSI = "[";
212
+ const ANSI_OSC = "]";
213
+ const ANSI_SGR_TERMINATOR = "m";
214
+ const ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;
215
+ const wrapAnsiCode = (code) => `${ESCAPES.values().next().value}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;
216
+ const wrapAnsiHyperlink = (url) => `${ESCAPES.values().next().value}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;
217
+ const wordLengths = (string) => string.split(" ").map((character) => stringWidth(character));
218
+ const wrapWord = (rows, word, columns) => {
219
+ const characters = [...word];
220
+ let isInsideEscape = false;
221
+ let isInsideLinkEscape = false;
222
+ let visible = stringWidth(stripAnsi(rows.at(-1)));
223
+ for (const [index, character] of characters.entries()) {
224
+ const characterLength = stringWidth(character);
225
+ if (visible + characterLength <= columns) rows[rows.length - 1] += character;
226
+ else {
227
+ rows.push(character);
228
+ visible = 0;
229
+ }
230
+ if (ESCAPES.has(character)) {
231
+ isInsideEscape = true;
232
+ isInsideLinkEscape = characters.slice(index + 1, index + 1 + ANSI_ESCAPE_LINK.length).join("") === ANSI_ESCAPE_LINK;
233
+ }
234
+ if (isInsideEscape) {
235
+ if (isInsideLinkEscape) {
236
+ if (character === ANSI_ESCAPE_BELL) {
237
+ isInsideEscape = false;
238
+ isInsideLinkEscape = false;
239
+ }
240
+ } else if (character === ANSI_SGR_TERMINATOR) isInsideEscape = false;
241
+ continue;
242
+ }
243
+ visible += characterLength;
244
+ if (visible === columns && index < characters.length - 1) {
245
+ rows.push("");
246
+ visible = 0;
247
+ }
248
+ }
249
+ if (!visible && rows.at(-1).length > 0 && rows.length > 1) rows[rows.length - 2] += rows.pop();
250
+ };
251
+ const stringVisibleTrimSpacesRight = (string) => {
252
+ const words = string.split(" ");
253
+ let last = words.length;
254
+ while (last > 0) {
255
+ if (stringWidth(words[last - 1]) > 0) break;
256
+ last--;
257
+ }
258
+ if (last === words.length) return string;
259
+ return words.slice(0, last).join(" ") + words.slice(last).join("");
260
+ };
261
+ const exec = (string, columns, options = {}) => {
262
+ if (options.trim !== false && string.trim() === "") return "";
263
+ let returnValue = "";
264
+ let escapeCode;
265
+ let escapeUrl;
266
+ const lengths = wordLengths(string);
267
+ let rows = [""];
268
+ for (const [index, word] of string.split(" ").entries()) {
269
+ if (options.trim !== false) rows[rows.length - 1] = rows.at(-1).trimStart();
270
+ let rowLength = stringWidth(rows.at(-1));
271
+ if (index !== 0) {
272
+ if (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {
273
+ rows.push("");
274
+ rowLength = 0;
275
+ }
276
+ if (rowLength > 0 || options.trim === false) {
277
+ rows[rows.length - 1] += " ";
278
+ rowLength++;
279
+ }
280
+ }
281
+ if (options.hard && lengths[index] > columns) {
282
+ const remainingColumns = columns - rowLength;
283
+ const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);
284
+ if (Math.floor((lengths[index] - 1) / columns) < breaksStartingThisLine) rows.push("");
285
+ wrapWord(rows, word, columns);
286
+ continue;
287
+ }
288
+ if (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) {
289
+ if (options.wordWrap === false && rowLength < columns) {
290
+ wrapWord(rows, word, columns);
291
+ continue;
292
+ }
293
+ rows.push("");
294
+ }
295
+ if (rowLength + lengths[index] > columns && options.wordWrap === false) {
296
+ wrapWord(rows, word, columns);
297
+ continue;
298
+ }
299
+ rows[rows.length - 1] += word;
300
+ }
301
+ if (options.trim !== false) rows = rows.map((row) => stringVisibleTrimSpacesRight(row));
302
+ const preString = rows.join("\n");
303
+ const pre = [...preString];
304
+ let preStringIndex = 0;
305
+ for (const [index, character] of pre.entries()) {
306
+ returnValue += character;
307
+ if (ESCAPES.has(character)) {
308
+ const { groups } = new RegExp(`(?:\\${ANSI_CSI}(?<code>\\d+)m|\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`).exec(preString.slice(preStringIndex)) || { groups: {} };
309
+ if (groups.code !== void 0) {
310
+ const code = Number.parseFloat(groups.code);
311
+ escapeCode = code === END_CODE ? void 0 : code;
312
+ } else if (groups.uri !== void 0) escapeUrl = groups.uri.length === 0 ? void 0 : groups.uri;
313
+ }
314
+ const code = ansiStyles.codes.get(Number(escapeCode));
315
+ if (pre[index + 1] === "\n") {
316
+ if (escapeUrl) returnValue += wrapAnsiHyperlink("");
317
+ if (escapeCode && code) returnValue += wrapAnsiCode(code);
318
+ } else if (character === "\n") {
319
+ if (escapeCode && code) returnValue += wrapAnsiCode(escapeCode);
320
+ if (escapeUrl) returnValue += wrapAnsiHyperlink(escapeUrl);
321
+ }
322
+ preStringIndex += character.length;
323
+ }
324
+ return returnValue;
325
+ };
326
+ function wrapAnsi(string, columns, options) {
327
+ return String(string).normalize().replaceAll("\r\n", "\n").split("\n").map((line) => exec(line, columns, options)).join("\n");
328
+ }
329
+ //#endregion
330
+ export { wrapAnsi as default };
package/mise.toml ADDED
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ node = "v24.18.0"
package/oxlint.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "plugins": ["typescript", "vitest"],
4
+ "env": {
5
+ "node": true
6
+ },
7
+ "ignorePatterns": ["node_modules", "dist", "public", "reports", "coverage", ".yarn", "__generated__"],
8
+ "rules": {
9
+ "no-var": "error",
10
+ "no-console": "error",
11
+ "camelcase": "off",
12
+ "func-names": "error",
13
+ "no-unused-vars": "off",
14
+ "typescript/no-unused-vars": "error"
15
+ },
16
+ "overrides": [
17
+ {
18
+ "files": ["**/*.spec.{js,ts}", "**/*.test.{js,ts}"],
19
+ "rules": {
20
+ "vitest/consistent-test-it": ["error", { "fn": "it", "withinDescribe": "it" }],
21
+ "vitest/no-alias-methods": "error"
22
+ }
23
+ }
24
+ ]
25
+ }
package/package.json CHANGED
@@ -1,72 +1,84 @@
1
1
  {
2
2
  "name": "@cmflow/cli",
3
- "version": "3.2.1",
3
+ "version": "3.4.0-alpha.1",
4
4
  "description": "An awesome Git Flow",
5
- "author": "camfou",
6
5
  "license": "MIT",
7
- "email": "camfou@gmail.com",
8
- "main": "./src/index.js",
9
- "module": "./src/index.js",
10
- "type": "module",
6
+ "author": "camfou",
11
7
  "bin": {
12
- "checkfeatures": "./bin/checkfeatures.sh",
13
- "cm": "./bin/cm.js",
14
- "cmconfig": "bin/cm-config.js",
15
- "cmexpedit": "./bin/cmexpedit.sh",
16
- "cmfetch": "bin/cm-fetch.js",
17
- "cmfinish": "bin/cm-finish.js",
18
- "cmmerge": "./bin/cm-merge.js",
19
- "cmpublish": "bin/cm-publish.js",
20
- "cmpull": "./bin/cmpull.sh",
21
- "cmpush": "bin/cm-push.js",
22
- "cmrebase": "bin/cm-rebase.js",
23
- "cmrelease": "./bin/cmrelease.js",
24
- "cmrepublish": "bin/cm-republish.js",
25
- "cmstart": "bin/cm-start.js"
8
+ "cm": "./dist/bin/cm.mjs",
9
+ "cmrelease": "./dist/bin/cmrelease.mjs"
26
10
  },
11
+ "type": "module",
12
+ "main": "./dist/src/index.mjs",
13
+ "module": "./dist/src/index.mjs",
27
14
  "exports": {
28
- ".": "./src/index.js",
29
- "./semantic/*": "./src/semantic/*.js"
15
+ ".": "./dist/src/index.mjs",
16
+ "./semantic/*": "./dist/src/semantic/*.mjs"
17
+ },
18
+ "scripts": {
19
+ "build": "tsdown",
20
+ "check": "tsc --noEmit",
21
+ "dev": "tsdown --watch",
22
+ "prepare": "yarn build",
23
+ "test": "yarn lint && yarn format:check && yarn test:unit",
24
+ "test:unit": "vitest run",
25
+ "lint": "oxlint src bin",
26
+ "lint:ci": "mkdir -p ./reports && oxlint --format checkstyle src bin > ./reports/oxlint.xml",
27
+ "lint:fix": "oxlint --fix src bin",
28
+ "format": "oxfmt",
29
+ "format:check": "oxfmt --check",
30
+ "release": "yarn build && node dist/bin/cmrelease.mjs",
31
+ "release:dry_run": "yarn build && node dist/bin/cmrelease.mjs --dry-run",
32
+ "jira:releases": "yarn build && node --env-file=.env dist/bin/cm.mjs jira-releases --project-id CMAB --component API --tag 0.3241.3 --verbose"
30
33
  },
31
34
  "dependencies": {
35
+ "semantic-release": ">=24.2.3"
36
+ },
37
+ "devDependencies": {
38
+ "@ai-sdk/openai": "^1.0.0",
39
+ "@ai-sdk/openai-compatible": "^3.0.14",
40
+ "@clack/prompts": "^1.7.0",
41
+ "@directus/sdk": "21.2.2",
42
+ "@semantic-release/github": "11.0.1",
43
+ "@semantic-release/release-notes-generator": ">=14.0.3",
44
+ "@types/fs-extra": "^11.0.4",
45
+ "@types/inquirer": "^9.0.10",
46
+ "@types/lodash": "^4.17.0",
47
+ "@types/node": "24.1.0",
48
+ "@types/semver": "^7.8.0",
49
+ "ai": "^7.0.35",
50
+ "ai-sdk-ollama": "^4.0.0",
32
51
  "any-observable": "0.5.1",
33
52
  "axios": "1.8.2",
34
53
  "axios-retry": "^4.5.0",
35
54
  "chalk": "^4.1.0",
36
- "commander": "5.1.0",
55
+ "commander": "^12.1.0",
56
+ "dotenv": "16.4.5",
37
57
  "execa": "5.1.1",
38
58
  "figures": "3.2.0",
39
59
  "fs-extra": "^10.1.0",
40
- "globby": "11.1.0",
60
+ "globby": "^14.0.0",
41
61
  "has-yarn": "^2.1.0",
42
62
  "https-proxy-agent": "7.0.6",
63
+ "husky": "4.3.6",
43
64
  "inquirer": "9.2.19",
44
- "listr": "0.14.3",
65
+ "lint-staged": "10.5.3",
66
+ "listr2": "^8.0.0",
45
67
  "lodash": "4.17.21",
46
68
  "moment": "^2.30.1",
47
69
  "node-fetch": "3.3.2",
70
+ "oxfmt": "^0.64.0",
71
+ "oxlint": "^1.79.0",
48
72
  "rxjs": "7.8.1",
49
- "semantic-release": ">=24.2.3",
50
73
  "semver": "7.7.1",
51
- "split": "1.0.1"
52
- },
53
- "devDependencies": {
54
- "@semantic-release/github": "11.0.1",
55
- "@semantic-release/release-notes-generator": ">=14.0.3",
56
- "@stylistic/eslint-plugin": "^4.2.0",
57
- "@typescript-eslint/eslint-plugin": "8.26.1",
58
- "@typescript-eslint/parser": "8.26.1",
59
- "eslint": "9.21.0",
60
- "eslint-config-prettier": "10.0.2",
61
- "eslint-formatter-junit": "^8.40.0",
62
- "eslint-plugin-prettier": "5.2.3",
63
- "eslint-plugin-simple-import-sort": "12.1.1",
64
- "eslint-plugin-vitest": "0.5.4",
65
- "husky": "4.3.6",
66
- "lint-staged": "10.5.3",
67
- "prettier": "3.5.1",
68
- "typescript": "5.8.2",
69
- "vitest": "^3.0.8"
74
+ "split": "1.0.1",
75
+ "ts-morph": "^25.0.1",
76
+ "tsdown": "^0.22.14",
77
+ "tsx": "^4.19.0",
78
+ "typescript": "^7.0.2",
79
+ "vitest": "^3.0.8",
80
+ "yaml": "^2.0.0",
81
+ "zod": "^4.4.3"
70
82
  },
71
83
  "peerDependencies": {
72
84
  "@semantic-release/commit-analyzer": ">=13.0.1",
@@ -80,33 +92,24 @@
80
92
  "optional": true
81
93
  }
82
94
  },
83
- "scripts": {
84
- "test": "yarn lint && yarn test_unit",
85
- "test_unit": "vitest run",
86
- "lint": "eslint",
87
- "lint_ci": "eslint --format junit --output-file ./reports/eslint.xml",
88
- "lint_fix": "eslint --fix",
89
- "release": "node bin/cmrelease.js",
90
- "release_dry_run": "node bin/cmrelease.js --dry-run",
91
- "jira_releases": "node --env-file=.env bin/cm.js jira-releases --project-id CMAB --component API --tag 0.3241.3 --verbose"
92
- },
93
95
  "husky": {
94
96
  "hooks": {
95
- "pre-commit": "lint-staged",
96
- "post-commit": "git update-index --again"
97
+ "post-commit": "git update-index --again",
98
+ "pre-commit": "lint-staged"
97
99
  }
98
100
  },
99
101
  "lint-staged": {
100
- "*.js": [
101
- "eslint --fix",
102
- "git add"
102
+ "*.{js,ts}": [
103
+ "oxlint --fix",
104
+ "oxfmt"
103
105
  ]
104
106
  },
107
+ "packageManager": "yarn@4.18.0",
108
+ "email": "camfou@gmail.com",
105
109
  "flow": {
106
110
  "branch": {
107
111
  "develop": "master",
108
112
  "production": "master"
109
113
  }
110
- },
111
- "packageManager": "yarn@4.7.0"
114
+ }
112
115
  }
@@ -1,4 +1,4 @@
1
- import { defineConfig } from "./src/index.js";
1
+ import { defineConfig } from "./dist/src/index.mjs";
2
2
 
3
3
  export default defineConfig({
4
4
  branches: [
@@ -19,19 +19,19 @@ export default defineConfig({
19
19
  channel: "rc"
20
20
  }
21
21
  ],
22
- verifyConditions: ["./src/semantic/core/verify-conditions.js"],
22
+ verifyConditions: ["./dist/src/semantic/core/verify-conditions.mjs"],
23
23
  analyzeCommits: ["@semantic-release/commit-analyzer"],
24
- verifyRelease: ["./src/semantic/core/verify-release.js"],
24
+ verifyRelease: ["./dist/src/semantic/core/verify-release.mjs"],
25
25
  generateNotes: [
26
26
  [
27
- "./src/semantic/core/conditional",
27
+ "./dist/src/semantic/core/conditional.mjs",
28
28
  {
29
29
  run: ["@semantic-release/release-notes-generator"]
30
30
  }
31
31
  ]
32
32
  ],
33
- prepare: ["./src/semantic/core/prepare/bump-version.js", "./src/semantic/core/prepare/commit.js"],
34
- publish: ["./src/semantic/core/sync-repository.js", "@semantic-release/github"],
33
+ prepare: ["./dist/src/semantic/core/prepare/bump-version.mjs", "./dist/src/semantic/core/prepare/commit.mjs"],
34
+ publish: ["./dist/src/semantic/core/sync-repository.mjs", "@semantic-release/github"],
35
35
  success: ["@semantic-release/github"],
36
36
  fail: ["@semantic-release/github"],
37
37
  npmPublish: false,
@@ -0,0 +1,39 @@
1
+ import type { Command } from "commander";
2
+ import type { ListrTask } from "listr2";
3
+ import { git } from "../common/index.js";
4
+ import { runCommand } from "../common/run-command.js";
5
+ import type { CmContext, ICommand } from "../common/types.js";
6
+ import { refreshRepository } from "./tasks/refresh-repository.js";
7
+
8
+ interface CheckfeaturesOpts {
9
+ verbose?: number;
10
+ }
11
+
12
+ export class Checkfeatures implements ICommand {
13
+ mapContext(_opts: CheckfeaturesOpts, context: CmContext): CmContext {
14
+ return { ...context, output: [] };
15
+ }
16
+
17
+ getTasks(context: CmContext): ListrTask[] {
18
+ return [refreshRepository(context)];
19
+ }
20
+
21
+ success(): void {
22
+ const branches = git.branchesInfos("-r") as Array<{
23
+ branch: string;
24
+ date: string;
25
+ creation: string;
26
+ author: string;
27
+ }>;
28
+ for (const { branch, date, creation, author } of branches) {
29
+ console.log(`${date}\t${creation}\t${author}\t${branch}`);
30
+ }
31
+ }
32
+ }
33
+
34
+ export default (program: Command): void =>
35
+ void program
36
+ .command("checkfeatures")
37
+ .description("List feature branches with metadata")
38
+ .option("-v, --verbose", "Enable verbose log", (v, t: number) => t + 1, 0)
39
+ .action((opts: CheckfeaturesOpts) => runCommand(Checkfeatures, opts));
@@ -0,0 +1,36 @@
1
+ import type { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import figures from "figures";
4
+ import type { ListrTask } from "listr2";
5
+
6
+ import type { CmContext, ICommand } from "../common/types.js";
7
+ import { runCommand } from "../common/run-command.js";
8
+ import { dockerCleanTags } from "../semantic/utils/docker-clean-tags.js";
9
+
10
+ interface CleanOpts {
11
+ verbose?: number;
12
+ }
13
+
14
+ export class Clean implements ICommand {
15
+ mapContext(_opts: CleanOpts, context: CmContext): CmContext {
16
+ return { ...context };
17
+ }
18
+
19
+ prompt(): Array<Record<string, unknown>> {
20
+ return [];
21
+ }
22
+
23
+ getTasks(context: CmContext): ListrTask[] {
24
+ return [{ title: "Clean docker tags", task: () => dockerCleanTags(context as unknown as Parameters<typeof dockerCleanTags>[0]) }];
25
+ }
26
+
27
+ success(): void {
28
+ console.log(chalk.green(figures.tick), "Docker tags cleaned");
29
+ }
30
+ }
31
+
32
+ export default (program: Command): void =>
33
+ void program
34
+ .command("clean")
35
+ .description("Clean deployed docker image on Docker hub")
36
+ .action((opts: CleanOpts) => runCommand(Clean, opts));