@metabase/cli 0.1.2 → 0.1.3

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 (173) hide show
  1. package/README.md +46 -0
  2. package/dist/add-collection-BOnW3n0Z.mjs +11 -0
  3. package/dist/{add-collection-DwxQDXzL.mjs → add-collection-CYzLXtm5.mjs} +4 -4
  4. package/dist/{api-key-BktzvPb7.mjs → api-key-PuKAaQ7V.mjs} +1 -1
  5. package/dist/{archive-kYoy5LK5.mjs → archive-BO29HssD.mjs} +5 -5
  6. package/dist/{archive-Cq4WKmJt.mjs → archive-TLtE0kDm.mjs} +5 -5
  7. package/dist/{archive-C1mF-9Kj.mjs → archive-mnPwvARh.mjs} +5 -5
  8. package/dist/{archive-CLWtbvvH.mjs → archive-rMwM-zTz.mjs} +5 -5
  9. package/dist/auth-6xSQV9_O.mjs +19 -0
  10. package/dist/{body-rDrR-C1c.mjs → body-DyJdyUnm.mjs} +3 -3
  11. package/dist/{branches-CH2UcCpX.mjs → branches-DfmU7c7o.mjs} +6 -6
  12. package/dist/{cancel-CgLZcItQ.mjs → cancel-CMZDt-Oq.mjs} +5 -5
  13. package/dist/{cancel-task-DcYrFsM6.mjs → cancel-task-CgZTaU3M.mjs} +6 -6
  14. package/dist/card-BPRuWt1L.mjs +20 -0
  15. package/dist/{cards-C4NIaERo.mjs → cards-CHbQGafh.mjs} +5 -5
  16. package/dist/cli.mjs +25 -24
  17. package/dist/collection-ubrm8jOv.mjs +19 -0
  18. package/dist/{create-CzfNOhOF.mjs → create-8Hv7mPeZ.mjs} +8 -8
  19. package/dist/{create-Dh0p-c2Y.mjs → create-9Eixx15H.mjs} +6 -6
  20. package/dist/{create-CB0Yp__0.mjs → create-BBUS1QQj.mjs} +8 -8
  21. package/dist/{create-CNvd5T8h.mjs → create-BCuXOmjv.mjs} +7 -7
  22. package/dist/{create-DvrVZ2hS.mjs → create-BwTWnEI9.mjs} +8 -8
  23. package/dist/{create-QgN369N5.mjs → create-C0rMO9hM.mjs} +8 -8
  24. package/dist/{create-Cbh1cGj9.mjs → create-CicN3zvl.mjs} +8 -8
  25. package/dist/{create-BUCLNqiN.mjs → create-DSYimCdi.mjs} +8 -8
  26. package/dist/{create-DU0ZhnZu.mjs → create-DmoCeGvG.mjs} +6 -6
  27. package/dist/{create-bqc_rmix.mjs → create-DxEFGyTl.mjs} +6 -6
  28. package/dist/{create-branch-BJFH9Hda.mjs → create-branch-CyGWseMj.mjs} +6 -6
  29. package/dist/{credentials-DTP1xuKz.mjs → credentials-BsyxKKpn.mjs} +9 -8
  30. package/dist/{current-task-z_TiJ0kt.mjs → current-task-Cp2TOV2G.mjs} +6 -6
  31. package/dist/dashboard-DMXwndg8.mjs +20 -0
  32. package/dist/{database-DQkUxTLd.mjs → database-u753FytI.mjs} +3 -3
  33. package/dist/db-Br0VA1nL.mjs +22 -0
  34. package/dist/{delete-CVYII8mq.mjs → delete-QRsN6npe.mjs} +7 -7
  35. package/dist/{delete-DeZQ1r9w.mjs → delete-_9bnRv2O.mjs} +7 -7
  36. package/dist/{delete-runtime-BMzvfj_B.mjs → delete-runtime-BkAdygbs.mjs} +2 -2
  37. package/dist/{delete-table-ZiR9-ndv.mjs → delete-table-DTLdSkjp.mjs} +7 -7
  38. package/dist/{deprovision-BhD3J-Am.mjs → deprovision-CRV8Isc3.mjs} +11 -11
  39. package/dist/{dirty-D9agt7Os.mjs → dirty-CEH3GeaE.mjs} +6 -6
  40. package/dist/{docker-CHpV8PRz.mjs → docker-BYQ0FHrT.mjs} +5 -102
  41. package/dist/{eid-B5wawMmO.mjs → eid-C4-Vk0tN.mjs} +1 -1
  42. package/dist/{export-Bfk7JAlR.mjs → export-D7sASe7p.mjs} +7 -7
  43. package/dist/field-DN3Mtvjy.mjs +18 -0
  44. package/dist/{fields-7ByLsxLg.mjs → fields-BcqomXOj.mjs} +5 -5
  45. package/dist/{flag-pair-DtR1AiBQ.mjs → flag-pair-Fmcdkrfx.mjs} +1 -1
  46. package/dist/{get-gOT_RarI.mjs → get-B3N93OEi.mjs} +5 -5
  47. package/dist/{get-BE6Izpus.mjs → get-BRwM-_QR.mjs} +5 -5
  48. package/dist/{get-DUSR5i99.mjs → get-BrLtlgsJ.mjs} +5 -5
  49. package/dist/{get-DKy3DAJX.mjs → get-By8D2ZCD.mjs} +5 -5
  50. package/dist/{get-tISo-cmg.mjs → get-C8mOGKNU.mjs} +5 -5
  51. package/dist/{get-cuHp9-6U.mjs → get-C9ddaeGp.mjs} +5 -5
  52. package/dist/{get-DikegGzi.mjs → get-Cv5O0Nzp.mjs} +5 -5
  53. package/dist/{get-CQGeF-eP.mjs → get-Cw74jQSg.mjs} +5 -5
  54. package/dist/{get-StkjKuh0.mjs → get-DGPgyqzM.mjs} +5 -5
  55. package/dist/{get-C3CcAJGg.mjs → get-DNdDX5ON.mjs} +5 -5
  56. package/dist/{get-D2m4jhwT.mjs → get-DVTJi4o0.mjs} +5 -5
  57. package/dist/{get-bYc7eGYe.mjs → get-REcs9xfF.mjs} +5 -5
  58. package/dist/{get-run-D59Yqaoh.mjs → get-run-DY8GOsfI.mjs} +5 -5
  59. package/dist/git-sync-C3DyWKLP.mjs +28 -0
  60. package/dist/{has-remote-changes-B1TciDVD.mjs → has-remote-changes-Bw_X8TI6.mjs} +6 -6
  61. package/dist/{import-DnnmmJbp.mjs → import-QVwrtIFF.mjs} +7 -7
  62. package/dist/{input-ikCiip6x.mjs → input-BQ-BZA8h.mjs} +1 -1
  63. package/dist/{is-dirty-DlfX7e39.mjs → is-dirty-BHucbgY2.mjs} +3 -3
  64. package/dist/is-dirty-YZTcIZmy.mjs +10 -0
  65. package/dist/{items-DQFQSpjF.mjs → items-BrLOFmIa.mjs} +6 -6
  66. package/dist/{key-NDEARu2L.mjs → key-CCJdVWKc.mjs} +1 -1
  67. package/dist/{license-DBh13sc8.mjs → license-B3KaSSS3.mjs} +3 -3
  68. package/dist/{list-GFfR9SuT.mjs → list-B1_XSq0O.mjs} +4 -4
  69. package/dist/{list-4kYCGv01.mjs → list-B8WxxlSA.mjs} +5 -5
  70. package/dist/{list-DQj-QJAs.mjs → list-CYYq46ca.mjs} +4 -4
  71. package/dist/{list-Cy0VhXQs.mjs → list-D35m483Y.mjs} +4 -4
  72. package/dist/{list-DJN-OvTZ.mjs → list-Dgaxc0kI.mjs} +4 -4
  73. package/dist/{list-DAZP-IM5.mjs → list-Dygi5MBO.mjs} +4 -4
  74. package/dist/{list-CP5RNjO6.mjs → list-HcYQlqJr.mjs} +5 -5
  75. package/dist/{list-DlKzgnqo.mjs → list-ThlZXdtA.mjs} +4 -4
  76. package/dist/{list-Di529OJD.mjs → list-W_G0Wupl.mjs} +4 -4
  77. package/dist/{list-BwjqQ6pp.mjs → list-YwqpLfkl.mjs} +4 -4
  78. package/dist/{list-D067ZSE5.mjs → list-g2xt5jvY.mjs} +4 -4
  79. package/dist/{list-9AOWhxqp.mjs → list-mSYy6xIm.mjs} +4 -4
  80. package/dist/{list-iFVEdi2J.mjs → list-wyaVSZpU.mjs} +4 -4
  81. package/dist/{login-DxgkosGx.mjs → login-DVBsPahM.mjs} +6 -6
  82. package/dist/{logout-BlVwqBog.mjs → logout-CPGsbP2z.mjs} +5 -5
  83. package/dist/{logs-CudNEkT4.mjs → logs-CDdM2nW-.mjs} +7 -6
  84. package/dist/{manifest-Dv5B9Blc.mjs → manifest-CGM7XNLC.mjs} +2 -2
  85. package/dist/measure-C-2Zimtc.mjs +19 -0
  86. package/dist/{metadata-B2Td415K.mjs → metadata-CpGxasPK.mjs} +5 -5
  87. package/dist/{metadata-BTJAFVvZ.mjs → metadata-Djyv6HKF.mjs} +5 -5
  88. package/dist/{package-DV6Asqim.mjs → package-BeJ9DFrO.mjs} +3 -1
  89. package/dist/{parse-id-B38zTlYs.mjs → parse-id-DcoC0Z3o.mjs} +1 -1
  90. package/dist/{parse-ref-DGvh4aDn.mjs → parse-ref-D1yeDOn8.mjs} +1 -1
  91. package/dist/{parse-schemas-Ds-cVE-O.mjs → parse-schemas-NgeC8-ba.mjs} +2 -2
  92. package/dist/{poll-Bh6oAifO.mjs → poll-CPn_4eae.mjs} +2 -2
  93. package/dist/{poll-task-vPwV31Fs.mjs → poll-task-YHJL7Q94.mjs} +2 -2
  94. package/dist/{predicates-DiIiS3k7.mjs → predicates-CGO17Q15.mjs} +1 -1
  95. package/dist/{preflight-DxJb-hUV.mjs → preflight-UP6MOkcY.mjs} +3 -3
  96. package/dist/process-FjsqDwKo.mjs +105 -0
  97. package/dist/{prompt-Bf3DQ-qE.mjs → prompt-DgDNy_Pc.mjs} +1 -1
  98. package/dist/{provision-B-I0zuDe.mjs → provision-Cw4yFtn9.mjs} +12 -12
  99. package/dist/{ps-CaiOFCv2.mjs → ps-CmGyds34.mjs} +3 -3
  100. package/dist/ps-D7kAMsc0.mjs +11 -0
  101. package/dist/{query-BtF1yWZZ.mjs → query-CWM06uYl.mjs} +8 -8
  102. package/dist/{query-jmfqaXRP.mjs → query-DXYFK2Dn.mjs} +5 -5
  103. package/dist/{remove-C2iv0g03.mjs → remove-BJiq8Bna.mjs} +9 -8
  104. package/dist/{remove-xskleeru.mjs → remove-DtSkkvp3.mjs} +5 -5
  105. package/dist/{remove-collection-DhZghaZy.mjs → remove-collection-CfdSGSSW.mjs} +8 -8
  106. package/dist/{render-DXv-D6fU.mjs → render-DuoDUTVL.mjs} +1 -1
  107. package/dist/{rescan-values-DW6u90ep.mjs → rescan-values-DmZSi8y2.mjs} +5 -5
  108. package/dist/{run-DxVzhcF3.mjs → run-By3Hx4Sv.mjs} +7 -7
  109. package/dist/{runs-BOHk1XnM.mjs → runs-OxCc7uCv.mjs} +5 -5
  110. package/dist/{runtime-cwBS8wwK.mjs → runtime-CqLG3Q3o.mjs} +3 -3
  111. package/dist/{schema-tables-CcFbY_jN.mjs → schema-tables-gCfMALFX.mjs} +5 -5
  112. package/dist/{schemas-DZmv_V62.mjs → schemas-CelnP-JJ.mjs} +5 -5
  113. package/dist/{search-CYMuc7Fg.mjs → search-Ccc2XHFA.mjs} +5 -5
  114. package/dist/segment-ZWbF5Lw8.mjs +19 -0
  115. package/dist/{set-B_rrVwU4.mjs → set-CwZkyHao.mjs} +6 -6
  116. package/dist/{set-CbGfQ7Ye.mjs → set-DQoW10tq.mjs} +7 -7
  117. package/dist/{setting-DqZY9NXP.mjs → setting-DrI9j2k_.mjs} +3 -3
  118. package/dist/{setup-DxmcAorA.mjs → setup-flXHfxYc.mjs} +6 -6
  119. package/dist/snippet-C7Y7BV-k.mjs +19 -0
  120. package/dist/{start-Cn0epTks.mjs → start-B6jtccng.mjs} +10 -9
  121. package/dist/{stash-BFZIl9F4.mjs → stash-Bhp_hRrV.mjs} +7 -7
  122. package/dist/{status-BjCeJNLp.mjs → status-BxWCQzCv.mjs} +7 -7
  123. package/dist/{status-FDIDmqvM.mjs → status-DGw7jG9b.mjs} +4 -4
  124. package/dist/{status-UALK3OJl.mjs → status-fw5qhKyj.mjs} +4 -4
  125. package/dist/{stop-DUwrDWw8.mjs → stop-x6EOdIVT.mjs} +9 -8
  126. package/dist/{summary-CS4UGiFJ.mjs → summary-Da1JIhhv.mjs} +5 -5
  127. package/dist/{sync-schema-IrHdJxmX.mjs → sync-schema-Do916yAq.mjs} +5 -5
  128. package/dist/table-BsJDzYMc.mjs +19 -0
  129. package/dist/transform-BFOkT-X-.mjs +24 -0
  130. package/dist/transform-job-CvAq4Qdm.mjs +19 -0
  131. package/dist/{translate-B__zbDKm.mjs → translate-CEnaytH7.mjs} +7 -7
  132. package/dist/{tree-Mh0uQ_Wy.mjs → tree-pWV930zt.mjs} +4 -4
  133. package/dist/{update-j9vgemKR.mjs → update-Bd-Hk_z8.mjs} +7 -7
  134. package/dist/{update-Masp5WeT.mjs → update-BncXiS3T.mjs} +7 -7
  135. package/dist/{update-Cp1789qq.mjs → update-C-VOpeVi.mjs} +7 -7
  136. package/dist/{update-1Di9hbPo.mjs → update-CA7f8M_E.mjs} +9 -9
  137. package/dist/{update-D2VI_5cy.mjs → update-CN3LI4St.mjs} +9 -9
  138. package/dist/{update-B5_pp6Jj.mjs → update-CvujE0sT.mjs} +9 -9
  139. package/dist/{update-B9DBMo30.mjs → update-DLMn9cXk.mjs} +7 -7
  140. package/dist/{update-D8GwQTcL.mjs → update-Db0rN6W1.mjs} +9 -9
  141. package/dist/{update-dashcard-CNiQw1MD.mjs → update-dashcard-C13FmMd8.mjs} +7 -7
  142. package/dist/{update-Bw0WZix_.mjs → update-jLIPP2pF.mjs} +12 -12
  143. package/dist/{update-BfBsM_y1.mjs → update-w3N6O04l.mjs} +9 -9
  144. package/dist/upgrade-Cko0ScCj.mjs +432 -0
  145. package/dist/{url-GFM76VIK.mjs → url-BKzUneYx.mjs} +8 -7
  146. package/dist/{uuid-Uif0lNk8.mjs → uuid-D9TBeO2v.mjs} +4 -4
  147. package/dist/{validate-DCYx6jdL.mjs → validate-CLdliJUz.mjs} +1 -1
  148. package/dist/{validate-query-B07oGG4K.mjs → validate-query-C34T9ZUr.mjs} +3 -3
  149. package/dist/{values-DrwNHUAI.mjs → values-CFO1KoS0.mjs} +5 -5
  150. package/dist/{wait-DO7tS7NI.mjs → wait-CM59nNh3.mjs} +2 -2
  151. package/dist/{wait-flags-CjX2sEGm.mjs → wait-flags-6QBmhHw9.mjs} +2 -2
  152. package/dist/{wait-BoKk8CJy.mjs → wait-h9MABbYJ.mjs} +7 -7
  153. package/dist/workspace-AJjCGa9h.mjs +24 -0
  154. package/dist/{workspace-credentials-B6BL-X0d.mjs → workspace-credentials-Cctumbru.mjs} +1 -1
  155. package/package.json +3 -1
  156. package/dist/add-collection-SL08iMub.mjs +0 -11
  157. package/dist/auth-DfYkakP3.mjs +0 -19
  158. package/dist/card-ZCGU2JEh.mjs +0 -20
  159. package/dist/collection-D_uFLIAS.mjs +0 -19
  160. package/dist/dashboard-G1-dGLUR.mjs +0 -20
  161. package/dist/db-CBaEfumR.mjs +0 -22
  162. package/dist/field-BDJ1pEgr.mjs +0 -18
  163. package/dist/git-sync-BiTWfLgY.mjs +0 -28
  164. package/dist/is-dirty-DClGFOGV.mjs +0 -10
  165. package/dist/measure-C7SbdYQk.mjs +0 -19
  166. package/dist/ps-BmYQYC7t.mjs +0 -10
  167. package/dist/segment-Df4pfjco.mjs +0 -19
  168. package/dist/snippet-CwSHjQyn.mjs +0 -19
  169. package/dist/table-Cdr5bKp1.mjs +0 -19
  170. package/dist/transform-CeZusR_w.mjs +0 -24
  171. package/dist/transform-job-BOn9-CGa.mjs +0 -19
  172. package/dist/workspace-CyEX40D-.mjs +0 -24
  173. /package/dist/{workspace-DVuqKJGG.mjs → workspace-C5q4nbpY.mjs} +0 -0
@@ -0,0 +1,432 @@
1
+ import { package_default } from "./package-BeJ9DFrO.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem, writeText } from "./render-DuoDUTVL.mjs";
4
+ import { AbortError, NetworkError, TimeoutError, UnknownError, errorMessage } from "./predicates-CGO17Q15.mjs";
5
+ import { HttpError, USER_AGENT, combineAborts, defineMetabaseCommand, outputFlags, parseJson, throwIfAborted } from "./runtime-CqLG3Q3o.mjs";
6
+ import { promptConfirm } from "./prompt-DgDNy_Pc.mjs";
7
+ import { streamProcess } from "./process-FjsqDwKo.mjs";
8
+ import { z } from "zod";
9
+ import { realpathSync } from "node:fs";
10
+ import { compare, valid } from "semver";
11
+
12
+ //#region src/core/http/npm-registry.ts
13
+ const DEFAULT_REGISTRY = "https://registry.npmjs.org";
14
+ const DEFAULT_TIMEOUT_MS = 15e3;
15
+ const ERROR_BODY_BYTE_CAP = 8 * 1024;
16
+ const NpmDistTags = z.object({ latest: z.string() }).loose();
17
+ async function fetchNpmDistTags(packageName, opts = {}) {
18
+ const registry = opts.registry ?? DEFAULT_REGISTRY;
19
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
20
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
21
+ const url = buildDistTagsUrl(registry, packageName);
22
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
23
+ const { combined, processSignal } = combineAborts(timeoutSignal, opts.signal);
24
+ let response;
25
+ try {
26
+ response = await fetchImpl(url, {
27
+ method: "GET",
28
+ headers: {
29
+ accept: "application/json",
30
+ "user-agent": USER_AGENT
31
+ },
32
+ signal: combined
33
+ });
34
+ } catch (error) {
35
+ throwIfAborted(opts.signal, processSignal);
36
+ if (timeoutSignal.aborted) throw new TimeoutError(`npm registry request timed out after ${timeoutMs}ms`, {
37
+ kind: "http",
38
+ method: "GET",
39
+ url,
40
+ timeoutMs
41
+ });
42
+ const cause = errorMessage(error);
43
+ throw new NetworkError(`could not reach npm registry: ${cause}`, {
44
+ method: "GET",
45
+ url,
46
+ cause
47
+ });
48
+ }
49
+ if (!response.ok) {
50
+ const rawBody = await readErrorBody(response);
51
+ throw new HttpError({
52
+ status: response.status,
53
+ statusText: response.statusText,
54
+ method: "GET",
55
+ url,
56
+ responseHeaders: response.headers,
57
+ rawBody
58
+ });
59
+ }
60
+ const text = await response.text();
61
+ return parseJson(text, NpmDistTags, { source: url });
62
+ }
63
+ function buildDistTagsUrl(registry, packageName) {
64
+ const base = registry.replace(/\/+$/, "");
65
+ const encoded = packageName.replace("/", "%2F");
66
+ return `${base}/-/package/${encoded}/dist-tags`;
67
+ }
68
+ async function readErrorBody(response) {
69
+ try {
70
+ const text = await response.text();
71
+ return text.slice(0, ERROR_BODY_BYTE_CAP);
72
+ } catch (error) {
73
+ return `[body read failed: ${errorMessage(error)}]`;
74
+ }
75
+ }
76
+
77
+ //#endregion
78
+ //#region src/core/install-method.ts
79
+ const InstallMethodKindSchema = z.enum([
80
+ "npm-global",
81
+ "npm-local",
82
+ "npx",
83
+ "dev",
84
+ "unknown"
85
+ ]);
86
+ const PackageManagerSchema = z.enum([
87
+ "npm",
88
+ "pnpm",
89
+ "yarn",
90
+ "bun",
91
+ "unknown"
92
+ ]);
93
+ const GLOBAL_MARKERS = [
94
+ {
95
+ marker: "/.bun/install/global/node_modules/",
96
+ packageManager: "bun"
97
+ },
98
+ {
99
+ marker: "/Library/pnpm/global/",
100
+ packageManager: "pnpm"
101
+ },
102
+ {
103
+ marker: "/.local/share/pnpm/global/",
104
+ packageManager: "pnpm"
105
+ },
106
+ {
107
+ marker: "/share/pnpm/global/",
108
+ packageManager: "pnpm"
109
+ },
110
+ {
111
+ marker: "/AppData/Local/pnpm/global/",
112
+ packageManager: "pnpm"
113
+ },
114
+ {
115
+ marker: "/pnpm-global/node_modules/",
116
+ packageManager: "pnpm"
117
+ },
118
+ {
119
+ marker: "/.config/yarn/global/node_modules/",
120
+ packageManager: "yarn"
121
+ },
122
+ {
123
+ marker: "/AppData/Local/Yarn/Data/global/node_modules/",
124
+ packageManager: "yarn"
125
+ },
126
+ {
127
+ marker: "/lib/node_modules/",
128
+ packageManager: "npm"
129
+ },
130
+ {
131
+ marker: "/.npm-global/node_modules/",
132
+ packageManager: "npm"
133
+ },
134
+ {
135
+ marker: "/AppData/Roaming/npm/node_modules/",
136
+ packageManager: "npm"
137
+ }
138
+ ];
139
+ const NPX_MARKER = "/_npx/";
140
+ const NODE_MODULES_MARKER = "/node_modules/";
141
+ function detectInstallMethod(scriptPath, options = {}) {
142
+ if (scriptPath === void 0 || scriptPath === "") return {
143
+ kind: "unknown",
144
+ packageManager: "unknown",
145
+ realPath: ""
146
+ };
147
+ const realPath = safeRealpath(scriptPath);
148
+ const normalized = realPath.replaceAll("\\", "/");
149
+ if (realPath.endsWith(".ts")) return {
150
+ kind: "dev",
151
+ packageManager: "unknown",
152
+ realPath
153
+ };
154
+ if (normalized.includes(NPX_MARKER)) return {
155
+ kind: "npx",
156
+ packageManager: "npm",
157
+ realPath
158
+ };
159
+ for (const { marker, packageManager } of GLOBAL_MARKERS) if (normalized.includes(marker)) return {
160
+ kind: "npm-global",
161
+ packageManager,
162
+ realPath
163
+ };
164
+ const customPrefix = resolveNpmConfigPrefix(options.npmConfigPrefix);
165
+ if (customPrefix !== null && normalized.startsWith(customPrefix)) return {
166
+ kind: "npm-global",
167
+ packageManager: "npm",
168
+ realPath
169
+ };
170
+ if (normalized.includes(NODE_MODULES_MARKER)) return {
171
+ kind: "npm-local",
172
+ packageManager: "npm",
173
+ realPath
174
+ };
175
+ return {
176
+ kind: "dev",
177
+ packageManager: "unknown",
178
+ realPath
179
+ };
180
+ }
181
+ function resolveNpmConfigPrefix(override) {
182
+ const raw = override ?? process.env["npm_config_prefix"] ?? process.env["NPM_CONFIG_PREFIX"];
183
+ if (raw === void 0 || raw === "") return null;
184
+ const normalized = raw.replaceAll("\\", "/").replace(/\/+$/, "");
185
+ return `${normalized}/`;
186
+ }
187
+ function buildInstallCommand(install, packageName, targetVersion) {
188
+ const spec = `${packageName}@${targetVersion}`;
189
+ switch (install.kind) {
190
+ case "npm-global": return makeCommand(globalArgv(install.packageManager, spec));
191
+ case "npm-local": return makeCommand([
192
+ "npm",
193
+ "install",
194
+ spec
195
+ ]);
196
+ case "npx":
197
+ case "dev":
198
+ case "unknown": return null;
199
+ }
200
+ }
201
+ function globalArgv(packageManager, spec) {
202
+ switch (packageManager) {
203
+ case "pnpm": return [
204
+ "pnpm",
205
+ "add",
206
+ "-g",
207
+ spec
208
+ ];
209
+ case "yarn": return [
210
+ "yarn",
211
+ "global",
212
+ "add",
213
+ spec
214
+ ];
215
+ case "bun": return [
216
+ "bun",
217
+ "add",
218
+ "-g",
219
+ spec
220
+ ];
221
+ case "npm":
222
+ case "unknown": return [
223
+ "npm",
224
+ "install",
225
+ "-g",
226
+ spec
227
+ ];
228
+ }
229
+ }
230
+ function makeCommand(argv) {
231
+ return {
232
+ argv,
233
+ display: argv.join(" ")
234
+ };
235
+ }
236
+ function safeRealpath(path) {
237
+ try {
238
+ return realpathSync(path);
239
+ } catch (error) {
240
+ if (error instanceof Error) return path;
241
+ throw error;
242
+ }
243
+ }
244
+
245
+ //#endregion
246
+ //#region src/core/version.ts
247
+ const SEMVER_MESSAGE = "expected semver MAJOR.MINOR.PATCH[-prerelease][+build]";
248
+ const SemverString = z.string().refine((value) => valid(value) !== null, { message: SEMVER_MESSAGE });
249
+ function compareSemver(a, b) {
250
+ return compare(a, b);
251
+ }
252
+
253
+ //#endregion
254
+ //#region src/commands/upgrade.ts
255
+ const UpgradeCommandSchema = z.object({
256
+ argv: z.array(z.string()).min(1),
257
+ display: z.string()
258
+ });
259
+ const UpgradeStatus = z.object({
260
+ packageName: z.string(),
261
+ currentVersion: SemverString,
262
+ latestVersion: SemverString,
263
+ targetVersion: SemverString,
264
+ updateAvailable: z.boolean(),
265
+ changeRequired: z.boolean(),
266
+ installMethod: InstallMethodKindSchema,
267
+ packageManager: PackageManagerSchema,
268
+ binaryPath: z.string(),
269
+ command: UpgradeCommandSchema.nullable(),
270
+ canAutoInstall: z.boolean()
271
+ });
272
+ const upgradeStatusView = {
273
+ compactPick: UpgradeStatus,
274
+ tableColumns: [
275
+ {
276
+ key: "currentVersion",
277
+ label: "Current"
278
+ },
279
+ {
280
+ key: "latestVersion",
281
+ label: "Latest"
282
+ },
283
+ {
284
+ key: "targetVersion",
285
+ label: "Target"
286
+ },
287
+ {
288
+ key: "updateAvailable",
289
+ label: "Update available"
290
+ },
291
+ {
292
+ key: "installMethod",
293
+ label: "Install method"
294
+ },
295
+ {
296
+ key: "command",
297
+ label: "Upgrade command",
298
+ format: formatCommandCell
299
+ }
300
+ ]
301
+ };
302
+ var upgrade_default = defineMetabaseCommand({
303
+ meta: {
304
+ name: "upgrade",
305
+ description: "Upgrade the Metabase CLI itself to the latest published release"
306
+ },
307
+ args: {
308
+ ...outputFlags,
309
+ check: {
310
+ type: "boolean",
311
+ description: "Print update status without installing"
312
+ },
313
+ yes: {
314
+ type: "boolean",
315
+ description: "Skip the confirmation prompt",
316
+ alias: "y"
317
+ },
318
+ to: {
319
+ type: "string",
320
+ description: "Target version (default: latest published)"
321
+ },
322
+ registry: {
323
+ type: "string",
324
+ description: "npm registry URL (default: https://registry.npmjs.org)"
325
+ }
326
+ },
327
+ outputSchema: UpgradeStatus,
328
+ examples: [
329
+ "metabase upgrade",
330
+ "metabase upgrade --check",
331
+ "metabase upgrade --check --json",
332
+ "metabase upgrade --yes",
333
+ "metabase upgrade --to 0.1.2"
334
+ ],
335
+ async run({ args, ctx }) {
336
+ const currentVersion = SemverString.parse(package_default.version);
337
+ const install = detectInstallMethod(process.argv[1]);
338
+ const distTags = await fetchNpmDistTags(package_default.name, distTagsOptions(args.registry));
339
+ const latestVersion = SemverString.parse(distTags.latest);
340
+ const targetVersion = resolveTargetVersion(args.to, latestVersion);
341
+ const updateAvailable = compareSemver(currentVersion, latestVersion) < 0;
342
+ const changeRequired = compareSemver(currentVersion, targetVersion) !== 0;
343
+ const command = buildInstallCommand(install, package_default.name, targetVersion);
344
+ const canAutoInstall = install.kind === "npm-global" && command !== null;
345
+ const status = {
346
+ packageName: package_default.name,
347
+ currentVersion,
348
+ latestVersion,
349
+ targetVersion,
350
+ updateAvailable,
351
+ changeRequired,
352
+ installMethod: install.kind,
353
+ packageManager: install.packageManager,
354
+ binaryPath: install.realPath,
355
+ command: command === null ? null : {
356
+ argv: [...command.argv],
357
+ display: command.display
358
+ },
359
+ canAutoInstall
360
+ };
361
+ emitStatus(status, install, command, ctx);
362
+ if (args.check || !changeRequired || command === null || !canAutoInstall) return;
363
+ const needsPrompt = !args.yes;
364
+ if (needsPrompt && !process.stdin.isTTY) return;
365
+ if (needsPrompt) {
366
+ const confirmed = await promptConfirm({
367
+ message: `Run "${command.display}" now?`,
368
+ initialValue: true
369
+ });
370
+ if (!confirmed) throw new AbortError();
371
+ }
372
+ const [bin, ...rest] = command.argv;
373
+ const exitCode = await streamProcess(bin, rest, { shell: process.platform === "win32" });
374
+ if (exitCode !== 0) throw new UnknownError({
375
+ originalMessage: `upgrade command exited with code ${exitCode ?? "unknown"}`,
376
+ stack: null
377
+ });
378
+ }
379
+ });
380
+ function distTagsOptions(registryArg) {
381
+ const registry = registryArg?.trim();
382
+ if (registry === void 0 || registry === "") return {};
383
+ return { registry };
384
+ }
385
+ function resolveTargetVersion(toArg, latestVersion) {
386
+ const trimmed = toArg?.trim();
387
+ if (trimmed === void 0 || trimmed === "") return latestVersion;
388
+ return SemverString.parse(trimmed);
389
+ }
390
+ function emitStatus(status, install, command, ctx) {
391
+ if (ctx.format === "json" || ctx.fields !== void 0 || ctx.full) {
392
+ renderItem(status, upgradeStatusView, ctx);
393
+ return;
394
+ }
395
+ writeText(buildHumanText(status, install, command));
396
+ }
397
+ function buildHumanText(status, install, command) {
398
+ if (!status.changeRequired) return `Up to date (${status.currentVersion}).`;
399
+ const header = [`Current version: ${status.currentVersion}`, `Latest version: ${status.latestVersion}`];
400
+ if (status.targetVersion !== status.latestVersion) header.push(`Target version: ${status.targetVersion}`);
401
+ const tail = buildHumanTail(install, command);
402
+ return [
403
+ ...header,
404
+ "",
405
+ ...tail
406
+ ].join("\n");
407
+ }
408
+ function buildHumanTail(install, command) {
409
+ switch (install.kind) {
410
+ case "npm-global": return [
411
+ `Installed via: ${install.packageManager} (global)`,
412
+ `Binary path: ${install.realPath}`,
413
+ ...command === null ? [] : [`Upgrade command: ${command.display}`]
414
+ ];
415
+ case "npm-local": return [
416
+ `Installed via: ${install.packageManager} (local install)`,
417
+ `Binary path: ${install.realPath}`,
418
+ ...command === null ? [] : [`Run in that project: ${command.display}`]
419
+ ];
420
+ case "npx": return [`Running via npx — no upgrade needed.`, `npx fetches the latest version on each invocation.`];
421
+ case "dev": return [`Running from source at ${install.realPath}.`, `Pull the latest changes from git and rebuild to upgrade.`];
422
+ case "unknown": return [`Could not detect how the CLI was installed${install.realPath === "" ? "" : ` (${install.realPath})`}.`, `Reinstall with your package manager — for example: npm install -g @metabase/cli@latest`];
423
+ }
424
+ }
425
+ function formatCommandCell(value) {
426
+ if (value === null || value === void 0) return "";
427
+ if (typeof value === "object" && "display" in value && typeof value.display === "string") return value.display;
428
+ return "";
429
+ }
430
+
431
+ //#endregion
432
+ export { upgrade_default as default };
@@ -1,11 +1,12 @@
1
- import "./package-DV6Asqim.mjs";
1
+ import "./package-BeJ9DFrO.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { renderItem } from "./render-DXv-D6fU.mjs";
4
- import "./predicates-DiIiS3k7.mjs";
5
- import { defineMetabaseCommand, localUrl, outputFlags } from "./runtime-cwBS8wwK.mjs";
6
- import { parseId } from "./parse-id-B38zTlYs.mjs";
7
- import "./poll-Bh6oAifO.mjs";
8
- import { checkDockerReady, requireWorkspaceContainerLocation } from "./docker-CHpV8PRz.mjs";
3
+ import { renderItem } from "./render-DuoDUTVL.mjs";
4
+ import "./predicates-CGO17Q15.mjs";
5
+ import { defineMetabaseCommand, localUrl, outputFlags } from "./runtime-CqLG3Q3o.mjs";
6
+ import { parseId } from "./parse-id-DcoC0Z3o.mjs";
7
+ import "./poll-CPn_4eae.mjs";
8
+ import "./process-FjsqDwKo.mjs";
9
+ import { checkDockerReady, requireWorkspaceContainerLocation } from "./docker-BYQ0FHrT.mjs";
9
10
  import { z } from "zod";
10
11
 
11
12
  //#region src/commands/workspace/url.ts
@@ -1,8 +1,8 @@
1
- import "./package-DV6Asqim.mjs";
1
+ import "./package-BeJ9DFrO.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
- import { writeJson, writeText } from "./render-DXv-D6fU.mjs";
4
- import { ConfigError } from "./predicates-DiIiS3k7.mjs";
5
- import { defineMetabaseCommand, outputFlags, parseInteger } from "./runtime-cwBS8wwK.mjs";
3
+ import { writeJson, writeText } from "./render-DuoDUTVL.mjs";
4
+ import { ConfigError } from "./predicates-CGO17Q15.mjs";
5
+ import { defineMetabaseCommand, outputFlags, parseInteger } from "./runtime-CqLG3Q3o.mjs";
6
6
  import { z } from "zod";
7
7
  import { randomUUID } from "node:crypto";
8
8
 
@@ -1,4 +1,4 @@
1
- import { ConfigError, escapeJsonPointerSegment, isPlainObject } from "./predicates-DiIiS3k7.mjs";
1
+ import { ConfigError, escapeJsonPointerSegment, isPlainObject } from "./predicates-CGO17Q15.mjs";
2
2
  import { z } from "zod";
3
3
  import Ajv2020 from "ajv/dist/2020.js";
4
4
  import addFormats from "ajv-formats";
@@ -1,6 +1,6 @@
1
- import { writeJson } from "./render-DXv-D6fU.mjs";
2
- import { ConfigError } from "./predicates-DiIiS3k7.mjs";
3
- import { assertNotLegacyEnvelopeWrappingMbql5, isMbql5Query, validateQuery } from "./validate-DCYx6jdL.mjs";
1
+ import { writeJson } from "./render-DuoDUTVL.mjs";
2
+ import { ConfigError } from "./predicates-CGO17Q15.mjs";
3
+ import { assertNotLegacyEnvelopeWrappingMbql5, isMbql5Query, validateQuery } from "./validate-CLdliJUz.mjs";
4
4
 
5
5
  //#region src/commands/validate-query.ts
6
6
  const skipValidateFlag = { "skip-validate": {
@@ -1,9 +1,9 @@
1
- import "./package-DV6Asqim.mjs";
1
+ import "./package-BeJ9DFrO.mjs";
2
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";
3
+ import { renderItem } from "./render-DuoDUTVL.mjs";
4
+ import "./predicates-CGO17Q15.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-CqLG3Q3o.mjs";
6
+ import { parseId } from "./parse-id-DcoC0Z3o.mjs";
7
7
  import { FieldValues, fieldValuesView } from "./field-B3gvaqpK.mjs";
8
8
 
9
9
  //#region src/commands/field/values.ts
@@ -1,5 +1,5 @@
1
- import { pollUntil } from "./poll-Bh6oAifO.mjs";
2
- import { Workspace } from "./workspace-DVuqKJGG.mjs";
1
+ import { pollUntil } from "./poll-CPn_4eae.mjs";
2
+ import { Workspace } from "./workspace-C5q4nbpY.mjs";
3
3
 
4
4
  //#region src/commands/workspace/database/wait.ts
5
5
  async function waitForDatabaseProvisioned(client, workspaceId, databaseId, schedule) {
@@ -1,5 +1,5 @@
1
- import { parseId } from "./parse-id-B38zTlYs.mjs";
2
- import { DEFAULT_INTERVAL_MS, DEFAULT_TIMEOUT_MS } from "./poll-Bh6oAifO.mjs";
1
+ import { parseId } from "./parse-id-DcoC0Z3o.mjs";
2
+ import { DEFAULT_INTERVAL_MS, DEFAULT_TIMEOUT_MS } from "./poll-CPn_4eae.mjs";
3
3
 
4
4
  //#region src/commands/wait-flags.ts
5
5
  const waitFlags = {
@@ -1,11 +1,11 @@
1
- import "./package-DV6Asqim.mjs";
1
+ import "./package-BeJ9DFrO.mjs";
2
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 { SyncTaskOrIdle, pollSyncTask, syncTaskIdleView, syncTaskView, throwIfFailedTask } from "./poll-task-vPwV31Fs.mjs";
8
- import { DEFAULT_INTERVAL_MS, DEFAULT_TIMEOUT_MS } from "./poll-Bh6oAifO.mjs";
3
+ import { renderItem } from "./render-DuoDUTVL.mjs";
4
+ import "./predicates-CGO17Q15.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-CqLG3Q3o.mjs";
6
+ import { parseId } from "./parse-id-DcoC0Z3o.mjs";
7
+ import { SyncTaskOrIdle, pollSyncTask, syncTaskIdleView, syncTaskView, throwIfFailedTask } from "./poll-task-YHJL7Q94.mjs";
8
+ import { DEFAULT_INTERVAL_MS, DEFAULT_TIMEOUT_MS } from "./poll-CPn_4eae.mjs";
9
9
 
10
10
  //#region src/commands/git-sync/wait.ts
11
11
  const WaitResult = SyncTaskOrIdle;
@@ -0,0 +1,24 @@
1
+ import { defineCommand } from "citty";
2
+
3
+ //#region src/commands/workspace/index.ts
4
+ var workspace_default = defineCommand({
5
+ meta: {
6
+ name: "workspace",
7
+ description: "Manage Metabase workspaces (workspace-manager)"
8
+ },
9
+ subCommands: {
10
+ list: () => import("./list-B8WxxlSA.mjs").then((mod) => mod.default),
11
+ create: () => import("./create-BCuXOmjv.mjs").then((mod) => mod.default),
12
+ database: () => import("./database-u753FytI.mjs").then((mod) => mod.default),
13
+ start: () => import("./start-B6jtccng.mjs").then((mod) => mod.default),
14
+ stop: () => import("./stop-x6EOdIVT.mjs").then((mod) => mod.default),
15
+ remove: () => import("./remove-BJiq8Bna.mjs").then((mod) => mod.default),
16
+ logs: () => import("./logs-CDdM2nW-.mjs").then((mod) => mod.default),
17
+ url: () => import("./url-BKzUneYx.mjs").then((mod) => mod.default),
18
+ credentials: () => import("./credentials-BsyxKKpn.mjs").then((mod) => mod.default),
19
+ ps: () => import("./ps-D7kAMsc0.mjs").then((mod) => mod.default)
20
+ }
21
+ });
22
+
23
+ //#endregion
24
+ export { workspace_default as default };
@@ -1,4 +1,4 @@
1
- import { ConfigError, ValidationError, errorMessage } from "./predicates-DiIiS3k7.mjs";
1
+ import { ConfigError, ValidationError, errorMessage } from "./predicates-CGO17Q15.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomBytes } from "node:crypto";
4
4
  import { YAMLParseError, parse, stringify } from "yaml";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metabase/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Metabase CLI",
5
5
  "license": "AGPL-3.0",
6
6
  "repository": {
@@ -45,12 +45,14 @@
45
45
  "ajv-formats": "^3.0.1",
46
46
  "citty": "^0.2.2",
47
47
  "cli-table3": "^0.6.5",
48
+ "semver": "^7.8.0",
48
49
  "yaml": "^2.8.4",
49
50
  "zod": "^4.0.0"
50
51
  },
51
52
  "devDependencies": {
52
53
  "@types/js-yaml": "^4.0.9",
53
54
  "@types/node": "^22.10.0",
55
+ "@types/semver": "^7.7.1",
54
56
  "execa": "^9.5.2",
55
57
  "fast-check": "^4.7.0",
56
58
  "js-yaml": "^4.1.0",
@@ -1,11 +0,0 @@
1
- import "./package-DV6Asqim.mjs";
2
- import "./command-augment-D9pI9Vbh.mjs";
3
- import "./render-DXv-D6fU.mjs";
4
- import "./predicates-DiIiS3k7.mjs";
5
- import "./runtime-cwBS8wwK.mjs";
6
- import "./parse-id-B38zTlYs.mjs";
7
- import "./poll-task-vPwV31Fs.mjs";
8
- import "./poll-Bh6oAifO.mjs";
9
- import { SyncSettingsUpdateResult, add_collection_default, setCollectionRemoteSynced, syncSettingsUpdateView } from "./add-collection-DwxQDXzL.mjs";
10
-
11
- export { add_collection_default as default };
@@ -1,19 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/auth/index.ts
4
- var auth_default = defineCommand({
5
- meta: {
6
- name: "auth",
7
- description: "Authenticate against a Metabase instance"
8
- },
9
- default: "login",
10
- subCommands: {
11
- login: () => import("./login-DxgkosGx.mjs").then((m) => m.default),
12
- status: () => import("./status-FDIDmqvM.mjs").then((m) => m.default),
13
- list: () => import("./list-Di529OJD.mjs").then((m) => m.default),
14
- logout: () => import("./logout-BlVwqBog.mjs").then((m) => m.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { auth_default as default };
@@ -1,20 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/card/index.ts
4
- var card_default = defineCommand({
5
- meta: {
6
- name: "card",
7
- description: "Manage Metabase cards (questions, models, metrics)"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DlKzgnqo.mjs").then((mod) => mod.default),
11
- get: () => import("./get-cuHp9-6U.mjs").then((mod) => mod.default),
12
- query: () => import("./query-jmfqaXRP.mjs").then((mod) => mod.default),
13
- create: () => import("./create-QgN369N5.mjs").then((mod) => mod.default),
14
- update: () => import("./update-D8GwQTcL.mjs").then((mod) => mod.default),
15
- archive: () => import("./archive-C1mF-9Kj.mjs").then((mod) => mod.default)
16
- }
17
- });
18
-
19
- //#endregion
20
- export { card_default as default };
@@ -1,19 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/collection/index.ts
4
- var collection_default = defineCommand({
5
- meta: {
6
- name: "collection",
7
- description: "Browse Metabase collections"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DJN-OvTZ.mjs").then((mod) => mod.default),
11
- get: () => import("./get-tISo-cmg.mjs").then((mod) => mod.default),
12
- items: () => import("./items-DQFQSpjF.mjs").then((mod) => mod.default),
13
- tree: () => import("./tree-Mh0uQ_Wy.mjs").then((mod) => mod.default),
14
- create: () => import("./create-DU0ZhnZu.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { collection_default as default };