@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.
- package/LICENSE +661 -0
- package/README.md +762 -0
- package/dist/api-key-D9XxErQn.mjs +13 -0
- package/dist/archive-BPG5c88Y.mjs +38 -0
- package/dist/auth--Hpjwlaf.mjs +18 -0
- package/dist/body-DwU2s6Pg.mjs +19 -0
- package/dist/body-flags-7oqLhu5j.mjs +14 -0
- package/dist/branches-BbcoJXfp.mjs +41 -0
- package/dist/cancel-task-BDas45YO.mjs +29 -0
- package/dist/card-C31pGtBZ.mjs +113 -0
- package/dist/card-D4zZSPUb.mjs +19 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +61 -0
- package/dist/command-augment-D9pI9Vbh.mjs +11 -0
- package/dist/create-Bd_U1zWU.mjs +124 -0
- package/dist/create-CCzsCZMm.mjs +47 -0
- package/dist/create-CwVcoq0O.mjs +43 -0
- package/dist/create-DpnjQvPw.mjs +43 -0
- package/dist/create-_UOeEXAj.mjs +39 -0
- package/dist/create-branch-sDttBORB.mjs +54 -0
- package/dist/credentials-C0xKke5D.mjs +84 -0
- package/dist/current-task-BGt1mqaX.mjs +35 -0
- package/dist/database-4V1iiPEx.mjs +17 -0
- package/dist/database-BTX5qbSv.mjs +33 -0
- package/dist/db-Dm2u2ISJ.mjs +17 -0
- package/dist/delete-DRBTgyus.mjs +47 -0
- package/dist/delete-DUC_stoL.mjs +47 -0
- package/dist/delete-runtime-inOVw3IX.mjs +58 -0
- package/dist/delete-table-9Is631O_.mjs +47 -0
- package/dist/deprovision-BAMzZc6f.mjs +60 -0
- package/dist/dirty-CLjHbz6J.mjs +32 -0
- package/dist/docker-QWVMG2gl.mjs +605 -0
- package/dist/eid-BNhutC1U.mjs +13 -0
- package/dist/export-D2Anfu3p.mjs +97 -0
- package/dist/field-Dhs2AND3.mjs +13 -0
- package/dist/field-QwBMAWsq.mjs +76 -0
- package/dist/flag-pair-CWvvzDJ_.mjs +17 -0
- package/dist/get-2po1uv9i.mjs +35 -0
- package/dist/get-BHJA78zg.mjs +35 -0
- package/dist/get-CAPLfawI.mjs +35 -0
- package/dist/get-CAVVmdMX.mjs +49 -0
- package/dist/get-DDWpubE8.mjs +36 -0
- package/dist/get-DhIoNeOp.mjs +35 -0
- package/dist/get-qPOsuTPw.mjs +35 -0
- package/dist/has-remote-changes-DAL5jetW.mjs +63 -0
- package/dist/import-CUMxUfSF.mjs +92 -0
- package/dist/input-BNqSFl38.mjs +33 -0
- package/dist/is-dirty-B10S6MG0.mjs +35 -0
- package/dist/is-dirty-CUuq-aB6.mjs +9 -0
- package/dist/key-CyhOpgWt.mjs +12 -0
- package/dist/license-DtsGJi3l.mjs +17 -0
- package/dist/list-B8s7Qnzk.mjs +31 -0
- package/dist/list-C5MGydGU.mjs +31 -0
- package/dist/list-DeFGwhhJ.mjs +60 -0
- package/dist/list-OBx5B3gd.mjs +39 -0
- package/dist/list-Y7iGsOfE.mjs +31 -0
- package/dist/list-evtQS7jl.mjs +39 -0
- package/dist/list-qetY9OIN.mjs +31 -0
- package/dist/login-Dqw9ZtCx.mjs +172 -0
- package/dist/logout-DwYJ5OUi.mjs +74 -0
- package/dist/logs-B_lrY7Js.mjs +57 -0
- package/dist/manifest-wzEFG0JB.mjs +124 -0
- package/dist/package-t8dKf4m_.mjs +73 -0
- package/dist/parse-id-C1prc9US.mjs +12 -0
- package/dist/poll-D2sXM5rc.mjs +49 -0
- package/dist/poll-task-Byiunmaj.mjs +194 -0
- package/dist/prompt-fXeNtj0M.mjs +40 -0
- package/dist/provision-DC4_HWZD.mjs +80 -0
- package/dist/ps-1bZKIwWh.mjs +9 -0
- package/dist/ps-BiOrecEe.mjs +78 -0
- package/dist/query-BnGVGeM3.mjs +100 -0
- package/dist/remove-Bx48o-0S.mjs +62 -0
- package/dist/remove-DecoZzNd.mjs +97 -0
- package/dist/render-DlBijc5i.mjs +179 -0
- package/dist/run-D4NgvaRh.mjs +87 -0
- package/dist/runtime-DUgFfYkN.mjs +950 -0
- package/dist/search-4wKx5ug2.mjs +171 -0
- package/dist/set-BZnCRL4c.mjs +66 -0
- package/dist/set-DCjrmTFm.mjs +66 -0
- package/dist/setting-C4vQSqer.mjs +18 -0
- package/dist/setting-DM7pm7yh.mjs +55 -0
- package/dist/setup-Dqh9hN6l.mjs +70 -0
- package/dist/start-xXQypG5L.mjs +324 -0
- package/dist/stash-ZZkmW_V7.mjs +106 -0
- package/dist/status-9KAPIpX8.mjs +31 -0
- package/dist/status-DezF-PIM.mjs +63 -0
- package/dist/status-JH6BZppo.mjs +55 -0
- package/dist/stop-br-ZOnve.mjs +80 -0
- package/dist/sync-C7VOWD00.mjs +26 -0
- package/dist/table-BvAr2ixC.mjs +75 -0
- package/dist/table-D-Mb5Nvw.mjs +16 -0
- package/dist/transform-CqxZwhGs.mjs +21 -0
- package/dist/transform-DfVkUttP.mjs +137 -0
- package/dist/transform-job-DuB_OjhO.mjs +91 -0
- package/dist/transform-job-HjbqjEoP.mjs +19 -0
- package/dist/translate-DJxDVAE4.mjs +110 -0
- package/dist/update-CDtm71m2.mjs +50 -0
- package/dist/update-DYVeVjk2.mjs +76 -0
- package/dist/update-DxKlQ0hP.mjs +50 -0
- package/dist/url-DP88YHNo.mjs +53 -0
- package/dist/wait-Cj_8wu4y.mjs +52 -0
- package/dist/wait-DwZN3ZwR.mjs +19 -0
- package/dist/wait-flags-CjW4ogUJ.mjs +35 -0
- package/dist/workspace-CbwR0vX_.mjs +24 -0
- package/dist/workspace-Dr9lWU3D.mjs +72 -0
- package/dist/workspace-credentials-q5RRFMT8.mjs +139 -0
- 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 };
|