@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.
- package/LICENSE +33 -0
- package/README.md +375 -0
- package/ROADMAP.md +42 -0
- package/bin/mxs.cjs +40 -0
- package/dist/Lexical.dev-DpU35QTu.mjs +10992 -0
- package/dist/Lexical.dev-DpU35QTu.mjs.map +1 -0
- package/dist/Lexical.node-gYNDt_p9.mjs +247 -0
- package/dist/Lexical.node-gYNDt_p9.mjs.map +1 -0
- package/dist/Lexical.prod-t4c3bHV3.mjs +5579 -0
- package/dist/Lexical.prod-t4c3bHV3.mjs.map +1 -0
- package/dist/LexicalClipboard.dev-CdeeWCIq.mjs +496 -0
- package/dist/LexicalClipboard.dev-CdeeWCIq.mjs.map +1 -0
- package/dist/LexicalClipboard.node-0e9GBL1g.mjs +26 -0
- package/dist/LexicalClipboard.node-0e9GBL1g.mjs.map +1 -0
- package/dist/LexicalClipboard.prod-CsCWYmV7.mjs +293 -0
- package/dist/LexicalClipboard.prod-CsCWYmV7.mjs.map +1 -0
- package/dist/LexicalCodeCore.dev-haI2cqH8.mjs +539 -0
- package/dist/LexicalCodeCore.dev-haI2cqH8.mjs.map +1 -0
- package/dist/LexicalCodeCore.prod-D_k7zuE5.mjs +383 -0
- package/dist/LexicalCodeCore.prod-D_k7zuE5.mjs.map +1 -0
- package/dist/LexicalDragon.dev-CAggdFh_.mjs +90 -0
- package/dist/LexicalDragon.dev-CAggdFh_.mjs.map +1 -0
- package/dist/LexicalDragon.node-QMR_wqJg.mjs +15 -0
- package/dist/LexicalDragon.node-QMR_wqJg.mjs.map +1 -0
- package/dist/LexicalDragon.prod-OssQhwS-.mjs +61 -0
- package/dist/LexicalDragon.prod-OssQhwS-.mjs.map +1 -0
- package/dist/LexicalExtension.dev-CtDZiMCU.mjs +1665 -0
- package/dist/LexicalExtension.dev-CtDZiMCU.mjs.map +1 -0
- package/dist/LexicalExtension.node-BM0gh8zu.mjs +51 -0
- package/dist/LexicalExtension.node-BM0gh8zu.mjs.map +1 -0
- package/dist/LexicalExtension.prod-Ug6emhEO.mjs +971 -0
- package/dist/LexicalExtension.prod-Ug6emhEO.mjs.map +1 -0
- package/dist/LexicalHeadless.dev-D4yQpl_s.mjs +45 -0
- package/dist/LexicalHeadless.dev-D4yQpl_s.mjs.map +1 -0
- package/dist/LexicalHeadless.prod-jeN65B3k.mjs +31 -0
- package/dist/LexicalHeadless.prod-jeN65B3k.mjs.map +1 -0
- package/dist/LexicalHtml.dev-BdU1_ITQ.mjs +686 -0
- package/dist/LexicalHtml.dev-BdU1_ITQ.mjs.map +1 -0
- package/dist/LexicalHtml.node-DLtAh00E.mjs +26 -0
- package/dist/LexicalHtml.node-DLtAh00E.mjs.map +1 -0
- package/dist/LexicalHtml.prod-DdLE1HHT.mjs +432 -0
- package/dist/LexicalHtml.prod-DdLE1HHT.mjs.map +1 -0
- package/dist/LexicalLink.dev-DK87Biuy.mjs +1084 -0
- package/dist/LexicalLink.dev-DK87Biuy.mjs.map +1 -0
- package/dist/LexicalLink.prod-fssuv6Sf.mjs +717 -0
- package/dist/LexicalLink.prod-fssuv6Sf.mjs.map +1 -0
- package/dist/LexicalList.dev-BJ4dr_rk.mjs +1352 -0
- package/dist/LexicalList.dev-BJ4dr_rk.mjs.map +1 -0
- package/dist/LexicalList.prod-jWBbaWfi.mjs +841 -0
- package/dist/LexicalList.prod-jWBbaWfi.mjs.map +1 -0
- package/dist/LexicalMarkdown.dev-C8e-eh6y.mjs +1207 -0
- package/dist/LexicalMarkdown.dev-C8e-eh6y.mjs.map +1 -0
- package/dist/LexicalMarkdown.prod-k73tZVb2.mjs +756 -0
- package/dist/LexicalMarkdown.prod-k73tZVb2.mjs.map +1 -0
- package/dist/LexicalRichText.dev-CrSqq3K-.mjs +645 -0
- package/dist/LexicalRichText.dev-CrSqq3K-.mjs.map +1 -0
- package/dist/LexicalRichText.node-B7k7wlQz.mjs +106 -0
- package/dist/LexicalRichText.node-B7k7wlQz.mjs.map +1 -0
- package/dist/LexicalRichText.prod-CqvyxQ9m.mjs +429 -0
- package/dist/LexicalRichText.prod-CqvyxQ9m.mjs.map +1 -0
- package/dist/LexicalSelection.dev-sNOHKHe_.mjs +725 -0
- package/dist/LexicalSelection.dev-sNOHKHe_.mjs.map +1 -0
- package/dist/LexicalSelection.node-Di7GwBCZ.mjs +38 -0
- package/dist/LexicalSelection.node-Di7GwBCZ.mjs.map +1 -0
- package/dist/LexicalSelection.prod-SWllPJop.mjs +388 -0
- package/dist/LexicalSelection.prod-SWllPJop.mjs.map +1 -0
- package/dist/LexicalTable.dev-CQkLHXJx.mjs +3262 -0
- package/dist/LexicalTable.dev-CQkLHXJx.mjs.map +1 -0
- package/dist/LexicalTable.prod-BtqCwKSi.mjs +2218 -0
- package/dist/LexicalTable.prod-BtqCwKSi.mjs.map +1 -0
- package/dist/LexicalUtils.dev-DiUpsXE8.mjs +850 -0
- package/dist/LexicalUtils.dev-DiUpsXE8.mjs.map +1 -0
- package/dist/LexicalUtils.node-CmK462d1.mjs +66 -0
- package/dist/LexicalUtils.node-CmK462d1.mjs.map +1 -0
- package/dist/LexicalUtils.prod-bWwV4GAF.mjs +377 -0
- package/dist/LexicalUtils.prod-bWwV4GAF.mjs.map +1 -0
- package/dist/auth-DIFZzoMm.mjs +211 -0
- package/dist/auth-DIFZzoMm.mjs.map +1 -0
- package/dist/bin/mxs.d.mts +927 -0
- package/dist/bin/mxs.mjs +3249 -0
- package/dist/bin/mxs.mjs.map +1 -0
- package/dist/chunk-hT5z_Zn9.mjs +35 -0
- package/dist/config-store-DIu7x0ao.mjs +121 -0
- package/dist/config-store-DIu7x0ao.mjs.map +1 -0
- package/dist/create-B2AOQL1e.mjs +24 -0
- package/dist/create-B2AOQL1e.mjs.map +1 -0
- package/dist/create-CwjGcv2n.mjs +23 -0
- package/dist/create-CwjGcv2n.mjs.map +1 -0
- package/dist/create-DT1l2hue.mjs +23 -0
- package/dist/create-DT1l2hue.mjs.map +1 -0
- package/dist/create-DjlRHPXy.mjs +23 -0
- package/dist/create-DjlRHPXy.mjs.map +1 -0
- package/dist/create-Dz6rJJSS.mjs +19 -0
- package/dist/create-Dz6rJJSS.mjs.map +1 -0
- package/dist/delete-B4dGrrus.mjs +22 -0
- package/dist/delete-B4dGrrus.mjs.map +1 -0
- package/dist/delete-BH6ZngTz.mjs +22 -0
- package/dist/delete-BH6ZngTz.mjs.map +1 -0
- package/dist/delete-BrY5zJ6S.mjs +22 -0
- package/dist/delete-BrY5zJ6S.mjs.map +1 -0
- package/dist/delete-CaG2d_xt.mjs +31 -0
- package/dist/delete-CaG2d_xt.mjs.map +1 -0
- package/dist/delete-YzRliRn8.mjs +31 -0
- package/dist/delete-YzRliRn8.mjs.map +1 -0
- package/dist/document-output-BVB8emLt.mjs +145 -0
- package/dist/document-output-BVB8emLt.mjs.map +1 -0
- package/dist/edit-Bb0Ze4w6.mjs +79 -0
- package/dist/edit-Bb0Ze4w6.mjs.map +1 -0
- package/dist/edit-BeFmC3XD.mjs +80 -0
- package/dist/edit-BeFmC3XD.mjs.map +1 -0
- package/dist/edit-DLDw_ZWX.mjs +86 -0
- package/dist/edit-DLDw_ZWX.mjs.map +1 -0
- package/dist/edit-z55ofr1S.mjs +40 -0
- package/dist/edit-z55ofr1S.mjs.map +1 -0
- package/dist/editor-xrF-j3UE.mjs +42 -0
- package/dist/editor-xrF-j3UE.mjs.map +1 -0
- package/dist/envelope-overlays-DPAlMNW1.mjs +26 -0
- package/dist/envelope-overlays-DPAlMNW1.mjs.map +1 -0
- package/dist/get-2qjq0wgG.mjs +28 -0
- package/dist/get-2qjq0wgG.mjs.map +1 -0
- package/dist/get-BGAk1Zmv.mjs +14 -0
- package/dist/get-BGAk1Zmv.mjs.map +1 -0
- package/dist/get-CRR13lgj.mjs +10 -0
- package/dist/get-CRR13lgj.mjs.map +1 -0
- package/dist/get-ClkpDBTL.mjs +13 -0
- package/dist/get-ClkpDBTL.mjs.map +1 -0
- package/dist/get-DJfUJ3sP.mjs +10 -0
- package/dist/get-DJfUJ3sP.mjs.map +1 -0
- package/dist/get-DiqaQvoS.mjs +14 -0
- package/dist/get-DiqaQvoS.mjs.map +1 -0
- package/dist/index.d.mts +338 -0
- package/dist/index.mjs +10 -0
- package/dist/list-BYzhflDg.mjs +14 -0
- package/dist/list-BYzhflDg.mjs.map +1 -0
- package/dist/list-DY-tPNG-.mjs +10 -0
- package/dist/list-DY-tPNG-.mjs.map +1 -0
- package/dist/list-DlQSkbqx.mjs +10 -0
- package/dist/list-DlQSkbqx.mjs.map +1 -0
- package/dist/list-DsrA5wIz.mjs +15 -0
- package/dist/list-DsrA5wIz.mjs.map +1 -0
- package/dist/list-Fp4nKfQb.mjs +10 -0
- package/dist/list-Fp4nKfQb.mjs.map +1 -0
- package/dist/list-s_tloiEX.mjs +10 -0
- package/dist/list-s_tloiEX.mjs.map +1 -0
- package/dist/litexml-codec-CDoRloiR.mjs +13451 -0
- package/dist/litexml-codec-CDoRloiR.mjs.map +1 -0
- package/dist/login-CLOJ-fTJ.mjs +579 -0
- package/dist/login-CLOJ-fTJ.mjs.map +1 -0
- package/dist/logout-v8ihxsim.mjs +11 -0
- package/dist/logout-v8ihxsim.mjs.map +1 -0
- package/dist/onboarding-640IldLz.mjs +888 -0
- package/dist/onboarding-640IldLz.mjs.map +1 -0
- package/dist/output-BM7aBFwt.mjs +120 -0
- package/dist/output-BM7aBFwt.mjs.map +1 -0
- package/dist/output-CTnO1lYt.d.mts +16 -0
- package/dist/payload-CN11pUto.mjs +547 -0
- package/dist/payload-CN11pUto.mjs.map +1 -0
- package/dist/publish-DkTYB-eK.mjs +23 -0
- package/dist/publish-DkTYB-eK.mjs.map +1 -0
- package/dist/publish-pRBfTJfe.mjs +23 -0
- package/dist/publish-pRBfTJfe.mjs.map +1 -0
- package/dist/resolve-BogJOR7R.mjs +119 -0
- package/dist/resolve-BogJOR7R.mjs.map +1 -0
- package/dist/resolve-Bp1AfBmM.mjs +26 -0
- package/dist/resolve-Bp1AfBmM.mjs.map +1 -0
- package/dist/resolve-Bw5Po9yK.mjs +16 -0
- package/dist/resolve-Bw5Po9yK.mjs.map +1 -0
- package/dist/resolve-CyjMlaoJ.mjs +23 -0
- package/dist/resolve-CyjMlaoJ.mjs.map +1 -0
- package/dist/resolve-helpers-CahPoJ0Y.mjs +30 -0
- package/dist/resolve-helpers-CahPoJ0Y.mjs.map +1 -0
- package/dist/set-BEGQz2si.mjs +43 -0
- package/dist/set-BEGQz2si.mjs.map +1 -0
- package/dist/shared-D0HVBDHI.mjs +39 -0
- package/dist/shared-D0HVBDHI.mjs.map +1 -0
- package/dist/status-LXrN9fI-.mjs +22 -0
- package/dist/status-LXrN9fI-.mjs.map +1 -0
- package/dist/update-B9ynFCdZ.mjs +30 -0
- package/dist/update-B9ynFCdZ.mjs.map +1 -0
- package/dist/update-BMZQPOvR.mjs +28 -0
- package/dist/update-BMZQPOvR.mjs.map +1 -0
- package/dist/update-BXz0l7Lz.mjs +36 -0
- package/dist/update-BXz0l7Lz.mjs.map +1 -0
- package/dist/update-Dx6AF8tf.mjs +30 -0
- package/dist/update-Dx6AF8tf.mjs.map +1 -0
- package/dist/update-q66TLS38.mjs +37 -0
- package/dist/update-q66TLS38.mjs.map +1 -0
- package/dist/whoami-CTkctOEd.mjs +22 -0
- package/dist/whoami-CTkctOEd.mjs.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-pRBfTJfe.mjs","names":[],"sources":["../src/commands/note/publish.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveNoteId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n publish: boolean,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveNoteId(client, slugOrId)\n if (flags.dryRun) {\n emitSuccess({ would_set: { id, isPublished: publish } }, out)\n return\n }\n const res = await client.request(`/notes/${id}/publish`, {\n method: 'PATCH',\n body: { isPublished: publish },\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;AAQA,eAAsB,IACpB,UACA,SACA,OACA,KACA;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAC/C,IAAI,MAAM,QAAQ;EAChB,YAAY,EAAE,WAAW;GAAE;GAAI,aAAa;EAAQ,EAAE,GAAG,GAAG;EAC5D;CACF;CAKA,aAAY,MAJM,OAAO,QAAQ,UAAU,GAAG,WAAW;EACvD,QAAQ;EACR,MAAM,EAAE,aAAa,QAAQ;CAC/B,CAAC,GACe,MAAM,GAAG;AAC3B"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
//#region src/core/resolve.ts
|
|
3
|
+
const SNOWFLAKE_RE = /^\d{15,}$/;
|
|
4
|
+
function isSnowflakeId(value) {
|
|
5
|
+
return SNOWFLAKE_RE.test(value);
|
|
6
|
+
}
|
|
7
|
+
var NameResolver = class {
|
|
8
|
+
fetchers;
|
|
9
|
+
cache = /* @__PURE__ */ new Map();
|
|
10
|
+
ttlMs;
|
|
11
|
+
constructor(fetchers, { ttlMs = 6e4 } = {}) {
|
|
12
|
+
this.fetchers = fetchers;
|
|
13
|
+
this.ttlMs = ttlMs;
|
|
14
|
+
}
|
|
15
|
+
async resolveCategory(value) {
|
|
16
|
+
return this.resolveWith("category", value, this.fetchers.fetchCategories);
|
|
17
|
+
}
|
|
18
|
+
async resolveTopic(value) {
|
|
19
|
+
return this.resolveWith("topic", value, this.fetchers.fetchTopics);
|
|
20
|
+
}
|
|
21
|
+
invalidate(kind) {
|
|
22
|
+
if (!kind) {
|
|
23
|
+
this.cache.clear();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.cache.delete(kind);
|
|
27
|
+
}
|
|
28
|
+
async resolveWith(kind, value, fetcher) {
|
|
29
|
+
if (isSnowflakeId(value)) return value;
|
|
30
|
+
if (!fetcher) throw new MxsError({
|
|
31
|
+
code: "validation.failed",
|
|
32
|
+
message: `cannot resolve ${kind}: no fetcher configured`
|
|
33
|
+
});
|
|
34
|
+
const items = await this.load(kind, fetcher);
|
|
35
|
+
const hit = matchItem(items, value);
|
|
36
|
+
if (hit) return hit.id;
|
|
37
|
+
const suggestions = fuzzySuggest(items, value);
|
|
38
|
+
throw new MxsError({
|
|
39
|
+
code: "validation.failed",
|
|
40
|
+
message: `${kind} "${value}" not found`,
|
|
41
|
+
details: { issues: [{
|
|
42
|
+
path: ["meta", kind],
|
|
43
|
+
message: "not found",
|
|
44
|
+
...suggestions.length ? { suggestions } : {}
|
|
45
|
+
}] },
|
|
46
|
+
hint: kind === "category" ? "run `mxs category list` to see available categories" : "run `mxs topic list` to see available topics"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async load(kind, fetcher) {
|
|
50
|
+
const cached = this.cache.get(kind);
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
if (cached && cached.expiresAt > now) return cached.items;
|
|
53
|
+
const items = await fetcher();
|
|
54
|
+
this.cache.set(kind, {
|
|
55
|
+
items,
|
|
56
|
+
expiresAt: now + this.ttlMs
|
|
57
|
+
});
|
|
58
|
+
return items;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function matchItem(items, value) {
|
|
62
|
+
const bySlug = items.find((i) => i.slug && i.slug === value);
|
|
63
|
+
if (bySlug) return bySlug;
|
|
64
|
+
const byName = items.find((i) => i.name && i.name === value);
|
|
65
|
+
if (byName) return byName;
|
|
66
|
+
const lower = value.toLowerCase();
|
|
67
|
+
const byNameCi = items.find((i) => i.name && i.name.toLowerCase() === lower);
|
|
68
|
+
if (byNameCi) return byNameCi;
|
|
69
|
+
const bySlugCi = items.find((i) => i.slug && i.slug.toLowerCase() === lower);
|
|
70
|
+
if (bySlugCi) return bySlugCi;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function levenshtein(a, b) {
|
|
74
|
+
if (a === b) return 0;
|
|
75
|
+
if (!a.length) return b.length;
|
|
76
|
+
if (!b.length) return a.length;
|
|
77
|
+
const m = a.length;
|
|
78
|
+
const n = b.length;
|
|
79
|
+
let prev = Array.from({ length: n + 1 });
|
|
80
|
+
let curr = Array.from({ length: n + 1 });
|
|
81
|
+
for (let j = 0; j <= n; j++) prev[j] = j;
|
|
82
|
+
for (let i = 1; i <= m; i++) {
|
|
83
|
+
curr[0] = i;
|
|
84
|
+
for (let j = 1; j <= n; j++) {
|
|
85
|
+
const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;
|
|
86
|
+
curr[j] = Math.min((curr[j - 1] ?? 0) + 1, (prev[j] ?? 0) + 1, (prev[j - 1] ?? 0) + cost);
|
|
87
|
+
}
|
|
88
|
+
[prev, curr] = [curr, prev];
|
|
89
|
+
}
|
|
90
|
+
return prev[n] ?? 0;
|
|
91
|
+
}
|
|
92
|
+
function fuzzySuggest(items, value, maxDistance = 2) {
|
|
93
|
+
const lower = value.toLowerCase();
|
|
94
|
+
const scored = [];
|
|
95
|
+
for (const item of items) {
|
|
96
|
+
const candidates = [];
|
|
97
|
+
if (item.name) candidates.push(item.name);
|
|
98
|
+
if (item.slug) candidates.push(item.slug);
|
|
99
|
+
let best = Number.POSITIVE_INFINITY;
|
|
100
|
+
let label = item.name ?? item.slug ?? item.id;
|
|
101
|
+
for (const c of candidates) {
|
|
102
|
+
const d = levenshtein(c.toLowerCase(), lower);
|
|
103
|
+
if (d < best) {
|
|
104
|
+
best = d;
|
|
105
|
+
label = c;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (best <= maxDistance) scored.push({
|
|
109
|
+
label,
|
|
110
|
+
score: best
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
scored.sort((a, b) => a.score - b.score);
|
|
114
|
+
return scored.slice(0, 3).map((s) => s.label);
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { matchItem as a, levenshtein as i, fuzzySuggest as n, isSnowflakeId as r, NameResolver as t };
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=resolve-BogJOR7R.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-BogJOR7R.mjs","names":[],"sources":["../src/core/resolve.ts"],"sourcesContent":["import { MxsError } from './errors'\n\nexport interface ResolvableItem {\n id: string\n slug?: string\n name?: string\n}\n\nexport interface ResolverFetchers {\n fetchCategories?: () => Promise<ResolvableItem[]>\n fetchTopics?: () => Promise<ResolvableItem[]>\n}\n\ninterface CacheEntry {\n expiresAt: number\n items: ResolvableItem[]\n}\n\nconst SNOWFLAKE_RE = /^\\d{15,}$/\n\nexport function isSnowflakeId(value: string): boolean {\n return SNOWFLAKE_RE.test(value)\n}\n\nexport class NameResolver {\n private cache = new Map<string, CacheEntry>()\n private ttlMs: number\n\n constructor(\n private fetchers: ResolverFetchers,\n { ttlMs = 60_000 }: { ttlMs?: number } = {},\n ) {\n this.ttlMs = ttlMs\n }\n\n async resolveCategory(value: string): Promise<string> {\n return this.resolveWith('category', value, this.fetchers.fetchCategories)\n }\n\n async resolveTopic(value: string): Promise<string> {\n return this.resolveWith('topic', value, this.fetchers.fetchTopics)\n }\n\n invalidate(kind?: string): void {\n if (!kind) {\n this.cache.clear()\n return\n }\n this.cache.delete(kind)\n }\n\n private async resolveWith(\n kind: 'category' | 'topic',\n value: string,\n fetcher: (() => Promise<ResolvableItem[]>) | undefined,\n ): Promise<string> {\n if (isSnowflakeId(value)) return value\n if (!fetcher) {\n throw new MxsError({\n code: 'validation.failed',\n message: `cannot resolve ${kind}: no fetcher configured`,\n })\n }\n const items = await this.load(kind, fetcher)\n const hit = matchItem(items, value)\n if (hit) return hit.id\n const suggestions = fuzzySuggest(items, value)\n throw new MxsError({\n code: 'validation.failed',\n message: `${kind} \"${value}\" not found`,\n details: {\n issues: [\n {\n path: ['meta', kind],\n message: 'not found',\n ...(suggestions.length ? { suggestions } : {}),\n },\n ],\n },\n hint:\n kind === 'category'\n ? 'run `mxs category list` to see available categories'\n : 'run `mxs topic list` to see available topics',\n })\n }\n\n private async load(\n kind: string,\n fetcher: () => Promise<ResolvableItem[]>,\n ): Promise<ResolvableItem[]> {\n const cached = this.cache.get(kind)\n const now = Date.now()\n if (cached && cached.expiresAt > now) return cached.items\n const items = await fetcher()\n this.cache.set(kind, { items, expiresAt: now + this.ttlMs })\n return items\n }\n}\n\nexport function matchItem(\n items: ReadonlyArray<ResolvableItem>,\n value: string,\n): ResolvableItem | null {\n const bySlug = items.find((i) => i.slug && i.slug === value)\n if (bySlug) return bySlug\n const byName = items.find((i) => i.name && i.name === value)\n if (byName) return byName\n const lower = value.toLowerCase()\n const byNameCi = items.find((i) => i.name && i.name.toLowerCase() === lower)\n if (byNameCi) return byNameCi\n const bySlugCi = items.find((i) => i.slug && i.slug.toLowerCase() === lower)\n if (bySlugCi) return bySlugCi\n return null\n}\n\nexport function levenshtein(a: string, b: string): number {\n if (a === b) return 0\n if (!a.length) return b.length\n if (!b.length) return a.length\n const m = a.length\n const n = b.length\n let prev = Array.from<number>({ length: n + 1 })\n let curr = Array.from<number>({ length: n + 1 })\n for (let j = 0; j <= n; j++) prev[j] = j\n for (let i = 1; i <= m; i++) {\n curr[0] = i\n for (let j = 1; j <= n; j++) {\n const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1\n curr[j] = Math.min(\n (curr[j - 1] ?? 0) + 1,\n (prev[j] ?? 0) + 1,\n (prev[j - 1] ?? 0) + cost,\n )\n }\n ;[prev, curr] = [curr, prev]\n }\n return prev[n] ?? 0\n}\n\nexport function fuzzySuggest(\n items: ReadonlyArray<ResolvableItem>,\n value: string,\n maxDistance = 2,\n): string[] {\n const lower = value.toLowerCase()\n const scored: { label: string; score: number }[] = []\n for (const item of items) {\n const candidates: string[] = []\n if (item.name) candidates.push(item.name)\n if (item.slug) candidates.push(item.slug)\n let best = Number.POSITIVE_INFINITY\n let label = item.name ?? item.slug ?? item.id\n for (const c of candidates) {\n const d = levenshtein(c.toLowerCase(), lower)\n if (d < best) {\n best = d\n label = c\n }\n }\n if (best <= maxDistance) scored.push({ label, score: best })\n }\n scored.sort((a, b) => a.score - b.score)\n return scored.slice(0, 3).map((s) => s.label)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
|
|
3
|
+
//#region src/commands/post/resolve.ts
|
|
4
|
+
async function resolvePostReadPath(client, slugOrId) {
|
|
5
|
+
if (isSnowflakeId(slugOrId)) return `/posts/${slugOrId}`;
|
|
6
|
+
const path = (await client.request(`/posts/get-url/${encodeURIComponent(slugOrId)}`)).data?.path;
|
|
7
|
+
if (!path) throw new MxsError({
|
|
8
|
+
code: "resource.not_found",
|
|
9
|
+
message: `post not found: ${slugOrId}`
|
|
10
|
+
});
|
|
11
|
+
return `/posts${path.startsWith("/") ? path : `/${path}`}`;
|
|
12
|
+
}
|
|
13
|
+
async function resolvePostId(client, slugOrId) {
|
|
14
|
+
if (isSnowflakeId(slugOrId)) return slugOrId;
|
|
15
|
+
const path = await resolvePostReadPath(client, slugOrId);
|
|
16
|
+
const res = await client.request(path);
|
|
17
|
+
if (!res.data?.id) throw new MxsError({
|
|
18
|
+
code: "resource.not_found",
|
|
19
|
+
message: `post not found: ${slugOrId}`
|
|
20
|
+
});
|
|
21
|
+
return res.data.id;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { resolvePostReadPath as n, resolvePostId as t };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=resolve-Bp1AfBmM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-Bp1AfBmM.mjs","names":[],"sources":["../src/commands/post/resolve.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { isSnowflakeId } from '../../core/resolve'\n\ninterface PostSlugUrl {\n path?: string\n}\n\ninterface PostIdResult {\n id?: string\n}\n\nexport async function resolvePostReadPath(\n client: ApiClient,\n slugOrId: string,\n): Promise<string> {\n if (isSnowflakeId(slugOrId)) return `/posts/${slugOrId}`\n\n const resolved = await client.request<PostSlugUrl>(\n `/posts/get-url/${encodeURIComponent(slugOrId)}`,\n )\n const path = resolved.data?.path\n if (!path) {\n throw new MxsError({\n code: 'resource.not_found',\n message: `post not found: ${slugOrId}`,\n })\n }\n return `/posts${path.startsWith('/') ? path : `/${path}`}`\n}\n\nexport async function resolvePostId(\n client: ApiClient,\n slugOrId: string,\n): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n\n const path = await resolvePostReadPath(client, slugOrId)\n const res = await client.request<PostIdResult>(path)\n if (!res.data?.id) {\n throw new MxsError({\n code: 'resource.not_found',\n message: `post not found: ${slugOrId}`,\n })\n }\n return res.data.id\n}\n"],"mappings":";;;AAYA,eAAsB,oBACpB,QACA,UACiB;CACjB,IAAI,cAAc,QAAQ,GAAG,OAAO,UAAU;CAK9C,MAAM,QAAO,MAHU,OAAO,QAC5B,kBAAkB,mBAAmB,QAAQ,GAC/C,GACsB,MAAM;CAC5B,IAAI,CAAC,MACH,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,mBAAmB;CAC9B,CAAC;CAEH,OAAO,SAAS,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI;AACpD;AAEA,eAAsB,cACpB,QACA,UACiB;CACjB,IAAI,cAAc,QAAQ,GAAG,OAAO;CAEpC,MAAM,OAAO,MAAM,oBAAoB,QAAQ,QAAQ;CACvD,MAAM,MAAM,MAAM,OAAO,QAAsB,IAAI;CACnD,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,mBAAmB;CAC9B,CAAC;CAEH,OAAO,IAAI,KAAK;AAClB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
|
|
3
|
+
//#region src/commands/category/resolve.ts
|
|
4
|
+
async function resolveCategoryId(client, slugOrId) {
|
|
5
|
+
if (isSnowflakeId(slugOrId)) return slugOrId;
|
|
6
|
+
const id = (await client.request(`/categories/${encodeURIComponent(slugOrId)}`)).data?.data?.id;
|
|
7
|
+
if (!id) throw new MxsError({
|
|
8
|
+
code: "resource.not_found",
|
|
9
|
+
message: `category not found: ${slugOrId}`
|
|
10
|
+
});
|
|
11
|
+
return id;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { resolveCategoryId as t };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=resolve-Bw5Po9yK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-Bw5Po9yK.mjs","names":[],"sources":["../src/commands/category/resolve.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { isSnowflakeId } from '../../core/resolve'\n\ninterface CategoryEnvelope {\n data?: { id?: string }\n}\n\nexport async function resolveCategoryId(\n client: ApiClient,\n slugOrId: string,\n): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<CategoryEnvelope>(\n `/categories/${encodeURIComponent(slugOrId)}`,\n )\n const id = res.data?.data?.id\n if (!id) {\n throw new MxsError({\n code: 'resource.not_found',\n message: `category not found: ${slugOrId}`,\n })\n }\n return id\n}\n"],"mappings":";;;AAQA,eAAsB,kBACpB,QACA,UACiB;CACjB,IAAI,cAAc,QAAQ,GAAG,OAAO;CAIpC,MAAM,MAAK,MAHO,OAAO,QACvB,eAAe,mBAAmB,QAAQ,GAC5C,GACe,MAAM,MAAM;CAC3B,IAAI,CAAC,IACH,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,uBAAuB;CAClC,CAAC;CAEH,OAAO;AACT"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
|
|
3
|
+
//#region src/commands/note/resolve.ts
|
|
4
|
+
async function resolveNoteId(client, slugOrId) {
|
|
5
|
+
if (isSnowflakeId(slugOrId)) return slugOrId;
|
|
6
|
+
if (/^\d+$/.test(slugOrId)) {
|
|
7
|
+
const res = await client.request(`/notes/nid/${encodeURIComponent(slugOrId)}`, { query: { single: "1" } });
|
|
8
|
+
const id = res.data?.data?.id ?? res.data?.id;
|
|
9
|
+
if (!id) throw new MxsError({
|
|
10
|
+
code: "resource.not_found",
|
|
11
|
+
message: `note not found: ${slugOrId}`
|
|
12
|
+
});
|
|
13
|
+
return id;
|
|
14
|
+
}
|
|
15
|
+
throw new MxsError({
|
|
16
|
+
code: "validation.failed",
|
|
17
|
+
message: `invalid note reference: ${slugOrId} (use snowflake id or numeric nid)`
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { resolveNoteId as t };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=resolve-CyjMlaoJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-CyjMlaoJ.mjs","names":[],"sources":["../src/commands/note/resolve.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { isSnowflakeId } from '../../core/resolve'\n\ninterface NidEnvelope {\n data?: { id?: string }\n id?: string\n}\n\nexport async function resolveNoteId(\n client: ApiClient,\n slugOrId: string,\n): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n if (/^\\d+$/.test(slugOrId)) {\n const res = await client.request<NidEnvelope>(\n `/notes/nid/${encodeURIComponent(slugOrId)}`,\n { query: { single: '1' } },\n )\n const id = res.data?.data?.id ?? res.data?.id\n if (!id) {\n throw new MxsError({\n code: 'resource.not_found',\n message: `note not found: ${slugOrId}`,\n })\n }\n return id\n }\n throw new MxsError({\n code: 'validation.failed',\n message: `invalid note reference: ${slugOrId} (use snowflake id or numeric nid)`,\n })\n}\n"],"mappings":";;;AASA,eAAsB,cACpB,QACA,UACiB;CACjB,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,IAAI,QAAQ,KAAK,QAAQ,GAAG;EAC1B,MAAM,MAAM,MAAM,OAAO,QACvB,cAAc,mBAAmB,QAAQ,KACzC,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,CAC3B;EACA,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM;EAC3C,IAAI,CAAC,IACH,MAAM,IAAI,SAAS;GACjB,MAAM;GACN,SAAS,mBAAmB;EAC9B,CAAC;EAEH,OAAO;CACT;CACA,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,2BAA2B,SAAS;CAC/C,CAAC;AACH"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { t as NameResolver } from "./resolve-BogJOR7R.mjs";
|
|
2
|
+
//#region src/commands/internal/resolve-helpers.ts
|
|
3
|
+
function buildResolver(client) {
|
|
4
|
+
return new NameResolver({
|
|
5
|
+
fetchCategories: async () => {
|
|
6
|
+
const res = await client.request("/categories");
|
|
7
|
+
const data = Array.isArray(res.data) ? res.data : res.data?.data;
|
|
8
|
+
return Array.isArray(data) ? data : [];
|
|
9
|
+
},
|
|
10
|
+
fetchTopics: async () => {
|
|
11
|
+
const res = await client.request("/topics/all");
|
|
12
|
+
const data = Array.isArray(res.data) ? res.data : res.data?.data;
|
|
13
|
+
return Array.isArray(data) ? data : [];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function resolveCategoryRefs(payload, resolver) {
|
|
18
|
+
const nameRef = payload.__categoryName;
|
|
19
|
+
delete payload.__categoryName;
|
|
20
|
+
if (typeof nameRef === "string" && nameRef.length > 0 && !payload.categoryId) payload.categoryId = await resolver.resolveCategory(nameRef);
|
|
21
|
+
}
|
|
22
|
+
async function resolveTopicRefs(payload, resolver) {
|
|
23
|
+
const nameRef = payload.__topicName;
|
|
24
|
+
delete payload.__topicName;
|
|
25
|
+
if (typeof nameRef === "string" && nameRef.length > 0 && !payload.topicId) payload.topicId = await resolver.resolveTopic(nameRef);
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { resolveCategoryRefs as n, resolveTopicRefs as r, buildResolver as t };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=resolve-helpers-CahPoJ0Y.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-helpers-CahPoJ0Y.mjs","names":[],"sources":["../src/commands/internal/resolve-helpers.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { NameResolver, type ResolvableItem } from '../../core/resolve'\n\nexport function buildResolver(client: ApiClient): NameResolver {\n return new NameResolver({\n fetchCategories: async () => {\n const res = await client.request<\n { data: ResolvableItem[] } | ResolvableItem[]\n >('/categories')\n const data = Array.isArray(res.data) ? res.data : res.data?.data\n return Array.isArray(data) ? data : []\n },\n fetchTopics: async () => {\n const res = await client.request<\n { data: ResolvableItem[] } | ResolvableItem[]\n >('/topics/all')\n const data = Array.isArray(res.data) ? res.data : res.data?.data\n return Array.isArray(data) ? data : []\n },\n })\n}\n\nexport async function resolveCategoryRefs(\n payload: Record<string, unknown>,\n resolver: NameResolver,\n): Promise<void> {\n const nameRef = payload.__categoryName\n delete payload.__categoryName\n if (\n typeof nameRef === 'string' &&\n nameRef.length > 0 &&\n !payload.categoryId\n ) {\n payload.categoryId = await resolver.resolveCategory(nameRef)\n }\n}\n\nexport async function resolveTopicRefs(\n payload: Record<string, unknown>,\n resolver: NameResolver,\n): Promise<void> {\n const nameRef = payload.__topicName\n delete payload.__topicName\n if (typeof nameRef === 'string' && nameRef.length > 0 && !payload.topicId) {\n payload.topicId = await resolver.resolveTopic(nameRef)\n }\n}\n"],"mappings":";;AAGA,SAAgB,cAAc,QAAiC;CAC7D,OAAO,IAAI,aAAa;EACtB,iBAAiB,YAAY;GAC3B,MAAM,MAAM,MAAM,OAAO,QAEvB,aAAa;GACf,MAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,MAAM;GAC5D,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;EACvC;EACA,aAAa,YAAY;GACvB,MAAM,MAAM,MAAM,OAAO,QAEvB,aAAa;GACf,MAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,MAAM;GAC5D,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;EACvC;CACF,CAAC;AACH;AAEA,eAAsB,oBACpB,SACA,UACe;CACf,MAAM,UAAU,QAAQ;CACxB,OAAO,QAAQ;CACf,IACE,OAAO,YAAY,YACnB,QAAQ,SAAS,KACjB,CAAC,QAAQ,YAET,QAAQ,aAAa,MAAM,SAAS,gBAAgB,OAAO;AAE/D;AAEA,eAAsB,iBACpB,SACA,UACe;CACf,MAAM,UAAU,QAAQ;CACxB,OAAO,QAAQ;CACf,IAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAChE,QAAQ,UAAU,MAAM,SAAS,aAAa,OAAO;AAEzD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
|
|
3
|
+
//#region src/commands/config/set.ts
|
|
4
|
+
async function run(key, value, opts, flags, out) {
|
|
5
|
+
const coerced = coerce(value, opts.type);
|
|
6
|
+
if (flags.dryRun) {
|
|
7
|
+
emitSuccess({
|
|
8
|
+
key,
|
|
9
|
+
value: coerced
|
|
10
|
+
}, out);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
emitSuccess((await buildApiClient(await resolveContext(flags, out), flags).request(`/options/${key}`, {
|
|
14
|
+
method: "PATCH",
|
|
15
|
+
body: coerced
|
|
16
|
+
})).data, out);
|
|
17
|
+
}
|
|
18
|
+
function coerce(value, type) {
|
|
19
|
+
if (type === "string") return value;
|
|
20
|
+
if (type === "number") {
|
|
21
|
+
const n = Number(value);
|
|
22
|
+
if (Number.isNaN(n)) throw new MxsError({
|
|
23
|
+
code: "validation.failed",
|
|
24
|
+
message: `invalid number: ${value}`
|
|
25
|
+
});
|
|
26
|
+
return n;
|
|
27
|
+
}
|
|
28
|
+
if (type === "bool") return value === "true";
|
|
29
|
+
if (type === "json" || type === void 0) try {
|
|
30
|
+
return JSON.parse(value);
|
|
31
|
+
} catch {
|
|
32
|
+
if (type === "json") throw new MxsError({
|
|
33
|
+
code: "validation.failed",
|
|
34
|
+
message: `invalid JSON: ${value}`
|
|
35
|
+
});
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { run };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=set-BEGQz2si.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-BEGQz2si.mjs","names":[],"sources":["../src/commands/config/set.ts"],"sourcesContent":["import { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport interface ConfigSetFlags {\n type?: 'json' | 'string' | 'number' | 'bool'\n}\n\nexport async function run(\n key: string,\n value: string,\n opts: ConfigSetFlags,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const coerced = coerce(value, opts.type)\n if (flags.dryRun) {\n emitSuccess({ key, value: coerced }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const res = await client.request(`/options/${key}`, {\n method: 'PATCH',\n body: coerced,\n })\n emitSuccess(res.data, out)\n}\n\nfunction coerce(value: string, type?: ConfigSetFlags['type']): unknown {\n if (type === 'string') return value\n if (type === 'number') {\n const n = Number(value)\n if (Number.isNaN(n))\n throw new MxsError({\n code: 'validation.failed',\n message: `invalid number: ${value}`,\n })\n return n\n }\n if (type === 'bool') return value === 'true'\n if (type === 'json' || type === undefined) {\n try {\n return JSON.parse(value)\n } catch {\n if (type === 'json')\n throw new MxsError({\n code: 'validation.failed',\n message: `invalid JSON: ${value}`,\n })\n return value\n }\n }\n return value\n}\n"],"mappings":";;;AAQA,eAAsB,IACpB,KACA,OACA,MACA,OACA,KACA;CACA,MAAM,UAAU,OAAO,OAAO,KAAK,IAAI;CACvC,IAAI,MAAM,QAAQ;EAChB,YAAY;GAAE;GAAK,OAAO;EAAQ,GAAG,GAAG;EACxC;CACF;CAOA,aAAY,MALG,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KACZ,EAAE,QAAQ,YAAY,OAAO;EAClD,QAAQ;EACR,MAAM;CACR,CAAC,GACe,MAAM,GAAG;AAC3B;AAEA,SAAS,OAAO,OAAe,MAAwC;CACrE,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,SAAS,UAAU;EACrB,MAAM,IAAI,OAAO,KAAK;EACtB,IAAI,OAAO,MAAM,CAAC,GAChB,MAAM,IAAI,SAAS;GACjB,MAAM;GACN,SAAS,mBAAmB;EAC9B,CAAC;EACH,OAAO;CACT;CACA,IAAI,SAAS,QAAQ,OAAO,UAAU;CACtC,IAAI,SAAS,UAAU,SAAS,KAAA,GAC9B,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN,IAAI,SAAS,QACX,MAAM,IAAI,SAAS;GACjB,MAAM;GACN,SAAS,iBAAiB;EAC5B,CAAC;EACH,OAAO;CACT;CAEF,OAAO;AACT"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { r as emitInfo, s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { l as resolveConfig } from "./config-store-DIu7x0ao.mjs";
|
|
3
|
+
import { n as ApiClient, t as runOnboarding } from "./onboarding-640IldLz.mjs";
|
|
4
|
+
//#region src/commands/internal/shared.ts
|
|
5
|
+
async function resolveContext(flags, out) {
|
|
6
|
+
let resolved;
|
|
7
|
+
try {
|
|
8
|
+
resolved = await resolveConfig({
|
|
9
|
+
apiUrl: flags.apiUrl,
|
|
10
|
+
token: flags.token,
|
|
11
|
+
apiKey: flags.apiKey
|
|
12
|
+
});
|
|
13
|
+
} catch (err) {
|
|
14
|
+
if (err instanceof MxsError && err.code === "config.missing.api_url") {
|
|
15
|
+
emitInfo(`saved ${(await runOnboarding()).apiUrl} to config`, out);
|
|
16
|
+
resolved = await resolveConfig({
|
|
17
|
+
apiUrl: flags.apiUrl,
|
|
18
|
+
token: flags.token,
|
|
19
|
+
apiKey: flags.apiKey
|
|
20
|
+
});
|
|
21
|
+
} else throw err;
|
|
22
|
+
}
|
|
23
|
+
return resolved;
|
|
24
|
+
}
|
|
25
|
+
function buildApiClient(resolved, flags) {
|
|
26
|
+
return new ApiClient({
|
|
27
|
+
apiBase: resolved.apiBase,
|
|
28
|
+
authBase: resolved.authBase,
|
|
29
|
+
clientId: resolved.clientId,
|
|
30
|
+
token: resolved.token,
|
|
31
|
+
apiKey: resolved.apiKey,
|
|
32
|
+
autoRefresh: Boolean(resolved.token) && !resolved.apiKey && !flags.token && !process.env.MXS_TOKEN,
|
|
33
|
+
verbose: flags.verbose
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { resolveContext as n, buildApiClient as t };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=shared-D0HVBDHI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-D0HVBDHI.mjs","names":[],"sources":["../src/commands/internal/shared.ts"],"sourcesContent":["import { ApiClient } from '../../core/api-client'\nimport { readConfig, resolveConfig, writeConfig } from '../../core/config-store'\nimport { MxsError } from '../../core/errors'\nimport { runOnboarding } from '../../core/onboarding'\nimport { emitInfo, type OutputOptions } from '../../core/output'\n\nexport interface GlobalFlags {\n json?: boolean\n apiUrl?: string\n token?: string\n apiKey?: string\n quiet?: boolean\n verbose?: boolean\n dryRun?: boolean\n}\n\nexport async function resolveContext(flags: GlobalFlags, out: OutputOptions) {\n let resolved\n try {\n resolved = await resolveConfig({\n apiUrl: flags.apiUrl,\n token: flags.token,\n apiKey: flags.apiKey,\n })\n } catch (err) {\n if (err instanceof MxsError && err.code === 'config.missing.api_url') {\n const probed = await runOnboarding()\n emitInfo(`saved ${probed.apiUrl} to config`, out)\n resolved = await resolveConfig({\n apiUrl: flags.apiUrl,\n token: flags.token,\n apiKey: flags.apiKey,\n })\n } else {\n throw err\n }\n }\n return resolved\n}\n\nexport function buildApiClient(\n resolved: Awaited<ReturnType<typeof resolveConfig>>,\n flags: GlobalFlags,\n) {\n return new ApiClient({\n apiBase: resolved.apiBase,\n authBase: resolved.authBase,\n clientId: resolved.clientId,\n token: resolved.token,\n apiKey: resolved.apiKey,\n autoRefresh:\n Boolean(resolved.token) &&\n !resolved.apiKey &&\n !flags.token &&\n !process.env.MXS_TOKEN,\n verbose: flags.verbose,\n })\n}\n\nexport async function persistApiVersion(version: number) {\n const cfg = await readConfig()\n if (cfg.api_version === version) return\n await writeConfig({ ...cfg, api_version: version })\n}\n"],"mappings":";;;;AAgBA,eAAsB,eAAe,OAAoB,KAAoB;CAC3E,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,cAAc;GAC7B,QAAQ,MAAM;GACd,OAAO,MAAM;GACb,QAAQ,MAAM;EAChB,CAAC;CACH,SAAS,KAAK;EACZ,IAAI,eAAe,YAAY,IAAI,SAAS,0BAA0B;GAEpE,SAAS,UAAS,MADG,cAAc,GACV,OAAO,aAAa,GAAG;GAChD,WAAW,MAAM,cAAc;IAC7B,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,QAAQ,MAAM;GAChB,CAAC;EACH,OACE,MAAM;CAEV;CACA,OAAO;AACT;AAEA,SAAgB,eACd,UACA,OACA;CACA,OAAO,IAAI,UAAU;EACnB,SAAS,SAAS;EAClB,UAAU,SAAS;EACnB,UAAU,SAAS;EACnB,OAAO,SAAS;EAChB,QAAQ,SAAS;EACjB,aACE,QAAQ,SAAS,KAAK,KACtB,CAAC,SAAS,UACV,CAAC,MAAM,SACP,CAAC,QAAQ,IAAI;EACf,SAAS,MAAM;CACjB,CAAC;AACH"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { c as readCredentials } from "./config-store-DIu7x0ao.mjs";
|
|
3
|
+
import { i as isExpiringSoon } from "./auth-DIFZzoMm.mjs";
|
|
4
|
+
//#region src/commands/auth/status.ts
|
|
5
|
+
async function run(_flags, out) {
|
|
6
|
+
const cred = await readCredentials();
|
|
7
|
+
if (!cred) {
|
|
8
|
+
emitSuccess({ authenticated: false }, out);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
emitSuccess({
|
|
12
|
+
authenticated: true,
|
|
13
|
+
expires_at: cred.expires_at,
|
|
14
|
+
expiring_soon: isExpiringSoon(cred),
|
|
15
|
+
has_refresh: Boolean(cred.refresh_token),
|
|
16
|
+
user: cred.user ?? null
|
|
17
|
+
}, out);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { run };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=status-LXrN9fI-.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-LXrN9fI-.mjs","names":[],"sources":["../src/commands/auth/status.ts"],"sourcesContent":["import { isExpiringSoon } from '../../core/auth'\nimport { readCredentials } from '../../core/config-store'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { type GlobalFlags } from '../internal/shared'\n\nexport async function run(_flags: GlobalFlags, out: OutputOptions) {\n const cred = await readCredentials()\n if (!cred) {\n emitSuccess({ authenticated: false }, out)\n return\n }\n emitSuccess(\n {\n authenticated: true,\n expires_at: cred.expires_at,\n expiring_soon: isExpiringSoon(cred),\n has_refresh: Boolean(cred.refresh_token),\n user: cred.user ?? null,\n },\n out,\n )\n}\n"],"mappings":";;;;AAKA,eAAsB,IAAI,QAAqB,KAAoB;CACjE,MAAM,OAAO,MAAM,gBAAgB;CACnC,IAAI,CAAC,MAAM;EACT,YAAY,EAAE,eAAe,MAAM,GAAG,GAAG;EACzC;CACF;CACA,YACE;EACE,eAAe;EACf,YAAY,KAAK;EACjB,eAAe,eAAe,IAAI;EAClC,aAAa,QAAQ,KAAK,aAAa;EACvC,MAAM,KAAK,QAAQ;CACrB,GACA,GACF;AACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { r as buildPostPayload } from "./payload-CN11pUto.mjs";
|
|
3
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
|
|
4
|
+
import { n as resolveCategoryRefs, t as buildResolver } from "./resolve-helpers-CahPoJ0Y.mjs";
|
|
5
|
+
import { t as resolvePostId } from "./resolve-Bp1AfBmM.mjs";
|
|
6
|
+
//#region src/commands/post/update.ts
|
|
7
|
+
async function run(slugOrId, opts, flags, out) {
|
|
8
|
+
const built = await buildPostPayload(opts);
|
|
9
|
+
if (opts.content === void 0 && !opts.file) {
|
|
10
|
+
delete built.payload.content;
|
|
11
|
+
delete built.payload.text;
|
|
12
|
+
delete built.payload.contentFormat;
|
|
13
|
+
}
|
|
14
|
+
if (flags.dryRun) {
|
|
15
|
+
emitSuccess(built.payload, out);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const client = buildApiClient(await resolveContext(flags, out), flags);
|
|
19
|
+
const resolver = buildResolver(client);
|
|
20
|
+
await resolveCategoryRefs(built.payload, resolver);
|
|
21
|
+
const id = await resolvePostId(client, slugOrId);
|
|
22
|
+
emitSuccess((await client.request(`/posts/${id}`, {
|
|
23
|
+
method: "PATCH",
|
|
24
|
+
body: built.payload
|
|
25
|
+
})).data, out);
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { run };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=update-B9ynFCdZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-B9ynFCdZ.mjs","names":[],"sources":["../src/commands/post/update.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildPostPayload, type PostFlagInputs } from '../../core/payload'\nimport { buildResolver, resolveCategoryRefs } from '../internal/resolve-helpers'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\nimport { resolvePostId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n opts: PostFlagInputs,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const built = await buildPostPayload(opts)\n if (opts.content === undefined && !opts.file) {\n delete built.payload.content\n delete built.payload.text\n delete built.payload.contentFormat\n }\n if (flags.dryRun) {\n emitSuccess(built.payload, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const resolver = buildResolver(client)\n await resolveCategoryRefs(built.payload, resolver)\n const id = await resolvePostId(client, slugOrId)\n const res = await client.request(`/posts/${id}`, {\n method: 'PATCH',\n body: built.payload,\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;;;AAMA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,QAAQ,MAAM,iBAAiB,IAAI;CACzC,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,KAAK,MAAM;EAC5C,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;CACvB;CACA,IAAI,MAAM,QAAQ;EAChB,YAAY,MAAM,SAAS,GAAG;EAC9B;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,WAAW,cAAc,MAAM;CACrC,MAAM,oBAAoB,MAAM,SAAS,QAAQ;CACjD,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAK/C,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;EAC/C,QAAQ;EACR,MAAM,MAAM;CACd,CAAC,GACe,MAAM,GAAG;AAC3B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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 resolveCategoryId } from "./resolve-Bw5Po9yK.mjs";
|
|
4
|
+
//#region src/commands/category/update.ts
|
|
5
|
+
async function run(slugOrId, opts, flags, out) {
|
|
6
|
+
const body = {};
|
|
7
|
+
if (opts.name) body.name = opts.name;
|
|
8
|
+
if (opts.slug) body.slug = opts.slug;
|
|
9
|
+
if (opts.type) body.type = opts.type === "tag" ? 1 : 0;
|
|
10
|
+
if (opts.icon) body.icon = opts.icon;
|
|
11
|
+
if (flags.dryRun) {
|
|
12
|
+
emitSuccess({
|
|
13
|
+
id: slugOrId,
|
|
14
|
+
body
|
|
15
|
+
}, out);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const client = buildApiClient(await resolveContext(flags, out), flags);
|
|
19
|
+
const id = await resolveCategoryId(client, slugOrId);
|
|
20
|
+
emitSuccess((await client.request(`/categories/${id}`, {
|
|
21
|
+
method: "PATCH",
|
|
22
|
+
body
|
|
23
|
+
})).data, out);
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { run };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=update-BMZQPOvR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-BMZQPOvR.mjs","names":[],"sources":["../src/commands/category/update.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveCategoryId } from './resolve'\n\nexport interface CategoryUpdateFlags {\n name?: string\n slug?: string\n type?: 'category' | 'tag'\n icon?: string\n}\n\nexport async function run(\n slugOrId: string,\n opts: CategoryUpdateFlags,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const body: Record<string, unknown> = {}\n if (opts.name) body.name = opts.name\n if (opts.slug) body.slug = opts.slug\n if (opts.type) body.type = opts.type === 'tag' ? 1 : 0\n if (opts.icon) body.icon = opts.icon\n if (flags.dryRun) {\n emitSuccess({ id: slugOrId, body }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveCategoryId(client, slugOrId)\n const res = await client.request(`/categories/${id}`, {\n method: 'PATCH',\n body,\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;AAeA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,OAAgC,CAAC;CACvC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,SAAS,QAAQ,IAAI;CACrD,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,MAAM,QAAQ;EAChB,YAAY;GAAE,IAAI;GAAU;EAAK,GAAG,GAAG;EACvC;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,kBAAkB,QAAQ,QAAQ;CAKnD,aAAY,MAJM,OAAO,QAAQ,eAAe,MAAM;EACpD,QAAQ;EACR;CACF,CAAC,GACe,MAAM,GAAG;AAC3B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { n as buildPagePayload } from "./payload-CN11pUto.mjs";
|
|
3
|
+
import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
|
|
4
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
|
|
5
|
+
//#region src/commands/page/update.ts
|
|
6
|
+
async function run(slugOrId, opts, flags, out) {
|
|
7
|
+
const built = await buildPagePayload(opts);
|
|
8
|
+
if (opts.content === void 0 && !opts.file) {
|
|
9
|
+
delete built.payload.content;
|
|
10
|
+
delete built.payload.text;
|
|
11
|
+
delete built.payload.contentFormat;
|
|
12
|
+
}
|
|
13
|
+
if (flags.dryRun) {
|
|
14
|
+
emitSuccess(built.payload, out);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const client = buildApiClient(await resolveContext(flags, out), flags);
|
|
18
|
+
const id = await resolveId(client, slugOrId);
|
|
19
|
+
emitSuccess((await client.request(`/pages/${id}`, {
|
|
20
|
+
method: "PATCH",
|
|
21
|
+
body: built.payload
|
|
22
|
+
})).data, out);
|
|
23
|
+
}
|
|
24
|
+
async function resolveId(client, slugOrId) {
|
|
25
|
+
if (isSnowflakeId(slugOrId)) return slugOrId;
|
|
26
|
+
const res = await client.request(`/pages/slug/${slugOrId}`);
|
|
27
|
+
if (!res.data?.id) throw new MxsError({
|
|
28
|
+
code: "resource.not_found",
|
|
29
|
+
message: `page not found: ${slugOrId}`
|
|
30
|
+
});
|
|
31
|
+
return res.data.id;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { run };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=update-BXz0l7Lz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-BXz0l7Lz.mjs","names":[],"sources":["../src/commands/page/update.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildPagePayload, type PageFlagInputs } from '../../core/payload'\nimport { isSnowflakeId } from '../../core/resolve'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport async function run(\n slugOrId: string,\n opts: PageFlagInputs,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const built = await buildPagePayload(opts)\n if (opts.content === undefined && !opts.file) {\n delete built.payload.content\n delete built.payload.text\n delete built.payload.contentFormat\n }\n if (flags.dryRun) {\n emitSuccess(built.payload, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveId(client, slugOrId)\n const res = await client.request(`/pages/${id}`, {\n method: 'PATCH',\n body: built.payload,\n })\n emitSuccess(res.data, out)\n}\n\nasync function resolveId(client: ApiClient, slugOrId: string): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<{ id: string }>(`/pages/slug/${slugOrId}`)\n if (!res.data?.id)\n throw new MxsError({\n code: 'resource.not_found',\n message: `page not found: ${slugOrId}`,\n })\n return res.data.id\n}\n"],"mappings":";;;;;AAOA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,QAAQ,MAAM,iBAAiB,IAAI;CACzC,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,KAAK,MAAM;EAC5C,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;CACvB;CACA,IAAI,MAAM,QAAQ;EAChB,YAAY,MAAM,SAAS,GAAG;EAC9B;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;CAK3C,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;EAC/C,QAAQ;EACR,MAAM,MAAM;CACd,CAAC,GACe,MAAM,GAAG;AAC3B;AAEA,eAAe,UAAU,QAAmB,UAAmC;CAC7E,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,MAAM,MAAM,MAAM,OAAO,QAAwB,eAAe,UAAU;CAC1E,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,mBAAmB;CAC9B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { i as emitSuccess } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { t as buildNotePayload } from "./payload-CN11pUto.mjs";
|
|
3
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
|
|
4
|
+
import { r as resolveTopicRefs, t as buildResolver } from "./resolve-helpers-CahPoJ0Y.mjs";
|
|
5
|
+
import { t as resolveNoteId } from "./resolve-CyjMlaoJ.mjs";
|
|
6
|
+
//#region src/commands/note/update.ts
|
|
7
|
+
async function run(slugOrId, opts, flags, out) {
|
|
8
|
+
const built = await buildNotePayload(opts);
|
|
9
|
+
if (opts.content === void 0 && !opts.file) {
|
|
10
|
+
delete built.payload.content;
|
|
11
|
+
delete built.payload.text;
|
|
12
|
+
delete built.payload.contentFormat;
|
|
13
|
+
}
|
|
14
|
+
if (flags.dryRun) {
|
|
15
|
+
emitSuccess(built.payload, out);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const client = buildApiClient(await resolveContext(flags, out), flags);
|
|
19
|
+
const resolver = buildResolver(client);
|
|
20
|
+
await resolveTopicRefs(built.payload, resolver);
|
|
21
|
+
const id = await resolveNoteId(client, slugOrId);
|
|
22
|
+
emitSuccess((await client.request(`/notes/${id}`, {
|
|
23
|
+
method: "PATCH",
|
|
24
|
+
body: built.payload
|
|
25
|
+
})).data, out);
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { run };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=update-Dx6AF8tf.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-Dx6AF8tf.mjs","names":[],"sources":["../src/commands/note/update.ts"],"sourcesContent":["import { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildNotePayload, type NoteFlagInputs } from '../../core/payload'\nimport { buildResolver, resolveTopicRefs } from '../internal/resolve-helpers'\nimport {\n buildApiClient,\n type GlobalFlags,\n resolveContext,\n} from '../internal/shared'\nimport { resolveNoteId } from './resolve'\n\nexport async function run(\n slugOrId: string,\n opts: NoteFlagInputs,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const built = await buildNotePayload(opts)\n if (opts.content === undefined && !opts.file) {\n delete built.payload.content\n delete built.payload.text\n delete built.payload.contentFormat\n }\n if (flags.dryRun) {\n emitSuccess(built.payload, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const resolver = buildResolver(client)\n await resolveTopicRefs(built.payload, resolver)\n const id = await resolveNoteId(client, slugOrId)\n const res = await client.request(`/notes/${id}`, {\n method: 'PATCH',\n body: built.payload,\n })\n emitSuccess(res.data, out)\n}\n"],"mappings":";;;;;;AAUA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,QAAQ,MAAM,iBAAiB,IAAI;CACzC,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,KAAK,MAAM;EAC5C,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;EACrB,OAAO,MAAM,QAAQ;CACvB;CACA,IAAI,MAAM,QAAQ;EAChB,YAAY,MAAM,SAAS,GAAG;EAC9B;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,WAAW,cAAc,MAAM;CACrC,MAAM,iBAAiB,MAAM,SAAS,QAAQ;CAC9C,MAAM,KAAK,MAAM,cAAc,QAAQ,QAAQ;CAK/C,aAAY,MAJM,OAAO,QAAQ,UAAU,MAAM;EAC/C,QAAQ;EACR,MAAM,MAAM;CACd,CAAC,GACe,MAAM,GAAG;AAC3B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { r as isSnowflakeId } from "./resolve-BogJOR7R.mjs";
|
|
3
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
|
|
4
|
+
//#region src/commands/topic/update.ts
|
|
5
|
+
async function run(slugOrId, opts, flags, out) {
|
|
6
|
+
const body = {};
|
|
7
|
+
if (opts.name) body.name = opts.name;
|
|
8
|
+
if (opts.slug) body.slug = opts.slug;
|
|
9
|
+
if (opts.description) body.description = opts.description;
|
|
10
|
+
if (opts.icon) body.icon = opts.icon;
|
|
11
|
+
if (flags.dryRun) {
|
|
12
|
+
emitSuccess({
|
|
13
|
+
id: slugOrId,
|
|
14
|
+
body
|
|
15
|
+
}, out);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const client = buildApiClient(await resolveContext(flags, out), flags);
|
|
19
|
+
const id = await resolveId(client, slugOrId);
|
|
20
|
+
emitSuccess((await client.request(`/topics/${id}`, {
|
|
21
|
+
method: "PATCH",
|
|
22
|
+
body
|
|
23
|
+
})).data, out);
|
|
24
|
+
}
|
|
25
|
+
async function resolveId(client, slugOrId) {
|
|
26
|
+
if (isSnowflakeId(slugOrId)) return slugOrId;
|
|
27
|
+
const res = await client.request(`/topics/slug/${slugOrId}`);
|
|
28
|
+
if (!res.data?.id) throw new MxsError({
|
|
29
|
+
code: "resource.not_found",
|
|
30
|
+
message: `topic not found: ${slugOrId}`
|
|
31
|
+
});
|
|
32
|
+
return res.data.id;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { run };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=update-q66TLS38.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-q66TLS38.mjs","names":[],"sources":["../src/commands/topic/update.ts"],"sourcesContent":["import type { ApiClient } from '../../core/api-client'\nimport { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { isSnowflakeId } from '../../core/resolve'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport interface TopicUpdateFlags {\n name?: string\n slug?: string\n description?: string\n icon?: string\n}\n\nexport async function run(\n slugOrId: string,\n opts: TopicUpdateFlags,\n flags: GlobalFlags,\n out: OutputOptions,\n) {\n const body: Record<string, unknown> = {}\n if (opts.name) body.name = opts.name\n if (opts.slug) body.slug = opts.slug\n if (opts.description) body.description = opts.description\n if (opts.icon) body.icon = opts.icon\n if (flags.dryRun) {\n emitSuccess({ id: slugOrId, body }, out)\n return\n }\n const ctx = await resolveContext(flags, out)\n const client = buildApiClient(ctx, flags)\n const id = await resolveId(client, slugOrId)\n const res = await client.request(`/topics/${id}`, {\n method: 'PATCH',\n body,\n })\n emitSuccess(res.data, out)\n}\n\nasync function resolveId(client: ApiClient, slugOrId: string): Promise<string> {\n if (isSnowflakeId(slugOrId)) return slugOrId\n const res = await client.request<{ id?: string }>(`/topics/slug/${slugOrId}`)\n if (!res.data?.id)\n throw new MxsError({\n code: 'resource.not_found',\n message: `topic not found: ${slugOrId}`,\n })\n return res.data.id\n}\n"],"mappings":";;;;AAaA,eAAsB,IACpB,UACA,MACA,OACA,KACA;CACA,MAAM,OAAgC,CAAC;CACvC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,KAAK,aAAa,KAAK,cAAc,KAAK;CAC9C,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK;CAChC,IAAI,MAAM,QAAQ;EAChB,YAAY;GAAE,IAAI;GAAU;EAAK,GAAG,GAAG;EACvC;CACF;CAEA,MAAM,SAAS,eAAe,MADZ,eAAe,OAAO,GAAG,GACR,KAAK;CACxC,MAAM,KAAK,MAAM,UAAU,QAAQ,QAAQ;CAK3C,aAAY,MAJM,OAAO,QAAQ,WAAW,MAAM;EAChD,QAAQ;EACR;CACF,CAAC,GACe,MAAM,GAAG;AAC3B;AAEA,eAAe,UAAU,QAAmB,UAAmC;CAC7E,IAAI,cAAc,QAAQ,GAAG,OAAO;CACpC,MAAM,MAAM,MAAM,OAAO,QAAyB,gBAAgB,UAAU;CAC5E,IAAI,CAAC,IAAI,MAAM,IACb,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS,oBAAoB;CAC/B,CAAC;CACH,OAAO,IAAI,KAAK;AAClB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { i as emitSuccess, s as MxsError } from "./output-BM7aBFwt.mjs";
|
|
2
|
+
import { c as readCredentials } from "./config-store-DIu7x0ao.mjs";
|
|
3
|
+
import { n as resolveContext, t as buildApiClient } from "./shared-D0HVBDHI.mjs";
|
|
4
|
+
//#region src/commands/auth/whoami.ts
|
|
5
|
+
async function run(flags, out) {
|
|
6
|
+
const ctx = await resolveContext(flags, out);
|
|
7
|
+
const cred = await readCredentials();
|
|
8
|
+
if (!cred && !ctx.token && !ctx.apiKey) throw new MxsError({
|
|
9
|
+
code: "auth.missing",
|
|
10
|
+
message: "not authenticated",
|
|
11
|
+
hint: "run `mxs auth login`"
|
|
12
|
+
});
|
|
13
|
+
const client = buildApiClient(ctx, flags);
|
|
14
|
+
emitSuccess({
|
|
15
|
+
user: (ctx.token && !ctx.apiKey ? await client.request("/auth/session").then((res) => res.data) : null) ?? cred?.user ?? null,
|
|
16
|
+
api_url: ctx.apiUrl
|
|
17
|
+
}, out);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { run };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=whoami-CTkctOEd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami-CTkctOEd.mjs","names":[],"sources":["../src/commands/auth/whoami.ts"],"sourcesContent":["import { readCredentials } from '../../core/config-store'\nimport { MxsError } from '../../core/errors'\nimport { emitSuccess, type OutputOptions } from '../../core/output'\nimport { buildApiClient, type GlobalFlags, resolveContext } from '../internal/shared'\n\nexport async function run(flags: GlobalFlags, out: OutputOptions) {\n const ctx = await resolveContext(flags, out)\n const cred = await readCredentials()\n if (!cred && !ctx.token && !ctx.apiKey) {\n throw new MxsError({\n code: 'auth.missing',\n message: 'not authenticated',\n hint: 'run `mxs auth login`',\n })\n }\n const client = buildApiClient(ctx, flags)\n const session =\n ctx.token && !ctx.apiKey\n ? await client.request('/auth/session').then((res) => res.data)\n : null\n emitSuccess(\n {\n user: session ?? cred?.user ?? null,\n api_url: ctx.apiUrl,\n },\n out,\n )\n}\n"],"mappings":";;;;AAKA,eAAsB,IAAI,OAAoB,KAAoB;CAChE,MAAM,MAAM,MAAM,eAAe,OAAO,GAAG;CAC3C,MAAM,OAAO,MAAM,gBAAgB;CACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,QAC9B,MAAM,IAAI,SAAS;EACjB,MAAM;EACN,SAAS;EACT,MAAM;CACR,CAAC;CAEH,MAAM,SAAS,eAAe,KAAK,KAAK;CAKxC,YACE;EACE,OALF,IAAI,SAAS,CAAC,IAAI,SACd,MAAM,OAAO,QAAQ,eAAe,EAAE,MAAM,QAAQ,IAAI,IAAI,IAC5D,SAGe,MAAM,QAAQ;EAC/B,SAAS,IAAI;CACf,GACA,GACF;AACF"}
|