@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,97 @@
|
|
|
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 { REMOTE_SYNC_PATHS, SyncTask, pollFlags, pollSyncTask, throwIfFailedTask } from "./poll-task-Byiunmaj.mjs";
|
|
7
|
+
import "./poll-D2sXM5rc.mjs";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
|
|
10
|
+
//#region src/commands/sync/export.ts
|
|
11
|
+
const SyncExportKickoff = z.object({
|
|
12
|
+
message: z.string(),
|
|
13
|
+
task_id: z.number().int().positive()
|
|
14
|
+
});
|
|
15
|
+
const SyncExportResult = z.object({
|
|
16
|
+
message: z.string(),
|
|
17
|
+
task_id: z.number().int().positive(),
|
|
18
|
+
final: SyncTask.nullable().optional()
|
|
19
|
+
});
|
|
20
|
+
const syncExportView = {
|
|
21
|
+
compactPick: SyncExportResult,
|
|
22
|
+
tableColumns: [{
|
|
23
|
+
key: "task_id",
|
|
24
|
+
label: "Task ID"
|
|
25
|
+
}, {
|
|
26
|
+
key: "message",
|
|
27
|
+
label: "Message"
|
|
28
|
+
}]
|
|
29
|
+
};
|
|
30
|
+
var export_default = defineMetabaseCommand({
|
|
31
|
+
meta: {
|
|
32
|
+
name: "export",
|
|
33
|
+
description: "Export Metabase changes back to the configured git remote"
|
|
34
|
+
},
|
|
35
|
+
args: {
|
|
36
|
+
...outputFlags,
|
|
37
|
+
...profileFlag,
|
|
38
|
+
...connectionFlags,
|
|
39
|
+
branch: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Branch to export to (defaults to remote-sync-branch setting)",
|
|
42
|
+
alias: "b"
|
|
43
|
+
},
|
|
44
|
+
message: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "Commit message",
|
|
47
|
+
alias: "m"
|
|
48
|
+
},
|
|
49
|
+
force: {
|
|
50
|
+
type: "boolean",
|
|
51
|
+
description: "Force-push / overwrite remote",
|
|
52
|
+
default: false
|
|
53
|
+
},
|
|
54
|
+
...pollFlags
|
|
55
|
+
},
|
|
56
|
+
outputSchema: SyncExportResult,
|
|
57
|
+
examples: [
|
|
58
|
+
"metabase sync export -m \"update dashboards\"",
|
|
59
|
+
"metabase sync export --branch main --json",
|
|
60
|
+
"metabase sync export --no-wait"
|
|
61
|
+
],
|
|
62
|
+
async run({ args, ctx, getClient }) {
|
|
63
|
+
const timeoutMs = parseId(args.timeout, "timeout");
|
|
64
|
+
const intervalMs = parseId(args.interval, "interval");
|
|
65
|
+
const body = {};
|
|
66
|
+
if (args.branch !== void 0 && args.branch !== "") body.branch = args.branch;
|
|
67
|
+
if (args.message !== void 0 && args.message !== "") body.message = args.message;
|
|
68
|
+
if (args.force) body.force = true;
|
|
69
|
+
const client = await getClient();
|
|
70
|
+
const kickoff = await client.requestParsed(SyncExportKickoff, REMOTE_SYNC_PATHS.export, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
body
|
|
73
|
+
});
|
|
74
|
+
if (!args.wait) {
|
|
75
|
+
const result$1 = {
|
|
76
|
+
message: kickoff.message,
|
|
77
|
+
task_id: kickoff.task_id
|
|
78
|
+
};
|
|
79
|
+
renderItem(result$1, syncExportView, ctx);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const final = await pollSyncTask(client, {
|
|
83
|
+
timeoutMs,
|
|
84
|
+
intervalMs
|
|
85
|
+
});
|
|
86
|
+
const result = {
|
|
87
|
+
message: kickoff.message,
|
|
88
|
+
task_id: kickoff.task_id,
|
|
89
|
+
final
|
|
90
|
+
};
|
|
91
|
+
renderItem(result, syncExportView, ctx);
|
|
92
|
+
throwIfFailedTask(final, "export");
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
export { export_default as default };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
|
|
3
|
+
//#region src/commands/field/index.ts
|
|
4
|
+
var field_default = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "field",
|
|
7
|
+
description: "Inspect Metabase fields"
|
|
8
|
+
},
|
|
9
|
+
subCommands: { get: () => import("./get-BHJA78zg.mjs").then((m) => m.default) }
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { field_default as default };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/domain/field.ts
|
|
4
|
+
const FieldVisibilityType = z.enum([
|
|
5
|
+
"details-only",
|
|
6
|
+
"hidden",
|
|
7
|
+
"normal",
|
|
8
|
+
"retired",
|
|
9
|
+
"sensitive"
|
|
10
|
+
]);
|
|
11
|
+
const FieldValuesType = z.enum([
|
|
12
|
+
"list",
|
|
13
|
+
"search",
|
|
14
|
+
"none"
|
|
15
|
+
]);
|
|
16
|
+
const Field = z.object({
|
|
17
|
+
id: z.number().int(),
|
|
18
|
+
table_id: z.number().int(),
|
|
19
|
+
name: z.string(),
|
|
20
|
+
display_name: z.string(),
|
|
21
|
+
description: z.string().nullable(),
|
|
22
|
+
database_type: z.string(),
|
|
23
|
+
base_type: z.string(),
|
|
24
|
+
semantic_type: z.string().nullable(),
|
|
25
|
+
fk_target_field_id: z.number().int().nullable(),
|
|
26
|
+
has_field_values: FieldValuesType,
|
|
27
|
+
visibility_type: FieldVisibilityType,
|
|
28
|
+
active: z.boolean(),
|
|
29
|
+
position: z.number().int()
|
|
30
|
+
}).loose();
|
|
31
|
+
const FieldCompact = Field.pick({
|
|
32
|
+
id: true,
|
|
33
|
+
name: true,
|
|
34
|
+
display_name: true,
|
|
35
|
+
description: true,
|
|
36
|
+
table_id: true,
|
|
37
|
+
base_type: true,
|
|
38
|
+
semantic_type: true,
|
|
39
|
+
fk_target_field_id: true
|
|
40
|
+
}).strip();
|
|
41
|
+
const fieldView = {
|
|
42
|
+
compactPick: FieldCompact,
|
|
43
|
+
tableColumns: [
|
|
44
|
+
{
|
|
45
|
+
key: "id",
|
|
46
|
+
label: "ID"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: "name",
|
|
50
|
+
label: "Name"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: "display_name",
|
|
54
|
+
label: "Display Name"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
key: "base_type",
|
|
58
|
+
label: "Base Type"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
key: "semantic_type",
|
|
62
|
+
label: "Semantic Type"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: "fk_target_field_id",
|
|
66
|
+
label: "FK Target"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: "description",
|
|
70
|
+
label: "Description"
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { Field, fieldView };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ConfigError } from "./runtime-DUgFfYkN.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/commands/flag-pair.ts
|
|
4
|
+
function requireBothOrNeither(first, second) {
|
|
5
|
+
const firstSet = first.value !== void 0 && first.value !== "";
|
|
6
|
+
const secondSet = second.value !== void 0 && second.value !== "";
|
|
7
|
+
if (!firstSet && !secondSet) return null;
|
|
8
|
+
if (!firstSet) throw new ConfigError(`${first.name} is required when using ${second.name}`);
|
|
9
|
+
if (!secondSet) throw new ConfigError(`${second.name} is required when using ${first.name}`);
|
|
10
|
+
return {
|
|
11
|
+
first: first.value,
|
|
12
|
+
second: second.value
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { requireBothOrNeither };
|
|
@@ -0,0 +1,35 @@
|
|
|
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 { Database, databaseView } from "./database-BTX5qbSv.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/commands/db/get.ts
|
|
9
|
+
var get_default = defineMetabaseCommand({
|
|
10
|
+
meta: {
|
|
11
|
+
name: "get",
|
|
12
|
+
description: "Get a database by id"
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
...outputFlags,
|
|
16
|
+
...profileFlag,
|
|
17
|
+
...connectionFlags,
|
|
18
|
+
id: {
|
|
19
|
+
type: "positional",
|
|
20
|
+
description: "Database id",
|
|
21
|
+
required: true
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
outputSchema: Database,
|
|
25
|
+
examples: ["metabase db get 1", "metabase db get 1 --json"],
|
|
26
|
+
async run({ args, ctx, getClient }) {
|
|
27
|
+
const id = parseId(args.id);
|
|
28
|
+
const client = await getClient();
|
|
29
|
+
const database = await client.requestParsed(Database, `/api/database/${id}`);
|
|
30
|
+
renderItem(database, databaseView, ctx);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { get_default as default };
|
|
@@ -0,0 +1,35 @@
|
|
|
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 { Field, fieldView } from "./field-QwBMAWsq.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/commands/field/get.ts
|
|
9
|
+
var get_default = defineMetabaseCommand({
|
|
10
|
+
meta: {
|
|
11
|
+
name: "get",
|
|
12
|
+
description: "Get a field by id"
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
...outputFlags,
|
|
16
|
+
...profileFlag,
|
|
17
|
+
...connectionFlags,
|
|
18
|
+
id: {
|
|
19
|
+
type: "positional",
|
|
20
|
+
description: "Field id",
|
|
21
|
+
required: true
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
outputSchema: Field,
|
|
25
|
+
examples: ["metabase field get 100", "metabase field get 100 --json"],
|
|
26
|
+
async run({ args, ctx, getClient }) {
|
|
27
|
+
const id = parseId(args.id);
|
|
28
|
+
const client = await getClient();
|
|
29
|
+
const field = await client.requestParsed(Field, `/api/field/${id}`);
|
|
30
|
+
renderItem(field, fieldView, ctx);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { get_default as default };
|
|
@@ -0,0 +1,35 @@
|
|
|
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/get.ts
|
|
9
|
+
var get_default = defineMetabaseCommand({
|
|
10
|
+
meta: {
|
|
11
|
+
name: "get",
|
|
12
|
+
description: "Get 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 get 1", "metabase card get 1 --json"],
|
|
26
|
+
async run({ args, ctx, getClient }) {
|
|
27
|
+
const id = parseId(args.id);
|
|
28
|
+
const client = await getClient();
|
|
29
|
+
const card = await client.requestParsed(Card, `/api/card/${id}`);
|
|
30
|
+
renderItem(card, cardView, ctx);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { get_default as default };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import "./package-t8dKf4m_.mjs";
|
|
2
|
+
import "./command-augment-D9pI9Vbh.mjs";
|
|
3
|
+
import { renderItem } from "./render-DlBijc5i.mjs";
|
|
4
|
+
import { connectionFlags, defineMetabaseCommand, outputFlags, parseJson, profileFlag } from "./runtime-DUgFfYkN.mjs";
|
|
5
|
+
import { SettingValue, settingValueView } from "./setting-DM7pm7yh.mjs";
|
|
6
|
+
import { parseSettingKey } from "./key-CyhOpgWt.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/setting/get.ts
|
|
10
|
+
var get_default = defineMetabaseCommand({
|
|
11
|
+
meta: {
|
|
12
|
+
name: "get",
|
|
13
|
+
description: "Get a setting value by key"
|
|
14
|
+
},
|
|
15
|
+
args: {
|
|
16
|
+
...outputFlags,
|
|
17
|
+
...profileFlag,
|
|
18
|
+
...connectionFlags,
|
|
19
|
+
key: {
|
|
20
|
+
type: "positional",
|
|
21
|
+
description: "Setting key",
|
|
22
|
+
required: true
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
outputSchema: SettingValue,
|
|
26
|
+
examples: ["metabase setting get remote-sync-branch", "metabase setting get site-name --json"],
|
|
27
|
+
async run({ args, ctx, getClient }) {
|
|
28
|
+
const key = parseSettingKey(args.key);
|
|
29
|
+
const client = await getClient();
|
|
30
|
+
const value = await fetchSettingValue(client, key);
|
|
31
|
+
const item = {
|
|
32
|
+
key,
|
|
33
|
+
value
|
|
34
|
+
};
|
|
35
|
+
renderItem(item, settingValueView, ctx);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
async function fetchSettingValue(client, key) {
|
|
39
|
+
const response = await client.requestRaw(`/api/setting/${encodeURIComponent(key)}`, {
|
|
40
|
+
method: "GET",
|
|
41
|
+
expectContentType: "binary"
|
|
42
|
+
});
|
|
43
|
+
if (response.status === 204) return null;
|
|
44
|
+
const text = await response.text();
|
|
45
|
+
return parseJson(text, z.unknown(), { source: response.url });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
export { get_default as default };
|
|
@@ -0,0 +1,36 @@
|
|
|
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 "./field-QwBMAWsq.mjs";
|
|
7
|
+
import { Table, tableView } from "./table-BvAr2ixC.mjs";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/table/get.ts
|
|
10
|
+
var get_default = defineMetabaseCommand({
|
|
11
|
+
meta: {
|
|
12
|
+
name: "get",
|
|
13
|
+
description: "Get a table by id, with its fields"
|
|
14
|
+
},
|
|
15
|
+
args: {
|
|
16
|
+
...outputFlags,
|
|
17
|
+
...profileFlag,
|
|
18
|
+
...connectionFlags,
|
|
19
|
+
id: {
|
|
20
|
+
type: "positional",
|
|
21
|
+
description: "Table id",
|
|
22
|
+
required: true
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
outputSchema: Table,
|
|
26
|
+
examples: ["metabase table get 42", "metabase table get 42 --json"],
|
|
27
|
+
async run({ args, ctx, getClient }) {
|
|
28
|
+
const id = parseId(args.id);
|
|
29
|
+
const client = await getClient();
|
|
30
|
+
const table = await client.requestParsed(Table, `/api/table/${id}/query_metadata`);
|
|
31
|
+
renderItem(table, tableView, ctx);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { get_default as default };
|
|
@@ -0,0 +1,35 @@
|
|
|
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 { TransformJob, transformJobView } from "./transform-job-DuB_OjhO.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/commands/transform-job/get.ts
|
|
9
|
+
var get_default = defineMetabaseCommand({
|
|
10
|
+
meta: {
|
|
11
|
+
name: "get",
|
|
12
|
+
description: "Get a transform job by id"
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
...outputFlags,
|
|
16
|
+
...profileFlag,
|
|
17
|
+
...connectionFlags,
|
|
18
|
+
id: {
|
|
19
|
+
type: "positional",
|
|
20
|
+
description: "Transform job id",
|
|
21
|
+
required: true
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
outputSchema: TransformJob,
|
|
25
|
+
examples: ["metabase transform-job get 1", "metabase transform-job get 1 --json"],
|
|
26
|
+
async run({ args, ctx, getClient }) {
|
|
27
|
+
const id = parseId(args.id);
|
|
28
|
+
const client = await getClient();
|
|
29
|
+
const job = await client.requestParsed(TransformJob, `/api/transform-job/${id}`);
|
|
30
|
+
renderItem(job, transformJobView, ctx);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { get_default as default };
|
|
@@ -0,0 +1,35 @@
|
|
|
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 { Transform, transformView } from "./transform-DfVkUttP.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/commands/transform/get.ts
|
|
9
|
+
var get_default = defineMetabaseCommand({
|
|
10
|
+
meta: {
|
|
11
|
+
name: "get",
|
|
12
|
+
description: "Get a transform by id"
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
...outputFlags,
|
|
16
|
+
...profileFlag,
|
|
17
|
+
...connectionFlags,
|
|
18
|
+
id: {
|
|
19
|
+
type: "positional",
|
|
20
|
+
description: "Transform id",
|
|
21
|
+
required: true
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
outputSchema: Transform,
|
|
25
|
+
examples: ["metabase transform get 1", "metabase transform get 1 --json"],
|
|
26
|
+
async run({ args, ctx, getClient }) {
|
|
27
|
+
const id = parseId(args.id);
|
|
28
|
+
const client = await getClient();
|
|
29
|
+
const transform = await client.requestParsed(Transform, `/api/transform/${id}`);
|
|
30
|
+
renderItem(transform, transformView, ctx);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { get_default as default };
|
|
@@ -0,0 +1,63 @@
|
|
|
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 } from "./poll-task-Byiunmaj.mjs";
|
|
6
|
+
import "./poll-D2sXM5rc.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
//#region src/commands/sync/has-remote-changes.ts
|
|
10
|
+
const HasRemoteChangesResult = z.object({
|
|
11
|
+
has_changes: z.boolean(),
|
|
12
|
+
remote_version: z.string().nullable(),
|
|
13
|
+
local_version: z.string().nullable(),
|
|
14
|
+
cached: z.boolean()
|
|
15
|
+
});
|
|
16
|
+
const hasRemoteChangesView = {
|
|
17
|
+
compactPick: HasRemoteChangesResult,
|
|
18
|
+
tableColumns: [
|
|
19
|
+
{
|
|
20
|
+
key: "has_changes",
|
|
21
|
+
label: "Has changes"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "remote_version",
|
|
25
|
+
label: "Remote"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
key: "local_version",
|
|
29
|
+
label: "Local"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: "cached",
|
|
33
|
+
label: "Cached"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
var has_remote_changes_default = defineMetabaseCommand({
|
|
38
|
+
meta: {
|
|
39
|
+
name: "has-remote-changes",
|
|
40
|
+
description: "Check whether the remote branch has unimported changes"
|
|
41
|
+
},
|
|
42
|
+
args: {
|
|
43
|
+
...outputFlags,
|
|
44
|
+
...profileFlag,
|
|
45
|
+
...connectionFlags,
|
|
46
|
+
forceRefresh: {
|
|
47
|
+
type: "boolean",
|
|
48
|
+
description: "Bypass the in-memory cache and re-check the remote",
|
|
49
|
+
default: false,
|
|
50
|
+
alias: "force-refresh"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
outputSchema: HasRemoteChangesResult,
|
|
54
|
+
examples: ["metabase sync has-remote-changes", "metabase sync has-remote-changes --force-refresh --json"],
|
|
55
|
+
async run({ args, ctx, getClient }) {
|
|
56
|
+
const client = await getClient();
|
|
57
|
+
const result = await client.requestParsed(HasRemoteChangesResult, REMOTE_SYNC_PATHS.hasRemoteChanges, { query: { "force-refresh": args.forceRefresh } });
|
|
58
|
+
renderItem(result, hasRemoteChangesView, ctx);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { has_remote_changes_default as default };
|
|
@@ -0,0 +1,92 @@
|
|
|
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 { REMOTE_SYNC_PATHS, SyncTask, pollFlags, pollSyncTask, throwIfFailedTask } from "./poll-task-Byiunmaj.mjs";
|
|
7
|
+
import "./poll-D2sXM5rc.mjs";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
|
|
10
|
+
//#region src/commands/sync/import.ts
|
|
11
|
+
const SyncImportKickoff = z.object({
|
|
12
|
+
status: z.literal("success"),
|
|
13
|
+
task_id: z.number().int().positive().nullable(),
|
|
14
|
+
message: z.string().nullable().optional()
|
|
15
|
+
});
|
|
16
|
+
const SyncImportResult = z.object({
|
|
17
|
+
message: z.string().nullable(),
|
|
18
|
+
task_id: z.number().int().positive().nullable(),
|
|
19
|
+
final: SyncTask.nullable().optional()
|
|
20
|
+
});
|
|
21
|
+
const syncImportView = {
|
|
22
|
+
compactPick: SyncImportResult,
|
|
23
|
+
tableColumns: [{
|
|
24
|
+
key: "task_id",
|
|
25
|
+
label: "Task ID"
|
|
26
|
+
}, {
|
|
27
|
+
key: "message",
|
|
28
|
+
label: "Message"
|
|
29
|
+
}]
|
|
30
|
+
};
|
|
31
|
+
var import_default = defineMetabaseCommand({
|
|
32
|
+
meta: {
|
|
33
|
+
name: "import",
|
|
34
|
+
description: "Import content from the configured git remote into Metabase"
|
|
35
|
+
},
|
|
36
|
+
args: {
|
|
37
|
+
...outputFlags,
|
|
38
|
+
...profileFlag,
|
|
39
|
+
...connectionFlags,
|
|
40
|
+
branch: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "Branch to import from (defaults to remote-sync-branch setting)",
|
|
43
|
+
alias: "b"
|
|
44
|
+
},
|
|
45
|
+
force: {
|
|
46
|
+
type: "boolean",
|
|
47
|
+
description: "Discard local Metabase-side dirty changes (LOSSY)",
|
|
48
|
+
default: false
|
|
49
|
+
},
|
|
50
|
+
...pollFlags
|
|
51
|
+
},
|
|
52
|
+
outputSchema: SyncImportResult,
|
|
53
|
+
examples: [
|
|
54
|
+
"metabase sync import",
|
|
55
|
+
"metabase sync import --branch main --json",
|
|
56
|
+
"metabase sync import --force --no-wait"
|
|
57
|
+
],
|
|
58
|
+
async run({ args, ctx, getClient }) {
|
|
59
|
+
const timeoutMs = parseId(args.timeout, "timeout");
|
|
60
|
+
const intervalMs = parseId(args.interval, "interval");
|
|
61
|
+
const body = {};
|
|
62
|
+
if (args.branch !== void 0 && args.branch !== "") body.branch = args.branch;
|
|
63
|
+
if (args.force) body.force = true;
|
|
64
|
+
const client = await getClient();
|
|
65
|
+
const kickoff = await client.requestParsed(SyncImportKickoff, REMOTE_SYNC_PATHS.import, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
body
|
|
68
|
+
});
|
|
69
|
+
if (!args.wait || kickoff.task_id === null) {
|
|
70
|
+
const result$1 = {
|
|
71
|
+
message: kickoff.message ?? null,
|
|
72
|
+
task_id: kickoff.task_id
|
|
73
|
+
};
|
|
74
|
+
renderItem(result$1, syncImportView, ctx);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const final = await pollSyncTask(client, {
|
|
78
|
+
timeoutMs,
|
|
79
|
+
intervalMs
|
|
80
|
+
});
|
|
81
|
+
const result = {
|
|
82
|
+
message: kickoff.message ?? null,
|
|
83
|
+
task_id: kickoff.task_id,
|
|
84
|
+
final
|
|
85
|
+
};
|
|
86
|
+
renderItem(result, syncImportView, ctx);
|
|
87
|
+
throwIfFailedTask(final, "import");
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { import_default as default };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ConfigError, isNotFoundError } from "./runtime-DUgFfYkN.mjs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
|
|
4
|
+
//#region src/runtime/input.ts
|
|
5
|
+
const SOURCE_LIST = "flag, --file, stdin, or positional argument";
|
|
6
|
+
async function readInput(sources) {
|
|
7
|
+
if (sources.flag) return sources.flag;
|
|
8
|
+
if (sources.file) return await readFileSource(sources.file);
|
|
9
|
+
if (!process.stdin.isTTY) {
|
|
10
|
+
const piped = await readStdin();
|
|
11
|
+
if (piped) return piped;
|
|
12
|
+
}
|
|
13
|
+
if (sources.positional) return sources.positional;
|
|
14
|
+
const required = sources.required ?? true;
|
|
15
|
+
if (required) throw new ConfigError(`input required: provide one of ${SOURCE_LIST}`);
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
async function readFileSource(path) {
|
|
19
|
+
try {
|
|
20
|
+
return await readFile(path, "utf8");
|
|
21
|
+
} catch (error) {
|
|
22
|
+
if (isNotFoundError(error)) throw new ConfigError(`--file not found: ${path}`);
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function readStdin() {
|
|
27
|
+
let data = "";
|
|
28
|
+
for await (const chunk of process.stdin) data += chunk;
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { readInput };
|