@mx-space/cli 0.1.1 → 0.2.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 (235) hide show
  1. package/README.md +101 -28
  2. package/ROADMAP.md +4 -3
  3. package/dist/{Lexical.dev-DpU35QTu.mjs → Lexical.dev-CMevU1DO.mjs} +1 -1
  4. package/dist/{Lexical.dev-DpU35QTu.mjs.map → Lexical.dev-CMevU1DO.mjs.map} +1 -1
  5. package/dist/{Lexical.node-gYNDt_p9.mjs → Lexical.node-BR9e7Cyk.mjs} +2 -2
  6. package/dist/{Lexical.node-gYNDt_p9.mjs.map → Lexical.node-BR9e7Cyk.mjs.map} +1 -1
  7. package/dist/{Lexical.prod-t4c3bHV3.mjs → Lexical.prod-PUD-z9fY.mjs} +1 -1
  8. package/dist/{Lexical.prod-t4c3bHV3.mjs.map → Lexical.prod-PUD-z9fY.mjs.map} +1 -1
  9. package/dist/{LexicalClipboard.dev-CdeeWCIq.mjs → LexicalClipboard.dev-DZC2zppG.mjs} +6 -6
  10. package/dist/{LexicalClipboard.dev-CdeeWCIq.mjs.map → LexicalClipboard.dev-DZC2zppG.mjs.map} +1 -1
  11. package/dist/{LexicalClipboard.node-0e9GBL1g.mjs → LexicalClipboard.node-e5G1wVGb.mjs} +2 -2
  12. package/dist/{LexicalClipboard.node-0e9GBL1g.mjs.map → LexicalClipboard.node-e5G1wVGb.mjs.map} +1 -1
  13. package/dist/{LexicalClipboard.prod-CsCWYmV7.mjs → LexicalClipboard.prod-DE2azzIb.mjs} +6 -6
  14. package/dist/{LexicalClipboard.prod-CsCWYmV7.mjs.map → LexicalClipboard.prod-DE2azzIb.mjs.map} +1 -1
  15. package/dist/{LexicalCodeCore.dev-haI2cqH8.mjs → LexicalCodeCore.dev-gs--x55I.mjs} +3 -3
  16. package/dist/{LexicalCodeCore.dev-haI2cqH8.mjs.map → LexicalCodeCore.dev-gs--x55I.mjs.map} +1 -1
  17. package/dist/{LexicalCodeCore.prod-D_k7zuE5.mjs → LexicalCodeCore.prod-DPHOnyEj.mjs} +3 -3
  18. package/dist/{LexicalCodeCore.prod-D_k7zuE5.mjs.map → LexicalCodeCore.prod-DPHOnyEj.mjs.map} +1 -1
  19. package/dist/{LexicalDragon.dev-CAggdFh_.mjs → LexicalDragon.dev-CVe8bzVN.mjs} +3 -3
  20. package/dist/{LexicalDragon.dev-CAggdFh_.mjs.map → LexicalDragon.dev-CVe8bzVN.mjs.map} +1 -1
  21. package/dist/{LexicalDragon.node-QMR_wqJg.mjs → LexicalDragon.node-c7EHvcnK.mjs} +2 -2
  22. package/dist/{LexicalDragon.node-QMR_wqJg.mjs.map → LexicalDragon.node-c7EHvcnK.mjs.map} +1 -1
  23. package/dist/{LexicalDragon.prod-OssQhwS-.mjs → LexicalDragon.prod-D6KvqyLD.mjs} +3 -3
  24. package/dist/{LexicalDragon.prod-OssQhwS-.mjs.map → LexicalDragon.prod-D6KvqyLD.mjs.map} +1 -1
  25. package/dist/{LexicalExtension.dev-CtDZiMCU.mjs → LexicalExtension.dev-PDo8HyEw.mjs} +3 -3
  26. package/dist/{LexicalExtension.dev-CtDZiMCU.mjs.map → LexicalExtension.dev-PDo8HyEw.mjs.map} +1 -1
  27. package/dist/{LexicalExtension.node-BM0gh8zu.mjs → LexicalExtension.node-BKzjRb-0.mjs} +2 -2
  28. package/dist/{LexicalExtension.node-BM0gh8zu.mjs.map → LexicalExtension.node-BKzjRb-0.mjs.map} +1 -1
  29. package/dist/{LexicalExtension.prod-Ug6emhEO.mjs → LexicalExtension.prod-D0x_lX7q.mjs} +3 -3
  30. package/dist/{LexicalExtension.prod-Ug6emhEO.mjs.map → LexicalExtension.prod-D0x_lX7q.mjs.map} +1 -1
  31. package/dist/{LexicalHeadless.dev-D4yQpl_s.mjs → LexicalHeadless.dev-DBKcW82j.mjs} +2 -2
  32. package/dist/{LexicalHeadless.dev-D4yQpl_s.mjs.map → LexicalHeadless.dev-DBKcW82j.mjs.map} +1 -1
  33. package/dist/{LexicalHeadless.prod-jeN65B3k.mjs → LexicalHeadless.prod-D4nEh7cR.mjs} +2 -2
  34. package/dist/{LexicalHeadless.prod-jeN65B3k.mjs.map → LexicalHeadless.prod-D4nEh7cR.mjs.map} +1 -1
  35. package/dist/{LexicalHtml.dev-BdU1_ITQ.mjs → LexicalHtml.dev-vsWW05es.mjs} +4 -4
  36. package/dist/{LexicalHtml.dev-BdU1_ITQ.mjs.map → LexicalHtml.dev-vsWW05es.mjs.map} +1 -1
  37. package/dist/{LexicalHtml.node-DLtAh00E.mjs → LexicalHtml.node-CpibAfba.mjs} +2 -2
  38. package/dist/{LexicalHtml.node-DLtAh00E.mjs.map → LexicalHtml.node-CpibAfba.mjs.map} +1 -1
  39. package/dist/{LexicalHtml.prod-DdLE1HHT.mjs → LexicalHtml.prod-Bqz-3WAp.mjs} +4 -4
  40. package/dist/{LexicalHtml.prod-DdLE1HHT.mjs.map → LexicalHtml.prod-Bqz-3WAp.mjs.map} +1 -1
  41. package/dist/{LexicalLink.dev-DK87Biuy.mjs → LexicalLink.dev-BO0J0B1E.mjs} +4 -4
  42. package/dist/{LexicalLink.dev-DK87Biuy.mjs.map → LexicalLink.dev-BO0J0B1E.mjs.map} +1 -1
  43. package/dist/{LexicalLink.prod-fssuv6Sf.mjs → LexicalLink.prod-D66AhUCZ.mjs} +4 -4
  44. package/dist/{LexicalLink.prod-fssuv6Sf.mjs.map → LexicalLink.prod-D66AhUCZ.mjs.map} +1 -1
  45. package/dist/{LexicalList.dev-BJ4dr_rk.mjs → LexicalList.dev-DVGTWRk0.mjs} +4 -4
  46. package/dist/{LexicalList.dev-BJ4dr_rk.mjs.map → LexicalList.dev-DVGTWRk0.mjs.map} +1 -1
  47. package/dist/{LexicalList.prod-jWBbaWfi.mjs → LexicalList.prod-Bao7NGl7.mjs} +4 -4
  48. package/dist/{LexicalList.prod-jWBbaWfi.mjs.map → LexicalList.prod-Bao7NGl7.mjs.map} +1 -1
  49. package/dist/{LexicalMarkdown.dev-C8e-eh6y.mjs → LexicalMarkdown.dev-CRWkZwlp.mjs} +4 -4
  50. package/dist/{LexicalMarkdown.dev-C8e-eh6y.mjs.map → LexicalMarkdown.dev-CRWkZwlp.mjs.map} +1 -1
  51. package/dist/{LexicalMarkdown.prod-k73tZVb2.mjs → LexicalMarkdown.prod-tGG6js4r.mjs} +4 -4
  52. package/dist/{LexicalMarkdown.prod-k73tZVb2.mjs.map → LexicalMarkdown.prod-tGG6js4r.mjs.map} +1 -1
  53. package/dist/{LexicalRichText.dev-CrSqq3K-.mjs → LexicalRichText.dev-DPXfQePC.mjs} +6 -6
  54. package/dist/{LexicalRichText.dev-CrSqq3K-.mjs.map → LexicalRichText.dev-DPXfQePC.mjs.map} +1 -1
  55. package/dist/{LexicalRichText.node-B7k7wlQz.mjs → LexicalRichText.node-BEkm_YwY.mjs} +5 -5
  56. package/dist/{LexicalRichText.node-B7k7wlQz.mjs.map → LexicalRichText.node-BEkm_YwY.mjs.map} +1 -1
  57. package/dist/{LexicalRichText.prod-CqvyxQ9m.mjs → LexicalRichText.prod-DlfudC5w.mjs} +6 -6
  58. package/dist/{LexicalRichText.prod-CqvyxQ9m.mjs.map → LexicalRichText.prod-DlfudC5w.mjs.map} +1 -1
  59. package/dist/{LexicalSelection.dev-sNOHKHe_.mjs → LexicalSelection.dev-BVTArZ-b.mjs} +2 -2
  60. package/dist/{LexicalSelection.dev-sNOHKHe_.mjs.map → LexicalSelection.dev-BVTArZ-b.mjs.map} +1 -1
  61. package/dist/{LexicalSelection.node-Di7GwBCZ.mjs → LexicalSelection.node-CQ8iTYsz.mjs} +2 -2
  62. package/dist/{LexicalSelection.node-Di7GwBCZ.mjs.map → LexicalSelection.node-CQ8iTYsz.mjs.map} +1 -1
  63. package/dist/{LexicalSelection.prod-SWllPJop.mjs → LexicalSelection.prod-BZKGGs-G.mjs} +2 -2
  64. package/dist/{LexicalSelection.prod-SWllPJop.mjs.map → LexicalSelection.prod-BZKGGs-G.mjs.map} +1 -1
  65. package/dist/{LexicalTable.dev-CQkLHXJx.mjs → LexicalTable.dev-C-AOEpJn.mjs} +5 -5
  66. package/dist/{LexicalTable.dev-CQkLHXJx.mjs.map → LexicalTable.dev-C-AOEpJn.mjs.map} +1 -1
  67. package/dist/{LexicalTable.prod-BtqCwKSi.mjs → LexicalTable.prod-Cyn0qWxZ.mjs} +5 -5
  68. package/dist/{LexicalTable.prod-BtqCwKSi.mjs.map → LexicalTable.prod-Cyn0qWxZ.mjs.map} +1 -1
  69. package/dist/{LexicalUtils.dev-DiUpsXE8.mjs → LexicalUtils.dev-DRRDyAlS.mjs} +3 -3
  70. package/dist/{LexicalUtils.dev-DiUpsXE8.mjs.map → LexicalUtils.dev-DRRDyAlS.mjs.map} +1 -1
  71. package/dist/{LexicalUtils.node-CmK462d1.mjs → LexicalUtils.node-Dz-HANi6.mjs} +2 -2
  72. package/dist/{LexicalUtils.node-CmK462d1.mjs.map → LexicalUtils.node-Dz-HANi6.mjs.map} +1 -1
  73. package/dist/{LexicalUtils.prod-bWwV4GAF.mjs → LexicalUtils.prod-CmeHwh8W.mjs} +3 -3
  74. package/dist/{LexicalUtils.prod-bWwV4GAF.mjs.map → LexicalUtils.prod-CmeHwh8W.mjs.map} +1 -1
  75. package/dist/{auth-OeKZZ_2x.mjs → auth-CAKmTDpF.mjs} +11 -11
  76. package/dist/auth-CAKmTDpF.mjs.map +1 -0
  77. package/dist/bin/mxs.d.mts +2 -1
  78. package/dist/bin/mxs.mjs +402 -55
  79. package/dist/bin/mxs.mjs.map +1 -1
  80. package/dist/{config-store-WL7dNMS6.mjs → config-store-B8_9iStL.mjs} +21 -81
  81. package/dist/config-store-B8_9iStL.mjs.map +1 -0
  82. package/dist/{create-Cxnqt_Wt.mjs → create-5wbU7IQh.mjs} +5 -5
  83. package/dist/{create-Cxnqt_Wt.mjs.map → create-5wbU7IQh.mjs.map} +1 -1
  84. package/dist/{create-DUOSAqBm.mjs → create-Bs6K7AyQ.mjs} +3 -3
  85. package/dist/{create-DUOSAqBm.mjs.map → create-Bs6K7AyQ.mjs.map} +1 -1
  86. package/dist/{create-C85MSrtt.mjs → create-DBReocgJ.mjs} +5 -5
  87. package/dist/{create-C85MSrtt.mjs.map → create-DBReocgJ.mjs.map} +1 -1
  88. package/dist/{create-BVHnXtIH.mjs → create-DGVaE0_S.mjs} +4 -4
  89. package/dist/{create-BVHnXtIH.mjs.map → create-DGVaE0_S.mjs.map} +1 -1
  90. package/dist/{create-BWA2WGrW.mjs → create-lLFZuMsz.mjs} +3 -3
  91. package/dist/{create-BWA2WGrW.mjs.map → create-lLFZuMsz.mjs.map} +1 -1
  92. package/dist/{delete-CGy-cV6k.mjs → delete-6tkhHQDp.mjs} +5 -5
  93. package/dist/delete-6tkhHQDp.mjs.map +1 -0
  94. package/dist/{delete-CcyrLNZv.mjs → delete-CRFxitDN.mjs} +6 -6
  95. package/dist/delete-CRFxitDN.mjs.map +1 -0
  96. package/dist/{delete-Cjxehwj7.mjs → delete-DU2Hvsy8.mjs} +5 -5
  97. package/dist/delete-DU2Hvsy8.mjs.map +1 -0
  98. package/dist/{delete-BEXOOFAJ.mjs → delete-nJmHtvfq.mjs} +6 -6
  99. package/dist/delete-nJmHtvfq.mjs.map +1 -0
  100. package/dist/{delete-CKqlAUT8.mjs → delete-tJhXI8s4.mjs} +5 -5
  101. package/dist/delete-tJhXI8s4.mjs.map +1 -0
  102. package/dist/{onboarding-C1t1yoay.mjs → dist-DJF1Ntdn.mjs} +95 -173
  103. package/dist/dist-DJF1Ntdn.mjs.map +1 -0
  104. package/dist/{document-output-C5PWbz2p.mjs → document-output-BFJdwPV0.mjs} +5 -5
  105. package/dist/document-output-BFJdwPV0.mjs.map +1 -0
  106. package/dist/{edit-BuKMUNVC.mjs → edit-BMjTbPQO.mjs} +5 -5
  107. package/dist/edit-BMjTbPQO.mjs.map +1 -0
  108. package/dist/{edit-DFnOnk4i.mjs → edit-BnEmMmv6.mjs} +9 -9
  109. package/dist/edit-BnEmMmv6.mjs.map +1 -0
  110. package/dist/{edit-BRaZ6GGg.mjs → edit-C4vRSmRy.mjs} +9 -9
  111. package/dist/{edit-BRaZ6GGg.mjs.map → edit-C4vRSmRy.mjs.map} +1 -1
  112. package/dist/{edit-t108N11Q.mjs → edit-CQsW5gnk.mjs} +8 -8
  113. package/dist/{edit-t108N11Q.mjs.map → edit-CQsW5gnk.mjs.map} +1 -1
  114. package/dist/{editor-xrF-j3UE.mjs → editor-BIw1ALTF.mjs} +4 -4
  115. package/dist/editor-BIw1ALTF.mjs.map +1 -0
  116. package/dist/{envelope-overlays-DPAlMNW1.mjs → envelope-overlays-DXXygxdF.mjs} +2 -2
  117. package/dist/{envelope-overlays-DPAlMNW1.mjs.map → envelope-overlays-DXXygxdF.mjs.map} +1 -1
  118. package/dist/{get-CwcNFb39.mjs → get-B3Y5hAAO.mjs} +3 -3
  119. package/dist/{get-CwcNFb39.mjs.map → get-B3Y5hAAO.mjs.map} +1 -1
  120. package/dist/{get-DnDvLa9S.mjs → get-C5fmd5Vf.mjs} +4 -4
  121. package/dist/{get-DnDvLa9S.mjs.map → get-C5fmd5Vf.mjs.map} +1 -1
  122. package/dist/{get-Doi-NKAh.mjs → get-Cdp2tmwz.mjs} +6 -6
  123. package/dist/get-Cdp2tmwz.mjs.map +1 -0
  124. package/dist/{get-DxTU7Nom.mjs → get-D18ChSKU.mjs} +3 -3
  125. package/dist/{get-DxTU7Nom.mjs.map → get-D18ChSKU.mjs.map} +1 -1
  126. package/dist/{get-BYoAlJwB.mjs → get-NSHTGu4Y.mjs} +4 -4
  127. package/dist/{get-BYoAlJwB.mjs.map → get-NSHTGu4Y.mjs.map} +1 -1
  128. package/dist/{get-GdRz82RW.mjs → get-XBPJr95m.mjs} +4 -4
  129. package/dist/{get-GdRz82RW.mjs.map → get-XBPJr95m.mjs.map} +1 -1
  130. package/dist/index.d.mts +57 -11
  131. package/dist/index.mjs +11 -10
  132. package/dist/{list-DVunNsXr.mjs → list-B6703n9X.mjs} +3 -3
  133. package/dist/{list-DVunNsXr.mjs.map → list-B6703n9X.mjs.map} +1 -1
  134. package/dist/{list-DN81zVDA.mjs → list-BtNocJhc.mjs} +3 -3
  135. package/dist/{list-DN81zVDA.mjs.map → list-BtNocJhc.mjs.map} +1 -1
  136. package/dist/{list-DHG-MzOM.mjs → list-C9dXrU9H.mjs} +3 -3
  137. package/dist/{list-DHG-MzOM.mjs.map → list-C9dXrU9H.mjs.map} +1 -1
  138. package/dist/{list-CtME3aDw.mjs → list-CcwcYZgN.mjs} +3 -3
  139. package/dist/{list-CtME3aDw.mjs.map → list-CcwcYZgN.mjs.map} +1 -1
  140. package/dist/{list-CLAcZYZ4.mjs → list-Ctc8b5gT.mjs} +3 -3
  141. package/dist/{list-CLAcZYZ4.mjs.map → list-Ctc8b5gT.mjs.map} +1 -1
  142. package/dist/{list-DbNCVZbz.mjs → list-b60JzCTw.mjs} +3 -3
  143. package/dist/{list-DbNCVZbz.mjs.map → list-b60JzCTw.mjs.map} +1 -1
  144. package/dist/{litexml-codec-CDoRloiR.mjs → litexml-codec-CfIxcPG0.mjs} +10 -10
  145. package/dist/{litexml-codec-CDoRloiR.mjs.map → litexml-codec-CfIxcPG0.mjs.map} +1 -1
  146. package/dist/{login-mjliJn8U.mjs → login-bZx4HaVs.mjs} +21 -9
  147. package/dist/{login-mjliJn8U.mjs.map → login-bZx4HaVs.mjs.map} +1 -1
  148. package/dist/logout-C0Dzitsu.mjs +18 -0
  149. package/dist/logout-C0Dzitsu.mjs.map +1 -0
  150. package/dist/ls-wMiTXZPQ.mjs +33 -0
  151. package/dist/ls-wMiTXZPQ.mjs.map +1 -0
  152. package/dist/mark-Dh9BErsf.mjs +29 -0
  153. package/dist/mark-Dh9BErsf.mjs.map +1 -0
  154. package/dist/onboarding-Bw_I8qpf.mjs +214 -0
  155. package/dist/onboarding-Bw_I8qpf.mjs.map +1 -0
  156. package/dist/{output-CTnO1lYt.d.mts → output-D2dDlyV2.d.mts} +1 -1
  157. package/dist/{output-BM7aBFwt.mjs → output-vzequvhd.mjs} +52 -9
  158. package/dist/output-vzequvhd.mjs.map +1 -0
  159. package/dist/{payload-CN11pUto.mjs → payload-CO4zbNr8.mjs} +17 -17
  160. package/dist/payload-CO4zbNr8.mjs.map +1 -0
  161. package/dist/profile-CNe2uWJi.mjs +172 -0
  162. package/dist/profile-CNe2uWJi.mjs.map +1 -0
  163. package/dist/{publish-akQWYsnL.mjs → publish-CzzucXQq.mjs} +4 -4
  164. package/dist/{publish-akQWYsnL.mjs.map → publish-CzzucXQq.mjs.map} +1 -1
  165. package/dist/{publish-CN3NTJ_r.mjs → publish-DRQkpxsz.mjs} +4 -4
  166. package/dist/{publish-CN3NTJ_r.mjs.map → publish-DRQkpxsz.mjs.map} +1 -1
  167. package/dist/{resolve-CyjMlaoJ.mjs → resolve-BYg5Gees.mjs} +5 -5
  168. package/dist/resolve-BYg5Gees.mjs.map +1 -0
  169. package/dist/{resolve-Bw5Po9yK.mjs → resolve-BlpMdnaM.mjs} +4 -4
  170. package/dist/resolve-BlpMdnaM.mjs.map +1 -0
  171. package/dist/{resolve-BogJOR7R.mjs → resolve-CUsHGcb-.mjs} +4 -4
  172. package/dist/resolve-CUsHGcb-.mjs.map +1 -0
  173. package/dist/{resolve-helpers-CahPoJ0Y.mjs → resolve-helpers-CoHYa2uk.mjs} +2 -2
  174. package/dist/{resolve-helpers-CahPoJ0Y.mjs.map → resolve-helpers-CoHYa2uk.mjs.map} +1 -1
  175. package/dist/{resolve-Bp1AfBmM.mjs → resolve-jdb1VqAG.mjs} +5 -5
  176. package/dist/resolve-jdb1VqAG.mjs.map +1 -0
  177. package/dist/rm-D-2iW1Cr.mjs +33 -0
  178. package/dist/rm-D-2iW1Cr.mjs.map +1 -0
  179. package/dist/run-Dnax6uhZ.mjs +130 -0
  180. package/dist/run-Dnax6uhZ.mjs.map +1 -0
  181. package/dist/self-update-CZywTwGd.mjs +1610 -0
  182. package/dist/self-update-CZywTwGd.mjs.map +1 -0
  183. package/dist/{set-ClbrGFGv.mjs → set-Dk28LAy5.mjs} +5 -5
  184. package/dist/set-Dk28LAy5.mjs.map +1 -0
  185. package/dist/{shared-C2EAn5h_.mjs → shared-d0_6ZPn_.mjs} +13 -9
  186. package/dist/shared-d0_6ZPn_.mjs.map +1 -0
  187. package/dist/show-DScu6mXz.mjs +39 -0
  188. package/dist/show-DScu6mXz.mjs.map +1 -0
  189. package/dist/status-8F6tgphP.mjs +23 -0
  190. package/dist/status-8F6tgphP.mjs.map +1 -0
  191. package/dist/{update-dc-72pUN.mjs → update-B1LGxV0n.mjs} +6 -6
  192. package/dist/{update-dc-72pUN.mjs.map → update-B1LGxV0n.mjs.map} +1 -1
  193. package/dist/{update-CHmckeo8.mjs → update-CXetpFT3.mjs} +4 -4
  194. package/dist/{update-CHmckeo8.mjs.map → update-CXetpFT3.mjs.map} +1 -1
  195. package/dist/{update-Duh-iVOZ.mjs → update-Dr4BW8U-.mjs} +6 -6
  196. package/dist/{update-Duh-iVOZ.mjs.map → update-Dr4BW8U-.mjs.map} +1 -1
  197. package/dist/{update-qfiC-9Og.mjs → update-bqcHRJPC.mjs} +6 -6
  198. package/dist/update-bqcHRJPC.mjs.map +1 -0
  199. package/dist/{update-CJjwg09n.mjs → update-dBtzzmkN.mjs} +5 -5
  200. package/dist/update-dBtzzmkN.mjs.map +1 -0
  201. package/dist/use-D7eKESSW.mjs +29 -0
  202. package/dist/use-D7eKESSW.mjs.map +1 -0
  203. package/dist/{whoami-UwcdRchK.mjs → whoami-CKSNd6zL.mjs} +6 -6
  204. package/dist/whoami-CKSNd6zL.mjs.map +1 -0
  205. package/package.json +15 -13
  206. package/LICENSE +0 -33
  207. package/dist/auth-OeKZZ_2x.mjs.map +0 -1
  208. package/dist/chunk-hT5z_Zn9.mjs +0 -35
  209. package/dist/config-store-WL7dNMS6.mjs.map +0 -1
  210. package/dist/delete-BEXOOFAJ.mjs.map +0 -1
  211. package/dist/delete-CGy-cV6k.mjs.map +0 -1
  212. package/dist/delete-CKqlAUT8.mjs.map +0 -1
  213. package/dist/delete-CcyrLNZv.mjs.map +0 -1
  214. package/dist/delete-Cjxehwj7.mjs.map +0 -1
  215. package/dist/document-output-C5PWbz2p.mjs.map +0 -1
  216. package/dist/edit-BuKMUNVC.mjs.map +0 -1
  217. package/dist/edit-DFnOnk4i.mjs.map +0 -1
  218. package/dist/editor-xrF-j3UE.mjs.map +0 -1
  219. package/dist/get-Doi-NKAh.mjs.map +0 -1
  220. package/dist/logout-Bslt_ZJ4.mjs +0 -11
  221. package/dist/logout-Bslt_ZJ4.mjs.map +0 -1
  222. package/dist/onboarding-C1t1yoay.mjs.map +0 -1
  223. package/dist/output-BM7aBFwt.mjs.map +0 -1
  224. package/dist/payload-CN11pUto.mjs.map +0 -1
  225. package/dist/resolve-BogJOR7R.mjs.map +0 -1
  226. package/dist/resolve-Bp1AfBmM.mjs.map +0 -1
  227. package/dist/resolve-Bw5Po9yK.mjs.map +0 -1
  228. package/dist/resolve-CyjMlaoJ.mjs.map +0 -1
  229. package/dist/set-ClbrGFGv.mjs.map +0 -1
  230. package/dist/shared-C2EAn5h_.mjs.map +0 -1
  231. package/dist/status-Cvyrrx-J.mjs +0 -22
  232. package/dist/status-Cvyrrx-J.mjs.map +0 -1
  233. package/dist/update-CJjwg09n.mjs.map +0 -1
  234. package/dist/update-qfiC-9Og.mjs.map +0 -1
  235. package/dist/whoami-UwcdRchK.mjs.map +0 -1
@@ -13,4 +13,4 @@ declare function emitError(err: unknown, opts: OutputOptions): void;
13
13
  declare function renderTable(rows: Record<string, unknown>[], columns: string[]): string;
14
14
  //#endregion
15
15
  export { emitSuccess as a, emitInfo as i, defaultOutputOptions as n, emitWarn as o, emitError as r, renderTable as s, OutputOptions as t };
16
- //# sourceMappingURL=output-CTnO1lYt.d.mts.map
16
+ //# sourceMappingURL=output-D2dDlyV2.d.mts.map
@@ -1,4 +1,33 @@
1
1
  //#region src/core/errors.ts
2
+ const MxsErrorCode = {
3
+ Generic: "generic",
4
+ ArgvParse: "argv.parse",
5
+ AuthMissing: "auth.missing",
6
+ AuthExpired: "auth.expired",
7
+ AuthDenied: "auth.denied",
8
+ AuthProbe: "auth.probe",
9
+ NetworkTimeout: "network.timeout",
10
+ NetworkDns: "network.dns",
11
+ NetworkRefused: "network.refused",
12
+ ValidationFailed: "validation.failed",
13
+ ValidationXml: "validation.xml",
14
+ ServerError: "server.error",
15
+ ResourceNotFound: "resource.not_found",
16
+ ConfigMissingApiUrl: "config.missing.api_url",
17
+ ConfigMissingToken: "config.missing.token",
18
+ ConfigMigrationFailed: "config.migration.failed",
19
+ ProfileNotFound: "profile.not_found",
20
+ ProfileNoneActive: "profile.none_active",
21
+ ProfileInvalidName: "profile.invalid_name",
22
+ ProfileWriteRequiresExplicit: "profile.write_requires_explicit",
23
+ UpdateDevEnvironment: "update.dev_environment",
24
+ UpdateTransientInstall: "update.transient_install",
25
+ UpdatePmUnknown: "update.pm_unknown",
26
+ UpdateRegistryUnreachable: "update.registry_unreachable",
27
+ UpdateNodeIncompatible: "update.node_incompatible",
28
+ UpdateSpawnFailed: "update.spawn_failed",
29
+ UpdatePermissionDenied: "update.permission_denied"
30
+ };
2
31
  var MxsError = class extends Error {
3
32
  code;
4
33
  details;
@@ -23,12 +52,15 @@ var MxsError = class extends Error {
23
52
  function exitCodeForError(err) {
24
53
  if (!(err instanceof MxsError)) return 1;
25
54
  const code = err.code;
26
- if (code === "argv.parse") return 2;
27
- if (code === "auth.missing" || code === "auth.expired" || code === "auth.denied" || code === "auth.probe") return 3;
28
- if (code === "network.timeout" || code === "network.dns" || code === "network.refused") return 4;
29
- if (code === "validation.failed" || code === "validation.xml" || code === "config.missing.api_url" || code === "config.missing.token") return 5;
30
- if (code === "server.error") return 6;
31
- if (code === "resource.not_found") return 7;
55
+ if (code === MxsErrorCode.ArgvParse) return 2;
56
+ if (code === MxsErrorCode.AuthMissing || code === MxsErrorCode.AuthExpired || code === MxsErrorCode.AuthDenied || code === MxsErrorCode.AuthProbe) return 3;
57
+ if (code === MxsErrorCode.NetworkTimeout || code === MxsErrorCode.NetworkDns || code === MxsErrorCode.NetworkRefused || code === MxsErrorCode.ProfileWriteRequiresExplicit || code === MxsErrorCode.ProfileNoneActive) return 4;
58
+ if (code === MxsErrorCode.ValidationFailed || code === MxsErrorCode.ValidationXml || code === MxsErrorCode.ProfileInvalidName || code === MxsErrorCode.ConfigMissingApiUrl || code === MxsErrorCode.ConfigMissingToken) return 5;
59
+ if (code === MxsErrorCode.ServerError) return 6;
60
+ if (code === MxsErrorCode.ResourceNotFound) return 7;
61
+ if (code === MxsErrorCode.UpdatePmUnknown) return 70;
62
+ if (code === MxsErrorCode.UpdatePermissionDenied) return 73;
63
+ if (code === MxsErrorCode.UpdateRegistryUnreachable) return 75;
32
64
  return 1;
33
65
  }
34
66
  //#endregion
@@ -72,6 +104,17 @@ function emitWarn(message, opts) {
72
104
  function emitError(err, opts) {
73
105
  if (err instanceof MxsError) {
74
106
  if (opts.json) {
107
+ if (err.code === MxsErrorCode.ProfileWriteRequiresExplicit) {
108
+ const details = err.details;
109
+ process.stdout.write(`${JSON.stringify({
110
+ ok: false,
111
+ error: err.code,
112
+ profile: details?.profile ?? null,
113
+ api_url: details?.api_url ?? null,
114
+ hint: err.hint ?? null
115
+ })}\n`);
116
+ return;
117
+ }
75
118
  process.stdout.write(`${JSON.stringify(err.toJSON())}\n`);
76
119
  return;
77
120
  }
@@ -87,7 +130,7 @@ function emitError(err, opts) {
87
130
  if (opts.json) {
88
131
  process.stdout.write(`${JSON.stringify({
89
132
  ok: false,
90
- code: "generic",
133
+ code: MxsErrorCode.Generic,
91
134
  message
92
135
  })}\n`);
93
136
  return;
@@ -115,6 +158,6 @@ function renderTable(rows, columns) {
115
158
  return `${columns.map((col, i) => col.padEnd(widths[i] ?? 0)).join(" ")}\n${widths.map((w) => "-".repeat(w)).join(" ")}\n${rows.map((row) => columns.map((col, i) => String(row[col] ?? "").padEnd(widths[i] ?? 0)).join(" ")).join("\n")}`;
116
159
  }
117
160
  //#endregion
118
- export { emitWarn as a, exitCodeForError as c, emitSuccess as i, emitError as n, renderTable as o, emitInfo as r, MxsError as s, defaultOutputOptions as t };
161
+ export { emitWarn as a, MxsErrorCode as c, emitSuccess as i, exitCodeForError as l, emitError as n, renderTable as o, emitInfo as r, MxsError as s, defaultOutputOptions as t };
119
162
 
120
- //# sourceMappingURL=output-BM7aBFwt.mjs.map
163
+ //# sourceMappingURL=output-vzequvhd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-vzequvhd.mjs","names":[],"sources":["../src/core/errors.ts","../src/core/output.ts"],"sourcesContent":["export const MxsErrorCode = {\n Generic: 'generic',\n ArgvParse: 'argv.parse',\n AuthMissing: 'auth.missing',\n AuthExpired: 'auth.expired',\n AuthDenied: 'auth.denied',\n AuthProbe: 'auth.probe',\n NetworkTimeout: 'network.timeout',\n NetworkDns: 'network.dns',\n NetworkRefused: 'network.refused',\n ValidationFailed: 'validation.failed',\n ValidationXml: 'validation.xml',\n ServerError: 'server.error',\n ResourceNotFound: 'resource.not_found',\n ConfigMissingApiUrl: 'config.missing.api_url',\n ConfigMissingToken: 'config.missing.token',\n ConfigMigrationFailed: 'config.migration.failed',\n ProfileNotFound: 'profile.not_found',\n ProfileNoneActive: 'profile.none_active',\n ProfileInvalidName: 'profile.invalid_name',\n ProfileWriteRequiresExplicit: 'profile.write_requires_explicit',\n UpdateDevEnvironment: 'update.dev_environment',\n UpdateTransientInstall: 'update.transient_install',\n UpdatePmUnknown: 'update.pm_unknown',\n UpdateRegistryUnreachable: 'update.registry_unreachable',\n UpdateNodeIncompatible: 'update.node_incompatible',\n UpdateSpawnFailed: 'update.spawn_failed',\n UpdatePermissionDenied: 'update.permission_denied',\n} as const\n\nexport type MxsErrorCode =\n | (typeof MxsErrorCode)[keyof typeof MxsErrorCode]\n | (string & {})\n\nexport interface MxsErrorOptions {\n code: MxsErrorCode\n message: string\n details?: unknown\n hint?: string\n cause?: unknown\n}\n\nexport class MxsError extends Error {\n readonly code: MxsErrorCode\n readonly details?: unknown\n readonly hint?: string\n\n constructor(options: MxsErrorOptions) {\n super(options.message, options.cause ? { cause: options.cause } : undefined)\n this.name = 'MxsError'\n this.code = options.code\n this.details = options.details\n this.hint = options.hint\n }\n\n toJSON() {\n return {\n ok: false as const,\n code: this.code,\n message: this.message,\n ...(this.details === undefined ? {} : { details: this.details }),\n ...(this.hint === undefined ? {} : { hint: this.hint }),\n }\n }\n}\n\nexport function exitCodeForError(err: unknown): number {\n if (!(err instanceof MxsError)) return 1\n const code = err.code\n if (code === MxsErrorCode.ArgvParse) return 2\n if (\n code === MxsErrorCode.AuthMissing ||\n code === MxsErrorCode.AuthExpired ||\n code === MxsErrorCode.AuthDenied ||\n code === MxsErrorCode.AuthProbe\n )\n return 3\n if (\n code === MxsErrorCode.NetworkTimeout ||\n code === MxsErrorCode.NetworkDns ||\n code === MxsErrorCode.NetworkRefused ||\n code === MxsErrorCode.ProfileWriteRequiresExplicit || // exit code 4: production write gate refusal\n code === MxsErrorCode.ProfileNoneActive\n )\n return 4\n if (\n code === MxsErrorCode.ValidationFailed ||\n code === MxsErrorCode.ValidationXml ||\n code === MxsErrorCode.ProfileInvalidName ||\n code === MxsErrorCode.ConfigMissingApiUrl ||\n code === MxsErrorCode.ConfigMissingToken\n )\n return 5\n if (code === MxsErrorCode.ServerError) return 6\n if (code === MxsErrorCode.ResourceNotFound) return 7\n if (code === MxsErrorCode.UpdatePmUnknown) return 70\n if (code === MxsErrorCode.UpdatePermissionDenied) return 73\n if (code === MxsErrorCode.UpdateRegistryUnreachable) return 75\n return 1\n}\n","import { MxsError, MxsErrorCode } from './errors'\n\nexport interface OutputOptions {\n json: boolean\n output?: string\n quiet: boolean\n verbose: boolean\n}\n\nexport const defaultOutputOptions: OutputOptions = {\n json: false,\n output: 'pretty-json',\n quiet: false,\n verbose: false,\n}\n\nfunction isTTY(stream: NodeJS.WriteStream): boolean {\n return Boolean(stream.isTTY)\n}\n\nfunction color(stream: NodeJS.WriteStream, code: number, text: string): string {\n if (!isTTY(stream)) return text\n return `\u001b[${code}m${text}\u001b[0m`\n}\n\nexport function emitSuccess(data: unknown, opts: OutputOptions): void {\n if (opts.json || opts.output === 'json') {\n process.stdout.write(`${JSON.stringify({ ok: true, data })}\\n`)\n return\n }\n if (data === null || data === undefined) {\n return\n }\n if (typeof data === 'string') {\n process.stdout.write(`${data}\\n`)\n return\n }\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`)\n}\n\nexport function emitInfo(message: string, opts: OutputOptions): void {\n if (opts.quiet || opts.json) return\n process.stderr.write(`${message}\\n`)\n}\n\nexport function emitWarn(message: string, opts: OutputOptions): void {\n if (opts.json) return\n process.stderr.write(`${color(process.stderr, 33, 'warn')}: ${message}\\n`)\n}\n\nexport function emitError(err: unknown, opts: OutputOptions): void {\n if (err instanceof MxsError) {\n if (opts.json) {\n if (err.code === MxsErrorCode.ProfileWriteRequiresExplicit) {\n const details = err.details as\n | { profile?: unknown; api_url?: unknown }\n | undefined\n process.stdout.write(\n `${JSON.stringify({\n ok: false,\n error: err.code,\n profile: details?.profile ?? null,\n api_url: details?.api_url ?? null,\n hint: err.hint ?? null,\n })}\\n`,\n )\n return\n }\n process.stdout.write(`${JSON.stringify(err.toJSON())}\\n`)\n return\n }\n process.stderr.write(`${color(process.stderr, 31, '✘')} ${err.message}\\n`)\n if (err.details) {\n const detailLines = formatDetails(err.details)\n for (const line of detailLines) {\n process.stderr.write(` · ${line}\\n`)\n }\n }\n if (err.hint) {\n process.stderr.write(`\\nhint: ${err.hint}\\n`)\n }\n return\n }\n const message = err instanceof Error ? err.message : String(err)\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ ok: false, code: MxsErrorCode.Generic, message })}\\n`,\n )\n return\n }\n process.stderr.write(`${color(process.stderr, 31, '✘')} ${message}\\n`)\n}\n\nfunction formatDetails(details: unknown): string[] {\n if (!details || typeof details !== 'object') return [String(details)]\n if (Array.isArray(details)) {\n return details.map((item) => formatIssue(item))\n }\n if (\n 'issues' in (details as Record<string, unknown>) &&\n Array.isArray((details as any).issues)\n ) {\n return (details as any).issues.map((issue: unknown) => formatIssue(issue))\n }\n return [JSON.stringify(details)]\n}\n\nfunction formatIssue(issue: unknown): string {\n if (!issue || typeof issue !== 'object') return String(issue)\n const obj = issue as Record<string, unknown>\n const path = Array.isArray(obj.path) ? obj.path.join('.') : ''\n const message =\n typeof obj.message === 'string' ? obj.message : JSON.stringify(obj)\n const line = typeof obj.line === 'number' ? ` (line ${obj.line})` : ''\n const suggestions = Array.isArray(obj.suggestions)\n ? ` — did you mean ${obj.suggestions.join(', ')}?`\n : ''\n return `${path ? `${path}: ` : ''}${message}${line}${suggestions}`\n}\n\nexport function renderTable(\n rows: Record<string, unknown>[],\n columns: string[],\n): string {\n if (rows.length === 0) return '(no rows)'\n const widths = columns.map((col) =>\n Math.max(col.length, ...rows.map((row) => String(row[col] ?? '').length)),\n )\n const header = columns.map((col, i) => col.padEnd(widths[i] ?? 0)).join(' ')\n const sep = widths.map((w) => '-'.repeat(w)).join(' ')\n const body = rows\n .map((row) =>\n columns\n .map((col, i) => String(row[col] ?? '').padEnd(widths[i] ?? 0))\n .join(' '),\n )\n .join('\\n')\n return `${header}\\n${sep}\\n${body}`\n}\n"],"mappings":";AAAA,MAAa,eAAe;CAC1B,SAAS;CACT,WAAW;CACX,aAAa;CACb,aAAa;CACb,YAAY;CACZ,WAAW;CACX,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,kBAAkB;CAClB,eAAe;CACf,aAAa;CACb,kBAAkB;CAClB,qBAAqB;CACrB,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,8BAA8B;CAC9B,sBAAsB;CACtB,wBAAwB;CACxB,iBAAiB;CACjB,2BAA2B;CAC3B,wBAAwB;CACxB,mBAAmB;CACnB,wBAAwB;AAC1B;AAcA,IAAa,WAAb,cAA8B,MAAM;CAClC;CACA;CACA;CAEA,YAAY,SAA0B;EACpC,MAAM,QAAQ,SAAS,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,KAAA,CAAS;EAC3E,KAAK,OAAO;EACZ,KAAK,OAAO,QAAQ;EACpB,KAAK,UAAU,QAAQ;EACvB,KAAK,OAAO,QAAQ;CACtB;CAEA,SAAS;EACP,OAAO;GACL,IAAI;GACJ,MAAM,KAAK;GACX,SAAS,KAAK;GACd,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;GAC9D,GAAI,KAAK,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK;EACvD;CACF;AACF;AAEA,SAAgB,iBAAiB,KAAsB;CACrD,IAAI,EAAE,eAAe,WAAW,OAAO;CACvC,MAAM,OAAO,IAAI;CACjB,IAAI,SAAS,aAAa,WAAW,OAAO;CAC5C,IACE,SAAS,aAAa,eACtB,SAAS,aAAa,eACtB,SAAS,aAAa,cACtB,SAAS,aAAa,WAEtB,OAAO;CACT,IACE,SAAS,aAAa,kBACtB,SAAS,aAAa,cACtB,SAAS,aAAa,kBACtB,SAAS,aAAa,gCACtB,SAAS,aAAa,mBAEtB,OAAO;CACT,IACE,SAAS,aAAa,oBACtB,SAAS,aAAa,iBACtB,SAAS,aAAa,sBACtB,SAAS,aAAa,uBACtB,SAAS,aAAa,oBAEtB,OAAO;CACT,IAAI,SAAS,aAAa,aAAa,OAAO;CAC9C,IAAI,SAAS,aAAa,kBAAkB,OAAO;CACnD,IAAI,SAAS,aAAa,iBAAiB,OAAO;CAClD,IAAI,SAAS,aAAa,wBAAwB,OAAO;CACzD,IAAI,SAAS,aAAa,2BAA2B,OAAO;CAC5D,OAAO;AACT;;;AC1FA,MAAa,uBAAsC;CACjD,MAAM;CACN,QAAQ;CACR,OAAO;CACP,SAAS;AACX;AAEA,SAAS,MAAM,QAAqC;CAClD,OAAO,QAAQ,OAAO,KAAK;AAC7B;AAEA,SAAS,MAAM,QAA4B,MAAc,MAAsB;CAC7E,IAAI,CAAC,MAAM,MAAM,GAAG,OAAO;CAC3B,OAAO,KAAK,KAAK,GAAG,KAAK;AAC3B;AAEA,SAAgB,YAAY,MAAe,MAA2B;CACpE,IAAI,KAAK,QAAQ,KAAK,WAAW,QAAQ;EACvC,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU;GAAE,IAAI;GAAM;EAAK,CAAC,EAAE,GAAG;EAC9D;CACF;CACA,IAAI,SAAS,QAAQ,SAAS,KAAA,GAC5B;CAEF,IAAI,OAAO,SAAS,UAAU;EAC5B,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;EAChC;CACF;CACA,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,GAAG;AAC3D;AAEA,SAAgB,SAAS,SAAiB,MAA2B;CACnE,IAAI,KAAK,SAAS,KAAK,MAAM;CAC7B,QAAQ,OAAO,MAAM,GAAG,QAAQ,GAAG;AACrC;AAEA,SAAgB,SAAS,SAAiB,MAA2B;CACnE,IAAI,KAAK,MAAM;CACf,QAAQ,OAAO,MAAM,GAAG,MAAM,QAAQ,QAAQ,IAAI,MAAM,EAAE,IAAI,QAAQ,GAAG;AAC3E;AAEA,SAAgB,UAAU,KAAc,MAA2B;CACjE,IAAI,eAAe,UAAU;EAC3B,IAAI,KAAK,MAAM;GACb,IAAI,IAAI,SAAS,aAAa,8BAA8B;IAC1D,MAAM,UAAU,IAAI;IAGpB,QAAQ,OAAO,MACb,GAAG,KAAK,UAAU;KAChB,IAAI;KACJ,OAAO,IAAI;KACX,SAAS,SAAS,WAAW;KAC7B,SAAS,SAAS,WAAW;KAC7B,MAAM,IAAI,QAAQ;IACpB,CAAC,EAAE,GACL;IACA;GACF;GACA,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,IAAI,OAAO,CAAC,EAAE,GAAG;GACxD;EACF;EACA,QAAQ,OAAO,MAAM,GAAG,MAAM,QAAQ,QAAQ,IAAI,GAAG,EAAE,GAAG,IAAI,QAAQ,GAAG;EACzE,IAAI,IAAI,SAAS;GACf,MAAM,cAAc,cAAc,IAAI,OAAO;GAC7C,KAAK,MAAM,QAAQ,aACjB,QAAQ,OAAO,MAAM,OAAO,KAAK,GAAG;EAExC;EACA,IAAI,IAAI,MACN,QAAQ,OAAO,MAAM,WAAW,IAAI,KAAK,GAAG;EAE9C;CACF;CACA,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;CAC/D,IAAI,KAAK,MAAM;EACb,QAAQ,OAAO,MACb,GAAG,KAAK,UAAU;GAAE,IAAI;GAAO,MAAM,aAAa;GAAS;EAAQ,CAAC,EAAE,GACxE;EACA;CACF;CACA,QAAQ,OAAO,MAAM,GAAG,MAAM,QAAQ,QAAQ,IAAI,GAAG,EAAE,GAAG,QAAQ,GAAG;AACvE;AAEA,SAAS,cAAc,SAA4B;CACjD,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU,OAAO,CAAC,OAAO,OAAO,CAAC;CACpE,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO,QAAQ,KAAK,SAAS,YAAY,IAAI,CAAC;CAEhD,IACE,YAAa,WACb,MAAM,QAAS,QAAgB,MAAM,GAErC,OAAQ,QAAgB,OAAO,KAAK,UAAmB,YAAY,KAAK,CAAC;CAE3E,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC;AACjC;AAEA,SAAS,YAAY,OAAwB;CAC3C,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO,OAAO,KAAK;CAC5D,MAAM,MAAM;CACZ,MAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI;CAC5D,MAAM,UACJ,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,KAAK,UAAU,GAAG;CACpE,MAAM,OAAO,OAAO,IAAI,SAAS,WAAW,UAAU,IAAI,KAAK,KAAK;CACpE,MAAM,cAAc,MAAM,QAAQ,IAAI,WAAW,IAC7C,mBAAmB,IAAI,YAAY,KAAK,IAAI,EAAE,KAC9C;CACJ,OAAO,GAAG,OAAO,GAAG,KAAK,MAAM,KAAK,UAAU,OAAO;AACvD;AAEA,SAAgB,YACd,MACA,SACQ;CACR,IAAI,KAAK,WAAW,GAAG,OAAO;CAC9B,MAAM,SAAS,QAAQ,KAAK,QAC1B,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,KAAK,QAAQ,OAAO,IAAI,QAAQ,EAAE,EAAE,MAAM,CAAC,CAC1E;CAUA,OAAO,GATQ,QAAQ,KAAK,KAAK,MAAM,IAAI,OAAO,OAAO,MAAM,CAAC,CAAC,EAAE,KAAK,IASzD,EAAE,IARL,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAQ3B,EAAE,IAPZ,KACV,KAAK,QACJ,QACG,KAAK,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC,EAC7D,KAAK,IAAI,CACd,EACC,KAAK,IACwB;AAClC"}
@@ -1,5 +1,5 @@
1
- import { s as MxsError } from "./output-BM7aBFwt.mjs";
2
- import { n as emptyLexicalState, r as parseToLexical, t as deriveTextFromLexical } from "./litexml-codec-CDoRloiR.mjs";
1
+ import { c as MxsErrorCode, s as MxsError } from "./output-vzequvhd.mjs";
2
+ import { n as emptyLexicalState, r as parseToLexical, t as deriveTextFromLexical } from "./litexml-codec-CfIxcPG0.mjs";
3
3
  import path from "node:path";
4
4
  import { promises } from "node:fs";
5
5
  //#region src/core/content-spec.ts
@@ -19,7 +19,7 @@ async function readContentSpec(spec, { cwd = process.cwd() } = {}) {
19
19
  };
20
20
  } catch (err) {
21
21
  throw new MxsError({
22
- code: "validation.failed",
22
+ code: MxsErrorCode.ValidationFailed,
23
23
  message: `failed to read ${p}: ${err?.message ?? err}`
24
24
  });
25
25
  }
@@ -38,7 +38,7 @@ async function readJsonSpec(spec) {
38
38
  return JSON.parse(text);
39
39
  } catch (err) {
40
40
  throw new MxsError({
41
- code: "validation.failed",
41
+ code: MxsErrorCode.ValidationFailed,
42
42
  message: `failed to read JSON from ${p}: ${err?.message ?? err}`
43
43
  });
44
44
  }
@@ -47,14 +47,14 @@ async function readJsonSpec(spec) {
47
47
  return JSON.parse(spec);
48
48
  } catch (err) {
49
49
  throw new MxsError({
50
- code: "validation.failed",
50
+ code: MxsErrorCode.ValidationFailed,
51
51
  message: `failed to parse JSON: ${err?.message ?? err}`
52
52
  });
53
53
  }
54
54
  }
55
55
  async function readStdin() {
56
56
  if (process.stdin.isTTY) throw new MxsError({
57
- code: "validation.failed",
57
+ code: MxsErrorCode.ValidationFailed,
58
58
  message: "requested stdin content but stdin is a TTY"
59
59
  });
60
60
  const chunks = [];
@@ -92,7 +92,7 @@ function tokenize(xml) {
92
92
  if (xml.startsWith("<!--", i)) {
93
93
  const end = xml.indexOf("-->", i + 4);
94
94
  if (end < 0) throw new MxsError({
95
- code: "validation.xml",
95
+ code: MxsErrorCode.ValidationXml,
96
96
  message: "unterminated XML comment",
97
97
  details: { line }
98
98
  });
@@ -103,7 +103,7 @@ function tokenize(xml) {
103
103
  if (xml.startsWith("<![CDATA[", i)) {
104
104
  const end = xml.indexOf("]]>", i + 9);
105
105
  if (end < 0) throw new MxsError({
106
- code: "validation.xml",
106
+ code: MxsErrorCode.ValidationXml,
107
107
  message: "unterminated CDATA",
108
108
  details: { line }
109
109
  });
@@ -119,7 +119,7 @@ function tokenize(xml) {
119
119
  }
120
120
  const close = xml.indexOf(">", i);
121
121
  if (close < 0) throw new MxsError({
122
- code: "validation.xml",
122
+ code: MxsErrorCode.ValidationXml,
123
123
  message: "unterminated tag",
124
124
  details: { line }
125
125
  });
@@ -174,7 +174,7 @@ function parseEnvelope(xml, kind) {
174
174
  const rootName = ROOT_TAGS[kind];
175
175
  const rootStart = tokens.findIndex((t) => t.kind === "open" && t.name === rootName);
176
176
  if (rootStart < 0) throw new MxsError({
177
- code: "validation.xml",
177
+ code: MxsErrorCode.ValidationXml,
178
178
  message: `expected root <${rootName}>`,
179
179
  details: { line: 1 }
180
180
  });
@@ -192,7 +192,7 @@ function parseEnvelope(xml, kind) {
192
192
  }
193
193
  }
194
194
  if (rootEnd < 0) throw new MxsError({
195
- code: "validation.xml",
195
+ code: MxsErrorCode.ValidationXml,
196
196
  message: `unterminated <${rootName}>`,
197
197
  details: { line: tokens[rootStart]?.line ?? 1 }
198
198
  });
@@ -227,7 +227,7 @@ function parseEnvelope(xml, kind) {
227
227
  continue;
228
228
  }
229
229
  if (t.kind === "open" || t.kind === "self") throw new MxsError({
230
- code: "validation.xml",
230
+ code: MxsErrorCode.ValidationXml,
231
231
  message: `unexpected <${t.name}> at root`,
232
232
  details: { line: t.line }
233
233
  });
@@ -251,7 +251,7 @@ function findMatchingClose(tokens, startOpen, name) {
251
251
  }
252
252
  }
253
253
  throw new MxsError({
254
- code: "validation.xml",
254
+ code: MxsErrorCode.ValidationXml,
255
255
  message: `unterminated <${name}>`,
256
256
  details: { line: tokens[startOpen]?.line ?? 1 }
257
257
  });
@@ -377,7 +377,7 @@ async function loadEnvelopeIfAny(filePath, kind) {
377
377
  if (filePath.startsWith("file=")) return parseEnvelope((await readContentSpec(filePath))?.text ?? "", kind);
378
378
  return parseEnvelope(await promises.readFile(filePath, "utf8").catch((err) => {
379
379
  throw new MxsError({
380
- code: "validation.failed",
380
+ code: MxsErrorCode.ValidationFailed,
381
381
  message: `failed to read ${filePath}: ${err?.message ?? err}`
382
382
  });
383
383
  }), kind);
@@ -448,7 +448,7 @@ async function buildNotePayload(flags) {
448
448
  const lat = Number(latRaw);
449
449
  const lng = Number(lngRaw);
450
450
  if (Number.isNaN(lat) || Number.isNaN(lng)) throw new MxsError({
451
- code: "validation.failed",
451
+ code: MxsErrorCode.ValidationFailed,
452
452
  message: `invalid --coords value "${flags.coords}", expected "lat,lng"`
453
453
  });
454
454
  payload.coordinates = {
@@ -516,7 +516,7 @@ async function resolveContent(flagSpec, envelope, format) {
516
516
  origin: source.origin
517
517
  };
518
518
  if (source.text.length === 0) throw new MxsError({
519
- code: "validation.failed",
519
+ code: MxsErrorCode.ValidationFailed,
520
520
  message: "content is required when contentFormat is lexical",
521
521
  details: { issues: [{
522
522
  path: ["content"],
@@ -544,4 +544,4 @@ function emptyPayload(format) {
544
544
  //#endregion
545
545
  export { coerceMeta as a, tagToFlag as c, emptyPayload as i, readContentSpec as l, buildPagePayload as n, flagToTag as o, buildPostPayload as r, parseEnvelope as s, buildNotePayload as t, readJsonSpec as u };
546
546
 
547
- //# sourceMappingURL=payload-CN11pUto.mjs.map
547
+ //# sourceMappingURL=payload-CO4zbNr8.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-CO4zbNr8.mjs","names":["fs","fs"],"sources":["../src/core/content-spec.ts","../src/core/envelope.ts","../src/core/payload.ts"],"sourcesContent":["import { promises as fs } from 'node:fs'\nimport path from 'node:path'\n\nimport { MxsError, MxsErrorCode } from './errors'\n\nexport interface ContentSource {\n text: string\n origin: 'inline' | 'file' | 'stdin'\n path?: string\n}\n\nexport async function readContentSpec(\n spec: string | undefined,\n { cwd = process.cwd() }: { cwd?: string } = {},\n): Promise<ContentSource | null> {\n if (spec === undefined) return null\n if (spec === '-' || spec === 'stdin') {\n const text = await readStdin()\n return { text, origin: 'stdin' }\n }\n if (spec.startsWith('file=')) {\n const p = path.resolve(cwd, spec.slice('file='.length))\n try {\n const text = await fs.readFile(p, 'utf8')\n return { text, origin: 'file', path: p }\n } catch (err: any) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `failed to read ${p}: ${err?.message ?? err}`,\n })\n }\n }\n return { text: spec, origin: 'inline' }\n}\n\nexport async function readJsonSpec(spec: string | undefined): Promise<unknown> {\n if (spec === undefined) return undefined\n if (spec.startsWith('file=')) {\n const p = path.resolve(process.cwd(), spec.slice('file='.length))\n try {\n const text = await fs.readFile(p, 'utf8')\n return JSON.parse(text)\n } catch (err: any) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `failed to read JSON from ${p}: ${err?.message ?? err}`,\n })\n }\n }\n try {\n return JSON.parse(spec)\n } catch (err: any) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `failed to parse JSON: ${err?.message ?? err}`,\n })\n }\n}\n\nexport async function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: 'requested stdin content but stdin is a TTY',\n })\n }\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks).toString('utf8')\n}\n","import { MxsError, MxsErrorCode } from './errors'\n\nexport type EnvelopeKind = 'post' | 'note'\n\nexport interface ParsedEnvelope {\n kind: EnvelopeKind\n meta: Record<string, unknown>\n contentXml: string\n sourceMap: Record<string, number>\n}\n\nconst ROOT_TAGS: Record<EnvelopeKind, string> = {\n post: 'mxpost',\n note: 'mxnote',\n}\n\nconst ARRAY_TAGS: Record<string, string> = {\n tags: 'tag',\n related: 'id',\n}\n\nconst SKIP_TEXT_RE = /^\\s*$/\n\nfunction kebabToCamel(name: string): string {\n return name.replaceAll(/-([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction camelToKebab(name: string): string {\n return name.replaceAll(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`)\n}\n\nexport function flagToTag(flag: string): string {\n return kebabToCamel(flag.replace(/^--/, ''))\n}\n\nexport function tagToFlag(tag: string): string {\n return `--${camelToKebab(tag)}`\n}\n\ninterface Token {\n kind: 'open' | 'close' | 'self' | 'text' | 'cdata'\n name?: string\n raw?: string\n text?: string\n line: number\n}\n\nfunction tokenize(xml: string): Token[] {\n const tokens: Token[] = []\n let i = 0\n let line = 1\n while (i < xml.length) {\n const ch = xml[i]\n if (ch === '<') {\n if (xml.startsWith('<!--', i)) {\n const end = xml.indexOf('-->', i + 4)\n if (end < 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: 'unterminated XML comment',\n details: { line },\n })\n }\n line += countLines(xml.slice(i, end + 3))\n i = end + 3\n continue\n }\n if (xml.startsWith('<![CDATA[', i)) {\n const end = xml.indexOf(']]>', i + 9)\n if (end < 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: 'unterminated CDATA',\n details: { line },\n })\n }\n const inner = xml.slice(i + 9, end)\n tokens.push({ kind: 'cdata', text: inner, line })\n line += countLines(xml.slice(i, end + 3))\n i = end + 3\n continue\n }\n const close = xml.indexOf('>', i)\n if (close < 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: 'unterminated tag',\n details: { line },\n })\n }\n const raw = xml.slice(i + 1, close).trim()\n if (raw.startsWith('/')) {\n tokens.push({ kind: 'close', name: raw.slice(1).trim(), line })\n } else if (raw.endsWith('/')) {\n const name = raw.slice(0, -1).trim().split(/\\s+/)[0] ?? ''\n tokens.push({ kind: 'self', name, raw, line })\n } else {\n const name = raw.split(/\\s+/)[0] ?? ''\n tokens.push({ kind: 'open', name, raw, line })\n }\n line += countLines(xml.slice(i, close + 1))\n i = close + 1\n } else {\n const next = xml.indexOf('<', i)\n const text = xml.slice(i, next < 0 ? xml.length : next)\n tokens.push({ kind: 'text', text, line })\n line += countLines(text)\n i = next < 0 ? xml.length : next\n }\n }\n return tokens\n}\n\nfunction countLines(s: string): number {\n let count = 0\n for (let i = 0; i < s.length; i++) {\n if (s.charCodeAt(i) === 10) count++\n }\n return count\n}\n\nfunction decodeXmlEntities(s: string): string {\n return s\n .replaceAll('&lt;', '<')\n .replaceAll('&gt;', '>')\n .replaceAll('&quot;', '\"')\n .replaceAll('&apos;', \"'\")\n .replaceAll('&amp;', '&')\n}\n\nexport function parseEnvelope(xml: string, kind: EnvelopeKind): ParsedEnvelope {\n const tokens = tokenize(xml)\n const rootName = ROOT_TAGS[kind]\n\n const rootStart = tokens.findIndex(\n (t) => t.kind === 'open' && t.name === rootName,\n )\n if (rootStart < 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: `expected root <${rootName}>`,\n details: { line: 1 },\n })\n }\n let depth = 0\n let rootEnd = -1\n for (let i = rootStart; i < tokens.length; i++) {\n const t = tokens[i]!\n if (t.kind === 'open' && t.name === rootName) depth++\n else if (t.kind === 'close' && t.name === rootName) {\n depth--\n if (depth === 0) {\n rootEnd = i\n break\n }\n }\n }\n if (rootEnd < 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: `unterminated <${rootName}>`,\n details: { line: tokens[rootStart]?.line ?? 1 },\n })\n }\n\n const inner = tokens.slice(rootStart + 1, rootEnd)\n const meta: Record<string, unknown> = {}\n const sourceMap: Record<string, number> = {}\n let contentXml = ''\n\n let i = 0\n while (i < inner.length) {\n const t = inner[i]!\n if (t.kind === 'text' || t.kind === 'cdata') {\n i++\n continue\n }\n if (t.kind === 'open' && t.name === 'meta') {\n const closeIdx = findMatchingClose(inner, i, 'meta')\n parseMeta(inner.slice(i + 1, closeIdx), meta, sourceMap)\n i = closeIdx + 1\n continue\n }\n if (t.kind === 'open' && t.name === 'content') {\n const closeIdx = findMatchingClose(inner, i, 'content')\n contentXml = renderInnerXml(inner.slice(i + 1, closeIdx))\n sourceMap.content = t.line\n i = closeIdx + 1\n continue\n }\n if (t.kind === 'self' && t.name === 'content') {\n contentXml = ''\n sourceMap.content = t.line\n i++\n continue\n }\n if (t.kind === 'open' || t.kind === 'self') {\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: `unexpected <${t.name}> at root`,\n details: { line: t.line },\n })\n }\n i++\n }\n\n return { kind, meta, contentXml, sourceMap }\n}\n\nfunction findMatchingClose(\n tokens: Token[],\n startOpen: number,\n name: string,\n): number {\n let depth = 0\n for (let i = startOpen; i < tokens.length; i++) {\n const t = tokens[i]!\n if (t.kind === 'open' && t.name === name) depth++\n else if (t.kind === 'close' && t.name === name) {\n depth--\n if (depth === 0) return i\n }\n }\n throw new MxsError({\n code: MxsErrorCode.ValidationXml,\n message: `unterminated <${name}>`,\n details: { line: tokens[startOpen]?.line ?? 1 },\n })\n}\n\nfunction parseMeta(\n tokens: Token[],\n meta: Record<string, unknown>,\n sourceMap: Record<string, number>,\n): void {\n let i = 0\n while (i < tokens.length) {\n const t = tokens[i]!\n if (t.kind === 'text' || t.kind === 'cdata') {\n i++\n continue\n }\n if (t.kind === 'close') {\n i++\n continue\n }\n if (t.kind === 'self') {\n const key = t.name!\n meta[key] = ''\n sourceMap[`meta.${key}`] = t.line\n i++\n continue\n }\n if (t.kind === 'open') {\n const name = t.name!\n const closeIdx = findMatchingClose(tokens, i, name)\n const inner = tokens.slice(i + 1, closeIdx)\n if (ARRAY_TAGS[name]) {\n const childTag = ARRAY_TAGS[name]\n const items: string[] = []\n let j = 0\n while (j < inner.length) {\n const c = inner[j]!\n if (c.kind === 'open' && c.name === childTag) {\n const cc = findMatchingClose(inner, j, childTag)\n items.push(textOf(inner.slice(j + 1, cc)))\n j = cc + 1\n } else {\n j++\n }\n }\n meta[name] = items\n } else {\n meta[name] = textOf(inner)\n }\n sourceMap[`meta.${name}`] = t.line\n i = closeIdx + 1\n continue\n }\n i++\n }\n}\n\nfunction textOf(tokens: Token[]): string {\n let s = ''\n for (const t of tokens) {\n if (t.kind === 'text' && t.text) s += t.text\n else if (t.kind === 'cdata' && t.text) s += t.text\n }\n return decodeXmlEntities(s).trim()\n}\n\nfunction renderInnerXml(tokens: Token[]): string {\n let out = ''\n for (const t of tokens) {\n if (t.kind === 'text') out += t.text ?? ''\n else if (t.kind === 'cdata') out += `<![CDATA[${t.text ?? ''}]]>`\n else if (t.kind === 'open') out += `<${t.raw ?? t.name}>`\n else if (t.kind === 'self') out += `<${t.raw ?? `${t.name}/`}>`\n else if (t.kind === 'close') out += `</${t.name}>`\n }\n if (out.startsWith('\\n')) out = out.slice(1)\n if (out.endsWith('\\n')) out = out.slice(0, -1)\n if (SKIP_TEXT_RE.test(out)) return ''\n return out\n}\n\nexport interface EnvelopeMeta {\n title?: string\n slug?: string\n category?: string\n topic?: string\n state?: 'publish' | 'draft'\n summary?: string\n copyright?: boolean\n pin?: string\n pinOrder?: number\n related?: string[]\n tags?: string[]\n mood?: string\n weather?: string\n publicAt?: string\n password?: string\n bookmark?: boolean\n location?: string\n subtitle?: string\n order?: number\n format?: 'lexical' | 'markdown'\n}\n\nexport function coerceMeta(raw: Record<string, unknown>): EnvelopeMeta {\n const out: EnvelopeMeta = {}\n const get = (key: string) => raw[key]\n\n const title = get('title')\n if (typeof title === 'string') out.title = title\n const slug = get('slug')\n if (typeof slug === 'string') out.slug = slug\n const category = get('category')\n if (typeof category === 'string') out.category = category\n const topic = get('topic')\n if (typeof topic === 'string') out.topic = topic\n const summary = get('summary')\n if (typeof summary === 'string') out.summary = summary\n const state = get('state')\n if (state === 'publish' || state === 'draft') out.state = state\n const copyright = get('copyright')\n if (typeof copyright === 'string') {\n out.copyright = copyright === 'true'\n }\n const pin = get('pin')\n if (typeof pin === 'string') out.pin = pin\n const pinOrder = get('pinOrder')\n if (typeof pinOrder === 'string' && pinOrder.length > 0) {\n const n = Number(pinOrder)\n if (!Number.isNaN(n)) out.pinOrder = n\n }\n const tags = get('tags')\n if (Array.isArray(tags)) out.tags = tags as string[]\n const related = get('related')\n if (Array.isArray(related)) out.related = related as string[]\n const mood = get('mood')\n if (typeof mood === 'string') out.mood = mood\n const weather = get('weather')\n if (typeof weather === 'string') out.weather = weather\n const publicAt = get('publicAt')\n if (typeof publicAt === 'string') out.publicAt = publicAt\n const password = get('password')\n if (typeof password === 'string') out.password = password\n const bookmark = get('bookmark')\n if (typeof bookmark === 'string') {\n out.bookmark = bookmark === 'true'\n }\n const location = get('location')\n if (typeof location === 'string') out.location = location\n const subtitle = get('subtitle')\n if (typeof subtitle === 'string') out.subtitle = subtitle\n const order = get('order')\n if (typeof order === 'string' && order.length > 0) {\n const n = Number(order)\n if (!Number.isNaN(n)) out.order = n\n }\n const format = get('format')\n if (format === 'lexical' || format === 'markdown') out.format = format\n\n return out\n}\n\nexport function listUnknownMetaKeys(\n raw: Record<string, unknown>,\n known: ReadonlyArray<string>,\n): string[] {\n return Object.keys(raw).filter((k) => !known.includes(k))\n}\n","import { promises as fs } from 'node:fs'\n\nimport { readContentSpec, readJsonSpec, readStdin } from './content-spec'\nimport {\n coerceMeta,\n type EnvelopeKind,\n type EnvelopeMeta,\n type ParsedEnvelope,\n parseEnvelope,\n} from './envelope'\nimport { MxsError, MxsErrorCode } from './errors'\nimport {\n deriveTextFromLexical,\n emptyLexicalState,\n parseToLexical,\n} from './litexml-codec'\n\nexport type ContentFormat = 'lexical' | 'markdown'\n\nexport interface PostFlagInputs {\n title?: string\n slug?: string\n category?: string\n content?: string\n format?: ContentFormat\n summary?: string\n state?: 'publish' | 'draft'\n tags?: string[]\n copyright?: boolean\n pin?: string\n pinOrder?: number\n related?: string[]\n meta?: string\n file?: string\n}\n\nexport interface NoteFlagInputs {\n title?: string\n slug?: string\n topic?: string\n content?: string\n format?: ContentFormat\n state?: 'publish' | 'draft'\n mood?: string\n weather?: string\n publicAt?: string\n password?: string\n bookmark?: boolean\n coords?: string\n location?: string\n images?: string\n meta?: string\n file?: string\n}\n\nexport interface PageFlagInputs {\n title?: string\n slug?: string\n subtitle?: string\n order?: number\n content?: string\n format?: ContentFormat\n meta?: string\n file?: string\n}\n\nexport interface BuiltPayload {\n payload: Record<string, unknown>\n envelopeMeta?: EnvelopeMeta\n contentSource?: 'flag' | 'envelope' | 'none'\n}\n\nexport async function loadEnvelopeIfAny(\n filePath: string | undefined,\n kind: EnvelopeKind,\n): Promise<ParsedEnvelope | null> {\n if (!filePath) return null\n if (filePath === '-' || filePath === 'stdin' || filePath === '/dev/stdin') {\n return parseEnvelope(await readStdin(), kind)\n }\n if (filePath.startsWith('file=')) {\n const src = await readContentSpec(filePath)\n return parseEnvelope(src?.text ?? '', kind)\n }\n const xml = await fs.readFile(filePath, 'utf8').catch((err) => {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `failed to read ${filePath}: ${err?.message ?? err}`,\n })\n })\n return parseEnvelope(xml, kind)\n}\n\nexport async function buildPostPayload(\n flags: PostFlagInputs,\n): Promise<BuiltPayload> {\n const envelope = await loadEnvelopeIfAny(flags.file, 'post')\n const envMeta: EnvelopeMeta = envelope ? coerceMeta(envelope.meta) : {}\n\n const payload: Record<string, unknown> = {}\n const title = flags.title ?? envMeta.title\n if (title !== undefined) payload.title = title\n const slug = flags.slug ?? envMeta.slug\n if (slug !== undefined) payload.slug = slug\n if (flags.category) payload.__categoryName = flags.category\n else if (envMeta.category) payload.__categoryName = envMeta.category\n const summary = flags.summary ?? envMeta.summary\n if (summary !== undefined) payload.summary = summary\n const state = flags.state ?? envMeta.state\n if (state !== undefined) payload.isPublished = state === 'publish'\n const tags = flags.tags ?? envMeta.tags\n if (tags !== undefined) payload.tags = tags\n const copyright = flags.copyright ?? envMeta.copyright\n if (copyright !== undefined) payload.copyright = copyright\n const pin = flags.pin ?? envMeta.pin\n if (pin !== undefined) payload.pin = pin\n const pinOrder = flags.pinOrder ?? envMeta.pinOrder\n if (pinOrder !== undefined) payload.pinOrder = pinOrder\n const related = flags.related ?? envMeta.related\n if (related !== undefined) payload.relatedId = related\n if (flags.meta !== undefined) {\n payload.meta = await readJsonSpec(flags.meta)\n }\n const format = flags.format ?? envMeta.format ?? 'lexical'\n payload.contentFormat = format\n\n const contentSrc = await resolveContent(flags.content, envelope, format)\n if (contentSrc) {\n payload.content = contentSrc.content\n payload.text = contentSrc.text\n }\n\n return {\n payload,\n envelopeMeta: envMeta,\n contentSource: contentSrc?.origin ?? 'none',\n }\n}\n\nexport async function buildNotePayload(\n flags: NoteFlagInputs,\n): Promise<BuiltPayload> {\n const envelope = await loadEnvelopeIfAny(flags.file, 'note')\n const envMeta: EnvelopeMeta = envelope ? coerceMeta(envelope.meta) : {}\n\n const payload: Record<string, unknown> = {}\n const title = flags.title ?? envMeta.title ?? '无题'\n payload.title = title\n const slug = flags.slug ?? envMeta.slug\n if (slug !== undefined) payload.slug = slug\n if (flags.topic) payload.__topicName = flags.topic\n else if (envMeta.topic) payload.__topicName = envMeta.topic\n const state = flags.state ?? envMeta.state\n if (state !== undefined) payload.isPublished = state === 'publish'\n const mood = flags.mood ?? envMeta.mood\n if (mood !== undefined) payload.mood = mood\n const weather = flags.weather ?? envMeta.weather\n if (weather !== undefined) payload.weather = weather\n const publicAt = flags.publicAt ?? envMeta.publicAt\n if (publicAt !== undefined) payload.publicAt = publicAt\n const password = flags.password ?? envMeta.password\n if (password !== undefined) payload.password = password\n const bookmark = flags.bookmark ?? envMeta.bookmark\n if (bookmark !== undefined) payload.bookmark = bookmark\n const location = flags.location ?? envMeta.location\n if (location !== undefined) payload.location = location\n\n if (flags.coords) {\n const [latRaw, lngRaw] = flags.coords.split(',').map((s) => s.trim())\n const lat = Number(latRaw)\n const lng = Number(lngRaw)\n if (Number.isNaN(lat) || Number.isNaN(lng)) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `invalid --coords value \"${flags.coords}\", expected \"lat,lng\"`,\n })\n }\n payload.coordinates = { latitude: lat, longitude: lng }\n }\n if (flags.images !== undefined) {\n payload.images = await readJsonSpec(flags.images)\n }\n if (flags.meta !== undefined) {\n payload.meta = await readJsonSpec(flags.meta)\n }\n\n const format = flags.format ?? envMeta.format ?? 'lexical'\n payload.contentFormat = format\n const contentSrc = await resolveContent(flags.content, envelope, format)\n if (contentSrc) {\n payload.content = contentSrc.content\n payload.text = contentSrc.text\n }\n\n return {\n payload,\n envelopeMeta: envMeta,\n contentSource: contentSrc?.origin ?? 'none',\n }\n}\n\nexport async function buildPagePayload(\n flags: PageFlagInputs,\n): Promise<BuiltPayload> {\n const envelope = await loadEnvelopeIfAny(flags.file, 'post')\n const envMeta: EnvelopeMeta = envelope ? coerceMeta(envelope.meta) : {}\n const payload: Record<string, unknown> = {}\n const title = flags.title ?? envMeta.title\n if (title !== undefined) payload.title = title\n const slug = flags.slug ?? envMeta.slug\n if (slug !== undefined) payload.slug = slug\n const subtitle = flags.subtitle ?? envMeta.subtitle\n if (subtitle !== undefined) payload.subtitle = subtitle\n const order = flags.order ?? envMeta.order\n if (order !== undefined) payload.order = order\n if (flags.meta !== undefined) {\n payload.meta = await readJsonSpec(flags.meta)\n }\n const format = flags.format ?? envMeta.format ?? 'lexical'\n payload.contentFormat = format\n const contentSrc = await resolveContent(flags.content, envelope, format)\n if (contentSrc) {\n payload.content = contentSrc.content\n payload.text = contentSrc.text\n }\n return {\n payload,\n envelopeMeta: envMeta,\n contentSource: contentSrc?.origin ?? 'none',\n }\n}\n\ninterface ResolvedContent {\n content: string\n text: string\n origin: 'flag' | 'envelope'\n}\n\nasync function resolveContent(\n flagSpec: string | undefined,\n envelope: ParsedEnvelope | null,\n format: ContentFormat,\n): Promise<ResolvedContent | null> {\n let source: { text: string; origin: 'flag' | 'envelope' } | null = null\n if (flagSpec !== undefined) {\n const src = await readContentSpec(flagSpec)\n if (src) source = { text: src.text, origin: 'flag' }\n } else if (envelope) {\n source = { text: envelope.contentXml, origin: 'envelope' }\n }\n if (!source) return null\n\n if (format === 'markdown') {\n return { content: source.text, text: source.text, origin: source.origin }\n }\n if (source.text.length === 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: 'content is required when contentFormat is lexical',\n details: { issues: [{ path: ['content'], message: 'required' }] },\n })\n }\n const state = parseToLexical(source.text)\n const lexicalJson = JSON.stringify(state)\n const text = deriveTextFromLexical(state)\n return { content: lexicalJson, text, origin: source.origin }\n}\n\nexport function emptyPayload(format: ContentFormat): {\n content: string\n text: string\n} {\n if (format === 'markdown') return { content: '', text: '' }\n const state = emptyLexicalState()\n return { content: JSON.stringify(state), text: '' }\n}\n"],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import { c as MxsErrorCode, s as MxsError } from "./output-vzequvhd.mjs";
2
+ import path from "node:path";
3
+ import { promises } from "node:fs";
4
+ import os from "node:os";
5
+ //#region src/core/config-dir.ts
6
+ function getConfigDir() {
7
+ const xdg = process.env.XDG_CONFIG_HOME;
8
+ const base = xdg && xdg.length > 0 ? xdg : path.join(os.homedir(), ".config");
9
+ return path.join(base, "mxs");
10
+ }
11
+ //#endregion
12
+ //#region src/core/profile.ts
13
+ const PROFILE_NAME_RE = /^[\d_a-z-]{1,32}$/;
14
+ const RESERVED_PROFILE_NAMES = new Set(["current"]);
15
+ function validateProfileName(name) {
16
+ if (!name || name.length === 0) throw new MxsError({
17
+ code: MxsErrorCode.ValidationFailed,
18
+ message: "profile name must not be empty"
19
+ });
20
+ if (RESERVED_PROFILE_NAMES.has(name)) throw new MxsError({
21
+ code: MxsErrorCode.ValidationFailed,
22
+ message: `profile name '${name}' is reserved`
23
+ });
24
+ if (!PROFILE_NAME_RE.test(name)) throw new MxsError({
25
+ code: MxsErrorCode.ValidationFailed,
26
+ message: `profile name '${name}' is invalid; must match ^[a-z0-9_-]{1,32}$`
27
+ });
28
+ }
29
+ function getProfilesDir() {
30
+ return path.join(getConfigDir(), "profiles");
31
+ }
32
+ function getCurrentPath() {
33
+ return path.join(getConfigDir(), "current");
34
+ }
35
+ function getProfileDir(name) {
36
+ return path.join(getProfilesDir(), name);
37
+ }
38
+ function getProfileConfigPath(name) {
39
+ return path.join(getProfileDir(name), "config.json");
40
+ }
41
+ function getProfileCredentialsPath(name) {
42
+ return path.join(getProfileDir(name), "credentials.json");
43
+ }
44
+ async function listProfiles() {
45
+ const dir = getProfilesDir();
46
+ let entries;
47
+ try {
48
+ entries = await promises.readdir(dir, { withFileTypes: true });
49
+ } catch (err) {
50
+ if (err?.code === "ENOENT") return [];
51
+ throw err;
52
+ }
53
+ return entries.filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name).sort();
54
+ }
55
+ async function getCurrentProfile() {
56
+ const p = getCurrentPath();
57
+ try {
58
+ const name = (await promises.readFile(p, "utf8")).trim();
59
+ return name.length > 0 ? name : null;
60
+ } catch (err) {
61
+ if (err?.code === "ENOENT") return null;
62
+ throw err;
63
+ }
64
+ }
65
+ async function setCurrentProfile(name) {
66
+ validateProfileName(name);
67
+ const dir = getProfileDir(name);
68
+ try {
69
+ if (!(await promises.stat(dir)).isDirectory()) throw new MxsError({
70
+ code: MxsErrorCode.ValidationFailed,
71
+ message: `profile '${name}' does not exist`
72
+ });
73
+ } catch (err) {
74
+ if (err instanceof MxsError) throw err;
75
+ if (err?.code === "ENOENT") throw new MxsError({
76
+ code: MxsErrorCode.ValidationFailed,
77
+ message: `profile '${name}' does not exist`
78
+ });
79
+ throw err;
80
+ }
81
+ await promises.writeFile(getCurrentPath(), `${name}\n`, { encoding: "utf8" });
82
+ }
83
+ async function readJsonIfExists(p) {
84
+ try {
85
+ const raw = await promises.readFile(p, "utf8");
86
+ return JSON.parse(raw);
87
+ } catch (err) {
88
+ if (err?.code === "ENOENT") return null;
89
+ if (err instanceof SyntaxError) throw new MxsError({
90
+ code: MxsErrorCode.Generic,
91
+ message: `failed to parse ${p}: ${err.message}`
92
+ });
93
+ throw err;
94
+ }
95
+ }
96
+ async function ensureProfileDir(name) {
97
+ const dir = getProfileDir(name);
98
+ await promises.mkdir(dir, {
99
+ recursive: true,
100
+ mode: 448
101
+ });
102
+ try {
103
+ await promises.chmod(dir, 448);
104
+ } catch {}
105
+ }
106
+ async function readProfileConfig(name) {
107
+ return await readJsonIfExists(getProfileConfigPath(name)) ?? {};
108
+ }
109
+ async function writeProfileConfig(name, cfg) {
110
+ await ensureProfileDir(name);
111
+ const p = getProfileConfigPath(name);
112
+ await promises.writeFile(p, JSON.stringify(cfg, null, 2), { mode: 420 });
113
+ try {
114
+ await promises.chmod(p, 420);
115
+ } catch {}
116
+ }
117
+ async function readProfileCredentials(name) {
118
+ const p = getProfileCredentialsPath(name);
119
+ const data = await readJsonIfExists(p);
120
+ if (data) await enforceProfileCredentialsMode(p);
121
+ return data;
122
+ }
123
+ async function writeProfileCredentials(name, creds) {
124
+ await ensureProfileDir(name);
125
+ const p = getProfileCredentialsPath(name);
126
+ await promises.writeFile(p, JSON.stringify(creds, null, 2), { mode: 384 });
127
+ await promises.chmod(p, 384);
128
+ }
129
+ async function deleteProfileCredentials(name) {
130
+ const p = getProfileCredentialsPath(name);
131
+ try {
132
+ await promises.unlink(p);
133
+ } catch (err) {
134
+ if (err?.code !== "ENOENT") throw err;
135
+ }
136
+ }
137
+ async function removeProfile(name) {
138
+ const dir = getProfileDir(name);
139
+ try {
140
+ await promises.stat(dir);
141
+ } catch (err) {
142
+ if (err?.code === "ENOENT") throw new MxsError({
143
+ code: MxsErrorCode.ResourceNotFound,
144
+ message: `profile '${name}' does not exist`
145
+ });
146
+ throw err;
147
+ }
148
+ await promises.rm(dir, {
149
+ recursive: true,
150
+ force: true
151
+ });
152
+ }
153
+ async function enforceProfileCredentialsMode(p) {
154
+ let stats;
155
+ try {
156
+ stats = await promises.stat(p);
157
+ } catch (err) {
158
+ if (err?.code === "ENOENT") return false;
159
+ throw err;
160
+ }
161
+ const mode = stats.mode & 511;
162
+ if (mode !== 384) {
163
+ process.stderr.write(`mxs: credentials file ${p} had mode ${mode.toString(8)}; chmod 600\n`);
164
+ await promises.chmod(p, 384);
165
+ return true;
166
+ }
167
+ return false;
168
+ }
169
+ //#endregion
170
+ export { getProfileCredentialsPath as a, listProfiles as c, removeProfile as d, setCurrentProfile as f, getConfigDir as g, writeProfileCredentials as h, getProfileConfigPath as i, readProfileConfig as l, writeProfileConfig as m, getCurrentPath as n, getProfileDir as o, validateProfileName as p, getCurrentProfile as r, getProfilesDir as s, deleteProfileCredentials as t, readProfileCredentials as u };
171
+
172
+ //# sourceMappingURL=profile-CNe2uWJi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-CNe2uWJi.mjs","names":["fs"],"sources":["../src/core/config-dir.ts","../src/core/profile.ts"],"sourcesContent":["import os from 'node:os'\nimport path from 'node:path'\n\nexport function getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME\n const base = xdg && xdg.length > 0 ? xdg : path.join(os.homedir(), '.config')\n return path.join(base, 'mxs')\n}\n","import { type Dirent, promises as fs } from 'node:fs'\nimport path from 'node:path'\n\nimport { getConfigDir } from './config-dir'\nimport type { ConfigShape, CredentialsShape } from './config-store'\nimport { MxsError, MxsErrorCode } from './errors'\n\nexport { getConfigDir }\n\nexport const PROFILE_NAME_RE = /^[\\d_a-z-]{1,32}$/\n\nexport const RESERVED_PROFILE_NAMES = new Set(['current'])\n\nexport function validateProfileName(name: string): void {\n if (!name || name.length === 0) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: 'profile name must not be empty',\n })\n }\n if (RESERVED_PROFILE_NAMES.has(name)) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `profile name '${name}' is reserved`,\n })\n }\n if (!PROFILE_NAME_RE.test(name)) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `profile name '${name}' is invalid; must match ^[a-z0-9_-]{1,32}$`,\n })\n }\n}\n\nexport function getProfilesDir(): string {\n return path.join(getConfigDir(), 'profiles')\n}\n\nexport function getCurrentPath(): string {\n return path.join(getConfigDir(), 'current')\n}\n\nexport function getProfileDir(name: string): string {\n return path.join(getProfilesDir(), name)\n}\n\nexport function getProfileConfigPath(name: string): string {\n return path.join(getProfileDir(name), 'config.json')\n}\n\nexport function getProfileCredentialsPath(name: string): string {\n return path.join(getProfileDir(name), 'credentials.json')\n}\n\nexport async function listProfiles(): Promise<string[]> {\n const dir = getProfilesDir()\n let entries: Dirent[]\n try {\n entries = await fs.readdir(dir, { withFileTypes: true })\n } catch (err: any) {\n if (err?.code === 'ENOENT') return []\n throw err\n }\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith('.'))\n .map((e) => e.name)\n .sort()\n}\n\nexport async function getCurrentProfile(): Promise<string | null> {\n const p = getCurrentPath()\n try {\n const raw = await fs.readFile(p, 'utf8')\n const name = raw.trim()\n return name.length > 0 ? name : null\n } catch (err: any) {\n if (err?.code === 'ENOENT') return null\n throw err\n }\n}\n\nexport async function setCurrentProfile(name: string): Promise<void> {\n validateProfileName(name)\n const dir = getProfileDir(name)\n try {\n const stat = await fs.stat(dir)\n if (!stat.isDirectory()) {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `profile '${name}' does not exist`,\n })\n }\n } catch (err: any) {\n if (err instanceof MxsError) throw err\n if (err?.code === 'ENOENT') {\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `profile '${name}' does not exist`,\n })\n }\n throw err\n }\n await fs.writeFile(getCurrentPath(), `${name}\\n`, { encoding: 'utf8' })\n}\n\nasync function readJsonIfExists<T>(p: string): Promise<T | null> {\n try {\n const raw = await fs.readFile(p, 'utf8')\n return JSON.parse(raw) as T\n } catch (err: any) {\n if (err?.code === 'ENOENT') return null\n if (err instanceof SyntaxError) {\n throw new MxsError({\n code: MxsErrorCode.Generic,\n message: `failed to parse ${p}: ${err.message}`,\n })\n }\n throw err\n }\n}\n\nasync function ensureProfileDir(name: string): Promise<void> {\n const dir = getProfileDir(name)\n await fs.mkdir(dir, { recursive: true, mode: 0o700 })\n try {\n await fs.chmod(dir, 0o700)\n } catch {}\n}\n\nexport type ProfileConfigShape = ConfigShape\nexport type ProfileCredentialsShape = CredentialsShape\n\nexport async function readProfileConfig(\n name: string,\n): Promise<ProfileConfigShape> {\n const data = await readJsonIfExists<ProfileConfigShape>(\n getProfileConfigPath(name),\n )\n return data ?? {}\n}\n\nexport async function writeProfileConfig(\n name: string,\n cfg: ProfileConfigShape,\n): Promise<void> {\n await ensureProfileDir(name)\n const p = getProfileConfigPath(name)\n await fs.writeFile(p, JSON.stringify(cfg, null, 2), { mode: 0o644 })\n try {\n await fs.chmod(p, 0o644)\n } catch {}\n}\n\nexport async function readProfileCredentials(\n name: string,\n): Promise<ProfileCredentialsShape | null> {\n const p = getProfileCredentialsPath(name)\n const data = await readJsonIfExists<ProfileCredentialsShape>(p)\n if (data) {\n await enforceProfileCredentialsMode(p)\n }\n return data\n}\n\nexport async function writeProfileCredentials(\n name: string,\n creds: ProfileCredentialsShape,\n): Promise<void> {\n await ensureProfileDir(name)\n const p = getProfileCredentialsPath(name)\n await fs.writeFile(p, JSON.stringify(creds, null, 2), { mode: 0o600 })\n await fs.chmod(p, 0o600)\n}\n\nexport async function deleteProfileCredentials(name: string): Promise<void> {\n const p = getProfileCredentialsPath(name)\n try {\n await fs.unlink(p)\n } catch (err: any) {\n if (err?.code !== 'ENOENT') throw err\n }\n}\n\nexport async function removeProfile(name: string): Promise<void> {\n const dir = getProfileDir(name)\n try {\n await fs.stat(dir)\n } catch (err: any) {\n if (err?.code === 'ENOENT') {\n throw new MxsError({\n code: MxsErrorCode.ResourceNotFound,\n message: `profile '${name}' does not exist`,\n })\n }\n throw err\n }\n await fs.rm(dir, { recursive: true, force: true })\n}\n\nasync function enforceProfileCredentialsMode(p: string): Promise<boolean> {\n let stats\n try {\n stats = await fs.stat(p)\n } catch (err: any) {\n if (err?.code === 'ENOENT') return false\n throw err\n }\n const mode = stats.mode & 0o777\n if (mode !== 0o600) {\n process.stderr.write(\n `mxs: credentials file ${p} had mode ${mode.toString(8)}; chmod 600\\n`,\n )\n await fs.chmod(p, 0o600)\n return true\n }\n return false\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
2
- import { n as resolveContext, t as buildApiClient } from "./shared-C2EAn5h_.mjs";
3
- import { t as resolvePostId } from "./resolve-Bp1AfBmM.mjs";
1
+ import { i as emitSuccess } from "./output-vzequvhd.mjs";
2
+ import { n as resolveContext, t as buildApiClient } from "./shared-d0_6ZPn_.mjs";
3
+ import { t as resolvePostId } from "./resolve-jdb1VqAG.mjs";
4
4
  //#region src/commands/post/publish.ts
5
5
  async function run(slugOrId, publish, flags, out) {
6
6
  const client = buildApiClient(await resolveContext(flags, out), flags);
@@ -20,4 +20,4 @@ async function run(slugOrId, publish, flags, out) {
20
20
  //#endregion
21
21
  export { run };
22
22
 
23
- //# sourceMappingURL=publish-akQWYsnL.mjs.map
23
+ //# sourceMappingURL=publish-CzzucXQq.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish-akQWYsnL.mjs","names":[],"sources":["../src/commands/post/publish.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\nimport { resolvePostId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n publish: boolean,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolvePostId(client, slugOrId)\n if (flags.dryRun) {\n emitSuccess({ would_set: { id, isPublished: publish } }, out)\n return\n }\n const res = await client.request(`/posts/${id}`, {\n method: 'PATCH',\n body: { isPublished: publish },\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;AAIA,eAAsB,IACpB,UACA,SACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,WAAW;GAAE;GAAI,aAAa;EAAQ,EAAE,GAAG,GAAG;EAC5D;CACF;CAKA,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;EAC/C,QAAQ;EACR,MAAM,EAAE,aAAa,QAAQ;CAC/B,CAAC,GACe,MAAM,GAAG;AAC3B"}
1
+ {"version":3,"file":"publish-CzzucXQq.mjs","names":[],"sources":["../src/commands/post/publish.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\nimport { resolvePostId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n publish: boolean,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolvePostId(client, slugOrId)\n if (flags.dryRun) {\n emitSuccess({ would_set: { id, isPublished: publish } }, out)\n return\n }\n const res = await client.request(`/posts/${id}`, {\n method: 'PATCH',\n body: { isPublished: publish },\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;AAIA,eAAsB,IACpB,UACA,SACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,WAAW;GAAE;GAAI,aAAa;EAAQ,EAAE,GAAG,GAAG;EAC5D;CACF;CAKA,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;EAC/C,QAAQ;EACR,MAAM,EAAE,aAAa,QAAQ;CAC/B,CAAC,GACe,MAAM,GAAG;AAC3B"}
@@ -1,6 +1,6 @@
1
- import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
2
- import { n as resolveContext, t as buildApiClient } from "./shared-C2EAn5h_.mjs";
3
- import { t as resolveNoteId } from "./resolve-CyjMlaoJ.mjs";
1
+ import { i as emitSuccess } from "./output-vzequvhd.mjs";
2
+ import { n as resolveContext, t as buildApiClient } from "./shared-d0_6ZPn_.mjs";
3
+ import { t as resolveNoteId } from "./resolve-BYg5Gees.mjs";
4
4
  //#region src/commands/note/publish.ts
5
5
  async function run(slugOrId, publish, flags, out) {
6
6
  const client = buildApiClient(await resolveContext(flags, out), flags);
@@ -20,4 +20,4 @@ async function run(slugOrId, publish, flags, out) {
20
20
  //#endregion
21
21
  export { run };
22
22
 
23
- //# sourceMappingURL=publish-CN3NTJ_r.mjs.map
23
+ //# sourceMappingURL=publish-DRQkpxsz.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish-CN3NTJ_r.mjs","names":[],"sources":["../src/commands/note/publish.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveNoteId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n publish: boolean,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveNoteId(client, slugOrId)\n if (flags.dryRun) {\n emitSuccess({ would_set: { id, isPublished: publish } }, out)\n return\n }\n const res = await client.request(`/notes/${id}/publish`, {\n method: 'PATCH',\n body: { isPublished: publish },\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;AAQA,eAAsB,IACpB,UACA,SACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,WAAW;GAAE;GAAI,aAAa;EAAQ,EAAE,GAAG,GAAG;EAC5D;CACF;CAKA,aAAY,MAJM,OAAO,QAAQ,UAAU,GAAG,WAAW;EACvD,QAAQ;EACR,MAAM,EAAE,aAAa,QAAQ;CAC/B,CAAC,GACe,MAAM,GAAG;AAC3B"}
1
+ {"version":3,"file":"publish-DRQkpxsz.mjs","names":[],"sources":["../src/commands/note/publish.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveNoteId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n publish: boolean,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveNoteId(client, slugOrId)\n if (flags.dryRun) {\n emitSuccess({ would_set: { id, isPublished: publish } }, out)\n return\n }\n const res = await client.request(`/notes/${id}/publish`, {\n method: 'PATCH',\n body: { isPublished: publish },\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;AAQA,eAAsB,IACpB,UACA,SACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,WAAW;GAAE;GAAI,aAAa;EAAQ,EAAE,GAAG,GAAG;EAC5D;CACF;CAKA,aAAY,MAJM,OAAO,QAAQ,UAAU,GAAG,WAAW;EACvD,QAAQ;EACR,MAAM,EAAE,aAAa,QAAQ;CAC/B,CAAC,GACe,MAAM,GAAG;AAC3B"}
@@ -1,5 +1,5 @@
1
- import { s as MxsError } from "./output-BM7aBFwt.mjs";
2
- import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
1
+ import { c as MxsErrorCode, s as MxsError } from "./output-vzequvhd.mjs";
2
+ import { r as isSnowflakeId } from "./resolve-CUsHGcb-.mjs";
3
3
  //#region src/commands/note/resolve.ts
4
4
  async function resolveNoteId(client, slugOrId) {
5
5
  if (isSnowflakeId(slugOrId)) return slugOrId;
@@ -7,17 +7,17 @@ async function resolveNoteId(client, slugOrId) {
7
7
  const res = await client.request(`/notes/nid/${encodeURIComponent(slugOrId)}`, { query: { single: "1" } });
8
8
  const id = res.data?.data?.id ?? res.data?.id;
9
9
  if (!id) throw new MxsError({
10
- code: "resource.not_found",
10
+ code: MxsErrorCode.ResourceNotFound,
11
11
  message: `note not found: ${slugOrId}`
12
12
  });
13
13
  return id;
14
14
  }
15
15
  throw new MxsError({
16
- code: "validation.failed",
16
+ code: MxsErrorCode.ValidationFailed,
17
17
  message: `invalid note reference: ${slugOrId} (use snowflake id or numeric nid)`
18
18
  });
19
19
  }
20
20
  //#endregion
21
21
  export { resolveNoteId as t };
22
22
 
23
- //# sourceMappingURL=resolve-CyjMlaoJ.mjs.map
23
+ //# sourceMappingURL=resolve-BYg5Gees.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-BYg5Gees.mjs","names":[],"sources":["../src/commands/note/resolve.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError, MxsErrorCode } from '../../core/errors'\nimport { isSnowflakeId } from '../../core/resolve'\n\ninterface NidEnvelope {\n data?: { id?: string }\n id?: string\n}\n\nexport async function resolveNoteId(\n client: ApiClient,\n slugOrId: string,\n): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n if (/^\\d+$/.test(slugOrId)) {\n const res = await client.request<NidEnvelope>(\n `/notes/nid/${encodeURIComponent(slugOrId)}`,\n { query: { single: '1' } },\n )\n const id = res.data?.data?.id ?? res.data?.id\n if (!id) {\n throw new MxsError({\n code: MxsErrorCode.ResourceNotFound,\n message: `note not found: ${slugOrId}`,\n })\n }\n return id\n }\n throw new MxsError({\n code: MxsErrorCode.ValidationFailed,\n message: `invalid note reference: ${slugOrId} (use snowflake id or numeric nid)`,\n })\n}\n"],"mappings":";;;AASA,eAAsB,cACpB,QACA,UACiB;CACjB,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,IAAI,QAAQ,KAAK,QAAQ,GAAG;EAC1B,MAAM,MAAM,MAAM,OAAO,QACvB,cAAc,mBAAmB,QAAQ,KACzC,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,CAC3B;EACA,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM;EAC3C,IAAI,CAAC,IACH,MAAM,IAAI,SAAS;GACjB,MAAM,aAAa;GACnB,SAAS,mBAAmB;EAC9B,CAAC;EAEH,OAAO;CACT;CACA,MAAM,IAAI,SAAS;EACjB,MAAM,aAAa;EACnB,SAAS,2BAA2B,SAAS;CAC/C,CAAC;AACH"}