@metabase/cli 0.1.0 → 0.1.2
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 +972 -57
- package/dist/add-collection-DwxQDXzL.mjs +54 -0
- package/dist/add-collection-SL08iMub.mjs +11 -0
- package/dist/api-key-BktzvPb7.mjs +13 -0
- package/dist/{archive-CsWeHXle.mjs → archive-C1mF-9Kj.mjs} +7 -4
- package/dist/archive-CLWtbvvH.mjs +44 -0
- package/dist/archive-Cq4WKmJt.mjs +44 -0
- package/dist/archive-kYoy5LK5.mjs +39 -0
- package/dist/auth-DfYkakP3.mjs +19 -0
- package/dist/{body-Dv9hQ0Qk.mjs → body-rDrR-C1c.mjs} +3 -2
- package/dist/{branches-BujtceGr.mjs → branches-CH2UcCpX.mjs} +8 -6
- package/dist/cancel-CgLZcItQ.mjs +56 -0
- package/dist/{cancel-task-CT2xUMRg.mjs → cancel-task-DcYrFsM6.mjs} +9 -7
- package/dist/{card-CsXk8T6A.mjs → card-CQxvHeyP.mjs} +34 -15
- package/dist/card-ZCGU2JEh.mjs +20 -0
- package/dist/cards-C4NIaERo.mjs +37 -0
- package/dist/cli.mjs +33 -14
- package/dist/collection-B3sPXRLs.mjs +163 -0
- package/dist/collection-D_uFLIAS.mjs +19 -0
- package/dist/create-BUCLNqiN.mjs +48 -0
- package/dist/create-CB0Yp__0.mjs +66 -0
- package/dist/create-CNvd5T8h.mjs +48 -0
- package/dist/create-Cbh1cGj9.mjs +48 -0
- package/dist/create-CzfNOhOF.mjs +48 -0
- package/dist/create-DU0ZhnZu.mjs +44 -0
- package/dist/create-Dh0p-c2Y.mjs +44 -0
- package/dist/create-DvrVZ2hS.mjs +125 -0
- package/dist/create-QgN369N5.mjs +50 -0
- package/dist/{create-B8ektf-R.mjs → create-bqc_rmix.mjs} +8 -6
- package/dist/{create-branch-goZBTNnr.mjs → create-branch-BJFH9Hda.mjs} +9 -7
- package/dist/credentials-DTP1xuKz.mjs +85 -0
- package/dist/{current-task-DBjRNCFq.mjs → current-task-z_TiJ0kt.mjs} +9 -7
- package/dist/dashboard-CnMD04PQ.mjs +163 -0
- package/dist/dashboard-G1-dGLUR.mjs +20 -0
- package/dist/database-DQkUxTLd.mjs +17 -0
- package/dist/database-vvig8k4x.mjs +51 -0
- package/dist/db-CBaEfumR.mjs +22 -0
- package/dist/{delete-8vGU35r3.mjs → delete-CVYII8mq.mjs} +7 -5
- package/dist/{delete-B27KLF5X.mjs → delete-DeZQ1r9w.mjs} +7 -5
- package/dist/{delete-runtime-Byr60cR3.mjs → delete-runtime-BMzvfj_B.mjs} +4 -4
- package/dist/{delete-table-BNaJ_gA4.mjs → delete-table-ZiR9-ndv.mjs} +7 -5
- package/dist/deprovision-BhD3J-Am.mjs +61 -0
- package/dist/{dirty-aNUuph4I.mjs → dirty-D9agt7Os.mjs} +8 -6
- package/dist/docker-CHpV8PRz.mjs +612 -0
- package/dist/eid-B5wawMmO.mjs +13 -0
- package/dist/{export-QDkuuzSE.mjs → export-Bfk7JAlR.mjs} +30 -23
- package/dist/field-B3gvaqpK.mjs +278 -0
- package/dist/field-BDJ1pEgr.mjs +18 -0
- package/dist/fields-7ByLsxLg.mjs +38 -0
- package/dist/flag-pair-DtR1AiBQ.mjs +17 -0
- package/dist/get-BE6Izpus.mjs +36 -0
- package/dist/get-C3CcAJGg.mjs +49 -0
- package/dist/{get-DI_IJvgk.mjs → get-CQGeF-eP.mjs} +6 -4
- package/dist/get-D2m4jhwT.mjs +53 -0
- package/dist/{get-BGBIzMKY.mjs → get-DKy3DAJX.mjs} +6 -4
- package/dist/{get-COXHplHP.mjs → get-DUSR5i99.mjs} +7 -5
- package/dist/get-DikegGzi.mjs +36 -0
- package/dist/get-StkjKuh0.mjs +40 -0
- package/dist/get-bYc7eGYe.mjs +36 -0
- package/dist/{get-Cl8-IauC.mjs → get-cuHp9-6U.mjs} +7 -4
- package/dist/{get-i6LWOByV.mjs → get-gOT_RarI.mjs} +6 -4
- package/dist/get-run-D59Yqaoh.mjs +36 -0
- package/dist/get-tISo-cmg.mjs +41 -0
- package/dist/git-sync-BiTWfLgY.mjs +28 -0
- package/dist/{has-remote-changes-hjKoQuRy.mjs → has-remote-changes-B1TciDVD.mjs} +8 -6
- package/dist/{import-HJsSKRYx.mjs → import-DnnmmJbp.mjs} +11 -9
- package/dist/{input-Dojr-RTw.mjs → input-ikCiip6x.mjs} +2 -1
- package/dist/is-dirty-DClGFOGV.mjs +10 -0
- package/dist/{is-dirty-1Qy7hiHB.mjs → is-dirty-DlfX7e39.mjs} +5 -4
- package/dist/items-DQFQSpjF.mjs +77 -0
- package/dist/{key-DBxPSFwi.mjs → key-NDEARu2L.mjs} +1 -1
- package/dist/{license-MoWse3ZI.mjs → license-DBh13sc8.mjs} +3 -3
- package/dist/list-4kYCGv01.mjs +32 -0
- package/dist/list-9AOWhxqp.mjs +61 -0
- package/dist/{list-Bk6RsbJl.mjs → list-BwjqQ6pp.mjs} +5 -3
- package/dist/{list-C_PRdL5e.mjs → list-CP5RNjO6.mjs} +7 -5
- package/dist/{list-C8tdLOH5.mjs → list-Cy0VhXQs.mjs} +5 -3
- package/dist/list-D067ZSE5.mjs +47 -0
- package/dist/list-DAZP-IM5.mjs +32 -0
- package/dist/list-DJN-OvTZ.mjs +52 -0
- package/dist/list-DQj-QJAs.mjs +40 -0
- package/dist/list-Di529OJD.mjs +55 -0
- package/dist/{list-C4Ajrw8f.mjs → list-DlKzgnqo.mjs} +6 -3
- package/dist/list-GFfR9SuT.mjs +32 -0
- package/dist/{list-CWt3fqrZ.mjs → list-iFVEdi2J.mjs} +5 -3
- package/dist/{login-C9WTwNn6.mjs → login-DxgkosGx.mjs} +30 -9
- package/dist/{logout-oLszGCOg.mjs → logout-BlVwqBog.mjs} +7 -6
- package/dist/logs-CudNEkT4.mjs +58 -0
- package/dist/{manifest-CAdjQYH8.mjs → manifest-Dv5B9Blc.mjs} +3 -7
- package/dist/measure-BEQfnLdN.mjs +67 -0
- package/dist/measure-C7SbdYQk.mjs +19 -0
- package/dist/metadata-B2Td415K.mjs +38 -0
- package/dist/metadata-BTJAFVvZ.mjs +37 -0
- package/dist/{package-BGfw4ZWJ.mjs → package-DV6Asqim.mjs} +7 -1
- package/dist/paginate-CTSfuYiF.mjs +49 -0
- package/dist/parse-id-B38zTlYs.mjs +12 -0
- package/dist/parse-ref-DGvh4aDn.mjs +17 -0
- package/dist/parse-schemas-Ds-cVE-O.mjs +12 -0
- package/dist/{poll-ILanYysl.mjs → poll-Bh6oAifO.mjs} +2 -1
- package/dist/{poll-task-DbpsiQhl.mjs → poll-task-vPwV31Fs.mjs} +8 -7
- package/dist/predicates-DiIiS3k7.mjs +153 -0
- package/dist/preflight-DxJb-hUV.mjs +91 -0
- package/dist/{prompt-DpT8yAVy.mjs → prompt-Bf3DQ-qE.mjs} +1 -1
- package/dist/provision-B-I0zuDe.mjs +77 -0
- package/dist/ps-BmYQYC7t.mjs +10 -0
- package/dist/ps-CaiOFCv2.mjs +78 -0
- package/dist/query-BtF1yWZZ.mjs +90 -0
- package/dist/{query-PihYi-UZ.mjs → query-jmfqaXRP.mjs} +38 -13
- package/dist/remove-C2iv0g03.mjs +98 -0
- package/dist/remove-collection-DhZghaZy.mjs +38 -0
- package/dist/{remove-B2hVYn1v.mjs → remove-xskleeru.mjs} +6 -5
- package/dist/render-DXv-D6fU.mjs +182 -0
- package/dist/rescan-values-DW6u90ep.mjs +43 -0
- package/dist/revision-message-flag-CWQbKhdl.mjs +11 -0
- package/dist/{run-C2so6Qp6.mjs → run-DxVzhcF3.mjs} +27 -36
- package/dist/runs-BOHk1XnM.mjs +54 -0
- package/dist/{runtime-C9CEZhcn.mjs → runtime-cwBS8wwK.mjs} +428 -442
- package/dist/schema-tables-CcFbY_jN.mjs +45 -0
- package/dist/schemas-DZmv_V62.mjs +47 -0
- package/dist/{search-CopOytXY.mjs → search-CYMuc7Fg.mjs} +6 -19
- package/dist/segment-BMrUBz94.mjs +70 -0
- package/dist/segment-Df4pfjco.mjs +19 -0
- package/dist/{set-BcF7M1GQ.mjs → set-B_rrVwU4.mjs} +6 -4
- package/dist/{set-CbibegpA.mjs → set-CbGfQ7Ye.mjs} +8 -6
- package/dist/{setting-U3NtBMFo.mjs → setting-DqZY9NXP.mjs} +3 -3
- package/dist/setup-DxmcAorA.mjs +71 -0
- package/dist/snippet-CwSHjQyn.mjs +19 -0
- package/dist/snippet-Dw0Sjzkr.mjs +64 -0
- package/dist/start-Cn0epTks.mjs +380 -0
- package/dist/{stash-DOBbYozC.mjs → stash-BFZIl9F4.mjs} +9 -7
- package/dist/{status-Buf1ZbNR.mjs → status-BjCeJNLp.mjs} +10 -8
- package/dist/{status-CUcs8XBH.mjs → status-FDIDmqvM.mjs} +4 -2
- package/dist/{status-D1F5XHae.mjs → status-UALK3OJl.mjs} +4 -2
- package/dist/stop-DUwrDWw8.mjs +81 -0
- package/dist/summary-CS4UGiFJ.mjs +41 -0
- package/dist/sync-schema-IrHdJxmX.mjs +43 -0
- package/dist/{table-Cfk7oSvw.mjs → table-B-PYcgGb.mjs} +22 -9
- package/dist/table-Cdr5bKp1.mjs +19 -0
- package/dist/transform-CeZusR_w.mjs +24 -0
- package/dist/{transform-B5uRpg1G.mjs → transform-IEX4Mx3X.mjs} +56 -2
- package/dist/transform-job-BOn9-CGa.mjs +19 -0
- package/dist/{transform-job-C7QXWTVE.mjs → transform-job-Csr86muI.mjs} +7 -0
- package/dist/translate-B__zbDKm.mjs +111 -0
- package/dist/tree-Mh0uQ_Wy.mjs +32 -0
- package/dist/update-1Di9hbPo.mjs +56 -0
- package/dist/update-B5_pp6Jj.mjs +56 -0
- package/dist/update-B9DBMo30.mjs +52 -0
- package/dist/update-BfBsM_y1.mjs +56 -0
- package/dist/update-Bw0WZix_.mjs +73 -0
- package/dist/update-Cp1789qq.mjs +52 -0
- package/dist/update-D2VI_5cy.mjs +57 -0
- package/dist/update-D8GwQTcL.mjs +59 -0
- package/dist/{update-CL8tRbxr.mjs → update-Masp5WeT.mjs} +9 -7
- package/dist/update-dashcard-CNiQw1MD.mjs +71 -0
- package/dist/update-j9vgemKR.mjs +51 -0
- package/dist/url-GFM76VIK.mjs +54 -0
- package/dist/uuid-Uif0lNk8.mjs +47 -0
- package/dist/validate-DCYx6jdL.mjs +1496 -0
- package/dist/validate-query-B07oGG4K.mjs +37 -0
- package/dist/values-DrwNHUAI.mjs +36 -0
- package/dist/{wait-Bugr9eXD.mjs → wait-BoKk8CJy.mjs} +10 -8
- package/dist/wait-DO7tS7NI.mjs +19 -0
- package/dist/wait-flags-CjX2sEGm.mjs +35 -0
- package/dist/workspace-CyEX40D-.mjs +24 -0
- package/dist/workspace-DVuqKJGG.mjs +72 -0
- package/dist/workspace-credentials-B6BL-X0d.mjs +139 -0
- package/package.json +7 -1
- package/dist/auth-BF7IjZIH.mjs +0 -18
- package/dist/card-_Ta7zdYe.mjs +0 -19
- package/dist/create-CI2Cunq5.mjs +0 -38
- package/dist/create-DdbU3TLX.mjs +0 -42
- package/dist/database-PA9Goi25.mjs +0 -33
- package/dist/db-DMghzgb6.mjs +0 -17
- package/dist/field-C8IVs6rp.mjs +0 -76
- package/dist/field-DaYo_90x.mjs +0 -13
- package/dist/get-Cwpj7lDe.mjs +0 -35
- package/dist/get-Dh_acl8q.mjs +0 -34
- package/dist/is-dirty-DpKn9HJp.mjs +0 -8
- package/dist/list-CBSBHtK-.mjs +0 -38
- package/dist/parse-id-BhmmfyCP.mjs +0 -14
- package/dist/sync-BPyGXfUk.mjs +0 -26
- package/dist/table-D7nJt7JO.mjs +0 -16
- package/dist/transform-UbyewMxY.mjs +0 -21
- package/dist/transform-job-CrYkr-Ma.mjs +0 -19
- package/dist/update-DU2oU2j-.mjs +0 -49
- /package/dist/{body-flags-BUA9XV1u.mjs → body-flags-BK7J6Daz.mjs} +0 -0
- /package/dist/{setting-26ckqHAP.mjs → setting-CTaAeMci.mjs} +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderList } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { Collection, CollectionCompact, collectionView } from "./collection-B3sPXRLs.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/collection/list.ts
|
|
10
|
+
const CollectionApiList = z.array(Collection);
|
|
11
|
+
const CollectionListFilter = z.enum([
|
|
12
|
+
"all",
|
|
13
|
+
"archived",
|
|
14
|
+
"personal"
|
|
15
|
+
]);
|
|
16
|
+
const COLLECTION_LIST_QUERY = {
|
|
17
|
+
all: {},
|
|
18
|
+
archived: { archived: true },
|
|
19
|
+
personal: { "personal-only": true }
|
|
20
|
+
};
|
|
21
|
+
const CollectionListEnvelope = listEnvelopeSchema(CollectionCompact);
|
|
22
|
+
var list_default = defineMetabaseCommand({
|
|
23
|
+
meta: {
|
|
24
|
+
name: "list",
|
|
25
|
+
description: "List collections"
|
|
26
|
+
},
|
|
27
|
+
args: {
|
|
28
|
+
...outputFlags,
|
|
29
|
+
...profileFlag,
|
|
30
|
+
...connectionFlags,
|
|
31
|
+
filter: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: `Filter preset: ${CollectionListFilter.options.join("|")}`,
|
|
34
|
+
default: "all"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
outputSchema: CollectionListEnvelope,
|
|
38
|
+
examples: [
|
|
39
|
+
"metabase collection list",
|
|
40
|
+
"metabase collection list --json",
|
|
41
|
+
"metabase collection list --filter archived --json"
|
|
42
|
+
],
|
|
43
|
+
async run({ args, ctx, getClient }) {
|
|
44
|
+
const filter = CollectionListFilter.parse(args.filter);
|
|
45
|
+
const client = await getClient();
|
|
46
|
+
const items = await client.requestParsed(CollectionApiList, "/api/collection", { query: COLLECTION_LIST_QUERY[filter] });
|
|
47
|
+
renderList(wrapList(items), collectionView, ctx);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
export { list_default as default };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderList } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { Snippet, SnippetCompact, snippetView } from "./snippet-Dw0Sjzkr.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/snippet/list.ts
|
|
10
|
+
const SnippetApiList = z.array(Snippet);
|
|
11
|
+
const SnippetListEnvelope = listEnvelopeSchema(SnippetCompact);
|
|
12
|
+
var list_default = defineMetabaseCommand({
|
|
13
|
+
meta: {
|
|
14
|
+
name: "list",
|
|
15
|
+
description: "List native query snippets"
|
|
16
|
+
},
|
|
17
|
+
args: {
|
|
18
|
+
...outputFlags,
|
|
19
|
+
...profileFlag,
|
|
20
|
+
...connectionFlags,
|
|
21
|
+
archived: {
|
|
22
|
+
type: "boolean",
|
|
23
|
+
description: "Show archived snippets instead of active ones"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
outputSchema: SnippetListEnvelope,
|
|
27
|
+
examples: [
|
|
28
|
+
"metabase snippet list",
|
|
29
|
+
"metabase snippet list --json",
|
|
30
|
+
"metabase snippet list --archived --json"
|
|
31
|
+
],
|
|
32
|
+
async run({ args, ctx, getClient }) {
|
|
33
|
+
const client = await getClient();
|
|
34
|
+
const items = await client.requestParsed(SnippetApiList, "/api/native-query-snippet", { query: { archived: args.archived || void 0 } });
|
|
35
|
+
renderList(wrapList(items), snippetView, ctx);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
//#endregion
|
|
40
|
+
export { list_default as default };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderList } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { defineMetabaseCommand, listEnvelopeSchema, listProfileNames, originOnly, outputFlags, readProfile, wrapList } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
//#region src/commands/auth/list.ts
|
|
9
|
+
const AuthProfile = z.object({
|
|
10
|
+
profile: z.string(),
|
|
11
|
+
url: z.string().nullable(),
|
|
12
|
+
present: z.boolean()
|
|
13
|
+
});
|
|
14
|
+
const AuthProfileListEnvelope = listEnvelopeSchema(AuthProfile);
|
|
15
|
+
const authProfileView = {
|
|
16
|
+
compactPick: AuthProfile,
|
|
17
|
+
tableColumns: [
|
|
18
|
+
{
|
|
19
|
+
key: "profile",
|
|
20
|
+
label: "Profile"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: "url",
|
|
24
|
+
label: "URL"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: "present",
|
|
28
|
+
label: "Authenticated"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
var list_default = defineMetabaseCommand({
|
|
33
|
+
meta: {
|
|
34
|
+
name: "list",
|
|
35
|
+
description: "List configured authentication profiles"
|
|
36
|
+
},
|
|
37
|
+
args: { ...outputFlags },
|
|
38
|
+
outputSchema: AuthProfileListEnvelope,
|
|
39
|
+
examples: ["metabase auth list", "metabase auth list --json"],
|
|
40
|
+
async run({ ctx }) {
|
|
41
|
+
const names = await listProfileNames();
|
|
42
|
+
const items = await Promise.all(names.map(async (name) => {
|
|
43
|
+
const profile = await readProfile(name);
|
|
44
|
+
return {
|
|
45
|
+
profile: name,
|
|
46
|
+
url: profile === null ? null : originOnly(profile.url),
|
|
47
|
+
present: profile !== null
|
|
48
|
+
};
|
|
49
|
+
}));
|
|
50
|
+
renderList(wrapList(items), authProfileView, ctx);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
export { list_default as default };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import "./package-
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
2
|
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { renderList } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import "./field-B3gvaqpK.mjs";
|
|
7
|
+
import { Card, CardCompact, cardView } from "./card-CQxvHeyP.mjs";
|
|
5
8
|
import { z } from "zod";
|
|
6
9
|
|
|
7
10
|
//#region src/commands/card/list.ts
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderList } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { Segment, SegmentCompact, segmentView } from "./segment-BMrUBz94.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/segment/list.ts
|
|
10
|
+
const SegmentApiList = z.array(Segment);
|
|
11
|
+
const SegmentListEnvelope = listEnvelopeSchema(SegmentCompact);
|
|
12
|
+
var list_default = defineMetabaseCommand({
|
|
13
|
+
meta: {
|
|
14
|
+
name: "list",
|
|
15
|
+
description: "List segments"
|
|
16
|
+
},
|
|
17
|
+
args: {
|
|
18
|
+
...outputFlags,
|
|
19
|
+
...profileFlag,
|
|
20
|
+
...connectionFlags
|
|
21
|
+
},
|
|
22
|
+
outputSchema: SegmentListEnvelope,
|
|
23
|
+
examples: ["metabase segment list", "metabase segment list --json"],
|
|
24
|
+
async run({ ctx, getClient }) {
|
|
25
|
+
const client = await getClient();
|
|
26
|
+
const items = await client.requestParsed(SegmentApiList, "/api/segment");
|
|
27
|
+
renderList(wrapList(items), segmentView, ctx);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { list_default as default };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import "./package-
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
2
|
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { renderList } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { Transform, TransformCompact, transformView } from "./transform-IEX4Mx3X.mjs";
|
|
5
7
|
import { z } from "zod";
|
|
6
8
|
|
|
7
9
|
//#region src/commands/transform/list.ts
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import "./package-
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
2
|
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { readInput } from "./input-
|
|
3
|
+
import { renderItem, warn } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import { ConfigError, MetabaseError, errorMessage } from "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { readInput } from "./input-ikCiip6x.mjs";
|
|
6
|
+
import { DEFAULT_PROFILE, HttpError, clearRejection, connectionFlags, createClient, defineMetabaseCommand, explicitProfileName, normalizeUrl, outputFlags, profileFlag, readEnvCredentials, recordRejection, writeProfile } from "./runtime-cwBS8wwK.mjs";
|
|
7
|
+
import { promptPassword, promptText } from "./prompt-Bf3DQ-qE.mjs";
|
|
6
8
|
import { z } from "zod";
|
|
7
9
|
|
|
8
10
|
//#region src/domain/user.ts
|
|
@@ -69,15 +71,16 @@ const loginView = {
|
|
|
69
71
|
},
|
|
70
72
|
{
|
|
71
73
|
key: "url",
|
|
72
|
-
label: "URL"
|
|
74
|
+
label: "Metabase URL"
|
|
73
75
|
},
|
|
74
76
|
{
|
|
75
77
|
key: "authenticated",
|
|
76
|
-
label: "
|
|
78
|
+
label: "Status",
|
|
79
|
+
format: (value) => value === true ? "credentials verified" : "saved without verification"
|
|
77
80
|
},
|
|
78
81
|
{
|
|
79
82
|
key: "email",
|
|
80
|
-
label: "
|
|
83
|
+
label: "Logged in as"
|
|
81
84
|
}
|
|
82
85
|
]
|
|
83
86
|
};
|
|
@@ -103,7 +106,7 @@ var login_default = defineMetabaseCommand({
|
|
|
103
106
|
"metabase auth login --profile staging --url https://staging.example.com"
|
|
104
107
|
],
|
|
105
108
|
async run({ args, ctx }) {
|
|
106
|
-
const profileName =
|
|
109
|
+
const profileName = await resolveLoginProfile(args.profile);
|
|
107
110
|
const env = readEnvCredentials();
|
|
108
111
|
if (args.apiKey) warn("warning: --api-key is visible in shell history and process listings — pipe the key on stdin or set METABASE_API_KEY instead");
|
|
109
112
|
const url = await resolveUrl(args.url, env.url);
|
|
@@ -112,7 +115,13 @@ var login_default = defineMetabaseCommand({
|
|
|
112
115
|
let authenticated = false;
|
|
113
116
|
if (!args["skip-verify"]) {
|
|
114
117
|
const result = await verifyCredentials(url, apiKey);
|
|
115
|
-
if (!result.ok)
|
|
118
|
+
if (!result.ok) {
|
|
119
|
+
await recordRejection(profileName, {
|
|
120
|
+
reason: result.message,
|
|
121
|
+
url
|
|
122
|
+
});
|
|
123
|
+
throw new ConfigError(`verification failed: ${result.message} — credentials were not saved for profile "${profileName}"`);
|
|
124
|
+
}
|
|
116
125
|
email = result.user.email;
|
|
117
126
|
authenticated = true;
|
|
118
127
|
}
|
|
@@ -120,6 +129,7 @@ var login_default = defineMetabaseCommand({
|
|
|
120
129
|
url,
|
|
121
130
|
apiKey
|
|
122
131
|
}, profileName);
|
|
132
|
+
await clearRejection(profileName);
|
|
123
133
|
if (location.backend === "file") warn(`warning: OS keychain unavailable; credentials stored as plaintext at ${location.path}`);
|
|
124
134
|
renderItem({
|
|
125
135
|
profile: profileName,
|
|
@@ -129,6 +139,17 @@ var login_default = defineMetabaseCommand({
|
|
|
129
139
|
}, loginView, ctx);
|
|
130
140
|
}
|
|
131
141
|
});
|
|
142
|
+
async function resolveLoginProfile(flagProfile) {
|
|
143
|
+
const explicit = explicitProfileName(flagProfile);
|
|
144
|
+
if (explicit !== null) return explicit;
|
|
145
|
+
if (!process.stdin.isTTY) return DEFAULT_PROFILE;
|
|
146
|
+
return promptText({
|
|
147
|
+
message: "Profile name",
|
|
148
|
+
placeholder: DEFAULT_PROFILE,
|
|
149
|
+
initialValue: DEFAULT_PROFILE,
|
|
150
|
+
validate: (input) => input ? void 0 : "Profile name is required"
|
|
151
|
+
});
|
|
152
|
+
}
|
|
132
153
|
async function resolveUrl(flagUrl, envUrl) {
|
|
133
154
|
if (flagUrl) return normalizeUrl(flagUrl);
|
|
134
155
|
if (envUrl) return normalizeUrl(envUrl);
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import "./package-
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
2
|
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { renderItem } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { clearProfile, clearRejection, defineMetabaseCommand, outputFlags, profileFlag, resolveProfileName } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { promptConfirm } from "./prompt-Bf3DQ-qE.mjs";
|
|
5
7
|
import { z } from "zod";
|
|
6
8
|
|
|
7
9
|
//#region src/commands/auth/logout.ts
|
|
@@ -45,8 +47,7 @@ var logout_default = defineMetabaseCommand({
|
|
|
45
47
|
examples: ["metabase auth logout --yes", "metabase auth logout --profile staging --yes"],
|
|
46
48
|
async run({ args, ctx }) {
|
|
47
49
|
const profileName = resolveProfileName(args.profile);
|
|
48
|
-
if (!args.yes) {
|
|
49
|
-
if (!process.stdin.isTTY) throw new ConfigError("--yes required to clear credentials non-interactively");
|
|
50
|
+
if (!args.yes && process.stdin.isTTY === true) {
|
|
50
51
|
const ok = await promptConfirm({
|
|
51
52
|
message: `Clear stored credentials for profile "${profileName}"?`,
|
|
52
53
|
initialValue: false
|
|
@@ -60,7 +61,7 @@ var logout_default = defineMetabaseCommand({
|
|
|
60
61
|
return;
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
|
-
const cleared = await clearProfile(profileName);
|
|
64
|
+
const [cleared] = await Promise.all([clearProfile(profileName), clearRejection(profileName)]);
|
|
64
65
|
renderItem({
|
|
65
66
|
profile: profileName,
|
|
66
67
|
cleared,
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { ConfigError } from "./predicates-DiIiS3k7.mjs";
|
|
4
|
+
import { defineMetabaseCommand, outputFlags, parseInteger } from "./runtime-cwBS8wwK.mjs";
|
|
5
|
+
import { parseId } from "./parse-id-B38zTlYs.mjs";
|
|
6
|
+
import "./poll-Bh6oAifO.mjs";
|
|
7
|
+
import { checkDockerReady, containerLifecycleStatus, containerNameFor, streamLogs } from "./docker-CHpV8PRz.mjs";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/workspace/logs.ts
|
|
10
|
+
const DEFAULT_TAIL = 200;
|
|
11
|
+
var logs_default = defineMetabaseCommand({
|
|
12
|
+
meta: {
|
|
13
|
+
name: "logs",
|
|
14
|
+
description: "Stream the local container's logs (passthrough to `docker logs`)"
|
|
15
|
+
},
|
|
16
|
+
args: {
|
|
17
|
+
...outputFlags,
|
|
18
|
+
id: {
|
|
19
|
+
type: "positional",
|
|
20
|
+
description: "Workspace id",
|
|
21
|
+
required: true
|
|
22
|
+
},
|
|
23
|
+
follow: {
|
|
24
|
+
type: "boolean",
|
|
25
|
+
alias: "f",
|
|
26
|
+
description: "Follow log output (stream indefinitely; Ctrl-C to exit)",
|
|
27
|
+
default: false
|
|
28
|
+
},
|
|
29
|
+
tail: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: `Number of lines from the end of the logs (default: ${DEFAULT_TAIL})`,
|
|
32
|
+
default: String(DEFAULT_TAIL)
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
examples: [
|
|
36
|
+
"metabase workspace logs 1",
|
|
37
|
+
"metabase workspace logs 1 --follow",
|
|
38
|
+
"metabase workspace logs 1 --tail 500"
|
|
39
|
+
],
|
|
40
|
+
async run({ args }) {
|
|
41
|
+
const workspaceId = parseId(args.id);
|
|
42
|
+
const containerName = containerNameFor(workspaceId);
|
|
43
|
+
const tail = parseInteger(args.tail ?? String(DEFAULT_TAIL), {
|
|
44
|
+
name: "--tail",
|
|
45
|
+
min: 0
|
|
46
|
+
});
|
|
47
|
+
await checkDockerReady();
|
|
48
|
+
const status = await containerLifecycleStatus(containerName);
|
|
49
|
+
if (status === "missing") throw new ConfigError(`no container for workspace ${workspaceId} — run \`metabase workspace start ${workspaceId}\` first`);
|
|
50
|
+
await streamLogs(containerName, {
|
|
51
|
+
follow: args.follow === true,
|
|
52
|
+
tail
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { logs_default as default };
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { getMetabaseAugment } from "./command-augment-D9pI9Vbh.mjs";
|
|
2
|
+
import { writeJson } from "./render-DXv-D6fU.mjs";
|
|
3
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
2
4
|
import { defineCommand } from "citty";
|
|
3
5
|
import { z } from "zod";
|
|
4
6
|
|
|
5
|
-
//#region src/output/manifest.ts
|
|
6
|
-
function writeManifest(manifest) {
|
|
7
|
-
process.stdout.write(JSON.stringify(manifest, null, 2) + "\n");
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
//#endregion
|
|
11
7
|
//#region src/runtime/manifest.ts
|
|
12
8
|
const ManifestArg = z.object({
|
|
13
9
|
name: z.string(),
|
|
@@ -115,7 +111,7 @@ function createManifestCommand(root) {
|
|
|
115
111
|
args: {},
|
|
116
112
|
async run() {
|
|
117
113
|
const manifest = await buildManifest(root);
|
|
118
|
-
|
|
114
|
+
writeJson(manifest);
|
|
119
115
|
}
|
|
120
116
|
});
|
|
121
117
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/domain/measure.ts
|
|
4
|
+
const Measure = z.object({
|
|
5
|
+
id: z.number().int(),
|
|
6
|
+
name: z.string(),
|
|
7
|
+
description: z.string().nullable(),
|
|
8
|
+
archived: z.boolean(),
|
|
9
|
+
table_id: z.number().int(),
|
|
10
|
+
definition: z.unknown(),
|
|
11
|
+
creator_id: z.number().int(),
|
|
12
|
+
entity_id: z.string().nullable(),
|
|
13
|
+
dimensions: z.array(z.unknown()).nullable(),
|
|
14
|
+
dimension_mappings: z.array(z.unknown()).nullable(),
|
|
15
|
+
definition_description: z.string().nullable().optional(),
|
|
16
|
+
result_column_name: z.string().nullable().optional(),
|
|
17
|
+
created_at: z.string(),
|
|
18
|
+
updated_at: z.string()
|
|
19
|
+
}).loose();
|
|
20
|
+
const MeasureCompact = Measure.pick({
|
|
21
|
+
id: true,
|
|
22
|
+
name: true,
|
|
23
|
+
description: true,
|
|
24
|
+
archived: true,
|
|
25
|
+
table_id: true
|
|
26
|
+
}).strip();
|
|
27
|
+
const measureView = {
|
|
28
|
+
compactPick: MeasureCompact,
|
|
29
|
+
tableColumns: [
|
|
30
|
+
{
|
|
31
|
+
key: "id",
|
|
32
|
+
label: "ID"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: "name",
|
|
36
|
+
label: "Name"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: "description",
|
|
40
|
+
label: "Description"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: "table_id",
|
|
44
|
+
label: "Table"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
key: "archived",
|
|
48
|
+
label: "Archived"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
const MeasureCreateInput = z.object({
|
|
53
|
+
name: z.string().min(1),
|
|
54
|
+
table_id: z.number().int().positive(),
|
|
55
|
+
definition: z.record(z.string(), z.unknown()),
|
|
56
|
+
description: z.string().nullable().optional()
|
|
57
|
+
}).loose();
|
|
58
|
+
const MeasureUpdateInput = z.object({
|
|
59
|
+
name: z.string().min(1).optional(),
|
|
60
|
+
definition: z.record(z.string(), z.unknown()).optional(),
|
|
61
|
+
revision_message: z.string().min(1),
|
|
62
|
+
archived: z.boolean().optional(),
|
|
63
|
+
description: z.string().nullable().optional()
|
|
64
|
+
}).loose();
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { Measure, MeasureCompact, MeasureCreateInput, MeasureUpdateInput, measureView };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
|
|
3
|
+
//#region src/commands/measure/index.ts
|
|
4
|
+
var measure_default = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "measure",
|
|
7
|
+
description: "Inspect Metabase measures"
|
|
8
|
+
},
|
|
9
|
+
subCommands: {
|
|
10
|
+
list: () => import("./list-DAZP-IM5.mjs").then((mod) => mod.default),
|
|
11
|
+
get: () => import("./get-bYc7eGYe.mjs").then((mod) => mod.default),
|
|
12
|
+
create: () => import("./create-Cbh1cGj9.mjs").then((mod) => mod.default),
|
|
13
|
+
update: () => import("./update-1Di9hbPo.mjs").then((mod) => mod.default),
|
|
14
|
+
archive: () => import("./archive-Cq4WKmJt.mjs").then((mod) => mod.default)
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { measure_default as default };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderItem } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { parseId } from "./parse-id-B38zTlYs.mjs";
|
|
7
|
+
import "./field-B3gvaqpK.mjs";
|
|
8
|
+
import "./table-B-PYcgGb.mjs";
|
|
9
|
+
import { Database, databaseView } from "./database-vvig8k4x.mjs";
|
|
10
|
+
|
|
11
|
+
//#region src/commands/db/metadata.ts
|
|
12
|
+
var metadata_default = defineMetabaseCommand({
|
|
13
|
+
meta: {
|
|
14
|
+
name: "metadata",
|
|
15
|
+
description: "Get a database with its tables and fields hydrated"
|
|
16
|
+
},
|
|
17
|
+
args: {
|
|
18
|
+
...outputFlags,
|
|
19
|
+
...profileFlag,
|
|
20
|
+
...connectionFlags,
|
|
21
|
+
id: {
|
|
22
|
+
type: "positional",
|
|
23
|
+
description: "Database id",
|
|
24
|
+
required: true
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
outputSchema: Database,
|
|
28
|
+
examples: ["metabase db metadata 1", "metabase db metadata 1 --json"],
|
|
29
|
+
async run({ args, ctx, getClient }) {
|
|
30
|
+
const id = parseId(args.id);
|
|
31
|
+
const client = await getClient();
|
|
32
|
+
const database = await client.requestParsed(Database, `/api/database/${id}/metadata`);
|
|
33
|
+
renderItem(database, databaseView, ctx);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { metadata_default as default };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import "./package-DV6Asqim.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderItem } from "./render-DXv-D6fU.mjs";
|
|
4
|
+
import "./predicates-DiIiS3k7.mjs";
|
|
5
|
+
import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-cwBS8wwK.mjs";
|
|
6
|
+
import { parseId } from "./parse-id-B38zTlYs.mjs";
|
|
7
|
+
import "./field-B3gvaqpK.mjs";
|
|
8
|
+
import { TableQueryMetadata, tableView } from "./table-B-PYcgGb.mjs";
|
|
9
|
+
|
|
10
|
+
//#region src/commands/table/metadata.ts
|
|
11
|
+
var metadata_default = defineMetabaseCommand({
|
|
12
|
+
meta: {
|
|
13
|
+
name: "metadata",
|
|
14
|
+
description: "Get a table with its fields, FKs, and dimensions hydrated"
|
|
15
|
+
},
|
|
16
|
+
args: {
|
|
17
|
+
...outputFlags,
|
|
18
|
+
...profileFlag,
|
|
19
|
+
...connectionFlags,
|
|
20
|
+
id: {
|
|
21
|
+
type: "positional",
|
|
22
|
+
description: "Table id",
|
|
23
|
+
required: true
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
outputSchema: TableQueryMetadata,
|
|
27
|
+
examples: ["metabase table metadata 42", "metabase table metadata 42 --json"],
|
|
28
|
+
async run({ args, ctx, getClient }) {
|
|
29
|
+
const id = parseId(args.id);
|
|
30
|
+
const client = await getClient();
|
|
31
|
+
const table = await client.requestParsed(TableQueryMetadata, `/api/table/${id}/query_metadata`);
|
|
32
|
+
renderItem(table, tableView, ctx);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { metadata_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region package.json
|
|
2
2
|
var name = "@metabase/cli";
|
|
3
|
-
var version = "0.1.
|
|
3
|
+
var version = "0.1.2";
|
|
4
4
|
var description = "Metabase CLI";
|
|
5
5
|
var license = "AGPL-3.0";
|
|
6
6
|
var repository = {
|
|
@@ -31,19 +31,25 @@ var scripts = {
|
|
|
31
31
|
"lint:fix": "oxlint --fix",
|
|
32
32
|
"format": "oxfmt",
|
|
33
33
|
"format:check": "oxfmt --check",
|
|
34
|
+
"sync:representations": "bun run scripts/sync-representations.ts",
|
|
34
35
|
"prepublishOnly": "tsdown && publint"
|
|
35
36
|
};
|
|
36
37
|
var dependencies = {
|
|
37
38
|
"@clack/prompts": "^0.8.2",
|
|
38
39
|
"@napi-rs/keyring": "^1.3.0",
|
|
40
|
+
"ajv": "^8.17.1",
|
|
41
|
+
"ajv-formats": "^3.0.1",
|
|
39
42
|
"citty": "^0.2.2",
|
|
40
43
|
"cli-table3": "^0.6.5",
|
|
44
|
+
"yaml": "^2.8.4",
|
|
41
45
|
"zod": "^4.0.0"
|
|
42
46
|
};
|
|
43
47
|
var devDependencies = {
|
|
48
|
+
"@types/js-yaml": "^4.0.9",
|
|
44
49
|
"@types/node": "^22.10.0",
|
|
45
50
|
"execa": "^9.5.2",
|
|
46
51
|
"fast-check": "^4.7.0",
|
|
52
|
+
"js-yaml": "^4.1.0",
|
|
47
53
|
"oxfmt": "^0.47.0",
|
|
48
54
|
"oxlint": "^1.62.0",
|
|
49
55
|
"publint": "^0.3.0",
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/runtime/paginate.ts
|
|
4
|
+
const DEFAULT_PAGE_SIZE = 50;
|
|
5
|
+
async function* paginate(client, path, itemSchema, opts = {}) {
|
|
6
|
+
const envelopeSchema = paginatedEnvelopeSchema(itemSchema);
|
|
7
|
+
const pageSize = opts.pageSize ?? DEFAULT_PAGE_SIZE;
|
|
8
|
+
const baseQuery = opts.query ?? {};
|
|
9
|
+
const cap = opts.max;
|
|
10
|
+
let offset = 0;
|
|
11
|
+
let yielded = 0;
|
|
12
|
+
while (true) {
|
|
13
|
+
const remaining = cap === void 0 ? Number.POSITIVE_INFINITY : cap - yielded;
|
|
14
|
+
if (remaining <= 0) return;
|
|
15
|
+
const requested = Math.min(pageSize, remaining);
|
|
16
|
+
const envelope = await client.requestParsed(envelopeSchema, path, {
|
|
17
|
+
query: {
|
|
18
|
+
...baseQuery,
|
|
19
|
+
limit: requested,
|
|
20
|
+
offset
|
|
21
|
+
},
|
|
22
|
+
...opts.signal !== void 0 && { signal: opts.signal }
|
|
23
|
+
});
|
|
24
|
+
for (const item of envelope.data) {
|
|
25
|
+
yield item;
|
|
26
|
+
yielded += 1;
|
|
27
|
+
if (cap !== void 0 && yielded >= cap) return;
|
|
28
|
+
}
|
|
29
|
+
if (envelope.data.length < requested) return;
|
|
30
|
+
if (envelope.total !== void 0 && envelope.total !== null && offset + envelope.data.length >= envelope.total) return;
|
|
31
|
+
offset += envelope.data.length;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function collectPaginated(client, path, itemSchema, opts = {}) {
|
|
35
|
+
const items = [];
|
|
36
|
+
for await (const item of paginate(client, path, itemSchema, opts)) items.push(item);
|
|
37
|
+
return items;
|
|
38
|
+
}
|
|
39
|
+
function paginatedEnvelopeSchema(itemSchema) {
|
|
40
|
+
return z.object({
|
|
41
|
+
data: z.array(itemSchema),
|
|
42
|
+
total: z.number().int().nonnegative().nullable().optional(),
|
|
43
|
+
limit: z.number().int().nonnegative().optional(),
|
|
44
|
+
offset: z.number().int().nonnegative().optional()
|
|
45
|
+
}).passthrough();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
export { collectPaginated };
|