@metabase/cli 0.1.0-alpha.workspaces-commands.818a8f1

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 (107) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +762 -0
  3. package/dist/api-key-D9XxErQn.mjs +13 -0
  4. package/dist/archive-BPG5c88Y.mjs +38 -0
  5. package/dist/auth--Hpjwlaf.mjs +18 -0
  6. package/dist/body-DwU2s6Pg.mjs +19 -0
  7. package/dist/body-flags-7oqLhu5j.mjs +14 -0
  8. package/dist/branches-BbcoJXfp.mjs +41 -0
  9. package/dist/cancel-task-BDas45YO.mjs +29 -0
  10. package/dist/card-C31pGtBZ.mjs +113 -0
  11. package/dist/card-D4zZSPUb.mjs +19 -0
  12. package/dist/cli.d.mts +1 -0
  13. package/dist/cli.mjs +61 -0
  14. package/dist/command-augment-D9pI9Vbh.mjs +11 -0
  15. package/dist/create-Bd_U1zWU.mjs +124 -0
  16. package/dist/create-CCzsCZMm.mjs +47 -0
  17. package/dist/create-CwVcoq0O.mjs +43 -0
  18. package/dist/create-DpnjQvPw.mjs +43 -0
  19. package/dist/create-_UOeEXAj.mjs +39 -0
  20. package/dist/create-branch-sDttBORB.mjs +54 -0
  21. package/dist/credentials-C0xKke5D.mjs +84 -0
  22. package/dist/current-task-BGt1mqaX.mjs +35 -0
  23. package/dist/database-4V1iiPEx.mjs +17 -0
  24. package/dist/database-BTX5qbSv.mjs +33 -0
  25. package/dist/db-Dm2u2ISJ.mjs +17 -0
  26. package/dist/delete-DRBTgyus.mjs +47 -0
  27. package/dist/delete-DUC_stoL.mjs +47 -0
  28. package/dist/delete-runtime-inOVw3IX.mjs +58 -0
  29. package/dist/delete-table-9Is631O_.mjs +47 -0
  30. package/dist/deprovision-BAMzZc6f.mjs +60 -0
  31. package/dist/dirty-CLjHbz6J.mjs +32 -0
  32. package/dist/docker-QWVMG2gl.mjs +605 -0
  33. package/dist/eid-BNhutC1U.mjs +13 -0
  34. package/dist/export-D2Anfu3p.mjs +97 -0
  35. package/dist/field-Dhs2AND3.mjs +13 -0
  36. package/dist/field-QwBMAWsq.mjs +76 -0
  37. package/dist/flag-pair-CWvvzDJ_.mjs +17 -0
  38. package/dist/get-2po1uv9i.mjs +35 -0
  39. package/dist/get-BHJA78zg.mjs +35 -0
  40. package/dist/get-CAPLfawI.mjs +35 -0
  41. package/dist/get-CAVVmdMX.mjs +49 -0
  42. package/dist/get-DDWpubE8.mjs +36 -0
  43. package/dist/get-DhIoNeOp.mjs +35 -0
  44. package/dist/get-qPOsuTPw.mjs +35 -0
  45. package/dist/has-remote-changes-DAL5jetW.mjs +63 -0
  46. package/dist/import-CUMxUfSF.mjs +92 -0
  47. package/dist/input-BNqSFl38.mjs +33 -0
  48. package/dist/is-dirty-B10S6MG0.mjs +35 -0
  49. package/dist/is-dirty-CUuq-aB6.mjs +9 -0
  50. package/dist/key-CyhOpgWt.mjs +12 -0
  51. package/dist/license-DtsGJi3l.mjs +17 -0
  52. package/dist/list-B8s7Qnzk.mjs +31 -0
  53. package/dist/list-C5MGydGU.mjs +31 -0
  54. package/dist/list-DeFGwhhJ.mjs +60 -0
  55. package/dist/list-OBx5B3gd.mjs +39 -0
  56. package/dist/list-Y7iGsOfE.mjs +31 -0
  57. package/dist/list-evtQS7jl.mjs +39 -0
  58. package/dist/list-qetY9OIN.mjs +31 -0
  59. package/dist/login-Dqw9ZtCx.mjs +172 -0
  60. package/dist/logout-DwYJ5OUi.mjs +74 -0
  61. package/dist/logs-B_lrY7Js.mjs +57 -0
  62. package/dist/manifest-wzEFG0JB.mjs +124 -0
  63. package/dist/package-t8dKf4m_.mjs +73 -0
  64. package/dist/parse-id-C1prc9US.mjs +12 -0
  65. package/dist/poll-D2sXM5rc.mjs +49 -0
  66. package/dist/poll-task-Byiunmaj.mjs +194 -0
  67. package/dist/prompt-fXeNtj0M.mjs +40 -0
  68. package/dist/provision-DC4_HWZD.mjs +80 -0
  69. package/dist/ps-1bZKIwWh.mjs +9 -0
  70. package/dist/ps-BiOrecEe.mjs +78 -0
  71. package/dist/query-BnGVGeM3.mjs +100 -0
  72. package/dist/remove-Bx48o-0S.mjs +62 -0
  73. package/dist/remove-DecoZzNd.mjs +97 -0
  74. package/dist/render-DlBijc5i.mjs +179 -0
  75. package/dist/run-D4NgvaRh.mjs +87 -0
  76. package/dist/runtime-DUgFfYkN.mjs +950 -0
  77. package/dist/search-4wKx5ug2.mjs +171 -0
  78. package/dist/set-BZnCRL4c.mjs +66 -0
  79. package/dist/set-DCjrmTFm.mjs +66 -0
  80. package/dist/setting-C4vQSqer.mjs +18 -0
  81. package/dist/setting-DM7pm7yh.mjs +55 -0
  82. package/dist/setup-Dqh9hN6l.mjs +70 -0
  83. package/dist/start-xXQypG5L.mjs +324 -0
  84. package/dist/stash-ZZkmW_V7.mjs +106 -0
  85. package/dist/status-9KAPIpX8.mjs +31 -0
  86. package/dist/status-DezF-PIM.mjs +63 -0
  87. package/dist/status-JH6BZppo.mjs +55 -0
  88. package/dist/stop-br-ZOnve.mjs +80 -0
  89. package/dist/sync-C7VOWD00.mjs +26 -0
  90. package/dist/table-BvAr2ixC.mjs +75 -0
  91. package/dist/table-D-Mb5Nvw.mjs +16 -0
  92. package/dist/transform-CqxZwhGs.mjs +21 -0
  93. package/dist/transform-DfVkUttP.mjs +137 -0
  94. package/dist/transform-job-DuB_OjhO.mjs +91 -0
  95. package/dist/transform-job-HjbqjEoP.mjs +19 -0
  96. package/dist/translate-DJxDVAE4.mjs +110 -0
  97. package/dist/update-CDtm71m2.mjs +50 -0
  98. package/dist/update-DYVeVjk2.mjs +76 -0
  99. package/dist/update-DxKlQ0hP.mjs +50 -0
  100. package/dist/url-DP88YHNo.mjs +53 -0
  101. package/dist/wait-Cj_8wu4y.mjs +52 -0
  102. package/dist/wait-DwZN3ZwR.mjs +19 -0
  103. package/dist/wait-flags-CjW4ogUJ.mjs +35 -0
  104. package/dist/workspace-CbwR0vX_.mjs +24 -0
  105. package/dist/workspace-Dr9lWU3D.mjs +72 -0
  106. package/dist/workspace-credentials-q5RRFMT8.mjs +139 -0
  107. package/package.json +62 -0
@@ -0,0 +1,13 @@
1
+ import { defineCommand } from "citty";
2
+
3
+ //#region src/commands/api-key/index.ts
4
+ var api_key_default = defineCommand({
5
+ meta: {
6
+ name: "api-key",
7
+ description: "Manage Metabase API keys"
8
+ },
9
+ subCommands: { create: () => import("./create-Bd_U1zWU.mjs").then((mod) => mod.default) }
10
+ });
11
+
12
+ //#endregion
13
+ export { api_key_default as default };
@@ -0,0 +1,38 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-DUgFfYkN.mjs";
5
+ import { parseId } from "./parse-id-C1prc9US.mjs";
6
+ import { Card, cardView } from "./card-C31pGtBZ.mjs";
7
+
8
+ //#region src/commands/card/archive.ts
9
+ var archive_default = defineMetabaseCommand({
10
+ meta: {
11
+ name: "archive",
12
+ description: "Archive (soft-delete) a card by id"
13
+ },
14
+ args: {
15
+ ...outputFlags,
16
+ ...profileFlag,
17
+ ...connectionFlags,
18
+ id: {
19
+ type: "positional",
20
+ description: "Card id",
21
+ required: true
22
+ }
23
+ },
24
+ outputSchema: Card,
25
+ examples: ["metabase card archive 1", "metabase card archive 1 --json"],
26
+ async run({ args, ctx, getClient }) {
27
+ const id = parseId(args.id);
28
+ const client = await getClient();
29
+ const updated = await client.requestParsed(Card, `/api/card/${id}`, {
30
+ method: "PUT",
31
+ body: { archived: true }
32
+ });
33
+ renderItem(updated, cardView, ctx);
34
+ }
35
+ });
36
+
37
+ //#endregion
38
+ export { archive_default as default };
@@ -0,0 +1,18 @@
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-Dqw9ZtCx.mjs").then((m) => m.default),
12
+ status: () => import("./status-JH6BZppo.mjs").then((m) => m.default),
13
+ logout: () => import("./logout-DwYJ5OUi.mjs").then((m) => m.default)
14
+ }
15
+ });
16
+
17
+ //#endregion
18
+ export { auth_default as default };
@@ -0,0 +1,19 @@
1
+ import { ConfigError, parseJson } from "./runtime-DUgFfYkN.mjs";
2
+ import { readInput } from "./input-BNqSFl38.mjs";
3
+
4
+ //#region src/runtime/body.ts
5
+ async function readBody(sources, schema) {
6
+ assertSingleSource(sources);
7
+ const raw = await readInput(sources);
8
+ return parseJson(raw, schema, { source: sources.source ?? "request body" });
9
+ }
10
+ function assertSingleSource(sources) {
11
+ const provided = [];
12
+ if (sources.flag !== void 0 && sources.flag !== "") provided.push("--body");
13
+ if (sources.file !== void 0 && sources.file !== "") provided.push("--file");
14
+ if (sources.positional !== void 0 && sources.positional !== "") provided.push("positional");
15
+ if (provided.length > 1) throw new ConfigError(`multiple body sources given (${provided.join(", ")}); pass exactly one`);
16
+ }
17
+
18
+ //#endregion
19
+ export { readBody };
@@ -0,0 +1,14 @@
1
+ //#region src/commands/body-flags.ts
2
+ const bodyInputFlags = {
3
+ body: {
4
+ type: "string",
5
+ description: "Inline JSON body"
6
+ },
7
+ file: {
8
+ type: "string",
9
+ description: "Path to JSON body file"
10
+ }
11
+ };
12
+
13
+ //#endregion
14
+ export { bodyInputFlags };
@@ -0,0 +1,41 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderList } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-DUgFfYkN.mjs";
5
+ import { REMOTE_SYNC_PATHS } from "./poll-task-Byiunmaj.mjs";
6
+ import "./poll-D2sXM5rc.mjs";
7
+ import { z } from "zod";
8
+
9
+ //#region src/commands/sync/branches.ts
10
+ const SyncBranchesApiResponse = z.object({ items: z.array(z.string()) });
11
+ const BranchRow = z.object({ name: z.string() });
12
+ const branchView = {
13
+ compactPick: BranchRow,
14
+ tableColumns: [{
15
+ key: "name",
16
+ label: "Branch"
17
+ }]
18
+ };
19
+ const SyncBranchListEnvelope = listEnvelopeSchema(BranchRow);
20
+ var branches_default = defineMetabaseCommand({
21
+ meta: {
22
+ name: "branches",
23
+ description: "List branches on the configured git remote"
24
+ },
25
+ args: {
26
+ ...outputFlags,
27
+ ...profileFlag,
28
+ ...connectionFlags
29
+ },
30
+ outputSchema: SyncBranchListEnvelope,
31
+ examples: ["metabase sync branches", "metabase sync branches --json"],
32
+ async run({ ctx, getClient }) {
33
+ const client = await getClient();
34
+ const response = await client.requestParsed(SyncBranchesApiResponse, REMOTE_SYNC_PATHS.branches);
35
+ const rows = response.items.map((name) => ({ name }));
36
+ renderList(wrapList(rows), branchView, ctx);
37
+ }
38
+ });
39
+
40
+ //#endregion
41
+ export { branches_default as default };
@@ -0,0 +1,29 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-DUgFfYkN.mjs";
5
+ import { REMOTE_SYNC_PATHS, SyncTask, syncTaskView } from "./poll-task-Byiunmaj.mjs";
6
+ import "./poll-D2sXM5rc.mjs";
7
+
8
+ //#region src/commands/sync/cancel-task.ts
9
+ var cancel_task_default = defineMetabaseCommand({
10
+ meta: {
11
+ name: "cancel-task",
12
+ description: "Cancel the running sync task"
13
+ },
14
+ args: {
15
+ ...outputFlags,
16
+ ...profileFlag,
17
+ ...connectionFlags
18
+ },
19
+ outputSchema: SyncTask,
20
+ examples: ["metabase sync cancel-task", "metabase sync cancel-task --json"],
21
+ async run({ ctx, getClient }) {
22
+ const client = await getClient();
23
+ const task = await client.requestParsed(SyncTask, REMOTE_SYNC_PATHS.cancelTask, { method: "POST" });
24
+ renderItem(task, syncTaskView, ctx);
25
+ }
26
+ });
27
+
28
+ //#endregion
29
+ export { cancel_task_default as default };
@@ -0,0 +1,113 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/domain/card.ts
4
+ const CardType = z.enum([
5
+ "question",
6
+ "model",
7
+ "metric"
8
+ ]);
9
+ const CardQueryType = z.enum(["native", "query"]);
10
+ const Card = z.object({
11
+ id: z.number().int(),
12
+ name: z.string(),
13
+ type: CardType,
14
+ display: z.string(),
15
+ description: z.string().nullable(),
16
+ archived: z.boolean(),
17
+ query_type: CardQueryType.nullable(),
18
+ database_id: z.number().int().nullable(),
19
+ table_id: z.number().int().nullable(),
20
+ collection_id: z.number().int().nullable(),
21
+ dashboard_id: z.number().int().nullable().optional(),
22
+ entity_id: z.string().nullable(),
23
+ creator_id: z.number().int(),
24
+ dataset_query: z.unknown(),
25
+ visualization_settings: z.unknown()
26
+ }).loose();
27
+ const CardCompact = Card.pick({
28
+ id: true,
29
+ name: true,
30
+ type: true,
31
+ display: true,
32
+ archived: true,
33
+ database_id: true,
34
+ collection_id: true,
35
+ description: true
36
+ }).strip();
37
+ const cardView = {
38
+ compactPick: CardCompact,
39
+ tableColumns: [
40
+ {
41
+ key: "id",
42
+ label: "ID"
43
+ },
44
+ {
45
+ key: "name",
46
+ label: "Name"
47
+ },
48
+ {
49
+ key: "type",
50
+ label: "Type"
51
+ },
52
+ {
53
+ key: "display",
54
+ label: "Display"
55
+ },
56
+ {
57
+ key: "database_id",
58
+ label: "DB"
59
+ },
60
+ {
61
+ key: "collection_id",
62
+ label: "Collection"
63
+ },
64
+ {
65
+ key: "archived",
66
+ label: "Archived"
67
+ }
68
+ ]
69
+ };
70
+ const CardCreateInput = z.object({
71
+ name: z.string().min(1),
72
+ type: CardType.optional(),
73
+ dataset_query: z.unknown(),
74
+ display: z.string().min(1),
75
+ visualization_settings: z.unknown(),
76
+ description: z.string().nullable().optional(),
77
+ collection_id: z.number().int().positive().nullable().optional(),
78
+ collection_position: z.number().int().positive().nullable().optional(),
79
+ dashboard_id: z.number().int().positive().nullable().optional(),
80
+ parameters: z.array(z.unknown()).optional(),
81
+ parameter_mappings: z.array(z.unknown()).optional()
82
+ }).loose();
83
+ const QueryColumn = z.object({
84
+ name: z.string(),
85
+ display_name: z.string().optional(),
86
+ base_type: z.string().optional(),
87
+ semantic_type: z.string().nullable().optional()
88
+ }).loose();
89
+ const CardQueryDataCompleted = z.object({
90
+ rows: z.array(z.unknown()),
91
+ cols: z.array(QueryColumn)
92
+ }).loose();
93
+ const CardQueryCompleted = z.object({
94
+ status: z.literal("completed"),
95
+ row_count: z.number().int().nonnegative(),
96
+ data: CardQueryDataCompleted
97
+ }).loose();
98
+ const CardQueryFailed = z.object({
99
+ status: z.literal("failed"),
100
+ error: z.string().nullable().optional(),
101
+ error_type: z.string().nullable().optional()
102
+ }).loose();
103
+ const CardQueryResult = z.discriminatedUnion("status", [CardQueryCompleted, CardQueryFailed]);
104
+ const cardQueryView = {
105
+ compactPick: CardQueryResult,
106
+ tableColumns: [{
107
+ key: "status",
108
+ label: "Status"
109
+ }]
110
+ };
111
+
112
+ //#endregion
113
+ export { Card, CardCompact, CardCreateInput, CardQueryResult, cardQueryView, cardView };
@@ -0,0 +1,19 @@
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-DeFGwhhJ.mjs").then((mod) => mod.default),
11
+ get: () => import("./get-CAPLfawI.mjs").then((mod) => mod.default),
12
+ query: () => import("./query-BnGVGeM3.mjs").then((mod) => mod.default),
13
+ create: () => import("./create-CwVcoq0O.mjs").then((mod) => mod.default),
14
+ archive: () => import("./archive-BPG5c88Y.mjs").then((mod) => mod.default)
15
+ }
16
+ });
17
+
18
+ //#endregion
19
+ export { card_default as default };
package/dist/cli.d.mts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/cli.mjs ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import { package_default } from "./package-t8dKf4m_.mjs";
3
+ import { getMetabaseAugment } from "./command-augment-D9pI9Vbh.mjs";
4
+ import { defineCommand, renderUsage, runMain } from "citty";
5
+
6
+ //#region src/main.ts
7
+ const main = defineCommand({
8
+ meta: {
9
+ name: "metabase",
10
+ version: package_default.version,
11
+ description: package_default.description
12
+ },
13
+ subCommands: {
14
+ auth: () => import("./auth--Hpjwlaf.mjs").then((mod) => mod.default),
15
+ license: () => import("./license-DtsGJi3l.mjs").then((mod) => mod.default),
16
+ db: () => import("./db-Dm2u2ISJ.mjs").then((mod) => mod.default),
17
+ table: () => import("./table-D-Mb5Nvw.mjs").then((mod) => mod.default),
18
+ field: () => import("./field-Dhs2AND3.mjs").then((mod) => mod.default),
19
+ card: () => import("./card-D4zZSPUb.mjs").then((mod) => mod.default),
20
+ transform: () => import("./transform-CqxZwhGs.mjs").then((mod) => mod.default),
21
+ "transform-job": () => import("./transform-job-HjbqjEoP.mjs").then((mod) => mod.default),
22
+ setting: () => import("./setting-C4vQSqer.mjs").then((mod) => mod.default),
23
+ search: () => import("./search-4wKx5ug2.mjs").then((mod) => mod.default),
24
+ sync: () => import("./sync-C7VOWD00.mjs").then((mod) => mod.default),
25
+ workspace: () => import("./workspace-CbwR0vX_.mjs").then((mod) => mod.default),
26
+ setup: () => import("./setup-Dqh9hN6l.mjs").then((mod) => mod.default),
27
+ "api-key": () => import("./api-key-D9XxErQn.mjs").then((mod) => mod.default),
28
+ eid: () => import("./eid-BNhutC1U.mjs").then((mod) => mod.default),
29
+ __manifest: () => import("./manifest-wzEFG0JB.mjs").then((mod) => mod.createManifestCommand(main))
30
+ }
31
+ });
32
+ var main_default = main;
33
+
34
+ //#endregion
35
+ //#region src/output/help.ts
36
+ const ANSI_ESC = String.fromCharCode(27);
37
+ const BREADCRUMB_SUFFIX = new RegExp(` \\([^()]*\\)(${ANSI_ESC}\\[\\d+m)?\\s*$`);
38
+ async function showUsage(cmd, parent) {
39
+ const raw = await renderUsage(cmd, parent);
40
+ const [first, ...rest] = raw.split("\n");
41
+ const stripped = first === void 0 ? "" : first.replace(BREADCRUMB_SUFFIX, "$1");
42
+ const body = [stripped, ...rest].join("\n");
43
+ const examples = getMetabaseAugment(cmd)?.examples ?? [];
44
+ process.stdout.write(body + renderExamples(examples) + "\n");
45
+ }
46
+ function renderExamples(examples) {
47
+ if (examples.length === 0) return "";
48
+ const lines = [
49
+ "",
50
+ "EXAMPLES",
51
+ ""
52
+ ];
53
+ for (const example of examples) lines.push(` ${example}`);
54
+ return lines.join("\n");
55
+ }
56
+
57
+ //#endregion
58
+ //#region src/cli.ts
59
+ runMain(main_default, { showUsage });
60
+
61
+ //#endregion
@@ -0,0 +1,11 @@
1
+ //#region src/runtime/command-augment.ts
2
+ const augments = new WeakMap();
3
+ function setMetabaseAugment(cmd, augment) {
4
+ augments.set(cmd, augment);
5
+ }
6
+ function getMetabaseAugment(cmd) {
7
+ return augments.get(cmd) ?? null;
8
+ }
9
+
10
+ //#endregion
11
+ export { getMetabaseAugment, setMetabaseAugment };
@@ -0,0 +1,124 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-DUgFfYkN.mjs";
5
+ import "./input-BNqSFl38.mjs";
6
+ import { readBody } from "./body-DwU2s6Pg.mjs";
7
+ import { bodyInputFlags } from "./body-flags-7oqLhu5j.mjs";
8
+ import { requireBothOrNeither } from "./flag-pair-CWvvzDJ_.mjs";
9
+ import { parseId } from "./parse-id-C1prc9US.mjs";
10
+ import { z } from "zod";
11
+
12
+ //#region src/domain/api-key.ts
13
+ const ApiKeyCreateInput = z.object({
14
+ name: z.string().min(1),
15
+ group_id: z.number().int().positive()
16
+ }).loose();
17
+ const ApiKeyGroup = z.object({
18
+ id: z.number().int().nullable(),
19
+ name: z.string().nullable()
20
+ }).loose();
21
+ const ApiKeyUpdatedBy = z.object({
22
+ id: z.number().int(),
23
+ common_name: z.string().nullable().optional()
24
+ }).loose();
25
+ const ApiKey = z.object({
26
+ id: z.number().int(),
27
+ name: z.string(),
28
+ group: ApiKeyGroup.nullable().optional(),
29
+ unmasked_key: z.string().nullable().optional(),
30
+ masked_key: z.string().nullable().optional(),
31
+ updated_by: ApiKeyUpdatedBy.nullable().optional(),
32
+ created_at: z.string().nullable().optional(),
33
+ updated_at: z.string().nullable().optional()
34
+ }).loose();
35
+ const ApiKeyCompact = ApiKey.pick({
36
+ id: true,
37
+ name: true,
38
+ group: true,
39
+ masked_key: true
40
+ }).strip();
41
+ const apiKeyView = {
42
+ compactPick: ApiKeyCompact,
43
+ tableColumns: [
44
+ {
45
+ key: "id",
46
+ label: "ID"
47
+ },
48
+ {
49
+ key: "name",
50
+ label: "Name"
51
+ },
52
+ {
53
+ key: "group",
54
+ label: "Group",
55
+ format: (value) => formatGroup(value)
56
+ },
57
+ {
58
+ key: "unmasked_key",
59
+ label: "Key"
60
+ }
61
+ ]
62
+ };
63
+ function formatGroup(value) {
64
+ const parsed = ApiKeyGroup.nullable().safeParse(value);
65
+ if (!parsed.success || parsed.data === null) return "";
66
+ const { id, name } = parsed.data;
67
+ if (name === null && id === null) return "";
68
+ if (name === null) return String(id);
69
+ return id === null ? name : `${name} (${id})`;
70
+ }
71
+
72
+ //#endregion
73
+ //#region src/commands/api-key/create.ts
74
+ var create_default = defineMetabaseCommand({
75
+ meta: {
76
+ name: "create",
77
+ description: "Create a new API key"
78
+ },
79
+ args: {
80
+ ...outputFlags,
81
+ ...profileFlag,
82
+ ...connectionFlags,
83
+ ...bodyInputFlags,
84
+ name: {
85
+ type: "string",
86
+ description: "API key name (alternative to --body / --file)"
87
+ },
88
+ "group-id": {
89
+ type: "string",
90
+ description: "Permission group id (alternative to --body / --file)"
91
+ }
92
+ },
93
+ outputSchema: ApiKey,
94
+ examples: [
95
+ "metabase api-key create --name \"deploy-bot\" --group-id 2",
96
+ "echo '{\"name\":\"k\",\"group_id\":2}' | metabase api-key create",
97
+ "metabase api-key create --file key.json"
98
+ ],
99
+ async run({ args, ctx, getClient }) {
100
+ const pair = requireBothOrNeither({
101
+ name: "--name",
102
+ value: args.name
103
+ }, {
104
+ name: "--group-id",
105
+ value: args["group-id"]
106
+ });
107
+ const body = pair ? ApiKeyCreateInput.parse({
108
+ name: pair.first,
109
+ group_id: parseId(pair.second, "--group-id")
110
+ }) : await readBody({
111
+ flag: args.body,
112
+ file: args.file
113
+ }, ApiKeyCreateInput);
114
+ const client = await getClient();
115
+ const created = await client.requestParsed(ApiKey, "/api/api-key", {
116
+ method: "POST",
117
+ body
118
+ });
119
+ renderItem(created, apiKeyView, ctx);
120
+ }
121
+ });
122
+
123
+ //#endregion
124
+ export { create_default as default };
@@ -0,0 +1,47 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-DUgFfYkN.mjs";
5
+ import "./input-BNqSFl38.mjs";
6
+ import { readBody } from "./body-DwU2s6Pg.mjs";
7
+ import { bodyInputFlags } from "./body-flags-7oqLhu5j.mjs";
8
+ import { Workspace, WorkspaceCreateInput, workspaceView } from "./workspace-Dr9lWU3D.mjs";
9
+
10
+ //#region src/commands/workspace/create.ts
11
+ var create_default = defineMetabaseCommand({
12
+ meta: {
13
+ name: "create",
14
+ description: "Create a workspace"
15
+ },
16
+ args: {
17
+ ...outputFlags,
18
+ ...profileFlag,
19
+ ...connectionFlags,
20
+ ...bodyInputFlags,
21
+ name: {
22
+ type: "string",
23
+ description: "Workspace name (alternative to --body / --file)"
24
+ }
25
+ },
26
+ outputSchema: Workspace,
27
+ examples: [
28
+ "metabase workspace create --name \"analytics\"",
29
+ "echo '{\"name\":\"analytics\"}' | metabase workspace create",
30
+ "metabase workspace create --file workspace.json"
31
+ ],
32
+ async run({ args, ctx, getClient }) {
33
+ const body = args.name !== void 0 && args.name !== "" ? WorkspaceCreateInput.parse({ name: args.name }) : await readBody({
34
+ flag: args.body,
35
+ file: args.file
36
+ }, WorkspaceCreateInput);
37
+ const client = await getClient();
38
+ const created = await client.requestParsed(Workspace, "/api/ee/workspace-manager", {
39
+ method: "POST",
40
+ body
41
+ });
42
+ renderItem(created, workspaceView, ctx);
43
+ }
44
+ });
45
+
46
+ //#endregion
47
+ export { create_default as default };
@@ -0,0 +1,43 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-DUgFfYkN.mjs";
5
+ import "./input-BNqSFl38.mjs";
6
+ import { readBody } from "./body-DwU2s6Pg.mjs";
7
+ import { bodyInputFlags } from "./body-flags-7oqLhu5j.mjs";
8
+ import { Card, CardCreateInput, cardView } from "./card-C31pGtBZ.mjs";
9
+
10
+ //#region src/commands/card/create.ts
11
+ var create_default = defineMetabaseCommand({
12
+ meta: {
13
+ name: "create",
14
+ description: "Create a card from a JSON spec"
15
+ },
16
+ args: {
17
+ ...outputFlags,
18
+ ...profileFlag,
19
+ ...connectionFlags,
20
+ ...bodyInputFlags
21
+ },
22
+ outputSchema: Card,
23
+ examples: [
24
+ "cat card.json | metabase card create",
25
+ "metabase card create --file card.json",
26
+ "metabase card create --body '{\"name\":\"x\",\"display\":\"table\",\"dataset_query\":{...},\"visualization_settings\":{}}'"
27
+ ],
28
+ async run({ args, ctx, getClient }) {
29
+ const body = await readBody({
30
+ flag: args.body,
31
+ file: args.file
32
+ }, CardCreateInput);
33
+ const client = await getClient();
34
+ const created = await client.requestParsed(Card, "/api/card", {
35
+ method: "POST",
36
+ body
37
+ });
38
+ renderItem(created, cardView, ctx);
39
+ }
40
+ });
41
+
42
+ //#endregion
43
+ export { create_default as default };
@@ -0,0 +1,43 @@
1
+ import "./package-t8dKf4m_.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-DlBijc5i.mjs";
4
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-DUgFfYkN.mjs";
5
+ import "./input-BNqSFl38.mjs";
6
+ import { readBody } from "./body-DwU2s6Pg.mjs";
7
+ import { bodyInputFlags } from "./body-flags-7oqLhu5j.mjs";
8
+ import { TransformJob, TransformJobCreateInput, transformJobView } from "./transform-job-DuB_OjhO.mjs";
9
+
10
+ //#region src/commands/transform-job/create.ts
11
+ var create_default = defineMetabaseCommand({
12
+ meta: {
13
+ name: "create",
14
+ description: "Create a transform job"
15
+ },
16
+ args: {
17
+ ...outputFlags,
18
+ ...profileFlag,
19
+ ...connectionFlags,
20
+ ...bodyInputFlags
21
+ },
22
+ outputSchema: TransformJob,
23
+ examples: [
24
+ "cat job.json | metabase transform-job create",
25
+ "metabase transform-job create --file job.json",
26
+ "metabase transform-job create --body '{\"name\":\"daily\",\"schedule\":\"0 0 0 * * ?\"}'"
27
+ ],
28
+ async run({ args, ctx, getClient }) {
29
+ const body = await readBody({
30
+ flag: args.body,
31
+ file: args.file
32
+ }, TransformJobCreateInput);
33
+ const client = await getClient();
34
+ const created = await client.requestParsed(TransformJob, "/api/transform-job", {
35
+ method: "POST",
36
+ body
37
+ });
38
+ renderItem(created, transformJobView, ctx);
39
+ }
40
+ });
41
+
42
+ //#endregion
43
+ export { create_default as default };