@metabase/cli 0.1.0 → 0.1.1

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--zwkmE1S.mjs +11 -0
  3. package/dist/add-collection-B1qe0D1U.mjs +54 -0
  4. package/dist/api-key-gzCbKDjL.mjs +13 -0
  5. package/dist/archive-CitmlD1e.mjs +39 -0
  6. package/dist/{archive-CsWeHXle.mjs → archive-CnhWegtR.mjs} +7 -4
  7. package/dist/archive-DQjBOXnx.mjs +44 -0
  8. package/dist/archive-Ni8-lQ1Y.mjs +44 -0
  9. package/dist/auth-BPjsrFxM.mjs +19 -0
  10. package/dist/{body-Dv9hQ0Qk.mjs → body-DRBgxS6-.mjs} +3 -2
  11. package/dist/{branches-BujtceGr.mjs → branches-C5Jcw8wu.mjs} +8 -6
  12. package/dist/cancel-Ca3r7Y6v.mjs +56 -0
  13. package/dist/{cancel-task-CT2xUMRg.mjs → cancel-task-C1-8vDKS.mjs} +9 -7
  14. package/dist/card-BGAy3eIb.mjs +20 -0
  15. package/dist/{card-CsXk8T6A.mjs → card-CAEZWixN.mjs} +34 -15
  16. package/dist/cards-CILfMPUP.mjs +37 -0
  17. package/dist/cli.mjs +33 -14
  18. package/dist/collection-B3sPXRLs.mjs +163 -0
  19. package/dist/collection-D8cnCB98.mjs +19 -0
  20. package/dist/create-3Z6rm-4O.mjs +44 -0
  21. package/dist/create-BsY5RrVY.mjs +44 -0
  22. package/dist/create-C4OCclBD.mjs +48 -0
  23. package/dist/create-COsD7Vzm.mjs +48 -0
  24. package/dist/create-CP8ou91U.mjs +125 -0
  25. package/dist/create-CeIi_QLj.mjs +66 -0
  26. package/dist/create-CqNw6PmR.mjs +50 -0
  27. package/dist/create-DE_5NrFy.mjs +48 -0
  28. package/dist/{create-B8ektf-R.mjs → create-MEhhhgMC.mjs} +8 -6
  29. package/dist/create-QxDmleKJ.mjs +48 -0
  30. package/dist/{create-branch-goZBTNnr.mjs → create-branch-CKMYaAHk.mjs} +9 -7
  31. package/dist/credentials-CwRKvdP2.mjs +85 -0
  32. package/dist/{current-task-DBjRNCFq.mjs → current-task-Dutjys16.mjs} +9 -7
  33. package/dist/dashboard-B4fVp392.mjs +20 -0
  34. package/dist/dashboard-CnMD04PQ.mjs +163 -0
  35. package/dist/database-BMTb0CzV.mjs +17 -0
  36. package/dist/database-Dvkfy3JM.mjs +51 -0
  37. package/dist/db-ACuuaEok.mjs +22 -0
  38. package/dist/{delete-8vGU35r3.mjs → delete-BMQZuVXZ.mjs} +7 -5
  39. package/dist/{delete-B27KLF5X.mjs → delete-BvcA4jPj.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-DUPjHKk4.mjs} +7 -5
  42. package/dist/deprovision-Bsc1S15j.mjs +61 -0
  43. package/dist/{dirty-aNUuph4I.mjs → dirty-CXcdoUhY.mjs} +8 -6
  44. package/dist/docker-D-ieBsP7.mjs +612 -0
  45. package/dist/eid-pvOsEMPZ.mjs +13 -0
  46. package/dist/{export-QDkuuzSE.mjs → export-BjGhLEOi.mjs} +30 -23
  47. package/dist/field-BI2bt8e9.mjs +18 -0
  48. package/dist/field-DciLbuv-.mjs +276 -0
  49. package/dist/fields-Do8HHm_T.mjs +38 -0
  50. package/dist/flag-pair-DtR1AiBQ.mjs +17 -0
  51. package/dist/{get-BGBIzMKY.mjs → get-BGFGWkH0.mjs} +6 -4
  52. package/dist/get-BmE_VHdl.mjs +36 -0
  53. package/dist/{get-DI_IJvgk.mjs → get-C7sshmqF.mjs} +6 -4
  54. package/dist/get-CObKBj2J.mjs +36 -0
  55. package/dist/get-Cq5U_Eep.mjs +40 -0
  56. package/dist/get-D4GUJBiX.mjs +41 -0
  57. package/dist/{get-COXHplHP.mjs → get-DFrsi77F.mjs} +7 -5
  58. package/dist/get-DczxeETg.mjs +53 -0
  59. package/dist/{get-Cl8-IauC.mjs → get-DeQa3ThJ.mjs} +7 -4
  60. package/dist/get-DhZ_dGUb.mjs +36 -0
  61. package/dist/{get-i6LWOByV.mjs → get-DzCVafyO.mjs} +6 -4
  62. package/dist/get-YCnVqq-z.mjs +49 -0
  63. package/dist/get-run-CTyW29s3.mjs +36 -0
  64. package/dist/git-sync-BOmT8HEU.mjs +28 -0
  65. package/dist/{has-remote-changes-hjKoQuRy.mjs → has-remote-changes-xX8vMVsX.mjs} +8 -6
  66. package/dist/{import-HJsSKRYx.mjs → import-CaAUNtXz.mjs} +11 -9
  67. package/dist/{input-Dojr-RTw.mjs → input-ikCiip6x.mjs} +2 -1
  68. package/dist/is-dirty-CPu-xqkW.mjs +10 -0
  69. package/dist/{is-dirty-1Qy7hiHB.mjs → is-dirty-mgxEwEk4.mjs} +5 -4
  70. package/dist/items-Cg67tdto.mjs +77 -0
  71. package/dist/{key-DBxPSFwi.mjs → key-NDEARu2L.mjs} +1 -1
  72. package/dist/{license-MoWse3ZI.mjs → license-CwKzVMD0.mjs} +3 -3
  73. package/dist/list-BqdNQ1nU.mjs +47 -0
  74. package/dist/list-BwGdD45N.mjs +32 -0
  75. package/dist/list-CfOVsAZz.mjs +55 -0
  76. package/dist/list-CpyNn1Zn.mjs +32 -0
  77. package/dist/list-CwwOoGLK.mjs +40 -0
  78. package/dist/{list-C_PRdL5e.mjs → list-DD8CQx8l.mjs} +7 -5
  79. package/dist/{list-Bk6RsbJl.mjs → list-DL-RWpIE.mjs} +5 -3
  80. package/dist/list-DLlq3FyS.mjs +61 -0
  81. package/dist/list-DdQ4jmUQ.mjs +52 -0
  82. package/dist/{list-C4Ajrw8f.mjs → list-DshbLoqR.mjs} +6 -3
  83. package/dist/{list-C8tdLOH5.mjs → list-DzTMpoBs.mjs} +5 -3
  84. package/dist/list-JgRtCzz3.mjs +32 -0
  85. package/dist/{list-CWt3fqrZ.mjs → list-WzgJcwB5.mjs} +5 -3
  86. package/dist/{login-C9WTwNn6.mjs → login-DJnmR2wX.mjs} +14 -5
  87. package/dist/{logout-oLszGCOg.mjs → logout-BMe_1Zp8.mjs} +7 -6
  88. package/dist/logs-CQxKJ3HG.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-BGyYbtqO.mjs +19 -0
  92. package/dist/metadata-CLIALntn.mjs +37 -0
  93. package/dist/metadata-T-fNUWg_.mjs +38 -0
  94. package/dist/{package-BGfw4ZWJ.mjs → package-DBsS7a5x.mjs} +7 -1
  95. package/dist/paginate-CTSfuYiF.mjs +49 -0
  96. package/dist/parse-id-BUOZQqjp.mjs +12 -0
  97. package/dist/parse-ref-DGvh4aDn.mjs +17 -0
  98. package/dist/parse-schemas-BnW4T1_I.mjs +12 -0
  99. package/dist/{poll-ILanYysl.mjs → poll-DMmmZWvi.mjs} +2 -1
  100. package/dist/{poll-task-DbpsiQhl.mjs → poll-task-2Ckiwp8U.mjs} +8 -7
  101. package/dist/predicates-DiIiS3k7.mjs +153 -0
  102. package/dist/preflight-CC_g6EWU.mjs +91 -0
  103. package/dist/{prompt-DpT8yAVy.mjs → prompt-Bf3DQ-qE.mjs} +1 -1
  104. package/dist/provision-BUgWJWAV.mjs +77 -0
  105. package/dist/ps-BUNHygf-.mjs +10 -0
  106. package/dist/ps-Yv0JjLVN.mjs +78 -0
  107. package/dist/{query-PihYi-UZ.mjs → query-CzfbuG8a.mjs} +38 -13
  108. package/dist/query-UIebHmbT.mjs +90 -0
  109. package/dist/remove-BAUbcwuF.mjs +98 -0
  110. package/dist/{remove-B2hVYn1v.mjs → remove-CN2PNGTR.mjs} +6 -5
  111. package/dist/remove-collection-C6NxEh53.mjs +38 -0
  112. package/dist/render-DXv-D6fU.mjs +182 -0
  113. package/dist/rescan-values-CcB4F9qa.mjs +43 -0
  114. package/dist/revision-message-flag-CWQbKhdl.mjs +11 -0
  115. package/dist/{run-C2so6Qp6.mjs → run-BjXZtu_6.mjs} +27 -36
  116. package/dist/runs-CXx7l1NY.mjs +54 -0
  117. package/dist/{runtime-C9CEZhcn.mjs → runtime-D7jihh81.mjs} +425 -442
  118. package/dist/schema-tables-BCJT2DM_.mjs +45 -0
  119. package/dist/schemas-DlNpbn4H.mjs +47 -0
  120. package/dist/{search-CopOytXY.mjs → search-Dt-6mdHZ.mjs} +6 -19
  121. package/dist/segment-BMrUBz94.mjs +70 -0
  122. package/dist/segment-C52QNnSs.mjs +19 -0
  123. package/dist/{set-BcF7M1GQ.mjs → set-DCESWpi3.mjs} +6 -4
  124. package/dist/{set-CbibegpA.mjs → set-L7cuHjVZ.mjs} +8 -6
  125. package/dist/{setting-U3NtBMFo.mjs → setting-DysGAuYS.mjs} +3 -3
  126. package/dist/setup-_ypJDPAY.mjs +71 -0
  127. package/dist/snippet-Dw0Sjzkr.mjs +64 -0
  128. package/dist/snippet-vb3G9R8a.mjs +19 -0
  129. package/dist/start-BokXnb0V.mjs +350 -0
  130. package/dist/{stash-DOBbYozC.mjs → stash-CaGX6PfX.mjs} +9 -7
  131. package/dist/{status-Buf1ZbNR.mjs → status-BaX9vedb.mjs} +10 -8
  132. package/dist/{status-CUcs8XBH.mjs → status-CyecXzN4.mjs} +4 -2
  133. package/dist/{status-D1F5XHae.mjs → status-RpVyPEty.mjs} +4 -2
  134. package/dist/stop-BRuF_Cg1.mjs +81 -0
  135. package/dist/summary-CpEOiOlZ.mjs +41 -0
  136. package/dist/sync-schema-4Cl4h8Jn.mjs +43 -0
  137. package/dist/table-BeMWuvzO.mjs +19 -0
  138. package/dist/{table-Cfk7oSvw.mjs → table-jljEqZ0R.mjs} +22 -9
  139. package/dist/transform-DwRc-w6y.mjs +24 -0
  140. package/dist/{transform-B5uRpg1G.mjs → transform-IEX4Mx3X.mjs} +56 -2
  141. package/dist/transform-job-BigWrctt.mjs +19 -0
  142. package/dist/{transform-job-C7QXWTVE.mjs → transform-job-Csr86muI.mjs} +7 -0
  143. package/dist/translate-DqLlXXUx.mjs +111 -0
  144. package/dist/tree-BT24nkLM.mjs +32 -0
  145. package/dist/update-BCXKQi2n.mjs +52 -0
  146. package/dist/{update-CL8tRbxr.mjs → update-BXbLmC2b.mjs} +9 -7
  147. package/dist/update-C1Frz9GR.mjs +52 -0
  148. package/dist/update-C5goGhNr.mjs +56 -0
  149. package/dist/update-CCOyB0iT.mjs +73 -0
  150. package/dist/update-D04NMueX.mjs +59 -0
  151. package/dist/update-D6WVtNV1.mjs +57 -0
  152. package/dist/update-DFR46LsB.mjs +56 -0
  153. package/dist/update-DyLItrpV.mjs +56 -0
  154. package/dist/update-dashcard-av0_PYeg.mjs +71 -0
  155. package/dist/update-mrgvQF4i.mjs +51 -0
  156. package/dist/url-x4wn_l3k.mjs +54 -0
  157. package/dist/uuid-BZHbti8B.mjs +47 -0
  158. package/dist/validate-DCYx6jdL.mjs +1496 -0
  159. package/dist/validate-query-B07oGG4K.mjs +37 -0
  160. package/dist/values-Be6i0Fs9.mjs +36 -0
  161. package/dist/{wait-Bugr9eXD.mjs → wait-BMqQD8k_.mjs} +10 -8
  162. package/dist/wait-CWizX_sR.mjs +19 -0
  163. package/dist/wait-flags-DO3ar2tf.mjs +35 -0
  164. package/dist/workspace-CG1xyJ86.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-DBsS7a5x.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-D7jihh81.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 };
@@ -1,7 +1,10 @@
1
- import "./package-BGfw4ZWJ.mjs";
1
+ import "./package-DBsS7a5x.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-D7jihh81.mjs";
6
+ import "./field-DciLbuv-.mjs";
7
+ import { Card, CardCompact, cardView } from "./card-CAEZWixN.mjs";
5
8
  import { z } from "zod";
6
9
 
7
10
  //#region src/commands/card/list.ts
@@ -1,7 +1,9 @@
1
- import "./package-BGfw4ZWJ.mjs";
1
+ import "./package-DBsS7a5x.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, renderList, wrapList } from "./runtime-C9CEZhcn.mjs";
4
- import { TransformJob, TransformJobCompact, transformJobView } from "./transform-job-C7QXWTVE.mjs";
3
+ import { renderList } from "./render-DXv-D6fU.mjs";
4
+ import "./predicates-DiIiS3k7.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-D7jihh81.mjs";
6
+ import { TransformJob, TransformJobCompact, transformJobView } from "./transform-job-Csr86muI.mjs";
5
7
  import { z } from "zod";
6
8
 
7
9
  //#region src/commands/transform-job/list.ts
@@ -0,0 +1,32 @@
1
+ import "./package-DBsS7a5x.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-D7jihh81.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-DBsS7a5x.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-D7jihh81.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-DBsS7a5x.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 { HttpError, clearRejection, connectionFlags, createClient, defineMetabaseCommand, normalizeUrl, outputFlags, profileFlag, readEnvCredentials, recordRejection, resolveProfileName, writeProfile } from "./runtime-D7jihh81.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
@@ -112,7 +114,13 @@ var login_default = defineMetabaseCommand({
112
114
  let authenticated = false;
113
115
  if (!args["skip-verify"]) {
114
116
  const result = await verifyCredentials(url, apiKey);
115
- if (!result.ok) throw new ConfigError(`verification failed: ${result.message}`);
117
+ if (!result.ok) {
118
+ await recordRejection(profileName, {
119
+ reason: result.message,
120
+ url
121
+ });
122
+ throw new ConfigError(`verification failed: ${result.message} — credentials were not saved for profile "${profileName}"`);
123
+ }
116
124
  email = result.user.email;
117
125
  authenticated = true;
118
126
  }
@@ -120,6 +128,7 @@ var login_default = defineMetabaseCommand({
120
128
  url,
121
129
  apiKey
122
130
  }, profileName);
131
+ await clearRejection(profileName);
123
132
  if (location.backend === "file") warn(`warning: OS keychain unavailable; credentials stored as plaintext at ${location.path}`);
124
133
  renderItem({
125
134
  profile: profileName,
@@ -1,7 +1,9 @@
1
- import "./package-BGfw4ZWJ.mjs";
1
+ import "./package-DBsS7a5x.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-D7jihh81.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-DBsS7a5x.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { ConfigError } from "./predicates-DiIiS3k7.mjs";
4
+ import { defineMetabaseCommand, outputFlags, parseInteger } from "./runtime-D7jihh81.mjs";
5
+ import { parseId } from "./parse-id-BUOZQqjp.mjs";
6
+ import "./poll-DMmmZWvi.mjs";
7
+ import { checkDockerReady, containerLifecycleStatus, containerNameFor, streamLogs } from "./docker-D-ieBsP7.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-BwGdD45N.mjs").then((mod) => mod.default),
11
+ get: () => import("./get-CObKBj2J.mjs").then((mod) => mod.default),
12
+ create: () => import("./create-COsD7Vzm.mjs").then((mod) => mod.default),
13
+ update: () => import("./update-DFR46LsB.mjs").then((mod) => mod.default),
14
+ archive: () => import("./archive-Ni8-lQ1Y.mjs").then((mod) => mod.default)
15
+ }
16
+ });
17
+
18
+ //#endregion
19
+ export { measure_default as default };
@@ -0,0 +1,37 @@
1
+ import "./package-DBsS7a5x.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-D7jihh81.mjs";
6
+ import { parseId } from "./parse-id-BUOZQqjp.mjs";
7
+ import "./field-DciLbuv-.mjs";
8
+ import { TableQueryMetadata, tableView } from "./table-jljEqZ0R.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 };
@@ -0,0 +1,38 @@
1
+ import "./package-DBsS7a5x.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-D7jihh81.mjs";
6
+ import { parseId } from "./parse-id-BUOZQqjp.mjs";
7
+ import "./field-DciLbuv-.mjs";
8
+ import "./table-jljEqZ0R.mjs";
9
+ import { Database, databaseView } from "./database-Dvkfy3JM.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 };
@@ -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.1";
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-D7jihh81.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 };
@@ -0,0 +1,17 @@
1
+ import { ConfigError } from "./predicates-DiIiS3k7.mjs";
2
+
3
+ //#region src/commands/collection/parse-ref.ts
4
+ const SPECIAL_TOKENS = new Set(["root", "trash"]);
5
+ const POSITIVE_INTEGER_PATTERN = /^[1-9]\d*$/;
6
+ const NANO_ID_PATTERN = /^[A-Za-z0-9_-]{21}$/;
7
+ const FORMAT_HINT = "expected integer, \"root\", \"trash\", or 21-char entity id";
8
+ function parseCollectionRef(raw) {
9
+ const trimmed = raw.trim();
10
+ if (trimmed === "") throw new ConfigError(`invalid id: ${JSON.stringify(trimmed)} (${FORMAT_HINT})`);
11
+ if (SPECIAL_TOKENS.has(trimmed)) return trimmed;
12
+ if (POSITIVE_INTEGER_PATTERN.test(trimmed) || NANO_ID_PATTERN.test(trimmed)) return trimmed;
13
+ throw new ConfigError(`invalid id: ${JSON.stringify(raw)} (${FORMAT_HINT})`);
14
+ }
15
+
16
+ //#endregion
17
+ export { parseCollectionRef };
@@ -0,0 +1,12 @@
1
+ import { ConfigError } from "./predicates-DiIiS3k7.mjs";
2
+ import { parseCsv } from "./runtime-D7jihh81.mjs";
3
+
4
+ //#region src/commands/workspace/database/parse-schemas.ts
5
+ function parseSchemasCsv(raw) {
6
+ const parts = parseCsv(raw);
7
+ if (parts.length === 0) throw new ConfigError("--schemas must contain at least one schema name");
8
+ return parts;
9
+ }
10
+
11
+ //#endregion
12
+ export { parseSchemasCsv };
@@ -1,4 +1,5 @@
1
- import { TimeoutError, combineAborts, throwIfAborted } from "./runtime-C9CEZhcn.mjs";
1
+ import { TimeoutError } from "./predicates-DiIiS3k7.mjs";
2
+ import { combineAborts, throwIfAborted } from "./runtime-D7jihh81.mjs";
2
3
  import { setTimeout } from "node:timers/promises";
3
4
 
4
5
  //#region src/runtime/poll.ts
@@ -1,8 +1,8 @@
1
- import { parseJson } from "./runtime-C9CEZhcn.mjs";
2
- import { DEFAULT_INTERVAL_MS, DEFAULT_TIMEOUT_MS, pollUntil } from "./poll-ILanYysl.mjs";
1
+ import { parseJsonOrPlain } from "./runtime-D7jihh81.mjs";
2
+ import { DEFAULT_INTERVAL_MS, DEFAULT_TIMEOUT_MS, pollUntil } from "./poll-DMmmZWvi.mjs";
3
3
  import { z } from "zod";
4
4
 
5
- //#region src/domain/remote-sync.ts
5
+ //#region src/domain/git-sync.ts
6
6
  const SyncTaskStatus = z.enum([
7
7
  "running",
8
8
  "successful",
@@ -109,7 +109,7 @@ const syncDirtyItemView = {
109
109
  };
110
110
 
111
111
  //#endregion
112
- //#region src/commands/sync/poll-task.ts
112
+ //#region src/commands/git-sync/poll-task.ts
113
113
  const TERMINAL_STATUSES = new Set([
114
114
  "successful",
115
115
  "errored",
@@ -132,7 +132,8 @@ const REMOTE_SYNC_PATHS = {
132
132
  export: "/api/ee/remote-sync/export",
133
133
  stash: "/api/ee/remote-sync/stash",
134
134
  branches: "/api/ee/remote-sync/branches",
135
- createBranch: "/api/ee/remote-sync/create-branch"
135
+ createBranch: "/api/ee/remote-sync/create-branch",
136
+ settings: "/api/ee/remote-sync/settings"
136
137
  };
137
138
  const SyncTaskIdle = z.object({ status: z.literal("idle") });
138
139
  const SyncTaskOrIdle = z.union([SyncTask, SyncTaskIdle]);
@@ -173,7 +174,7 @@ async function fetchOptionalParsed(client, path, schema) {
173
174
  });
174
175
  if (response.status === 204) return null;
175
176
  const text = await response.text();
176
- return parseJson(text, schema, { source: response.url });
177
+ return parseJsonOrPlain(text, response.headers.get("content-type"), schema, { source: response.url });
177
178
  }
178
179
  async function fetchCurrentTask(client) {
179
180
  return await fetchOptionalParsed(client, REMOTE_SYNC_PATHS.currentTask, SyncTask);
@@ -187,7 +188,7 @@ async function pollSyncTask(client, opts) {
187
188
  function throwIfFailedTask(final, verb) {
188
189
  if (final === null || !isFailure(final.status)) return;
189
190
  const detail = final.error_message ? `: ${final.error_message}` : "";
190
- throw new Error(`sync ${verb} ${final.status}${detail}`);
191
+ throw new Error(`git-sync ${verb} ${final.status}${detail}`);
191
192
  }
192
193
 
193
194
  //#endregion