@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.
Files changed (187) hide show
  1. package/README.md +972 -57
  2. package/dist/add-collection-DwxQDXzL.mjs +54 -0
  3. package/dist/add-collection-SL08iMub.mjs +11 -0
  4. package/dist/api-key-BktzvPb7.mjs +13 -0
  5. package/dist/{archive-CsWeHXle.mjs → archive-C1mF-9Kj.mjs} +7 -4
  6. package/dist/archive-CLWtbvvH.mjs +44 -0
  7. package/dist/archive-Cq4WKmJt.mjs +44 -0
  8. package/dist/archive-kYoy5LK5.mjs +39 -0
  9. package/dist/auth-DfYkakP3.mjs +19 -0
  10. package/dist/{body-Dv9hQ0Qk.mjs → body-rDrR-C1c.mjs} +3 -2
  11. package/dist/{branches-BujtceGr.mjs → branches-CH2UcCpX.mjs} +8 -6
  12. package/dist/cancel-CgLZcItQ.mjs +56 -0
  13. package/dist/{cancel-task-CT2xUMRg.mjs → cancel-task-DcYrFsM6.mjs} +9 -7
  14. package/dist/{card-CsXk8T6A.mjs → card-CQxvHeyP.mjs} +34 -15
  15. package/dist/card-ZCGU2JEh.mjs +20 -0
  16. package/dist/cards-C4NIaERo.mjs +37 -0
  17. package/dist/cli.mjs +33 -14
  18. package/dist/collection-B3sPXRLs.mjs +163 -0
  19. package/dist/collection-D_uFLIAS.mjs +19 -0
  20. package/dist/create-BUCLNqiN.mjs +48 -0
  21. package/dist/create-CB0Yp__0.mjs +66 -0
  22. package/dist/create-CNvd5T8h.mjs +48 -0
  23. package/dist/create-Cbh1cGj9.mjs +48 -0
  24. package/dist/create-CzfNOhOF.mjs +48 -0
  25. package/dist/create-DU0ZhnZu.mjs +44 -0
  26. package/dist/create-Dh0p-c2Y.mjs +44 -0
  27. package/dist/create-DvrVZ2hS.mjs +125 -0
  28. package/dist/create-QgN369N5.mjs +50 -0
  29. package/dist/{create-B8ektf-R.mjs → create-bqc_rmix.mjs} +8 -6
  30. package/dist/{create-branch-goZBTNnr.mjs → create-branch-BJFH9Hda.mjs} +9 -7
  31. package/dist/credentials-DTP1xuKz.mjs +85 -0
  32. package/dist/{current-task-DBjRNCFq.mjs → current-task-z_TiJ0kt.mjs} +9 -7
  33. package/dist/dashboard-CnMD04PQ.mjs +163 -0
  34. package/dist/dashboard-G1-dGLUR.mjs +20 -0
  35. package/dist/database-DQkUxTLd.mjs +17 -0
  36. package/dist/database-vvig8k4x.mjs +51 -0
  37. package/dist/db-CBaEfumR.mjs +22 -0
  38. package/dist/{delete-8vGU35r3.mjs → delete-CVYII8mq.mjs} +7 -5
  39. package/dist/{delete-B27KLF5X.mjs → delete-DeZQ1r9w.mjs} +7 -5
  40. package/dist/{delete-runtime-Byr60cR3.mjs → delete-runtime-BMzvfj_B.mjs} +4 -4
  41. package/dist/{delete-table-BNaJ_gA4.mjs → delete-table-ZiR9-ndv.mjs} +7 -5
  42. package/dist/deprovision-BhD3J-Am.mjs +61 -0
  43. package/dist/{dirty-aNUuph4I.mjs → dirty-D9agt7Os.mjs} +8 -6
  44. package/dist/docker-CHpV8PRz.mjs +612 -0
  45. package/dist/eid-B5wawMmO.mjs +13 -0
  46. package/dist/{export-QDkuuzSE.mjs → export-Bfk7JAlR.mjs} +30 -23
  47. package/dist/field-B3gvaqpK.mjs +278 -0
  48. package/dist/field-BDJ1pEgr.mjs +18 -0
  49. package/dist/fields-7ByLsxLg.mjs +38 -0
  50. package/dist/flag-pair-DtR1AiBQ.mjs +17 -0
  51. package/dist/get-BE6Izpus.mjs +36 -0
  52. package/dist/get-C3CcAJGg.mjs +49 -0
  53. package/dist/{get-DI_IJvgk.mjs → get-CQGeF-eP.mjs} +6 -4
  54. package/dist/get-D2m4jhwT.mjs +53 -0
  55. package/dist/{get-BGBIzMKY.mjs → get-DKy3DAJX.mjs} +6 -4
  56. package/dist/{get-COXHplHP.mjs → get-DUSR5i99.mjs} +7 -5
  57. package/dist/get-DikegGzi.mjs +36 -0
  58. package/dist/get-StkjKuh0.mjs +40 -0
  59. package/dist/get-bYc7eGYe.mjs +36 -0
  60. package/dist/{get-Cl8-IauC.mjs → get-cuHp9-6U.mjs} +7 -4
  61. package/dist/{get-i6LWOByV.mjs → get-gOT_RarI.mjs} +6 -4
  62. package/dist/get-run-D59Yqaoh.mjs +36 -0
  63. package/dist/get-tISo-cmg.mjs +41 -0
  64. package/dist/git-sync-BiTWfLgY.mjs +28 -0
  65. package/dist/{has-remote-changes-hjKoQuRy.mjs → has-remote-changes-B1TciDVD.mjs} +8 -6
  66. package/dist/{import-HJsSKRYx.mjs → import-DnnmmJbp.mjs} +11 -9
  67. package/dist/{input-Dojr-RTw.mjs → input-ikCiip6x.mjs} +2 -1
  68. package/dist/is-dirty-DClGFOGV.mjs +10 -0
  69. package/dist/{is-dirty-1Qy7hiHB.mjs → is-dirty-DlfX7e39.mjs} +5 -4
  70. package/dist/items-DQFQSpjF.mjs +77 -0
  71. package/dist/{key-DBxPSFwi.mjs → key-NDEARu2L.mjs} +1 -1
  72. package/dist/{license-MoWse3ZI.mjs → license-DBh13sc8.mjs} +3 -3
  73. package/dist/list-4kYCGv01.mjs +32 -0
  74. package/dist/list-9AOWhxqp.mjs +61 -0
  75. package/dist/{list-Bk6RsbJl.mjs → list-BwjqQ6pp.mjs} +5 -3
  76. package/dist/{list-C_PRdL5e.mjs → list-CP5RNjO6.mjs} +7 -5
  77. package/dist/{list-C8tdLOH5.mjs → list-Cy0VhXQs.mjs} +5 -3
  78. package/dist/list-D067ZSE5.mjs +47 -0
  79. package/dist/list-DAZP-IM5.mjs +32 -0
  80. package/dist/list-DJN-OvTZ.mjs +52 -0
  81. package/dist/list-DQj-QJAs.mjs +40 -0
  82. package/dist/list-Di529OJD.mjs +55 -0
  83. package/dist/{list-C4Ajrw8f.mjs → list-DlKzgnqo.mjs} +6 -3
  84. package/dist/list-GFfR9SuT.mjs +32 -0
  85. package/dist/{list-CWt3fqrZ.mjs → list-iFVEdi2J.mjs} +5 -3
  86. package/dist/{login-C9WTwNn6.mjs → login-DxgkosGx.mjs} +30 -9
  87. package/dist/{logout-oLszGCOg.mjs → logout-BlVwqBog.mjs} +7 -6
  88. package/dist/logs-CudNEkT4.mjs +58 -0
  89. package/dist/{manifest-CAdjQYH8.mjs → manifest-Dv5B9Blc.mjs} +3 -7
  90. package/dist/measure-BEQfnLdN.mjs +67 -0
  91. package/dist/measure-C7SbdYQk.mjs +19 -0
  92. package/dist/metadata-B2Td415K.mjs +38 -0
  93. package/dist/metadata-BTJAFVvZ.mjs +37 -0
  94. package/dist/{package-BGfw4ZWJ.mjs → package-DV6Asqim.mjs} +7 -1
  95. package/dist/paginate-CTSfuYiF.mjs +49 -0
  96. package/dist/parse-id-B38zTlYs.mjs +12 -0
  97. package/dist/parse-ref-DGvh4aDn.mjs +17 -0
  98. package/dist/parse-schemas-Ds-cVE-O.mjs +12 -0
  99. package/dist/{poll-ILanYysl.mjs → poll-Bh6oAifO.mjs} +2 -1
  100. package/dist/{poll-task-DbpsiQhl.mjs → poll-task-vPwV31Fs.mjs} +8 -7
  101. package/dist/predicates-DiIiS3k7.mjs +153 -0
  102. package/dist/preflight-DxJb-hUV.mjs +91 -0
  103. package/dist/{prompt-DpT8yAVy.mjs → prompt-Bf3DQ-qE.mjs} +1 -1
  104. package/dist/provision-B-I0zuDe.mjs +77 -0
  105. package/dist/ps-BmYQYC7t.mjs +10 -0
  106. package/dist/ps-CaiOFCv2.mjs +78 -0
  107. package/dist/query-BtF1yWZZ.mjs +90 -0
  108. package/dist/{query-PihYi-UZ.mjs → query-jmfqaXRP.mjs} +38 -13
  109. package/dist/remove-C2iv0g03.mjs +98 -0
  110. package/dist/remove-collection-DhZghaZy.mjs +38 -0
  111. package/dist/{remove-B2hVYn1v.mjs → remove-xskleeru.mjs} +6 -5
  112. package/dist/render-DXv-D6fU.mjs +182 -0
  113. package/dist/rescan-values-DW6u90ep.mjs +43 -0
  114. package/dist/revision-message-flag-CWQbKhdl.mjs +11 -0
  115. package/dist/{run-C2so6Qp6.mjs → run-DxVzhcF3.mjs} +27 -36
  116. package/dist/runs-BOHk1XnM.mjs +54 -0
  117. package/dist/{runtime-C9CEZhcn.mjs → runtime-cwBS8wwK.mjs} +428 -442
  118. package/dist/schema-tables-CcFbY_jN.mjs +45 -0
  119. package/dist/schemas-DZmv_V62.mjs +47 -0
  120. package/dist/{search-CopOytXY.mjs → search-CYMuc7Fg.mjs} +6 -19
  121. package/dist/segment-BMrUBz94.mjs +70 -0
  122. package/dist/segment-Df4pfjco.mjs +19 -0
  123. package/dist/{set-BcF7M1GQ.mjs → set-B_rrVwU4.mjs} +6 -4
  124. package/dist/{set-CbibegpA.mjs → set-CbGfQ7Ye.mjs} +8 -6
  125. package/dist/{setting-U3NtBMFo.mjs → setting-DqZY9NXP.mjs} +3 -3
  126. package/dist/setup-DxmcAorA.mjs +71 -0
  127. package/dist/snippet-CwSHjQyn.mjs +19 -0
  128. package/dist/snippet-Dw0Sjzkr.mjs +64 -0
  129. package/dist/start-Cn0epTks.mjs +380 -0
  130. package/dist/{stash-DOBbYozC.mjs → stash-BFZIl9F4.mjs} +9 -7
  131. package/dist/{status-Buf1ZbNR.mjs → status-BjCeJNLp.mjs} +10 -8
  132. package/dist/{status-CUcs8XBH.mjs → status-FDIDmqvM.mjs} +4 -2
  133. package/dist/{status-D1F5XHae.mjs → status-UALK3OJl.mjs} +4 -2
  134. package/dist/stop-DUwrDWw8.mjs +81 -0
  135. package/dist/summary-CS4UGiFJ.mjs +41 -0
  136. package/dist/sync-schema-IrHdJxmX.mjs +43 -0
  137. package/dist/{table-Cfk7oSvw.mjs → table-B-PYcgGb.mjs} +22 -9
  138. package/dist/table-Cdr5bKp1.mjs +19 -0
  139. package/dist/transform-CeZusR_w.mjs +24 -0
  140. package/dist/{transform-B5uRpg1G.mjs → transform-IEX4Mx3X.mjs} +56 -2
  141. package/dist/transform-job-BOn9-CGa.mjs +19 -0
  142. package/dist/{transform-job-C7QXWTVE.mjs → transform-job-Csr86muI.mjs} +7 -0
  143. package/dist/translate-B__zbDKm.mjs +111 -0
  144. package/dist/tree-Mh0uQ_Wy.mjs +32 -0
  145. package/dist/update-1Di9hbPo.mjs +56 -0
  146. package/dist/update-B5_pp6Jj.mjs +56 -0
  147. package/dist/update-B9DBMo30.mjs +52 -0
  148. package/dist/update-BfBsM_y1.mjs +56 -0
  149. package/dist/update-Bw0WZix_.mjs +73 -0
  150. package/dist/update-Cp1789qq.mjs +52 -0
  151. package/dist/update-D2VI_5cy.mjs +57 -0
  152. package/dist/update-D8GwQTcL.mjs +59 -0
  153. package/dist/{update-CL8tRbxr.mjs → update-Masp5WeT.mjs} +9 -7
  154. package/dist/update-dashcard-CNiQw1MD.mjs +71 -0
  155. package/dist/update-j9vgemKR.mjs +51 -0
  156. package/dist/url-GFM76VIK.mjs +54 -0
  157. package/dist/uuid-Uif0lNk8.mjs +47 -0
  158. package/dist/validate-DCYx6jdL.mjs +1496 -0
  159. package/dist/validate-query-B07oGG4K.mjs +37 -0
  160. package/dist/values-DrwNHUAI.mjs +36 -0
  161. package/dist/{wait-Bugr9eXD.mjs → wait-BoKk8CJy.mjs} +10 -8
  162. package/dist/wait-DO7tS7NI.mjs +19 -0
  163. package/dist/wait-flags-CjX2sEGm.mjs +35 -0
  164. package/dist/workspace-CyEX40D-.mjs +24 -0
  165. package/dist/workspace-DVuqKJGG.mjs +72 -0
  166. package/dist/workspace-credentials-B6BL-X0d.mjs +139 -0
  167. package/package.json +7 -1
  168. package/dist/auth-BF7IjZIH.mjs +0 -18
  169. package/dist/card-_Ta7zdYe.mjs +0 -19
  170. package/dist/create-CI2Cunq5.mjs +0 -38
  171. package/dist/create-DdbU3TLX.mjs +0 -42
  172. package/dist/database-PA9Goi25.mjs +0 -33
  173. package/dist/db-DMghzgb6.mjs +0 -17
  174. package/dist/field-C8IVs6rp.mjs +0 -76
  175. package/dist/field-DaYo_90x.mjs +0 -13
  176. package/dist/get-Cwpj7lDe.mjs +0 -35
  177. package/dist/get-Dh_acl8q.mjs +0 -34
  178. package/dist/is-dirty-DpKn9HJp.mjs +0 -8
  179. package/dist/list-CBSBHtK-.mjs +0 -38
  180. package/dist/parse-id-BhmmfyCP.mjs +0 -14
  181. package/dist/sync-BPyGXfUk.mjs +0 -26
  182. package/dist/table-D7nJt7JO.mjs +0 -16
  183. package/dist/transform-UbyewMxY.mjs +0 -21
  184. package/dist/transform-job-CrYkr-Ma.mjs +0 -19
  185. package/dist/update-DU2oU2j-.mjs +0 -49
  186. /package/dist/{body-flags-BUA9XV1u.mjs → body-flags-BK7J6Daz.mjs} +0 -0
  187. /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-BGfw4ZWJ.mjs";
1
+ import "./package-DV6Asqim.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, renderList, wrapList } from "./runtime-C9CEZhcn.mjs";
4
- import { Card, CardCompact, cardView } from "./card-CsXk8T6A.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 "./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-BGfw4ZWJ.mjs";
1
+ import "./package-DV6Asqim.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, renderList, wrapList } from "./runtime-C9CEZhcn.mjs";
4
- import { Transform, TransformCompact, transformView } from "./transform-B5uRpg1G.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 { 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-BGfw4ZWJ.mjs";
1
+ import "./package-DV6Asqim.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { ConfigError, HttpError, MetabaseError, connectionFlags, createClient, defineMetabaseCommand, errorMessage, normalizeUrl, outputFlags, profileFlag, readEnvCredentials, renderItem, resolveProfileName, warn, writeProfile } from "./runtime-C9CEZhcn.mjs";
4
- import { promptPassword, promptText } from "./prompt-DpT8yAVy.mjs";
5
- import { readInput } from "./input-Dojr-RTw.mjs";
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: "Authenticated"
78
+ label: "Status",
79
+ format: (value) => value === true ? "credentials verified" : "saved without verification"
77
80
  },
78
81
  {
79
82
  key: "email",
80
- label: "Email"
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 = resolveProfileName(args.profile);
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) throw new ConfigError(`verification failed: ${result.message}`);
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-BGfw4ZWJ.mjs";
1
+ import "./package-DV6Asqim.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { ConfigError, clearProfile, defineMetabaseCommand, outputFlags, profileFlag, renderItem, resolveProfileName } from "./runtime-C9CEZhcn.mjs";
4
- import { promptConfirm } from "./prompt-DpT8yAVy.mjs";
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
- writeManifest(manifest);
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.0";
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 };
@@ -0,0 +1,12 @@
1
+ import { parseInteger } from "./runtime-cwBS8wwK.mjs";
2
+
3
+ //#region src/commands/parse-id.ts
4
+ function parseId(value, name = "id") {
5
+ return parseInteger(value, {
6
+ name,
7
+ min: 1
8
+ });
9
+ }
10
+
11
+ //#endregion
12
+ export { parseId };