@mx-space/cli 0.2.2 → 0.3.0

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 (210) hide show
  1. package/README.md +14 -0
  2. package/ROADMAP.md +6 -0
  3. package/bin/mxs.cjs +5 -5
  4. package/dist/{Lexical.dev-CMevU1DO.mjs → Lexical.dev-rcxzwpir.mjs} +0 -2
  5. package/dist/{Lexical.node-BR9e7Cyk.mjs → Lexical.node-BUsI9gWr.mjs} +1 -3
  6. package/dist/{Lexical.prod-PUD-z9fY.mjs → Lexical.prod-C8HtkSD6.mjs} +0 -2
  7. package/dist/{LexicalClipboard.dev-DZC2zppG.mjs → LexicalClipboard.dev-BpqRwTLP.mjs} +5 -7
  8. package/dist/{LexicalClipboard.node-e5G1wVGb.mjs → LexicalClipboard.node-CO-MCKx5.mjs} +1 -3
  9. package/dist/{LexicalClipboard.prod-DE2azzIb.mjs → LexicalClipboard.prod-B_xdeiAC.mjs} +5 -7
  10. package/dist/{LexicalCodeCore.dev-gs--x55I.mjs → LexicalCodeCore.dev-7_cexm39.mjs} +2 -4
  11. package/dist/{LexicalCodeCore.prod-DPHOnyEj.mjs → LexicalCodeCore.prod-Bd6WFHcO.mjs} +2 -4
  12. package/dist/{LexicalDragon.dev-CVe8bzVN.mjs → LexicalDragon.dev-gBP8WSRS.mjs} +2 -4
  13. package/dist/{LexicalDragon.node-c7EHvcnK.mjs → LexicalDragon.node-OG6G55nl.mjs} +1 -3
  14. package/dist/{LexicalDragon.prod-D6KvqyLD.mjs → LexicalDragon.prod-DP-_Q8cv.mjs} +2 -4
  15. package/dist/{LexicalExtension.dev-PDo8HyEw.mjs → LexicalExtension.dev-DVbjljrm.mjs} +2 -4
  16. package/dist/{LexicalExtension.node-BKzjRb-0.mjs → LexicalExtension.node-CF3EAPN7.mjs} +1 -3
  17. package/dist/{LexicalExtension.prod-D0x_lX7q.mjs → LexicalExtension.prod-DklHHErZ.mjs} +2 -4
  18. package/dist/{LexicalHeadless.dev-DBKcW82j.mjs → LexicalHeadless.dev-DdWLM7Nl.mjs} +1 -3
  19. package/dist/{LexicalHeadless.prod-D4nEh7cR.mjs → LexicalHeadless.prod-CoiiTDzR.mjs} +1 -3
  20. package/dist/{LexicalHtml.dev-vsWW05es.mjs → LexicalHtml.dev-C3ZSWBFZ.mjs} +3 -5
  21. package/dist/{LexicalHtml.node-CpibAfba.mjs → LexicalHtml.node-D0TD152E.mjs} +1 -3
  22. package/dist/{LexicalHtml.prod-Bqz-3WAp.mjs → LexicalHtml.prod-CX47X0zl.mjs} +3 -5
  23. package/dist/{LexicalLink.dev-BO0J0B1E.mjs → LexicalLink.dev-BS1Bf-yD.mjs} +3 -5
  24. package/dist/{LexicalLink.prod-D66AhUCZ.mjs → LexicalLink.prod-B_crkoHP.mjs} +3 -5
  25. package/dist/{LexicalList.dev-DVGTWRk0.mjs → LexicalList.dev-OMqmcnQ-.mjs} +3 -5
  26. package/dist/{LexicalList.prod-Bao7NGl7.mjs → LexicalList.prod-CpL1s8vS.mjs} +3 -5
  27. package/dist/{LexicalMarkdown.dev-CRWkZwlp.mjs → LexicalMarkdown.dev-BHSdx_Gr.mjs} +3 -5
  28. package/dist/{LexicalMarkdown.prod-tGG6js4r.mjs → LexicalMarkdown.prod-C-S7Ii6-.mjs} +3 -5
  29. package/dist/{LexicalRichText.dev-DPXfQePC.mjs → LexicalRichText.dev-Bz9A_WbM.mjs} +5 -7
  30. package/dist/{LexicalRichText.node-BEkm_YwY.mjs → LexicalRichText.node-DDpwfE-P.mjs} +4 -6
  31. package/dist/{LexicalRichText.prod-DlfudC5w.mjs → LexicalRichText.prod-C8qXACDL.mjs} +5 -7
  32. package/dist/{LexicalSelection.dev-BVTArZ-b.mjs → LexicalSelection.dev-CQ380fnD.mjs} +1 -3
  33. package/dist/{LexicalSelection.node-CQ8iTYsz.mjs → LexicalSelection.node-DesBMjIE.mjs} +1 -3
  34. package/dist/{LexicalSelection.prod-BZKGGs-G.mjs → LexicalSelection.prod-D2jivCDB.mjs} +1 -3
  35. package/dist/{LexicalTable.dev-C-AOEpJn.mjs → LexicalTable.dev-Ca7mQ7Jk.mjs} +4 -6
  36. package/dist/{LexicalTable.prod-Cyn0qWxZ.mjs → LexicalTable.prod-DyPAcC7y.mjs} +4 -6
  37. package/dist/{LexicalUtils.dev-DRRDyAlS.mjs → LexicalUtils.dev-HxM8F0g6.mjs} +2 -4
  38. package/dist/{LexicalUtils.node-Dz-HANi6.mjs → LexicalUtils.node-lCWjRjoG.mjs} +1 -3
  39. package/dist/{LexicalUtils.prod-CmeHwh8W.mjs → LexicalUtils.prod-Bti5w4ki.mjs} +2 -4
  40. package/dist/bin/mxs.d.mts +2 -929
  41. package/dist/bin/mxs.mjs +2 -3595
  42. package/dist/esm-BKxzBG1f.mjs +2 -0
  43. package/dist/esm-DO9hVR8S.mjs +37652 -0
  44. package/dist/index.d.mts +1492 -374
  45. package/dist/index.mjs +2 -11
  46. package/dist/mxs-BUOk42XP.mjs +30444 -0
  47. package/dist/mxs-CM8-6uAr.d.mts +4 -0
  48. package/package.json +7 -2
  49. package/dist/Lexical.dev-CMevU1DO.mjs.map +0 -1
  50. package/dist/Lexical.node-BR9e7Cyk.mjs.map +0 -1
  51. package/dist/Lexical.prod-PUD-z9fY.mjs.map +0 -1
  52. package/dist/LexicalClipboard.dev-DZC2zppG.mjs.map +0 -1
  53. package/dist/LexicalClipboard.node-e5G1wVGb.mjs.map +0 -1
  54. package/dist/LexicalClipboard.prod-DE2azzIb.mjs.map +0 -1
  55. package/dist/LexicalCodeCore.dev-gs--x55I.mjs.map +0 -1
  56. package/dist/LexicalCodeCore.prod-DPHOnyEj.mjs.map +0 -1
  57. package/dist/LexicalDragon.dev-CVe8bzVN.mjs.map +0 -1
  58. package/dist/LexicalDragon.node-c7EHvcnK.mjs.map +0 -1
  59. package/dist/LexicalDragon.prod-D6KvqyLD.mjs.map +0 -1
  60. package/dist/LexicalExtension.dev-PDo8HyEw.mjs.map +0 -1
  61. package/dist/LexicalExtension.node-BKzjRb-0.mjs.map +0 -1
  62. package/dist/LexicalExtension.prod-D0x_lX7q.mjs.map +0 -1
  63. package/dist/LexicalHeadless.dev-DBKcW82j.mjs.map +0 -1
  64. package/dist/LexicalHeadless.prod-D4nEh7cR.mjs.map +0 -1
  65. package/dist/LexicalHtml.dev-vsWW05es.mjs.map +0 -1
  66. package/dist/LexicalHtml.node-CpibAfba.mjs.map +0 -1
  67. package/dist/LexicalHtml.prod-Bqz-3WAp.mjs.map +0 -1
  68. package/dist/LexicalLink.dev-BO0J0B1E.mjs.map +0 -1
  69. package/dist/LexicalLink.prod-D66AhUCZ.mjs.map +0 -1
  70. package/dist/LexicalList.dev-DVGTWRk0.mjs.map +0 -1
  71. package/dist/LexicalList.prod-Bao7NGl7.mjs.map +0 -1
  72. package/dist/LexicalMarkdown.dev-CRWkZwlp.mjs.map +0 -1
  73. package/dist/LexicalMarkdown.prod-tGG6js4r.mjs.map +0 -1
  74. package/dist/LexicalRichText.dev-DPXfQePC.mjs.map +0 -1
  75. package/dist/LexicalRichText.node-BEkm_YwY.mjs.map +0 -1
  76. package/dist/LexicalRichText.prod-DlfudC5w.mjs.map +0 -1
  77. package/dist/LexicalSelection.dev-BVTArZ-b.mjs.map +0 -1
  78. package/dist/LexicalSelection.node-CQ8iTYsz.mjs.map +0 -1
  79. package/dist/LexicalSelection.prod-BZKGGs-G.mjs.map +0 -1
  80. package/dist/LexicalTable.dev-C-AOEpJn.mjs.map +0 -1
  81. package/dist/LexicalTable.prod-Cyn0qWxZ.mjs.map +0 -1
  82. package/dist/LexicalUtils.dev-DRRDyAlS.mjs.map +0 -1
  83. package/dist/LexicalUtils.node-Dz-HANi6.mjs.map +0 -1
  84. package/dist/LexicalUtils.prod-CmeHwh8W.mjs.map +0 -1
  85. package/dist/auth-CAKmTDpF.mjs +0 -211
  86. package/dist/auth-CAKmTDpF.mjs.map +0 -1
  87. package/dist/bin/mxs.mjs.map +0 -1
  88. package/dist/config-store-B8_9iStL.mjs +0 -166
  89. package/dist/config-store-B8_9iStL.mjs.map +0 -1
  90. package/dist/create-5wbU7IQh.mjs +0 -23
  91. package/dist/create-5wbU7IQh.mjs.map +0 -1
  92. package/dist/create-Bs6K7AyQ.mjs +0 -23
  93. package/dist/create-Bs6K7AyQ.mjs.map +0 -1
  94. package/dist/create-DBReocgJ.mjs +0 -24
  95. package/dist/create-DBReocgJ.mjs.map +0 -1
  96. package/dist/create-DGVaE0_S.mjs +0 -19
  97. package/dist/create-DGVaE0_S.mjs.map +0 -1
  98. package/dist/create-lLFZuMsz.mjs +0 -23
  99. package/dist/create-lLFZuMsz.mjs.map +0 -1
  100. package/dist/delete-6tkhHQDp.mjs +0 -22
  101. package/dist/delete-6tkhHQDp.mjs.map +0 -1
  102. package/dist/delete-CRFxitDN.mjs +0 -31
  103. package/dist/delete-CRFxitDN.mjs.map +0 -1
  104. package/dist/delete-DU2Hvsy8.mjs +0 -22
  105. package/dist/delete-DU2Hvsy8.mjs.map +0 -1
  106. package/dist/delete-nJmHtvfq.mjs +0 -31
  107. package/dist/delete-nJmHtvfq.mjs.map +0 -1
  108. package/dist/delete-tJhXI8s4.mjs +0 -22
  109. package/dist/delete-tJhXI8s4.mjs.map +0 -1
  110. package/dist/dist-DJF1Ntdn.mjs +0 -810
  111. package/dist/dist-DJF1Ntdn.mjs.map +0 -1
  112. package/dist/document-output-BFJdwPV0.mjs +0 -200
  113. package/dist/document-output-BFJdwPV0.mjs.map +0 -1
  114. package/dist/edit-BMjTbPQO.mjs +0 -40
  115. package/dist/edit-BMjTbPQO.mjs.map +0 -1
  116. package/dist/edit-BnEmMmv6.mjs +0 -80
  117. package/dist/edit-BnEmMmv6.mjs.map +0 -1
  118. package/dist/edit-C4vRSmRy.mjs +0 -79
  119. package/dist/edit-C4vRSmRy.mjs.map +0 -1
  120. package/dist/edit-CQsW5gnk.mjs +0 -86
  121. package/dist/edit-CQsW5gnk.mjs.map +0 -1
  122. package/dist/editor-BIw1ALTF.mjs +0 -42
  123. package/dist/editor-BIw1ALTF.mjs.map +0 -1
  124. package/dist/envelope-overlays-DXXygxdF.mjs +0 -26
  125. package/dist/envelope-overlays-DXXygxdF.mjs.map +0 -1
  126. package/dist/get-B3Y5hAAO.mjs +0 -10
  127. package/dist/get-B3Y5hAAO.mjs.map +0 -1
  128. package/dist/get-C5fmd5Vf.mjs +0 -14
  129. package/dist/get-C5fmd5Vf.mjs.map +0 -1
  130. package/dist/get-Cdp2tmwz.mjs +0 -28
  131. package/dist/get-Cdp2tmwz.mjs.map +0 -1
  132. package/dist/get-D18ChSKU.mjs +0 -10
  133. package/dist/get-D18ChSKU.mjs.map +0 -1
  134. package/dist/get-NSHTGu4Y.mjs +0 -13
  135. package/dist/get-NSHTGu4Y.mjs.map +0 -1
  136. package/dist/get-XBPJr95m.mjs +0 -14
  137. package/dist/get-XBPJr95m.mjs.map +0 -1
  138. package/dist/list-B6703n9X.mjs +0 -10
  139. package/dist/list-B6703n9X.mjs.map +0 -1
  140. package/dist/list-BtNocJhc.mjs +0 -14
  141. package/dist/list-BtNocJhc.mjs.map +0 -1
  142. package/dist/list-C9dXrU9H.mjs +0 -10
  143. package/dist/list-C9dXrU9H.mjs.map +0 -1
  144. package/dist/list-CcwcYZgN.mjs +0 -10
  145. package/dist/list-CcwcYZgN.mjs.map +0 -1
  146. package/dist/list-Ctc8b5gT.mjs +0 -10
  147. package/dist/list-Ctc8b5gT.mjs.map +0 -1
  148. package/dist/list-b60JzCTw.mjs +0 -15
  149. package/dist/list-b60JzCTw.mjs.map +0 -1
  150. package/dist/litexml-codec-CfIxcPG0.mjs +0 -13451
  151. package/dist/litexml-codec-CfIxcPG0.mjs.map +0 -1
  152. package/dist/login-bZx4HaVs.mjs +0 -591
  153. package/dist/login-bZx4HaVs.mjs.map +0 -1
  154. package/dist/logout-C0Dzitsu.mjs +0 -18
  155. package/dist/logout-C0Dzitsu.mjs.map +0 -1
  156. package/dist/ls-wMiTXZPQ.mjs +0 -33
  157. package/dist/ls-wMiTXZPQ.mjs.map +0 -1
  158. package/dist/mark-Dh9BErsf.mjs +0 -29
  159. package/dist/mark-Dh9BErsf.mjs.map +0 -1
  160. package/dist/onboarding-Bw_I8qpf.mjs +0 -214
  161. package/dist/onboarding-Bw_I8qpf.mjs.map +0 -1
  162. package/dist/output-D2dDlyV2.d.mts +0 -16
  163. package/dist/output-vzequvhd.mjs +0 -163
  164. package/dist/output-vzequvhd.mjs.map +0 -1
  165. package/dist/payload-CO4zbNr8.mjs +0 -547
  166. package/dist/payload-CO4zbNr8.mjs.map +0 -1
  167. package/dist/profile-CNe2uWJi.mjs +0 -172
  168. package/dist/profile-CNe2uWJi.mjs.map +0 -1
  169. package/dist/publish-CzzucXQq.mjs +0 -23
  170. package/dist/publish-CzzucXQq.mjs.map +0 -1
  171. package/dist/publish-DRQkpxsz.mjs +0 -23
  172. package/dist/publish-DRQkpxsz.mjs.map +0 -1
  173. package/dist/resolve-BYg5Gees.mjs +0 -23
  174. package/dist/resolve-BYg5Gees.mjs.map +0 -1
  175. package/dist/resolve-BlpMdnaM.mjs +0 -16
  176. package/dist/resolve-BlpMdnaM.mjs.map +0 -1
  177. package/dist/resolve-CUsHGcb-.mjs +0 -119
  178. package/dist/resolve-CUsHGcb-.mjs.map +0 -1
  179. package/dist/resolve-helpers-CoHYa2uk.mjs +0 -30
  180. package/dist/resolve-helpers-CoHYa2uk.mjs.map +0 -1
  181. package/dist/resolve-jdb1VqAG.mjs +0 -26
  182. package/dist/resolve-jdb1VqAG.mjs.map +0 -1
  183. package/dist/rm-D-2iW1Cr.mjs +0 -33
  184. package/dist/rm-D-2iW1Cr.mjs.map +0 -1
  185. package/dist/run-Dnax6uhZ.mjs +0 -130
  186. package/dist/run-Dnax6uhZ.mjs.map +0 -1
  187. package/dist/self-update-CZywTwGd.mjs +0 -1610
  188. package/dist/self-update-CZywTwGd.mjs.map +0 -1
  189. package/dist/set-Dk28LAy5.mjs +0 -43
  190. package/dist/set-Dk28LAy5.mjs.map +0 -1
  191. package/dist/shared-d0_6ZPn_.mjs +0 -50
  192. package/dist/shared-d0_6ZPn_.mjs.map +0 -1
  193. package/dist/show-DScu6mXz.mjs +0 -39
  194. package/dist/show-DScu6mXz.mjs.map +0 -1
  195. package/dist/status-8F6tgphP.mjs +0 -23
  196. package/dist/status-8F6tgphP.mjs.map +0 -1
  197. package/dist/update-B1LGxV0n.mjs +0 -30
  198. package/dist/update-B1LGxV0n.mjs.map +0 -1
  199. package/dist/update-CXetpFT3.mjs +0 -28
  200. package/dist/update-CXetpFT3.mjs.map +0 -1
  201. package/dist/update-Dr4BW8U-.mjs +0 -30
  202. package/dist/update-Dr4BW8U-.mjs.map +0 -1
  203. package/dist/update-bqcHRJPC.mjs +0 -36
  204. package/dist/update-bqcHRJPC.mjs.map +0 -1
  205. package/dist/update-dBtzzmkN.mjs +0 -37
  206. package/dist/update-dBtzzmkN.mjs.map +0 -1
  207. package/dist/use-D7eKESSW.mjs +0 -29
  208. package/dist/use-D7eKESSW.mjs.map +0 -1
  209. package/dist/whoami-CKSNd6zL.mjs +0 -22
  210. package/dist/whoami-CKSNd6zL.mjs.map +0 -1
@@ -1 +0,0 @@
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":"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"}
@@ -1,547 +0,0 @@
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
- import path from "node:path";
4
- import { promises } from "node:fs";
5
- //#region src/core/content-spec.ts
6
- async function readContentSpec(spec, { cwd = process.cwd() } = {}) {
7
- if (spec === void 0) return null;
8
- if (spec === "-" || spec === "stdin") return {
9
- text: await readStdin(),
10
- origin: "stdin"
11
- };
12
- if (spec.startsWith("file=")) {
13
- const p = path.resolve(cwd, spec.slice(5));
14
- try {
15
- return {
16
- text: await promises.readFile(p, "utf8"),
17
- origin: "file",
18
- path: p
19
- };
20
- } catch (err) {
21
- throw new MxsError({
22
- code: MxsErrorCode.ValidationFailed,
23
- message: `failed to read ${p}: ${err?.message ?? err}`
24
- });
25
- }
26
- }
27
- return {
28
- text: spec,
29
- origin: "inline"
30
- };
31
- }
32
- async function readJsonSpec(spec) {
33
- if (spec === void 0) return void 0;
34
- if (spec.startsWith("file=")) {
35
- const p = path.resolve(process.cwd(), spec.slice(5));
36
- try {
37
- const text = await promises.readFile(p, "utf8");
38
- return JSON.parse(text);
39
- } catch (err) {
40
- throw new MxsError({
41
- code: MxsErrorCode.ValidationFailed,
42
- message: `failed to read JSON from ${p}: ${err?.message ?? err}`
43
- });
44
- }
45
- }
46
- try {
47
- return JSON.parse(spec);
48
- } catch (err) {
49
- throw new MxsError({
50
- code: MxsErrorCode.ValidationFailed,
51
- message: `failed to parse JSON: ${err?.message ?? err}`
52
- });
53
- }
54
- }
55
- async function readStdin() {
56
- if (process.stdin.isTTY) throw new MxsError({
57
- code: MxsErrorCode.ValidationFailed,
58
- message: "requested stdin content but stdin is a TTY"
59
- });
60
- const chunks = [];
61
- for await (const chunk of process.stdin) chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
62
- return Buffer.concat(chunks).toString("utf8");
63
- }
64
- //#endregion
65
- //#region src/core/envelope.ts
66
- const ROOT_TAGS = {
67
- post: "mxpost",
68
- note: "mxnote"
69
- };
70
- const ARRAY_TAGS = {
71
- tags: "tag",
72
- related: "id"
73
- };
74
- const SKIP_TEXT_RE = /^\s*$/;
75
- function kebabToCamel(name) {
76
- return name.replaceAll(/-([a-z])/g, (_, c) => c.toUpperCase());
77
- }
78
- function camelToKebab(name) {
79
- return name.replaceAll(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`);
80
- }
81
- function flagToTag(flag) {
82
- return kebabToCamel(flag.replace(/^--/, ""));
83
- }
84
- function tagToFlag(tag) {
85
- return `--${camelToKebab(tag)}`;
86
- }
87
- function tokenize(xml) {
88
- const tokens = [];
89
- let i = 0;
90
- let line = 1;
91
- while (i < xml.length) if (xml[i] === "<") {
92
- if (xml.startsWith("<!--", i)) {
93
- const end = xml.indexOf("-->", i + 4);
94
- if (end < 0) throw new MxsError({
95
- code: MxsErrorCode.ValidationXml,
96
- message: "unterminated XML comment",
97
- details: { line }
98
- });
99
- line += countLines(xml.slice(i, end + 3));
100
- i = end + 3;
101
- continue;
102
- }
103
- if (xml.startsWith("<![CDATA[", i)) {
104
- const end = xml.indexOf("]]>", i + 9);
105
- if (end < 0) throw new MxsError({
106
- code: MxsErrorCode.ValidationXml,
107
- message: "unterminated CDATA",
108
- details: { line }
109
- });
110
- const inner = xml.slice(i + 9, end);
111
- tokens.push({
112
- kind: "cdata",
113
- text: inner,
114
- line
115
- });
116
- line += countLines(xml.slice(i, end + 3));
117
- i = end + 3;
118
- continue;
119
- }
120
- const close = xml.indexOf(">", i);
121
- if (close < 0) throw new MxsError({
122
- code: MxsErrorCode.ValidationXml,
123
- message: "unterminated tag",
124
- details: { line }
125
- });
126
- const raw = xml.slice(i + 1, close).trim();
127
- if (raw.startsWith("/")) tokens.push({
128
- kind: "close",
129
- name: raw.slice(1).trim(),
130
- line
131
- });
132
- else if (raw.endsWith("/")) {
133
- const name = raw.slice(0, -1).trim().split(/\s+/)[0] ?? "";
134
- tokens.push({
135
- kind: "self",
136
- name,
137
- raw,
138
- line
139
- });
140
- } else {
141
- const name = raw.split(/\s+/)[0] ?? "";
142
- tokens.push({
143
- kind: "open",
144
- name,
145
- raw,
146
- line
147
- });
148
- }
149
- line += countLines(xml.slice(i, close + 1));
150
- i = close + 1;
151
- } else {
152
- const next = xml.indexOf("<", i);
153
- const text = xml.slice(i, next < 0 ? xml.length : next);
154
- tokens.push({
155
- kind: "text",
156
- text,
157
- line
158
- });
159
- line += countLines(text);
160
- i = next < 0 ? xml.length : next;
161
- }
162
- return tokens;
163
- }
164
- function countLines(s) {
165
- let count = 0;
166
- for (let i = 0; i < s.length; i++) if (s.charCodeAt(i) === 10) count++;
167
- return count;
168
- }
169
- function decodeXmlEntities(s) {
170
- return s.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"").replaceAll("&apos;", "'").replaceAll("&amp;", "&");
171
- }
172
- function parseEnvelope(xml, kind) {
173
- const tokens = tokenize(xml);
174
- const rootName = ROOT_TAGS[kind];
175
- const rootStart = tokens.findIndex((t) => t.kind === "open" && t.name === rootName);
176
- if (rootStart < 0) throw new MxsError({
177
- code: MxsErrorCode.ValidationXml,
178
- message: `expected root <${rootName}>`,
179
- details: { line: 1 }
180
- });
181
- let depth = 0;
182
- let rootEnd = -1;
183
- for (let i = rootStart; i < tokens.length; i++) {
184
- const t = tokens[i];
185
- if (t.kind === "open" && t.name === rootName) depth++;
186
- else if (t.kind === "close" && t.name === rootName) {
187
- depth--;
188
- if (depth === 0) {
189
- rootEnd = i;
190
- break;
191
- }
192
- }
193
- }
194
- if (rootEnd < 0) throw new MxsError({
195
- code: MxsErrorCode.ValidationXml,
196
- message: `unterminated <${rootName}>`,
197
- details: { line: tokens[rootStart]?.line ?? 1 }
198
- });
199
- const inner = tokens.slice(rootStart + 1, rootEnd);
200
- const meta = {};
201
- const sourceMap = {};
202
- let contentXml = "";
203
- let i = 0;
204
- while (i < inner.length) {
205
- const t = inner[i];
206
- if (t.kind === "text" || t.kind === "cdata") {
207
- i++;
208
- continue;
209
- }
210
- if (t.kind === "open" && t.name === "meta") {
211
- const closeIdx = findMatchingClose(inner, i, "meta");
212
- parseMeta(inner.slice(i + 1, closeIdx), meta, sourceMap);
213
- i = closeIdx + 1;
214
- continue;
215
- }
216
- if (t.kind === "open" && t.name === "content") {
217
- const closeIdx = findMatchingClose(inner, i, "content");
218
- contentXml = renderInnerXml(inner.slice(i + 1, closeIdx));
219
- sourceMap.content = t.line;
220
- i = closeIdx + 1;
221
- continue;
222
- }
223
- if (t.kind === "self" && t.name === "content") {
224
- contentXml = "";
225
- sourceMap.content = t.line;
226
- i++;
227
- continue;
228
- }
229
- if (t.kind === "open" || t.kind === "self") throw new MxsError({
230
- code: MxsErrorCode.ValidationXml,
231
- message: `unexpected <${t.name}> at root`,
232
- details: { line: t.line }
233
- });
234
- i++;
235
- }
236
- return {
237
- kind,
238
- meta,
239
- contentXml,
240
- sourceMap
241
- };
242
- }
243
- function findMatchingClose(tokens, startOpen, name) {
244
- let depth = 0;
245
- for (let i = startOpen; i < tokens.length; i++) {
246
- const t = tokens[i];
247
- if (t.kind === "open" && t.name === name) depth++;
248
- else if (t.kind === "close" && t.name === name) {
249
- depth--;
250
- if (depth === 0) return i;
251
- }
252
- }
253
- throw new MxsError({
254
- code: MxsErrorCode.ValidationXml,
255
- message: `unterminated <${name}>`,
256
- details: { line: tokens[startOpen]?.line ?? 1 }
257
- });
258
- }
259
- function parseMeta(tokens, meta, sourceMap) {
260
- let i = 0;
261
- while (i < tokens.length) {
262
- const t = tokens[i];
263
- if (t.kind === "text" || t.kind === "cdata") {
264
- i++;
265
- continue;
266
- }
267
- if (t.kind === "close") {
268
- i++;
269
- continue;
270
- }
271
- if (t.kind === "self") {
272
- const key = t.name;
273
- meta[key] = "";
274
- sourceMap[`meta.${key}`] = t.line;
275
- i++;
276
- continue;
277
- }
278
- if (t.kind === "open") {
279
- const name = t.name;
280
- const closeIdx = findMatchingClose(tokens, i, name);
281
- const inner = tokens.slice(i + 1, closeIdx);
282
- if (ARRAY_TAGS[name]) {
283
- const childTag = ARRAY_TAGS[name];
284
- const items = [];
285
- let j = 0;
286
- while (j < inner.length) {
287
- const c = inner[j];
288
- if (c.kind === "open" && c.name === childTag) {
289
- const cc = findMatchingClose(inner, j, childTag);
290
- items.push(textOf(inner.slice(j + 1, cc)));
291
- j = cc + 1;
292
- } else j++;
293
- }
294
- meta[name] = items;
295
- } else meta[name] = textOf(inner);
296
- sourceMap[`meta.${name}`] = t.line;
297
- i = closeIdx + 1;
298
- continue;
299
- }
300
- i++;
301
- }
302
- }
303
- function textOf(tokens) {
304
- let s = "";
305
- for (const t of tokens) if (t.kind === "text" && t.text) s += t.text;
306
- else if (t.kind === "cdata" && t.text) s += t.text;
307
- return decodeXmlEntities(s).trim();
308
- }
309
- function renderInnerXml(tokens) {
310
- let out = "";
311
- for (const t of tokens) if (t.kind === "text") out += t.text ?? "";
312
- else if (t.kind === "cdata") out += `<![CDATA[${t.text ?? ""}]]>`;
313
- else if (t.kind === "open") out += `<${t.raw ?? t.name}>`;
314
- else if (t.kind === "self") out += `<${t.raw ?? `${t.name}/`}>`;
315
- else if (t.kind === "close") out += `</${t.name}>`;
316
- if (out.startsWith("\n")) out = out.slice(1);
317
- if (out.endsWith("\n")) out = out.slice(0, -1);
318
- if (SKIP_TEXT_RE.test(out)) return "";
319
- return out;
320
- }
321
- function coerceMeta(raw) {
322
- const out = {};
323
- const get = (key) => raw[key];
324
- const title = get("title");
325
- if (typeof title === "string") out.title = title;
326
- const slug = get("slug");
327
- if (typeof slug === "string") out.slug = slug;
328
- const category = get("category");
329
- if (typeof category === "string") out.category = category;
330
- const topic = get("topic");
331
- if (typeof topic === "string") out.topic = topic;
332
- const summary = get("summary");
333
- if (typeof summary === "string") out.summary = summary;
334
- const state = get("state");
335
- if (state === "publish" || state === "draft") out.state = state;
336
- const copyright = get("copyright");
337
- if (typeof copyright === "string") out.copyright = copyright === "true";
338
- const pin = get("pin");
339
- if (typeof pin === "string") out.pin = pin;
340
- const pinOrder = get("pinOrder");
341
- if (typeof pinOrder === "string" && pinOrder.length > 0) {
342
- const n = Number(pinOrder);
343
- if (!Number.isNaN(n)) out.pinOrder = n;
344
- }
345
- const tags = get("tags");
346
- if (Array.isArray(tags)) out.tags = tags;
347
- const related = get("related");
348
- if (Array.isArray(related)) out.related = related;
349
- const mood = get("mood");
350
- if (typeof mood === "string") out.mood = mood;
351
- const weather = get("weather");
352
- if (typeof weather === "string") out.weather = weather;
353
- const publicAt = get("publicAt");
354
- if (typeof publicAt === "string") out.publicAt = publicAt;
355
- const password = get("password");
356
- if (typeof password === "string") out.password = password;
357
- const bookmark = get("bookmark");
358
- if (typeof bookmark === "string") out.bookmark = bookmark === "true";
359
- const location = get("location");
360
- if (typeof location === "string") out.location = location;
361
- const subtitle = get("subtitle");
362
- if (typeof subtitle === "string") out.subtitle = subtitle;
363
- const order = get("order");
364
- if (typeof order === "string" && order.length > 0) {
365
- const n = Number(order);
366
- if (!Number.isNaN(n)) out.order = n;
367
- }
368
- const format = get("format");
369
- if (format === "lexical" || format === "markdown") out.format = format;
370
- return out;
371
- }
372
- //#endregion
373
- //#region src/core/payload.ts
374
- async function loadEnvelopeIfAny(filePath, kind) {
375
- if (!filePath) return null;
376
- if (filePath === "-" || filePath === "stdin" || filePath === "/dev/stdin") return parseEnvelope(await readStdin(), kind);
377
- if (filePath.startsWith("file=")) return parseEnvelope((await readContentSpec(filePath))?.text ?? "", kind);
378
- return parseEnvelope(await promises.readFile(filePath, "utf8").catch((err) => {
379
- throw new MxsError({
380
- code: MxsErrorCode.ValidationFailed,
381
- message: `failed to read ${filePath}: ${err?.message ?? err}`
382
- });
383
- }), kind);
384
- }
385
- async function buildPostPayload(flags) {
386
- const envelope = await loadEnvelopeIfAny(flags.file, "post");
387
- const envMeta = envelope ? coerceMeta(envelope.meta) : {};
388
- const payload = {};
389
- const title = flags.title ?? envMeta.title;
390
- if (title !== void 0) payload.title = title;
391
- const slug = flags.slug ?? envMeta.slug;
392
- if (slug !== void 0) payload.slug = slug;
393
- if (flags.category) payload.__categoryName = flags.category;
394
- else if (envMeta.category) payload.__categoryName = envMeta.category;
395
- const summary = flags.summary ?? envMeta.summary;
396
- if (summary !== void 0) payload.summary = summary;
397
- const state = flags.state ?? envMeta.state;
398
- if (state !== void 0) payload.isPublished = state === "publish";
399
- const tags = flags.tags ?? envMeta.tags;
400
- if (tags !== void 0) payload.tags = tags;
401
- const copyright = flags.copyright ?? envMeta.copyright;
402
- if (copyright !== void 0) payload.copyright = copyright;
403
- const pin = flags.pin ?? envMeta.pin;
404
- if (pin !== void 0) payload.pin = pin;
405
- const pinOrder = flags.pinOrder ?? envMeta.pinOrder;
406
- if (pinOrder !== void 0) payload.pinOrder = pinOrder;
407
- const related = flags.related ?? envMeta.related;
408
- if (related !== void 0) payload.relatedId = related;
409
- if (flags.meta !== void 0) payload.meta = await readJsonSpec(flags.meta);
410
- const format = flags.format ?? envMeta.format ?? "lexical";
411
- payload.contentFormat = format;
412
- const contentSrc = await resolveContent(flags.content, envelope, format);
413
- if (contentSrc) {
414
- payload.content = contentSrc.content;
415
- payload.text = contentSrc.text;
416
- }
417
- return {
418
- payload,
419
- envelopeMeta: envMeta,
420
- contentSource: contentSrc?.origin ?? "none"
421
- };
422
- }
423
- async function buildNotePayload(flags) {
424
- const envelope = await loadEnvelopeIfAny(flags.file, "note");
425
- const envMeta = envelope ? coerceMeta(envelope.meta) : {};
426
- const payload = {};
427
- payload.title = flags.title ?? envMeta.title ?? "无题";
428
- const slug = flags.slug ?? envMeta.slug;
429
- if (slug !== void 0) payload.slug = slug;
430
- if (flags.topic) payload.__topicName = flags.topic;
431
- else if (envMeta.topic) payload.__topicName = envMeta.topic;
432
- const state = flags.state ?? envMeta.state;
433
- if (state !== void 0) payload.isPublished = state === "publish";
434
- const mood = flags.mood ?? envMeta.mood;
435
- if (mood !== void 0) payload.mood = mood;
436
- const weather = flags.weather ?? envMeta.weather;
437
- if (weather !== void 0) payload.weather = weather;
438
- const publicAt = flags.publicAt ?? envMeta.publicAt;
439
- if (publicAt !== void 0) payload.publicAt = publicAt;
440
- const password = flags.password ?? envMeta.password;
441
- if (password !== void 0) payload.password = password;
442
- const bookmark = flags.bookmark ?? envMeta.bookmark;
443
- if (bookmark !== void 0) payload.bookmark = bookmark;
444
- const location = flags.location ?? envMeta.location;
445
- if (location !== void 0) payload.location = location;
446
- if (flags.coords) {
447
- const [latRaw, lngRaw] = flags.coords.split(",").map((s) => s.trim());
448
- const lat = Number(latRaw);
449
- const lng = Number(lngRaw);
450
- if (Number.isNaN(lat) || Number.isNaN(lng)) throw new MxsError({
451
- code: MxsErrorCode.ValidationFailed,
452
- message: `invalid --coords value "${flags.coords}", expected "lat,lng"`
453
- });
454
- payload.coordinates = {
455
- latitude: lat,
456
- longitude: lng
457
- };
458
- }
459
- if (flags.images !== void 0) payload.images = await readJsonSpec(flags.images);
460
- if (flags.meta !== void 0) payload.meta = await readJsonSpec(flags.meta);
461
- const format = flags.format ?? envMeta.format ?? "lexical";
462
- payload.contentFormat = format;
463
- const contentSrc = await resolveContent(flags.content, envelope, format);
464
- if (contentSrc) {
465
- payload.content = contentSrc.content;
466
- payload.text = contentSrc.text;
467
- }
468
- return {
469
- payload,
470
- envelopeMeta: envMeta,
471
- contentSource: contentSrc?.origin ?? "none"
472
- };
473
- }
474
- async function buildPagePayload(flags) {
475
- const envelope = await loadEnvelopeIfAny(flags.file, "post");
476
- const envMeta = envelope ? coerceMeta(envelope.meta) : {};
477
- const payload = {};
478
- const title = flags.title ?? envMeta.title;
479
- if (title !== void 0) payload.title = title;
480
- const slug = flags.slug ?? envMeta.slug;
481
- if (slug !== void 0) payload.slug = slug;
482
- const subtitle = flags.subtitle ?? envMeta.subtitle;
483
- if (subtitle !== void 0) payload.subtitle = subtitle;
484
- const order = flags.order ?? envMeta.order;
485
- if (order !== void 0) payload.order = order;
486
- if (flags.meta !== void 0) payload.meta = await readJsonSpec(flags.meta);
487
- const format = flags.format ?? envMeta.format ?? "lexical";
488
- payload.contentFormat = format;
489
- const contentSrc = await resolveContent(flags.content, envelope, format);
490
- if (contentSrc) {
491
- payload.content = contentSrc.content;
492
- payload.text = contentSrc.text;
493
- }
494
- return {
495
- payload,
496
- envelopeMeta: envMeta,
497
- contentSource: contentSrc?.origin ?? "none"
498
- };
499
- }
500
- async function resolveContent(flagSpec, envelope, format) {
501
- let source = null;
502
- if (flagSpec !== void 0) {
503
- const src = await readContentSpec(flagSpec);
504
- if (src) source = {
505
- text: src.text,
506
- origin: "flag"
507
- };
508
- } else if (envelope) source = {
509
- text: envelope.contentXml,
510
- origin: "envelope"
511
- };
512
- if (!source) return null;
513
- if (format === "markdown") return {
514
- content: source.text,
515
- text: source.text,
516
- origin: source.origin
517
- };
518
- if (source.text.length === 0) throw new MxsError({
519
- code: MxsErrorCode.ValidationFailed,
520
- message: "content is required when contentFormat is lexical",
521
- details: { issues: [{
522
- path: ["content"],
523
- message: "required"
524
- }] }
525
- });
526
- const state = parseToLexical(source.text);
527
- return {
528
- content: JSON.stringify(state),
529
- text: deriveTextFromLexical(state),
530
- origin: source.origin
531
- };
532
- }
533
- function emptyPayload(format) {
534
- if (format === "markdown") return {
535
- content: "",
536
- text: ""
537
- };
538
- const state = emptyLexicalState();
539
- return {
540
- content: JSON.stringify(state),
541
- text: ""
542
- };
543
- }
544
- //#endregion
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
-
547
- //# sourceMappingURL=payload-CO4zbNr8.mjs.map
@@ -1 +0,0 @@
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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"}