@mx-space/cli 0.1.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 (190) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +375 -0
  3. package/ROADMAP.md +42 -0
  4. package/bin/mxs.cjs +40 -0
  5. package/dist/Lexical.dev-DpU35QTu.mjs +10992 -0
  6. package/dist/Lexical.dev-DpU35QTu.mjs.map +1 -0
  7. package/dist/Lexical.node-gYNDt_p9.mjs +247 -0
  8. package/dist/Lexical.node-gYNDt_p9.mjs.map +1 -0
  9. package/dist/Lexical.prod-t4c3bHV3.mjs +5579 -0
  10. package/dist/Lexical.prod-t4c3bHV3.mjs.map +1 -0
  11. package/dist/LexicalClipboard.dev-CdeeWCIq.mjs +496 -0
  12. package/dist/LexicalClipboard.dev-CdeeWCIq.mjs.map +1 -0
  13. package/dist/LexicalClipboard.node-0e9GBL1g.mjs +26 -0
  14. package/dist/LexicalClipboard.node-0e9GBL1g.mjs.map +1 -0
  15. package/dist/LexicalClipboard.prod-CsCWYmV7.mjs +293 -0
  16. package/dist/LexicalClipboard.prod-CsCWYmV7.mjs.map +1 -0
  17. package/dist/LexicalCodeCore.dev-haI2cqH8.mjs +539 -0
  18. package/dist/LexicalCodeCore.dev-haI2cqH8.mjs.map +1 -0
  19. package/dist/LexicalCodeCore.prod-D_k7zuE5.mjs +383 -0
  20. package/dist/LexicalCodeCore.prod-D_k7zuE5.mjs.map +1 -0
  21. package/dist/LexicalDragon.dev-CAggdFh_.mjs +90 -0
  22. package/dist/LexicalDragon.dev-CAggdFh_.mjs.map +1 -0
  23. package/dist/LexicalDragon.node-QMR_wqJg.mjs +15 -0
  24. package/dist/LexicalDragon.node-QMR_wqJg.mjs.map +1 -0
  25. package/dist/LexicalDragon.prod-OssQhwS-.mjs +61 -0
  26. package/dist/LexicalDragon.prod-OssQhwS-.mjs.map +1 -0
  27. package/dist/LexicalExtension.dev-CtDZiMCU.mjs +1665 -0
  28. package/dist/LexicalExtension.dev-CtDZiMCU.mjs.map +1 -0
  29. package/dist/LexicalExtension.node-BM0gh8zu.mjs +51 -0
  30. package/dist/LexicalExtension.node-BM0gh8zu.mjs.map +1 -0
  31. package/dist/LexicalExtension.prod-Ug6emhEO.mjs +971 -0
  32. package/dist/LexicalExtension.prod-Ug6emhEO.mjs.map +1 -0
  33. package/dist/LexicalHeadless.dev-D4yQpl_s.mjs +45 -0
  34. package/dist/LexicalHeadless.dev-D4yQpl_s.mjs.map +1 -0
  35. package/dist/LexicalHeadless.prod-jeN65B3k.mjs +31 -0
  36. package/dist/LexicalHeadless.prod-jeN65B3k.mjs.map +1 -0
  37. package/dist/LexicalHtml.dev-BdU1_ITQ.mjs +686 -0
  38. package/dist/LexicalHtml.dev-BdU1_ITQ.mjs.map +1 -0
  39. package/dist/LexicalHtml.node-DLtAh00E.mjs +26 -0
  40. package/dist/LexicalHtml.node-DLtAh00E.mjs.map +1 -0
  41. package/dist/LexicalHtml.prod-DdLE1HHT.mjs +432 -0
  42. package/dist/LexicalHtml.prod-DdLE1HHT.mjs.map +1 -0
  43. package/dist/LexicalLink.dev-DK87Biuy.mjs +1084 -0
  44. package/dist/LexicalLink.dev-DK87Biuy.mjs.map +1 -0
  45. package/dist/LexicalLink.prod-fssuv6Sf.mjs +717 -0
  46. package/dist/LexicalLink.prod-fssuv6Sf.mjs.map +1 -0
  47. package/dist/LexicalList.dev-BJ4dr_rk.mjs +1352 -0
  48. package/dist/LexicalList.dev-BJ4dr_rk.mjs.map +1 -0
  49. package/dist/LexicalList.prod-jWBbaWfi.mjs +841 -0
  50. package/dist/LexicalList.prod-jWBbaWfi.mjs.map +1 -0
  51. package/dist/LexicalMarkdown.dev-C8e-eh6y.mjs +1207 -0
  52. package/dist/LexicalMarkdown.dev-C8e-eh6y.mjs.map +1 -0
  53. package/dist/LexicalMarkdown.prod-k73tZVb2.mjs +756 -0
  54. package/dist/LexicalMarkdown.prod-k73tZVb2.mjs.map +1 -0
  55. package/dist/LexicalRichText.dev-CrSqq3K-.mjs +645 -0
  56. package/dist/LexicalRichText.dev-CrSqq3K-.mjs.map +1 -0
  57. package/dist/LexicalRichText.node-B7k7wlQz.mjs +106 -0
  58. package/dist/LexicalRichText.node-B7k7wlQz.mjs.map +1 -0
  59. package/dist/LexicalRichText.prod-CqvyxQ9m.mjs +429 -0
  60. package/dist/LexicalRichText.prod-CqvyxQ9m.mjs.map +1 -0
  61. package/dist/LexicalSelection.dev-sNOHKHe_.mjs +725 -0
  62. package/dist/LexicalSelection.dev-sNOHKHe_.mjs.map +1 -0
  63. package/dist/LexicalSelection.node-Di7GwBCZ.mjs +38 -0
  64. package/dist/LexicalSelection.node-Di7GwBCZ.mjs.map +1 -0
  65. package/dist/LexicalSelection.prod-SWllPJop.mjs +388 -0
  66. package/dist/LexicalSelection.prod-SWllPJop.mjs.map +1 -0
  67. package/dist/LexicalTable.dev-CQkLHXJx.mjs +3262 -0
  68. package/dist/LexicalTable.dev-CQkLHXJx.mjs.map +1 -0
  69. package/dist/LexicalTable.prod-BtqCwKSi.mjs +2218 -0
  70. package/dist/LexicalTable.prod-BtqCwKSi.mjs.map +1 -0
  71. package/dist/LexicalUtils.dev-DiUpsXE8.mjs +850 -0
  72. package/dist/LexicalUtils.dev-DiUpsXE8.mjs.map +1 -0
  73. package/dist/LexicalUtils.node-CmK462d1.mjs +66 -0
  74. package/dist/LexicalUtils.node-CmK462d1.mjs.map +1 -0
  75. package/dist/LexicalUtils.prod-bWwV4GAF.mjs +377 -0
  76. package/dist/LexicalUtils.prod-bWwV4GAF.mjs.map +1 -0
  77. package/dist/auth-DIFZzoMm.mjs +211 -0
  78. package/dist/auth-DIFZzoMm.mjs.map +1 -0
  79. package/dist/bin/mxs.d.mts +927 -0
  80. package/dist/bin/mxs.mjs +3249 -0
  81. package/dist/bin/mxs.mjs.map +1 -0
  82. package/dist/chunk-hT5z_Zn9.mjs +35 -0
  83. package/dist/config-store-DIu7x0ao.mjs +121 -0
  84. package/dist/config-store-DIu7x0ao.mjs.map +1 -0
  85. package/dist/create-B2AOQL1e.mjs +24 -0
  86. package/dist/create-B2AOQL1e.mjs.map +1 -0
  87. package/dist/create-CwjGcv2n.mjs +23 -0
  88. package/dist/create-CwjGcv2n.mjs.map +1 -0
  89. package/dist/create-DT1l2hue.mjs +23 -0
  90. package/dist/create-DT1l2hue.mjs.map +1 -0
  91. package/dist/create-DjlRHPXy.mjs +23 -0
  92. package/dist/create-DjlRHPXy.mjs.map +1 -0
  93. package/dist/create-Dz6rJJSS.mjs +19 -0
  94. package/dist/create-Dz6rJJSS.mjs.map +1 -0
  95. package/dist/delete-B4dGrrus.mjs +22 -0
  96. package/dist/delete-B4dGrrus.mjs.map +1 -0
  97. package/dist/delete-BH6ZngTz.mjs +22 -0
  98. package/dist/delete-BH6ZngTz.mjs.map +1 -0
  99. package/dist/delete-BrY5zJ6S.mjs +22 -0
  100. package/dist/delete-BrY5zJ6S.mjs.map +1 -0
  101. package/dist/delete-CaG2d_xt.mjs +31 -0
  102. package/dist/delete-CaG2d_xt.mjs.map +1 -0
  103. package/dist/delete-YzRliRn8.mjs +31 -0
  104. package/dist/delete-YzRliRn8.mjs.map +1 -0
  105. package/dist/document-output-BVB8emLt.mjs +145 -0
  106. package/dist/document-output-BVB8emLt.mjs.map +1 -0
  107. package/dist/edit-Bb0Ze4w6.mjs +79 -0
  108. package/dist/edit-Bb0Ze4w6.mjs.map +1 -0
  109. package/dist/edit-BeFmC3XD.mjs +80 -0
  110. package/dist/edit-BeFmC3XD.mjs.map +1 -0
  111. package/dist/edit-DLDw_ZWX.mjs +86 -0
  112. package/dist/edit-DLDw_ZWX.mjs.map +1 -0
  113. package/dist/edit-z55ofr1S.mjs +40 -0
  114. package/dist/edit-z55ofr1S.mjs.map +1 -0
  115. package/dist/editor-xrF-j3UE.mjs +42 -0
  116. package/dist/editor-xrF-j3UE.mjs.map +1 -0
  117. package/dist/envelope-overlays-DPAlMNW1.mjs +26 -0
  118. package/dist/envelope-overlays-DPAlMNW1.mjs.map +1 -0
  119. package/dist/get-2qjq0wgG.mjs +28 -0
  120. package/dist/get-2qjq0wgG.mjs.map +1 -0
  121. package/dist/get-BGAk1Zmv.mjs +14 -0
  122. package/dist/get-BGAk1Zmv.mjs.map +1 -0
  123. package/dist/get-CRR13lgj.mjs +10 -0
  124. package/dist/get-CRR13lgj.mjs.map +1 -0
  125. package/dist/get-ClkpDBTL.mjs +13 -0
  126. package/dist/get-ClkpDBTL.mjs.map +1 -0
  127. package/dist/get-DJfUJ3sP.mjs +10 -0
  128. package/dist/get-DJfUJ3sP.mjs.map +1 -0
  129. package/dist/get-DiqaQvoS.mjs +14 -0
  130. package/dist/get-DiqaQvoS.mjs.map +1 -0
  131. package/dist/index.d.mts +338 -0
  132. package/dist/index.mjs +10 -0
  133. package/dist/list-BYzhflDg.mjs +14 -0
  134. package/dist/list-BYzhflDg.mjs.map +1 -0
  135. package/dist/list-DY-tPNG-.mjs +10 -0
  136. package/dist/list-DY-tPNG-.mjs.map +1 -0
  137. package/dist/list-DlQSkbqx.mjs +10 -0
  138. package/dist/list-DlQSkbqx.mjs.map +1 -0
  139. package/dist/list-DsrA5wIz.mjs +15 -0
  140. package/dist/list-DsrA5wIz.mjs.map +1 -0
  141. package/dist/list-Fp4nKfQb.mjs +10 -0
  142. package/dist/list-Fp4nKfQb.mjs.map +1 -0
  143. package/dist/list-s_tloiEX.mjs +10 -0
  144. package/dist/list-s_tloiEX.mjs.map +1 -0
  145. package/dist/litexml-codec-CDoRloiR.mjs +13451 -0
  146. package/dist/litexml-codec-CDoRloiR.mjs.map +1 -0
  147. package/dist/login-CLOJ-fTJ.mjs +579 -0
  148. package/dist/login-CLOJ-fTJ.mjs.map +1 -0
  149. package/dist/logout-v8ihxsim.mjs +11 -0
  150. package/dist/logout-v8ihxsim.mjs.map +1 -0
  151. package/dist/onboarding-640IldLz.mjs +888 -0
  152. package/dist/onboarding-640IldLz.mjs.map +1 -0
  153. package/dist/output-BM7aBFwt.mjs +120 -0
  154. package/dist/output-BM7aBFwt.mjs.map +1 -0
  155. package/dist/output-CTnO1lYt.d.mts +16 -0
  156. package/dist/payload-CN11pUto.mjs +547 -0
  157. package/dist/payload-CN11pUto.mjs.map +1 -0
  158. package/dist/publish-DkTYB-eK.mjs +23 -0
  159. package/dist/publish-DkTYB-eK.mjs.map +1 -0
  160. package/dist/publish-pRBfTJfe.mjs +23 -0
  161. package/dist/publish-pRBfTJfe.mjs.map +1 -0
  162. package/dist/resolve-BogJOR7R.mjs +119 -0
  163. package/dist/resolve-BogJOR7R.mjs.map +1 -0
  164. package/dist/resolve-Bp1AfBmM.mjs +26 -0
  165. package/dist/resolve-Bp1AfBmM.mjs.map +1 -0
  166. package/dist/resolve-Bw5Po9yK.mjs +16 -0
  167. package/dist/resolve-Bw5Po9yK.mjs.map +1 -0
  168. package/dist/resolve-CyjMlaoJ.mjs +23 -0
  169. package/dist/resolve-CyjMlaoJ.mjs.map +1 -0
  170. package/dist/resolve-helpers-CahPoJ0Y.mjs +30 -0
  171. package/dist/resolve-helpers-CahPoJ0Y.mjs.map +1 -0
  172. package/dist/set-BEGQz2si.mjs +43 -0
  173. package/dist/set-BEGQz2si.mjs.map +1 -0
  174. package/dist/shared-D0HVBDHI.mjs +39 -0
  175. package/dist/shared-D0HVBDHI.mjs.map +1 -0
  176. package/dist/status-LXrN9fI-.mjs +22 -0
  177. package/dist/status-LXrN9fI-.mjs.map +1 -0
  178. package/dist/update-B9ynFCdZ.mjs +30 -0
  179. package/dist/update-B9ynFCdZ.mjs.map +1 -0
  180. package/dist/update-BMZQPOvR.mjs +28 -0
  181. package/dist/update-BMZQPOvR.mjs.map +1 -0
  182. package/dist/update-BXz0l7Lz.mjs +36 -0
  183. package/dist/update-BXz0l7Lz.mjs.map +1 -0
  184. package/dist/update-Dx6AF8tf.mjs +30 -0
  185. package/dist/update-Dx6AF8tf.mjs.map +1 -0
  186. package/dist/update-q66TLS38.mjs +37 -0
  187. package/dist/update-q66TLS38.mjs.map +1 -0
  188. package/dist/whoami-CTkctOEd.mjs +22 -0
  189. package/dist/whoami-CTkctOEd.mjs.map +1 -0
  190. package/package.json +77 -0
@@ -0,0 +1,547 @@
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";
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: "validation.failed",
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: "validation.failed",
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: "validation.failed",
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: "validation.failed",
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: "validation.xml",
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: "validation.xml",
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: "validation.xml",
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: "validation.xml",
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: "validation.xml",
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: "validation.xml",
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: "validation.xml",
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: "validation.failed",
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: "validation.failed",
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: "validation.failed",
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-CN11pUto.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-CN11pUto.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 } 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: 'validation.failed',\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: 'validation.failed',\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: 'validation.failed',\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: 'validation.failed',\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 } 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: 'validation.xml',\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: 'validation.xml',\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: 'validation.xml',\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: 'validation.xml',\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: 'validation.xml',\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: 'validation.xml',\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: 'validation.xml',\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 } 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: 'validation.failed',\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: 'validation.failed',\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: 'validation.failed',\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,23 @@
1
+ import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
2
+ import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
3
+ import { t as resolvePostId } from "./resolve-Bp1AfBmM.mjs";
4
+ //#region src/commands/post/publish.ts
5
+ async function run(slugOrId, publish, flags, out) {
6
+ const client = buildApiClient(await resolveContext(flags, out), flags);
7
+ const id = await resolvePostId(client, slugOrId);
8
+ if (flags.dryRun) {
9
+ emitSuccess({ would_set: {
10
+ id,
11
+ isPublished: publish
12
+ } }, out);
13
+ return;
14
+ }
15
+ emitSuccess((await client.request(`/posts/${id}`, {
16
+ method: "PATCH",
17
+ body: { isPublished: publish }
18
+ })).data, out);
19
+ }
20
+ //#endregion
21
+ export { run };
22
+
23
+ //# sourceMappingURL=publish-DkTYB-eK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-DkTYB-eK.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"}
@@ -0,0 +1,23 @@
1
+ import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
2
+ import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
3
+ import { t as resolveNoteId } from "./resolve-CyjMlaoJ.mjs";
4
+ //#region src/commands/note/publish.ts
5
+ async function run(slugOrId, publish, flags, out) {
6
+ const client = buildApiClient(await resolveContext(flags, out), flags);
7
+ const id = await resolveNoteId(client, slugOrId);
8
+ if (flags.dryRun) {
9
+ emitSuccess({ would_set: {
10
+ id,
11
+ isPublished: publish
12
+ } }, out);
13
+ return;
14
+ }
15
+ emitSuccess((await client.request(`/notes/${id}/publish`, {
16
+ method: "PATCH",
17
+ body: { isPublished: publish }
18
+ })).data, out);
19
+ }
20
+ //#endregion
21
+ export { run };
22
+
23
+ //# sourceMappingURL=publish-pRBfTJfe.mjs.map