@metabase/cli 0.1.18 → 0.2.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/README.md +61 -35
- package/dist/{add-collection-CRZAFCZy.mjs → add-collection-BTSGp4f9.mjs} +4 -5
- package/dist/add-collection-DlAwt2Z3.mjs +9 -0
- package/dist/append-DY1-O789.mjs +42 -0
- package/dist/{archive-errg-EKw.mjs → archive-BOEEMrYL.mjs} +6 -8
- package/dist/{archive-3mEhK9_H.mjs → archive-CJ9rElKn.mjs} +6 -8
- package/dist/{archive-De4yVEV8.mjs → archive-CWtUzlHO.mjs} +5 -7
- package/dist/{archive-d74nDcp4.mjs → archive-DCPw3df6.mjs} +5 -7
- package/dist/{archive-CFHYRF65.mjs → archive-DOa1u1aJ.mjs} +5 -7
- package/dist/{archive-Z8ZM-ilB.mjs → archive-pHsa4dL0.mjs} +8 -9
- package/dist/{archive-C3RWdM-2.mjs → archive-w6TX-zEk.mjs} +7 -8
- package/dist/auth-BrQtY0pO.mjs +22 -0
- package/dist/{body-BS2s2zDl.mjs → body-C1_AaTS4.mjs} +3 -3
- package/dist/{branches-mcyT7wI-.mjs → branches-BsBzaGIf.mjs} +5 -7
- package/dist/{cancel-B2l-i2NS.mjs → cancel-BNM0yyx-.mjs} +4 -6
- package/dist/{cancel-task-CugcIeIi.mjs → cancel-task-Bggzn4JL.mjs} +5 -7
- package/dist/capabilities-DrDJo_ng.mjs +684 -0
- package/dist/{card-DEmcRlNO.mjs → card-B8G5jQQT.mjs} +24 -18
- package/dist/card-DHCcmpgr.mjs +26 -0
- package/dist/{cards-BGkz5BeZ.mjs → cards-D0hvA13L.mjs} +7 -8
- package/dist/cli.mjs +175 -29
- package/dist/{collection-DrLpA1SO.mjs → collection-CFoLPrY5.mjs} +1 -1
- package/dist/collection-D0O9gp3S.mjs +23 -0
- package/dist/{collection-namespace-BP_LJrAD.mjs → collection-namespace-DqPNrCdQ.mjs} +2 -2
- package/dist/{create-kWzqvTGR.mjs → create-05rX4oL-.mjs} +11 -12
- package/dist/{create-wpvDXSSY.mjs → create-BR7x66KW.mjs} +12 -13
- package/dist/{create-D8KA4zJA.mjs → create-C17Fh1_X.mjs} +9 -10
- package/dist/{create-DhrftYre.mjs → create-C8ndg3g4.mjs} +14 -14
- package/dist/{create-DzyMvAVy.mjs → create-CZ9KFnbi.mjs} +8 -9
- package/dist/{create-Cztp5kES.mjs → create-Cii_utzV.mjs} +5 -7
- package/dist/{create-CkRFKtFG.mjs → create-Cyv7vHV_.mjs} +8 -9
- package/dist/{create-YfGzANNB.mjs → create-DKuixGJ2.mjs} +8 -9
- package/dist/{create-B4HAEEE0.mjs → create-E6L3WMqV.mjs} +8 -9
- package/dist/{create-BOmmMSjF.mjs → create-a3s1S2Dw.mjs} +11 -12
- package/dist/{create-branch-DsoMfx_2.mjs → create-branch-Dxn6UnV_.mjs} +5 -7
- package/dist/{create-CD9Rp8qs.mjs → create-oLb0E-ZP.mjs} +14 -14
- package/dist/csv-T6_vlLJS.mjs +58 -0
- package/dist/{current-task-WuKPZpZ6.mjs → current-task-DxWbw-bU.mjs} +5 -7
- package/dist/{dashboard-DOplbKyQ.mjs → dashboard-B-MTpfeS.mjs} +35 -15
- package/dist/dashboard-BpSPoeAn.mjs +35 -0
- package/dist/{database-D9fftP-i.mjs → database-CIbVSfua.mjs} +2 -2
- package/dist/db-DBRijnh4.mjs +27 -0
- package/dist/{delete-Buai0_e_.mjs → delete--P1xFX37.mjs} +6 -8
- package/dist/{delete-CmGh0jo1.mjs → delete-BBOIUl0D.mjs} +6 -8
- package/dist/{delete-BCitmugk.mjs → delete-Ce2EBQYA.mjs} +6 -8
- package/dist/{delete-runtime-B0ha5QR4.mjs → delete-runtime-B-8I9V1g.mjs} +2 -3
- package/dist/{delete-table-BOkYxdjA.mjs → delete-table-Bj32NsXn.mjs} +6 -8
- package/dist/{dependencies-XZrEvHUA.mjs → dependencies-ixzjVjUz.mjs} +5 -7
- package/dist/{dirty-B-5NDbG9.mjs → dirty-CH70h5m5.mjs} +5 -7
- package/dist/{document-1W7NRaO_.mjs → document-CL4ML5FN.mjs} +20 -4
- package/dist/document-dZpuFu3I.mjs +22 -0
- package/dist/{eid-BCuJRv7a.mjs → eid-XjkBbyb_.mjs} +10 -11
- package/dist/embedding-CKdw8q7p.mjs +11 -0
- package/dist/{export-Dod2gdyE.mjs → export-CChMg-mL.mjs} +7 -9
- package/dist/field-B1heFeCz.mjs +21 -0
- package/dist/{field-CMY_LWUe.mjs → field-DsXTeqBy.mjs} +6 -4
- package/dist/{fields-B0yttrzR.mjs → fields-C7h2QwUp.mjs} +6 -8
- package/dist/{get-Dz7fcqoG.mjs → get-AvGH_oph.mjs} +8 -9
- package/dist/{get-BkGh9BPd.mjs → get-B6ZJCJ8H.mjs} +5 -7
- package/dist/{get-k6M5nGMC.mjs → get-BWHJDa0B.mjs} +5 -7
- package/dist/{get-CfeYa0v5.mjs → get-BsyccuCH.mjs} +5 -7
- package/dist/{get-B0OsW6jk.mjs → get-C98IFgFi.mjs} +5 -7
- package/dist/{get-D-pNrQGA.mjs → get-Cj90oyxG.mjs} +5 -7
- package/dist/{get-DBY5esTW.mjs → get-D9r2znrn.mjs} +5 -7
- package/dist/{get-BpZ81hX8.mjs → get-DRZENkCj.mjs} +5 -7
- package/dist/{get-D7QMqPOK.mjs → get-DWWmpQ87.mjs} +5 -7
- package/dist/{get-CbpHt4Hs.mjs → get-Dg1J0wxb.mjs} +5 -7
- package/dist/{get-DJ8huA8y.mjs → get-DrWYvefc.mjs} +7 -8
- package/dist/{get-u5Uq9vms.mjs → get-KVN9ANVh.mjs} +4 -6
- package/dist/get-RlP_xiUd.mjs +67 -0
- package/dist/{get-9p0Gt1c7.mjs → get-cyR67Lmq.mjs} +5 -7
- package/dist/{get-DISgP66L.mjs → get-kqY2lwhO.mjs} +16 -9
- package/dist/{get-run-DQJVpDw1.mjs → get-run-C4C_QQqO.mjs} +5 -7
- package/dist/git-sync-JHa7bIyY.mjs +31 -0
- package/dist/{group-BNE_RiH5.mjs → group-CILtQqCL.mjs} +2 -1
- package/dist/{has-remote-changes-DvQBXudi.mjs → has-remote-changes-dLUGr0MD.mjs} +5 -7
- package/dist/{import-PGS8-DwE.mjs → import-Byull6jF.mjs} +7 -9
- package/dist/{input-7Sj85_K7.mjs → input-m9ctfLxZ.mjs} +6 -3
- package/dist/is-dirty-Bb2dfEYs.mjs +8 -0
- package/dist/{is-dirty-DyEVFQVJ.mjs → is-dirty-CU3ovgdG.mjs} +3 -4
- package/dist/{items-CkFEy2Du.mjs → items-CEGDYWuF.mjs} +7 -9
- package/dist/{key-bltP32Pm.mjs → key-Ge4VwWvS.mjs} +1 -1
- package/dist/{library-1AAVbk-K.mjs → library-DHWWa4Tt.mjs} +6 -6
- package/dist/{list-Bb8YRON_.mjs → list-3z1ZChTG.mjs} +4 -6
- package/dist/{list-BY4S32Lg.mjs → list-B9TyELob.mjs} +4 -6
- package/dist/{list-Sgo3RfDY.mjs → list-BFm4iEBt.mjs} +4 -6
- package/dist/{list-BVzu2RIZ.mjs → list-BliCJAjt.mjs} +4 -6
- package/dist/{list-CKzpoTgP.mjs → list-Bpv06V24.mjs} +6 -8
- package/dist/{list-BWAYDSbQ.mjs → list-Br48kL09.mjs} +4 -6
- package/dist/{list-pQ22nXhQ.mjs → list-BtcpNl4-.mjs} +4 -6
- package/dist/{list-82NkvRpI.mjs → list-BuyRG3GB.mjs} +7 -8
- package/dist/{list-CjF12k1G.mjs → list-CMb03cv3.mjs} +5 -7
- package/dist/{list-BCYTTCFD.mjs → list-CmCJwaGT.mjs} +4 -6
- package/dist/{list-CK0p7vvK.mjs → list-Cur_72xZ.mjs} +5 -7
- package/dist/{list-D-rgDFa5.mjs → list-D9FY30xH.mjs} +8 -9
- package/dist/{list-BBxRjuMn.mjs → list-DEkPxVZu.mjs} +4 -6
- package/dist/{list-B9wXg3qi.mjs → list-O2w5xd1q.mjs} +4 -6
- package/dist/{list-CJx5q-Yn.mjs → list-th_Ym6Cv.mjs} +6 -8
- package/dist/{login-C6ZAnGHz.mjs → login-hKlYsAa1.mjs} +8 -10
- package/dist/{logout-CWjyY3Y8.mjs → logout-DO8GVC6b.mjs} +4 -6
- package/dist/measure-R3T20wnB.mjs +25 -0
- package/dist/{measure-DoJvtCaA.mjs → measure-S9WszHre.mjs} +5 -4
- package/dist/{parameter-values-DmDOuE-j.mjs → parameter-values-BJb2GuLz.mjs} +5 -7
- package/dist/{parse-enum-BL9i_brN.mjs → parse-enum-Cfne2suT.mjs} +1 -1
- package/dist/{parse-id-DlXnOcmP.mjs → parse-id-DfY0Lugw.mjs} +1 -1
- package/dist/{parse-ref-CB_KvF9h.mjs → parse-ref-C_MsXYI6.mjs} +1 -1
- package/dist/{path-D8IJ4YrW.mjs → path-DzhQVCH8.mjs} +4 -6
- package/dist/{poll-hgnrHBoh.mjs → poll-D1Yg78c3.mjs} +2 -2
- package/dist/{poll-task-NQNLT_aA.mjs → poll-task-DLUZaglY.mjs} +2 -2
- package/dist/{preflight-DvaPQHHf.mjs → preflight-Cy2jUSca.mjs} +4 -5
- package/dist/{process-j8UHMHc2.mjs → process-D5HN1wpT.mjs} +1 -1
- package/dist/{prompt-C85xd9HR.mjs → prompt-ZG9Drin_.mjs} +1 -1
- package/dist/{publish-BntmFR6g.mjs → publish-3hmHoaX-.mjs} +7 -9
- package/dist/{query-BQfgKV68.mjs → query-DTASj9Zu.mjs} +9 -10
- package/dist/{query-DSKQZu91.mjs → query-DkZViD_3.mjs} +15 -15
- package/dist/{query-result-D6mfoVfQ.mjs → query-result-CbTFdlSf.mjs} +1 -1
- package/dist/{remove-collection-BguaI3-6.mjs → remove-collection-D3wH9H6R.mjs} +7 -9
- package/dist/replace-CFzqkZXs.mjs +42 -0
- package/dist/requests-KBiY9UYy.mjs +96 -0
- package/dist/{rescan-values-DjD6IW3J.mjs → rescan-values-B1WycObS.mjs} +7 -9
- package/dist/{resolve-Dj2MTBkn.mjs → resolve-Ct084wx3.mjs} +1 -1
- package/dist/{run-Bp1yxkBN.mjs → run-B8qEEdC8.mjs} +4 -6
- package/dist/{run-RQfQj7Rk.mjs → run-cw0qTEQ7.mjs} +7 -9
- package/dist/{runs-CSsatfWb.mjs → runs-BOA4kK_X.mjs} +6 -8
- package/dist/{runtime-oxjmrYoP.mjs → runtime-B-c-Fc2i.mjs} +3 -4
- package/dist/{schema-tables-5I5pCxHl.mjs → schema-tables-DRYzSVcW.mjs} +6 -8
- package/dist/{schemas-CfzFCfBt.mjs → schemas-BiMjD25L.mjs} +4 -6
- package/dist/{search-Vo-BqliA.mjs → search-DjKxRXO5.mjs} +4 -6
- package/dist/{segment-TXktTCfU.mjs → segment-BPb1H6DW.mjs} +6 -5
- package/dist/segment-CZkk0g79.mjs +25 -0
- package/dist/{selectors-DBnJsKlW.mjs → selectors-B7MJUn3I.mjs} +3 -3
- package/dist/{set-active-C0mUZlNN.mjs → set-active-CF868qdW.mjs} +4 -6
- package/dist/{set-1Vh0AF-T.mjs → set-kyoORFG3.mjs} +10 -10
- package/dist/setting-BZgjURQ_.mjs +20 -0
- package/dist/{setup-CzYFvFK5.mjs → setup-D9joJYPb.mjs} +11 -12
- package/dist/{skills-B6gfH0iR.mjs → skills-BqI05u72.mjs} +1 -1
- package/dist/{skills-CR2xyV33.mjs → skills-D8NrJxjp.mjs} +3 -3
- package/dist/{snippet-CtA2Pkoa.mjs → snippet-DWiXNy4T.mjs} +7 -4
- package/dist/snippet-y_FzKxaQ.mjs +22 -0
- package/dist/{stash-CQHXwBu_.mjs → stash-BVMerTaF.mjs} +7 -9
- package/dist/{status-C_7aqTvB.mjs → status-C-0jFjFn.mjs} +4 -6
- package/dist/{status-DXQkM18v.mjs → status-x8bDOa1i.mjs} +6 -8
- package/dist/{summary-1aNpQc8j.mjs → summary-B-R9SdMF.mjs} +5 -7
- package/dist/{sync-schema-BqLp5uTS.mjs → sync-schema-wne2KXIW.mjs} +9 -11
- package/dist/{table-DE3i82T_.mjs → table-C3RIKiYM.mjs} +16 -4
- package/dist/table-CS2-2INi.mjs +21 -0
- package/dist/transform-6hqM1DXA.mjs +31 -0
- package/dist/{transform-DEF38FWe.mjs → transform-JQel7e5H.mjs} +31 -5
- package/dist/transform-job-DuERhLaj.mjs +25 -0
- package/dist/transform-tag-DaNKreDj.mjs +21 -0
- package/dist/{transforms-BelyllUL.mjs → transforms-DB2WNP2R.mjs} +5 -7
- package/dist/{tree-YvmwGql7.mjs → tree-BIOphGVs.mjs} +4 -6
- package/dist/{unpublish-CHjGLMu9.mjs → unpublish-BWM36ZTg.mjs} +5 -7
- package/dist/{update-BACl_bJS.mjs → update-6umfSz5t.mjs} +9 -10
- package/dist/{update-txUfAJxy.mjs → update-7Ts7KrB8.mjs} +9 -10
- package/dist/{update-D7vc8GBF.mjs → update-BCbv880u.mjs} +12 -13
- package/dist/{update-K-jjQ0Aw.mjs → update-BchtHlbH.mjs} +10 -11
- package/dist/{update-BGMJTpA6.mjs → update-BiUeEGU-.mjs} +12 -13
- package/dist/{update-BKhekuqr.mjs → update-BlzcZwRQ.mjs} +15 -15
- package/dist/{update-BnHYSu96.mjs → update-CTZg2Lia.mjs} +13 -14
- package/dist/{update-C9fndCqb.mjs → update-DJDuIhYG.mjs} +9 -10
- package/dist/{update-CrRz47aj.mjs → update-HxYcvpSq.mjs} +15 -15
- package/dist/{update-Zz01Woxj.mjs → update-Sz0QRGWB.mjs} +9 -10
- package/dist/{update-dashcard-Dvth-yLC.mjs → update-dashcard-CfDpy7Lz.mjs} +11 -11
- package/dist/{update-BWlN3QDo.mjs → update-zfLbmC-H.mjs} +9 -10
- package/dist/{upgrade-DsXlfPef.mjs → upgrade-BWl0VjMK.mjs} +5 -7
- package/dist/upload-CPzOhGeX.mjs +16 -0
- package/dist/{uuid-ByJmWV7b.mjs → uuid-D_YeqDui.mjs} +3 -5
- package/dist/{validate-BqNW4Sk1.mjs → validate-clAWO3X-.mjs} +1 -2
- package/dist/{validate-query-CcZVKYPV.mjs → validate-query-CsK2_2_u.mjs} +2 -3
- package/dist/{values-CIjJI4sz.mjs → values-DSk8ZJ3B.mjs} +5 -7
- package/dist/{verify-Jsuc2dat.mjs → verify-DkQdLjf3.mjs} +2 -2
- package/dist/{wait-5ltTFvSa.mjs → wait-DvSsMjea.mjs} +6 -8
- package/dist/{wait-flags-D6kd_G7c.mjs → wait-flags-dXGThljd.mjs} +2 -2
- package/package.json +1 -1
- package/skill-data/core/SKILL.md +27 -21
- package/skill-data/dashboard/SKILL.md +26 -3
- package/skill-data/data-workflow/SKILL.md +17 -15
- package/dist/add-collection-DbalcC3_.mjs +0 -11
- package/dist/auth--PWX0oj5.mjs +0 -22
- package/dist/capabilities-N0jo5U7S.mjs +0 -239
- package/dist/card-D07WYCQY.mjs +0 -26
- package/dist/collection-Dss2qSEF.mjs +0 -23
- package/dist/dashboard-Crh4v6Fq.mjs +0 -35
- package/dist/db-BCAURQei.mjs +0 -28
- package/dist/document-upxL2nKH.mjs +0 -22
- package/dist/error-BaBm-UrT.mjs +0 -227
- package/dist/field-CloFa1oe.mjs +0 -21
- package/dist/get-B8tugTku.mjs +0 -50
- package/dist/git-sync-C9m-OHac.mjs +0 -31
- package/dist/is-dirty-DpyKeGAJ.mjs +0 -10
- package/dist/manifest-BVf8P4bl.mjs +0 -126
- package/dist/measure-Cbly1r0E.mjs +0 -25
- package/dist/metadata-CW5Lfw5d.mjs +0 -39
- package/dist/metadata-aQAqseCm.mjs +0 -38
- package/dist/notice-DyVl5aYB.mjs +0 -206
- package/dist/segment-BuN_IoM8.mjs +0 -25
- package/dist/setting-BbdKR-lO.mjs +0 -20
- package/dist/snippet-Bzo2U9Fv.mjs +0 -22
- package/dist/table-BwGOz97O.mjs +0 -22
- package/dist/transform-B65ZD9-e.mjs +0 -31
- package/dist/transform-job-BWVKXSV6.mjs +0 -25
- package/dist/transform-tag-C4qvmicL.mjs +0 -21
- /package/dist/{body-flags-DWTTxJpP.mjs → body-flags-CgHgJBRC.mjs} +0 -0
- /package/dist/{command-augment-DdZIfx1V.mjs → command-augment-D9pI9Vbh.mjs} +0 -0
- /package/dist/{paginate-FVZUxL4J.mjs → paginate-CMqbqhMC.mjs} +0 -0
- /package/dist/{parameter-CiJ4CwWE.mjs → parameter-BZ6y-Gfs.mjs} +0 -0
- /package/dist/{render-BTKnWL0d.mjs → render-CkuFkWlQ.mjs} +0 -0
- /package/dist/{revision-message-flag-CHrJgFFx.mjs → revision-message-flag-CHzX0cqV.mjs} +0 -0
- /package/dist/{setting-m46MUtW5.mjs → setting-Cko6bE_w.mjs} +0 -0
- /package/dist/{transform-job-CtixL4An.mjs → transform-job-CtVziW85.mjs} +0 -0
- /package/dist/{transform-tag-rsIrckCM.mjs → transform-tag-wFiWmiyO.mjs} +0 -0
|
@@ -0,0 +1,684 @@
|
|
|
1
|
+
import { ZodError, core, z } from "zod";
|
|
2
|
+
import { isCancel } from "@clack/prompts";
|
|
3
|
+
import Table from "cli-table3";
|
|
4
|
+
|
|
5
|
+
//#region src/runtime/citty.ts
|
|
6
|
+
async function resolveCitty(value) {
|
|
7
|
+
if (value === void 0) return void 0;
|
|
8
|
+
if (typeof value === "function") return value();
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function toAliasArray(alias) {
|
|
12
|
+
if (alias === void 0) return [];
|
|
13
|
+
return Array.isArray(alias) ? alias : [alias];
|
|
14
|
+
}
|
|
15
|
+
function normalizeFlag(value) {
|
|
16
|
+
return value.replace(/^-+/, "").replace(/-/g, "").toLowerCase();
|
|
17
|
+
}
|
|
18
|
+
function flagConsumesValue(token, argsDef) {
|
|
19
|
+
if (token.includes("=")) return false;
|
|
20
|
+
const name$1 = normalizeFlag(token);
|
|
21
|
+
for (const [key, def] of Object.entries(argsDef)) {
|
|
22
|
+
if (def.type !== "string" && def.type !== "enum") continue;
|
|
23
|
+
if (normalizeFlag(key) === name$1) return true;
|
|
24
|
+
if (toAliasArray(def.alias).some((alias) => normalizeFlag(alias) === name$1)) return true;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/output/types.ts
|
|
31
|
+
const DEFAULT_MAX_BYTES = 24576;
|
|
32
|
+
function listEnvelopeSchema(item) {
|
|
33
|
+
return z.object({
|
|
34
|
+
data: z.array(item),
|
|
35
|
+
returned: z.number().int().nonnegative(),
|
|
36
|
+
total: z.number().int().nonnegative().nullable().optional(),
|
|
37
|
+
limit: z.number().int().nonnegative().optional(),
|
|
38
|
+
truncated: z.object({
|
|
39
|
+
reason: z.literal("max_bytes"),
|
|
40
|
+
bytes: z.number().int().nonnegative()
|
|
41
|
+
}).optional()
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function wrapList(items) {
|
|
45
|
+
return {
|
|
46
|
+
data: items,
|
|
47
|
+
returned: items.length,
|
|
48
|
+
total: items.length
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/commands/flags.ts
|
|
54
|
+
const outputFlags = {
|
|
55
|
+
format: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description: "auto | json | text",
|
|
58
|
+
default: "auto"
|
|
59
|
+
},
|
|
60
|
+
json: {
|
|
61
|
+
type: "boolean",
|
|
62
|
+
description: "Shorthand for --format json"
|
|
63
|
+
},
|
|
64
|
+
full: {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
description: "Return the full object (default: compact)"
|
|
67
|
+
},
|
|
68
|
+
fields: {
|
|
69
|
+
type: "string",
|
|
70
|
+
description: "Dot-paths, comma separated (mutually exclusive with --full)"
|
|
71
|
+
},
|
|
72
|
+
maxBytes: {
|
|
73
|
+
type: "string",
|
|
74
|
+
description: "Output size cap; 0 disables",
|
|
75
|
+
default: String(DEFAULT_MAX_BYTES),
|
|
76
|
+
alias: "max-bytes"
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const profileFlag = { profile: {
|
|
80
|
+
type: "string",
|
|
81
|
+
description: "Named profile (default: 'default')",
|
|
82
|
+
alias: "p"
|
|
83
|
+
} };
|
|
84
|
+
const connectionFlags = {
|
|
85
|
+
url: {
|
|
86
|
+
type: "string",
|
|
87
|
+
description: "Metabase URL"
|
|
88
|
+
},
|
|
89
|
+
apiKey: {
|
|
90
|
+
type: "string",
|
|
91
|
+
description: "API key",
|
|
92
|
+
alias: "api-key"
|
|
93
|
+
},
|
|
94
|
+
skipPreflight: {
|
|
95
|
+
type: "boolean",
|
|
96
|
+
description: "Skip the server version capability check for this command",
|
|
97
|
+
alias: "skip-preflight"
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region src/core/json-pointer.ts
|
|
103
|
+
function escapeJsonPointerSegment(key) {
|
|
104
|
+
if (typeof key === "number") return String(key);
|
|
105
|
+
const segment = typeof key === "symbol" ? key.toString() : key;
|
|
106
|
+
return segment.replaceAll("~", "~0").replaceAll("/", "~1");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
//#region src/core/errors.ts
|
|
111
|
+
var MetabaseError = class extends Error {
|
|
112
|
+
get userMessage() {
|
|
113
|
+
return this.message;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var NetworkError = class extends MetabaseError {
|
|
117
|
+
category = "network";
|
|
118
|
+
isRetryable = true;
|
|
119
|
+
exitCode = 1;
|
|
120
|
+
developerDetail;
|
|
121
|
+
constructor(message, developerDetail) {
|
|
122
|
+
super(message);
|
|
123
|
+
this.name = "NetworkError";
|
|
124
|
+
this.developerDetail = developerDetail;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
var TimeoutError = class extends MetabaseError {
|
|
128
|
+
category = "timeout";
|
|
129
|
+
isRetryable = true;
|
|
130
|
+
exitCode = 1;
|
|
131
|
+
developerDetail;
|
|
132
|
+
constructor(message, developerDetail) {
|
|
133
|
+
super(message);
|
|
134
|
+
this.name = "TimeoutError";
|
|
135
|
+
this.developerDetail = developerDetail;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var ValidationError = class extends MetabaseError {
|
|
139
|
+
category = "validation";
|
|
140
|
+
isRetryable = false;
|
|
141
|
+
exitCode = 1;
|
|
142
|
+
developerDetail;
|
|
143
|
+
constructor(message, developerDetail) {
|
|
144
|
+
super(message);
|
|
145
|
+
this.name = "ValidationError";
|
|
146
|
+
this.developerDetail = developerDetail;
|
|
147
|
+
}
|
|
148
|
+
get userMessage() {
|
|
149
|
+
const issues = this.developerDetail.zodIssues;
|
|
150
|
+
if (issues.length === 0) return this.message;
|
|
151
|
+
return `${this.message}\n${formatIssueLines(issues, VALIDATION_ISSUE_FORMAT)}`;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const VALIDATION_MAX_ISSUES = 10;
|
|
155
|
+
const RESPONSE_SHAPE_MAX_ISSUES = 5;
|
|
156
|
+
const VALIDATION_ISSUE_FORMAT = {
|
|
157
|
+
max: VALIDATION_MAX_ISSUES,
|
|
158
|
+
formatIssue: (issue) => `${formatZodIssuePointer(issue.path)}: ${issue.message}`
|
|
159
|
+
};
|
|
160
|
+
const RESPONSE_SHAPE_ISSUE_FORMAT = {
|
|
161
|
+
max: RESPONSE_SHAPE_MAX_ISSUES,
|
|
162
|
+
formatIssue: formatZodIssue
|
|
163
|
+
};
|
|
164
|
+
function formatIssueLines(issues, format) {
|
|
165
|
+
const head = issues.slice(0, format.max).map(format.formatIssue);
|
|
166
|
+
const overflow = issues.length - format.max;
|
|
167
|
+
if (overflow > 0) head.push(`... and ${overflow} more`);
|
|
168
|
+
return head.map((line) => ` ${line}`).join("\n");
|
|
169
|
+
}
|
|
170
|
+
function formatZodIssuePointer(path) {
|
|
171
|
+
if (path.length === 0) return "/";
|
|
172
|
+
return path.map((key) => `/${escapeJsonPointerSegment(key)}`).join("");
|
|
173
|
+
}
|
|
174
|
+
const RESPONSE_SHAPE_LEAD_UNKNOWN_VERSION = "Metabase returned unexpected response shape";
|
|
175
|
+
var ResponseShapeError = class extends MetabaseError {
|
|
176
|
+
category = "response-shape";
|
|
177
|
+
isRetryable = false;
|
|
178
|
+
exitCode = 1;
|
|
179
|
+
developerDetail;
|
|
180
|
+
constructor(developerDetail) {
|
|
181
|
+
super(formatResponseShapeMessage(developerDetail.zodIssues, developerDetail.serverTag));
|
|
182
|
+
this.name = "ResponseShapeError";
|
|
183
|
+
this.developerDetail = developerDetail;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
function formatResponseShapeMessage(issues, serverTag) {
|
|
187
|
+
const lead = serverTag === null ? RESPONSE_SHAPE_LEAD_UNKNOWN_VERSION : `On Metabase ${serverTag} the response shape was unexpected`;
|
|
188
|
+
if (issues.length === 0) return lead;
|
|
189
|
+
return `${lead}:\n${formatIssueLines(issues, RESPONSE_SHAPE_ISSUE_FORMAT)}`;
|
|
190
|
+
}
|
|
191
|
+
var ConfigError = class extends MetabaseError {
|
|
192
|
+
category = "config";
|
|
193
|
+
isRetryable = false;
|
|
194
|
+
exitCode = 2;
|
|
195
|
+
developerDetail = null;
|
|
196
|
+
constructor(message) {
|
|
197
|
+
super(message);
|
|
198
|
+
this.name = "ConfigError";
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
var AbortError = class extends MetabaseError {
|
|
202
|
+
category = "abort";
|
|
203
|
+
isRetryable = false;
|
|
204
|
+
exitCode = 130;
|
|
205
|
+
developerDetail = null;
|
|
206
|
+
constructor(message = "aborted") {
|
|
207
|
+
super(message);
|
|
208
|
+
this.name = "AbortError";
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
var ChainedRequestError = class extends MetabaseError {
|
|
212
|
+
cause;
|
|
213
|
+
constructor(message, cause) {
|
|
214
|
+
super(message);
|
|
215
|
+
this.name = "ChainedRequestError";
|
|
216
|
+
this.cause = cause;
|
|
217
|
+
}
|
|
218
|
+
get category() {
|
|
219
|
+
return this.cause.category;
|
|
220
|
+
}
|
|
221
|
+
get isRetryable() {
|
|
222
|
+
return this.cause.isRetryable;
|
|
223
|
+
}
|
|
224
|
+
get exitCode() {
|
|
225
|
+
return this.cause.exitCode;
|
|
226
|
+
}
|
|
227
|
+
get developerDetail() {
|
|
228
|
+
return this.cause.developerDetail;
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
var UnknownError = class extends MetabaseError {
|
|
232
|
+
category = "unknown";
|
|
233
|
+
isRetryable = false;
|
|
234
|
+
exitCode = 1;
|
|
235
|
+
developerDetail;
|
|
236
|
+
constructor(input) {
|
|
237
|
+
super(input.originalMessage);
|
|
238
|
+
this.name = "UnknownError";
|
|
239
|
+
this.developerDetail = input;
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
function toMetabaseError(error) {
|
|
243
|
+
if (error instanceof MetabaseError) return error;
|
|
244
|
+
if (isCancel(error)) return new AbortError();
|
|
245
|
+
if (error instanceof ZodError) return new ConfigError(error.issues.map(formatZodIssue).join("; "));
|
|
246
|
+
if (error instanceof Error) return new UnknownError({
|
|
247
|
+
originalMessage: error.message,
|
|
248
|
+
stack: error.stack ?? null
|
|
249
|
+
});
|
|
250
|
+
return new UnknownError({
|
|
251
|
+
originalMessage: String(error),
|
|
252
|
+
stack: null
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
function formatZodIssue(issue) {
|
|
256
|
+
const path = core.toDotPath(issue.path);
|
|
257
|
+
return path === "" ? issue.message : `${path}: ${issue.message}`;
|
|
258
|
+
}
|
|
259
|
+
function isNotFoundError(value) {
|
|
260
|
+
return value instanceof Error && "code" in value && value.code === "ENOENT";
|
|
261
|
+
}
|
|
262
|
+
function errorMessage(value) {
|
|
263
|
+
return value instanceof Error ? value.message : String(value);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
//#endregion
|
|
267
|
+
//#region package.json
|
|
268
|
+
var name = "@metabase/cli";
|
|
269
|
+
var version = "0.2.0";
|
|
270
|
+
var description = "Metabase CLI";
|
|
271
|
+
var license = "AGPL-3.0";
|
|
272
|
+
var repository = {
|
|
273
|
+
"type": "git",
|
|
274
|
+
"url": "git+https://github.com/metabase/mb-cli.git"
|
|
275
|
+
};
|
|
276
|
+
var bin = { "mb": "./dist/cli.mjs" };
|
|
277
|
+
var files = [
|
|
278
|
+
"dist",
|
|
279
|
+
"skills",
|
|
280
|
+
"skill-data",
|
|
281
|
+
".claude-plugin"
|
|
282
|
+
];
|
|
283
|
+
var type = "module";
|
|
284
|
+
var publishConfig = {
|
|
285
|
+
"access": "public",
|
|
286
|
+
"registry": "https://registry.npmjs.org/"
|
|
287
|
+
};
|
|
288
|
+
var scripts = {
|
|
289
|
+
"build": "tsdown",
|
|
290
|
+
"dev": "tsdown --watch",
|
|
291
|
+
"start": "node dist/cli.mjs",
|
|
292
|
+
"test": "vitest run --project unit",
|
|
293
|
+
"test:watch": "vitest --project unit",
|
|
294
|
+
"test:e2e": "vitest run --project e2e",
|
|
295
|
+
"test:e2e:watch": "vitest --project e2e",
|
|
296
|
+
"e2e:up": "docker compose -f tests/e2e/docker-compose.yml up -d --wait",
|
|
297
|
+
"e2e:down": "docker compose -f tests/e2e/docker-compose.yml down -v",
|
|
298
|
+
"e2e:bootstrap": "bun tests/e2e/setup/bootstrap.ts",
|
|
299
|
+
"e2e:matrix": "bun scripts/e2e-matrix.ts",
|
|
300
|
+
"e2e:logs": "docker compose -f tests/e2e/docker-compose.yml logs -f metabase",
|
|
301
|
+
"typecheck": "tsc --noEmit",
|
|
302
|
+
"lint": "oxlint",
|
|
303
|
+
"lint:fix": "oxlint --fix",
|
|
304
|
+
"lint:skills": "uvx skillsaw lint skill-data/ --strict",
|
|
305
|
+
"format": "oxfmt",
|
|
306
|
+
"format:check": "oxfmt --check",
|
|
307
|
+
"sync:representations": "bun run scripts/sync-representations.ts",
|
|
308
|
+
"prepublishOnly": "tsdown && publint"
|
|
309
|
+
};
|
|
310
|
+
var dependencies = {
|
|
311
|
+
"@clack/prompts": "^0.8.2",
|
|
312
|
+
"@napi-rs/keyring": "^1.3.0",
|
|
313
|
+
"ajv": "^8.17.1",
|
|
314
|
+
"ajv-formats": "^3.0.1",
|
|
315
|
+
"citty": "^0.2.2",
|
|
316
|
+
"cli-table3": "^0.6.5",
|
|
317
|
+
"semver": "^7.8.0",
|
|
318
|
+
"yaml": "^2.8.4",
|
|
319
|
+
"zod": "^4.0.0"
|
|
320
|
+
};
|
|
321
|
+
var devDependencies = {
|
|
322
|
+
"@types/js-yaml": "^4.0.9",
|
|
323
|
+
"@types/node": "^22.10.0",
|
|
324
|
+
"@types/semver": "^7.7.1",
|
|
325
|
+
"execa": "^9.5.2",
|
|
326
|
+
"fast-check": "^4.7.0",
|
|
327
|
+
"js-yaml": "^4.1.0",
|
|
328
|
+
"oxfmt": "^0.47.0",
|
|
329
|
+
"oxlint": "^1.62.0",
|
|
330
|
+
"publint": "^0.3.0",
|
|
331
|
+
"tsdown": "^0.9.0",
|
|
332
|
+
"typescript": "^5.7.2",
|
|
333
|
+
"vitest": "^2.1.8"
|
|
334
|
+
};
|
|
335
|
+
var engines = { "node": ">=20.6" };
|
|
336
|
+
var package_default = {
|
|
337
|
+
name,
|
|
338
|
+
version,
|
|
339
|
+
description,
|
|
340
|
+
license,
|
|
341
|
+
repository,
|
|
342
|
+
bin,
|
|
343
|
+
files,
|
|
344
|
+
type,
|
|
345
|
+
publishConfig,
|
|
346
|
+
scripts,
|
|
347
|
+
dependencies,
|
|
348
|
+
devDependencies,
|
|
349
|
+
engines
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
//#endregion
|
|
353
|
+
//#region src/core/env.ts
|
|
354
|
+
const CANONICAL_PREFIX = "MB_";
|
|
355
|
+
const LEGACY_PREFIX = "METABASE_";
|
|
356
|
+
const ENV_URL = "MB_URL";
|
|
357
|
+
const ENV_API_KEY = "MB_API_KEY";
|
|
358
|
+
const ENV_PROFILE = "MB_PROFILE";
|
|
359
|
+
const ENV_VERBOSE = "MB_VERBOSE";
|
|
360
|
+
const ENV_SKIP_PREFLIGHT = "MB_CLI_SKIP_PREFLIGHT";
|
|
361
|
+
const ENV_DISABLE_KEYRING = "MB_CLI_DISABLE_KEYRING";
|
|
362
|
+
function legacyNameFor(canonical) {
|
|
363
|
+
return LEGACY_PREFIX + canonical.slice(CANONICAL_PREFIX.length);
|
|
364
|
+
}
|
|
365
|
+
const legacyVarsUsed = new Set();
|
|
366
|
+
function readEnv(canonical) {
|
|
367
|
+
const direct = process.env[canonical];
|
|
368
|
+
if (direct !== void 0) return direct;
|
|
369
|
+
const legacyValue = process.env[legacyNameFor(canonical)];
|
|
370
|
+
if (legacyValue !== void 0) {
|
|
371
|
+
legacyVarsUsed.add(canonical);
|
|
372
|
+
return legacyValue;
|
|
373
|
+
}
|
|
374
|
+
return void 0;
|
|
375
|
+
}
|
|
376
|
+
function consumeLegacyEnvWarnings() {
|
|
377
|
+
if (legacyVarsUsed.size === 0) return [];
|
|
378
|
+
const messages = [...legacyVarsUsed].map(legacyEnvWarning);
|
|
379
|
+
legacyVarsUsed.clear();
|
|
380
|
+
return messages;
|
|
381
|
+
}
|
|
382
|
+
function legacyEnvWarning(canonical) {
|
|
383
|
+
return `warning: ${legacyNameFor(canonical)} is deprecated; set ${canonical} instead`;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
//#endregion
|
|
387
|
+
//#region src/output/notice.ts
|
|
388
|
+
function warn(message) {
|
|
389
|
+
process.stderr.write(message + "\n");
|
|
390
|
+
}
|
|
391
|
+
function listTruncationNotice(bytes) {
|
|
392
|
+
return `… cut at ${bytes} bytes; narrow the selection or raise --max-bytes`;
|
|
393
|
+
}
|
|
394
|
+
const ITEM_OVERSIZE_REMEDY = "narrow with --fields or raise the cap with --max-bytes <n>";
|
|
395
|
+
function itemOversizeMessage(bytes, maxBytes, hint) {
|
|
396
|
+
return `output is ${bytes} bytes, over the ${maxBytes}-byte --max-bytes cap; ${hint ?? ITEM_OVERSIZE_REMEDY}`;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
//#endregion
|
|
400
|
+
//#region src/output/cap.ts
|
|
401
|
+
function capListEnvelope(envelope, maxBytes) {
|
|
402
|
+
if (maxBytes <= 0) return envelope;
|
|
403
|
+
const fullBytes = jsonByteLength(envelope);
|
|
404
|
+
if (fullBytes <= maxBytes) return envelope;
|
|
405
|
+
let lo = 0;
|
|
406
|
+
let hi = envelope.data.length;
|
|
407
|
+
while (lo < hi) {
|
|
408
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
409
|
+
if (jsonByteLength(truncate(envelope, mid, fullBytes)) <= maxBytes) lo = mid;
|
|
410
|
+
else hi = mid - 1;
|
|
411
|
+
}
|
|
412
|
+
return truncate(envelope, lo, fullBytes);
|
|
413
|
+
}
|
|
414
|
+
function truncate(envelope, count, originalBytes) {
|
|
415
|
+
return {
|
|
416
|
+
...envelope,
|
|
417
|
+
data: envelope.data.slice(0, count),
|
|
418
|
+
returned: count,
|
|
419
|
+
truncated: {
|
|
420
|
+
reason: "max_bytes",
|
|
421
|
+
bytes: originalBytes
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
function jsonByteLength(value) {
|
|
426
|
+
return Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
//#endregion
|
|
430
|
+
//#region src/runtime/predicates.ts
|
|
431
|
+
function isPlainObject(value) {
|
|
432
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
//#endregion
|
|
436
|
+
//#region src/output/projection.ts
|
|
437
|
+
function applyProjection(value, view, full, fields) {
|
|
438
|
+
if (fields !== void 0) {
|
|
439
|
+
if (fields.length === 0) throw new ConfigError("--fields requires at least one path");
|
|
440
|
+
return projectFields(value, fields);
|
|
441
|
+
}
|
|
442
|
+
if (full) return value;
|
|
443
|
+
const parsed = view.compactPick.safeParse(value);
|
|
444
|
+
if (parsed.success) return parsed.data;
|
|
445
|
+
throw new ConfigError(`compact projection failed: ${parsed.error.message}`);
|
|
446
|
+
}
|
|
447
|
+
function projectFields(value, fields) {
|
|
448
|
+
const out = {};
|
|
449
|
+
for (const path of fields) {
|
|
450
|
+
if (path.length === 0) throw new ConfigError(`empty field path`);
|
|
451
|
+
const parts = path.split(".");
|
|
452
|
+
if (parts.some((part) => part.length === 0)) throw new ConfigError(`invalid field path: "${path}"`);
|
|
453
|
+
setPath(out, parts, pickPath(value, parts));
|
|
454
|
+
}
|
|
455
|
+
return out;
|
|
456
|
+
}
|
|
457
|
+
function pickPath(value, parts) {
|
|
458
|
+
let cursor = value;
|
|
459
|
+
for (const part of parts) {
|
|
460
|
+
if (!isPlainObject(cursor) || !Object.hasOwn(cursor, part)) throw new ConfigError(`unknown field path: "${parts.join(".")}"`);
|
|
461
|
+
cursor = Reflect.get(cursor, part);
|
|
462
|
+
}
|
|
463
|
+
return cursor;
|
|
464
|
+
}
|
|
465
|
+
function setPath(target, parts, value) {
|
|
466
|
+
let cursor = target;
|
|
467
|
+
const lastIndex = parts.length - 1;
|
|
468
|
+
for (const [index, part] of parts.entries()) {
|
|
469
|
+
if (index === lastIndex) {
|
|
470
|
+
cursor[part] = value;
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
const existing = cursor[part];
|
|
474
|
+
if (isPlainObject(existing)) cursor = existing;
|
|
475
|
+
else {
|
|
476
|
+
const next = {};
|
|
477
|
+
cursor[part] = next;
|
|
478
|
+
cursor = next;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
//#endregion
|
|
484
|
+
//#region src/output/table.ts
|
|
485
|
+
const PLAIN_TABLE_STYLE = {
|
|
486
|
+
head: [],
|
|
487
|
+
border: []
|
|
488
|
+
};
|
|
489
|
+
function renderTable(rows, columns) {
|
|
490
|
+
const head = columns.map((column) => column.label ?? column.key);
|
|
491
|
+
const widths = columns.map((column) => column.width ?? null);
|
|
492
|
+
const hasWidth = widths.some((width) => width !== null);
|
|
493
|
+
const table = new Table(hasWidth ? {
|
|
494
|
+
head,
|
|
495
|
+
colWidths: widths,
|
|
496
|
+
style: PLAIN_TABLE_STYLE
|
|
497
|
+
} : {
|
|
498
|
+
head,
|
|
499
|
+
style: PLAIN_TABLE_STYLE
|
|
500
|
+
});
|
|
501
|
+
for (const row of rows) table.push(columns.map((column) => formatCell(row, column)));
|
|
502
|
+
return table.toString();
|
|
503
|
+
}
|
|
504
|
+
function renderRows(head, rows) {
|
|
505
|
+
const table = new Table({
|
|
506
|
+
head: [...head],
|
|
507
|
+
style: PLAIN_TABLE_STYLE
|
|
508
|
+
});
|
|
509
|
+
for (const row of rows) table.push([...row]);
|
|
510
|
+
return table.toString();
|
|
511
|
+
}
|
|
512
|
+
function formatCell(row, column) {
|
|
513
|
+
const value = row[column.key];
|
|
514
|
+
if (column.format !== void 0) return column.format(value);
|
|
515
|
+
return formatScalar(value);
|
|
516
|
+
}
|
|
517
|
+
function formatScalar(value) {
|
|
518
|
+
if (value === null || value === void 0) return "";
|
|
519
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
|
|
520
|
+
return JSON.stringify(value);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
//#endregion
|
|
524
|
+
//#region src/output/render.ts
|
|
525
|
+
function serializeJson(value, pretty) {
|
|
526
|
+
return JSON.stringify(value, null, pretty ? 2 : void 0);
|
|
527
|
+
}
|
|
528
|
+
function stdoutPretty() {
|
|
529
|
+
return process.stdout.isTTY === true;
|
|
530
|
+
}
|
|
531
|
+
function jsonLine(value) {
|
|
532
|
+
return serializeJson(value, stdoutPretty()) + "\n";
|
|
533
|
+
}
|
|
534
|
+
function writeJson(value) {
|
|
535
|
+
process.stdout.write(jsonLine(value));
|
|
536
|
+
}
|
|
537
|
+
function writeText(text$1) {
|
|
538
|
+
process.stdout.write(text$1 + "\n");
|
|
539
|
+
}
|
|
540
|
+
function renderItem(item, view, opts) {
|
|
541
|
+
const projected = applyProjection(item, view, opts.full, opts.fields);
|
|
542
|
+
const body = renderItemBody(item, view, projected, opts) + "\n";
|
|
543
|
+
assertItemWithinMaxBytes(body, opts);
|
|
544
|
+
process.stdout.write(body);
|
|
545
|
+
}
|
|
546
|
+
function renderSummary(item, view, summaryText, opts) {
|
|
547
|
+
if (opts.format === "json" || opts.fields !== void 0 || opts.full) {
|
|
548
|
+
renderItem(item, view, opts);
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
const body = (typeof summaryText === "function" ? summaryText() : summaryText) + "\n";
|
|
552
|
+
assertItemWithinMaxBytes(body, opts);
|
|
553
|
+
process.stdout.write(body);
|
|
554
|
+
}
|
|
555
|
+
function renderList(envelope, view, opts) {
|
|
556
|
+
if (opts.format === "json") {
|
|
557
|
+
renderJsonEnvelope(envelope, view, opts);
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (envelope.data.length === 0) {
|
|
561
|
+
process.stdout.write("(no results)\n");
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
if (opts.fields !== void 0) {
|
|
565
|
+
renderProjectedTable(envelope, view, opts.fields, opts.maxBytes);
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
const capped = capListEnvelope(envelope, opts.maxBytes);
|
|
569
|
+
process.stdout.write(renderTable(capped.data, view.tableColumns) + "\n");
|
|
570
|
+
if (capped.truncated !== void 0) warn(listTruncationNotice(capped.truncated.bytes));
|
|
571
|
+
}
|
|
572
|
+
function renderProjectedTable(envelope, view, fields, maxBytes) {
|
|
573
|
+
const projectedItems = projectListItems(envelope.data, view, false, fields);
|
|
574
|
+
const capped = capListEnvelope({
|
|
575
|
+
...envelope,
|
|
576
|
+
data: projectedItems
|
|
577
|
+
}, maxBytes);
|
|
578
|
+
const rows = capped.data.map((item) => fields.map((path) => formatScalar(pickPath(item, path.split(".")))));
|
|
579
|
+
process.stdout.write(renderRows(fields, rows) + "\n");
|
|
580
|
+
if (capped.truncated !== void 0) warn(listTruncationNotice(capped.truncated.bytes));
|
|
581
|
+
}
|
|
582
|
+
function projectListItems(items, view, full, fields) {
|
|
583
|
+
try {
|
|
584
|
+
return items.map((item) => applyProjection(item, view, full, fields));
|
|
585
|
+
} catch (error) {
|
|
586
|
+
throw enrichListFieldPathError(error, fields);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
function enrichListFieldPathError(error, fields) {
|
|
590
|
+
if (fields === void 0 || !(error instanceof ConfigError) || !error.message.startsWith("unknown field path")) return error;
|
|
591
|
+
const prefix = "data.";
|
|
592
|
+
const culprit = fields.find((field) => field === "data" || field.startsWith(prefix));
|
|
593
|
+
if (culprit === void 0) return error;
|
|
594
|
+
const suggestion = culprit.startsWith(prefix) ? culprit.slice(prefix.length) : "<field>";
|
|
595
|
+
return new ConfigError(`${error.message} — on list commands --fields paths are relative to each item in \`data\`, not the envelope. Drop the \`data.\` prefix (e.g. use \`${suggestion}\` instead of \`${culprit}\`).`);
|
|
596
|
+
}
|
|
597
|
+
function renderJsonEnvelope(envelope, view, opts) {
|
|
598
|
+
const projectedItems = projectListItems(envelope.data, view, opts.full, opts.fields);
|
|
599
|
+
const projectedEnvelope = {
|
|
600
|
+
...envelope,
|
|
601
|
+
data: projectedItems
|
|
602
|
+
};
|
|
603
|
+
const capped = capListEnvelope(projectedEnvelope, opts.maxBytes);
|
|
604
|
+
const ordered = {
|
|
605
|
+
returned: capped.returned,
|
|
606
|
+
total: capped.total,
|
|
607
|
+
limit: capped.limit,
|
|
608
|
+
truncated: capped.truncated,
|
|
609
|
+
data: capped.data
|
|
610
|
+
};
|
|
611
|
+
process.stdout.write(serializeJson(ordered, stdoutPretty()) + "\n");
|
|
612
|
+
if (capped.truncated !== void 0) warn(listTruncationNotice(capped.truncated.bytes));
|
|
613
|
+
}
|
|
614
|
+
function renderItemBody(item, view, projected, opts) {
|
|
615
|
+
if (opts.format === "json") return serializeJson(projected, stdoutPretty());
|
|
616
|
+
if (opts.fields !== void 0 || opts.full) return renderKeyValueLines(objectPairs(projected));
|
|
617
|
+
return renderKeyValueLines(columnPairs(item, view.tableColumns));
|
|
618
|
+
}
|
|
619
|
+
function columnPairs(item, columns) {
|
|
620
|
+
return columns.map((column) => [column.label ?? column.key, formatCell(item, column)]);
|
|
621
|
+
}
|
|
622
|
+
function objectPairs(value) {
|
|
623
|
+
if (!isPlainObject(value)) {
|
|
624
|
+
const scalar = formatScalar(value);
|
|
625
|
+
return scalar === "" ? [] : [["", scalar]];
|
|
626
|
+
}
|
|
627
|
+
return Object.entries(value).map(([key, raw]) => [key, formatScalar(raw)]);
|
|
628
|
+
}
|
|
629
|
+
function renderKeyValueLines(pairs) {
|
|
630
|
+
if (pairs.length === 0) return "";
|
|
631
|
+
const padding = Math.max(...pairs.map(([label]) => label.length));
|
|
632
|
+
return pairs.map(([label, value]) => `${label.padEnd(padding)} ${value}`).join("\n");
|
|
633
|
+
}
|
|
634
|
+
function assertItemWithinMaxBytes(body, opts) {
|
|
635
|
+
if (opts.maxBytes <= 0) return;
|
|
636
|
+
const bytes = Buffer.byteLength(body, "utf8");
|
|
637
|
+
if (bytes <= opts.maxBytes) return;
|
|
638
|
+
throw new ConfigError(itemOversizeMessage(bytes, opts.maxBytes, opts.oversizeHint));
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
//#endregion
|
|
642
|
+
//#region src/output/error.ts
|
|
643
|
+
const VERBOSE_BREADCRUMB = "(rerun with MB_VERBOSE=1 for details)";
|
|
644
|
+
function reportError(error, format) {
|
|
645
|
+
const handled = toMetabaseError(error);
|
|
646
|
+
const verbose = readEnv(ENV_VERBOSE) === "1";
|
|
647
|
+
if (format === "json") writeJsonError(handled, verbose);
|
|
648
|
+
else writeTextError(handled, verbose);
|
|
649
|
+
for (const message of consumeLegacyEnvWarnings()) warn(message);
|
|
650
|
+
process.exitCode = handled.exitCode;
|
|
651
|
+
}
|
|
652
|
+
function writeTextError(handled, verbose) {
|
|
653
|
+
process.stderr.write(handled.userMessage + "\n");
|
|
654
|
+
if (handled.developerDetail === null) return;
|
|
655
|
+
if (verbose) process.stderr.write(serializeJson(handled.developerDetail, stderrPretty()) + "\n");
|
|
656
|
+
else process.stderr.write(VERBOSE_BREADCRUMB + "\n");
|
|
657
|
+
}
|
|
658
|
+
function stderrPretty() {
|
|
659
|
+
return process.stderr.isTTY === true;
|
|
660
|
+
}
|
|
661
|
+
function writeJsonError(handled, verbose) {
|
|
662
|
+
const payload = {
|
|
663
|
+
category: handled.category,
|
|
664
|
+
message: handled.userMessage,
|
|
665
|
+
exitCode: handled.exitCode
|
|
666
|
+
};
|
|
667
|
+
if (verbose && handled.developerDetail !== null) payload.detail = handled.developerDetail;
|
|
668
|
+
const envelope = {
|
|
669
|
+
ok: false,
|
|
670
|
+
error: payload
|
|
671
|
+
};
|
|
672
|
+
process.stderr.write(serializeJson(envelope, stderrPretty()) + "\n");
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
//#endregion
|
|
676
|
+
//#region src/runtime/capabilities.ts
|
|
677
|
+
const Capabilities = z.object({
|
|
678
|
+
minVersion: z.number(),
|
|
679
|
+
tokenFeature: z.string().optional()
|
|
680
|
+
});
|
|
681
|
+
const BASELINE_CAPABILITIES = Object.freeze({ minVersion: 58 });
|
|
682
|
+
|
|
683
|
+
//#endregion
|
|
684
|
+
export { AbortError, BASELINE_CAPABILITIES, Capabilities, ChainedRequestError, ConfigError, DEFAULT_MAX_BYTES, ENV_API_KEY, ENV_DISABLE_KEYRING, ENV_PROFILE, ENV_SKIP_PREFLIGHT, ENV_URL, MetabaseError, NetworkError, ResponseShapeError, TimeoutError, UnknownError, ValidationError, connectionFlags, consumeLegacyEnvWarnings, errorMessage, escapeJsonPointerSegment, flagConsumesValue, formatScalar, isNotFoundError, isPlainObject, jsonLine, listEnvelopeSchema, listTruncationNotice, normalizeFlag, outputFlags, package_default, profileFlag, readEnv, renderItem, renderList, renderRows, renderSummary, reportError, resolveCitty, toAliasArray, warn, wrapList, writeJson, writeText };
|