@axtrabase/cli 0.1.0
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/README.md +130 -0
- package/dist/active-project.d.ts +12 -0
- package/dist/active-project.d.ts.map +1 -0
- package/dist/active-project.js +27 -0
- package/dist/active-project.js.map +1 -0
- package/dist/api-types.d.ts +187 -0
- package/dist/api-types.d.ts.map +1 -0
- package/dist/api-types.js +9 -0
- package/dist/api-types.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +98 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connection.d.ts +3 -0
- package/dist/commands/connection.d.ts.map +1 -0
- package/dist/commands/connection.js +58 -0
- package/dist/commands/connection.js.map +1 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +128 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/docs.d.ts +11 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +39 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +92 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +68 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +12 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +77 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/openapi.d.ts +4 -0
- package/dist/commands/openapi.d.ts.map +1 -0
- package/dist/commands/openapi.js +40 -0
- package/dist/commands/openapi.js.map +1 -0
- package/dist/commands/organisations.d.ts +3 -0
- package/dist/commands/organisations.d.ts.map +1 -0
- package/dist/commands/organisations.js +64 -0
- package/dist/commands/organisations.js.map +1 -0
- package/dist/commands/permissions.d.ts +9 -0
- package/dist/commands/permissions.d.ts.map +1 -0
- package/dist/commands/permissions.js +61 -0
- package/dist/commands/permissions.js.map +1 -0
- package/dist/commands/projects.d.ts +3 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +99 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/requests.d.ts +3 -0
- package/dist/commands/requests.d.ts.map +1 -0
- package/dist/commands/requests.js +91 -0
- package/dist/commands/requests.js.map +1 -0
- package/dist/commands/schema.d.ts +3 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +80 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +46 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tables.d.ts +3 -0
- package/dist/commands/tables.d.ts.map +1 -0
- package/dist/commands/tables.js +129 -0
- package/dist/commands/tables.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +41 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/concurrency.d.ts +18 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +32 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config/credentials.d.ts +17 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +77 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/paths.d.ts +12 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +20 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/resolve.d.ts +22 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +41 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/store.d.ts +24 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +72 -0
- package/dist/config/store.js.map +1 -0
- package/dist/exit-codes.d.ts +18 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +40 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/generators/typescript.d.ts +5 -0
- package/dist/generators/typescript.d.ts.map +1 -0
- package/dist/generators/typescript.js +70 -0
- package/dist/generators/typescript.js.map +1 -0
- package/dist/http/authenticated-client.d.ts +10 -0
- package/dist/http/authenticated-client.d.ts.map +1 -0
- package/dist/http/authenticated-client.js +24 -0
- package/dist/http/authenticated-client.js.map +1 -0
- package/dist/http/client.d.ts +42 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +86 -0
- package/dist/http/client.js.map +1 -0
- package/dist/http/errors.d.ts +29 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +21 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/open-browser.d.ts +9 -0
- package/dist/open-browser.d.ts.map +1 -0
- package/dist/open-browser.js +32 -0
- package/dist/open-browser.js.map +1 -0
- package/dist/output/file-writer.d.ts +8 -0
- package/dist/output/file-writer.d.ts.map +1 -0
- package/dist/output/file-writer.js +28 -0
- package/dist/output/file-writer.js.map +1 -0
- package/dist/output/print.d.ts +15 -0
- package/dist/output/print.d.ts.map +1 -0
- package/dist/output/print.js +27 -0
- package/dist/output/print.js.map +1 -0
- package/dist/output/sanitize.d.ts +30 -0
- package/dist/output/sanitize.d.ts.map +1 -0
- package/dist/output/sanitize.js +40 -0
- package/dist/output/sanitize.js.map +1 -0
- package/dist/output/table.d.ts +9 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +19 -0
- package/dist/output/table.js.map +1 -0
- package/dist/prompt-masked.d.ts +15 -0
- package/dist/prompt-masked.d.ts.map +1 -0
- package/dist/prompt-masked.js +75 -0
- package/dist/prompt-masked.js.map +1 -0
- package/dist/report-error.d.ts +18 -0
- package/dist/report-error.d.ts.map +1 -0
- package/dist/report-error.js +63 -0
- package/dist/report-error.js.map +1 -0
- package/dist/resolve-entity.d.ts +13 -0
- package/dist/resolve-entity.d.ts.map +1 -0
- package/dist/resolve-entity.js +18 -0
- package/dist/resolve-entity.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Read-only for v1 — bulk/single grant mutation stays dashboard-only (see
|
|
4
|
+
* ADR-013 and docs/cli.md's "deferred" list). Listing is safe to expose
|
|
5
|
+
* unconditionally: it only ever reveals what a caller's own project already
|
|
6
|
+
* grants, never another organisation's data.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerPermissionsCommand(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/commands/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAcjE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { resolveActiveProjectId } from "../active-project.js";
|
|
2
|
+
import { requireControlPlaneClient } from "../http/authenticated-client.js";
|
|
3
|
+
import { printJson, printLine } from "../output/print.js";
|
|
4
|
+
import { renderTable } from "../output/table.js";
|
|
5
|
+
import { runWithErrorHandling } from "../report-error.js";
|
|
6
|
+
/**
|
|
7
|
+
* Read-only for v1 — bulk/single grant mutation stays dashboard-only (see
|
|
8
|
+
* ADR-013 and docs/cli.md's "deferred" list). Listing is safe to expose
|
|
9
|
+
* unconditionally: it only ever reveals what a caller's own project already
|
|
10
|
+
* grants, never another organisation's data.
|
|
11
|
+
*/
|
|
12
|
+
export function registerPermissionsCommand(program) {
|
|
13
|
+
const permissions = program
|
|
14
|
+
.command("permissions")
|
|
15
|
+
.description("Inspect table permission grants (read-only — see docs/cli.md)");
|
|
16
|
+
permissions
|
|
17
|
+
.command("list")
|
|
18
|
+
.description("List every table permission grant in the active project")
|
|
19
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
20
|
+
.option("--api-key <id>", "only this API key's grants")
|
|
21
|
+
.action(async function () {
|
|
22
|
+
const options = this.optsWithGlobals();
|
|
23
|
+
await runWithErrorHandling(() => runList(options), options);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function accessShorthand(row) {
|
|
27
|
+
return ((row.canRead ? "R" : "-") +
|
|
28
|
+
(row.canCreate ? "C" : "-") +
|
|
29
|
+
(row.canUpdate ? "U" : "-") +
|
|
30
|
+
(row.canDelete ? "D" : "-"));
|
|
31
|
+
}
|
|
32
|
+
async function runList(options) {
|
|
33
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
34
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
35
|
+
const [permissionsResult, keysResult] = await Promise.all([
|
|
36
|
+
client.get(`/api/v1/projects/${projectId}/tables/permissions`),
|
|
37
|
+
client.get(`/api/v1/projects/${projectId}/api-keys`)
|
|
38
|
+
]);
|
|
39
|
+
const rows = options.apiKey
|
|
40
|
+
? permissionsResult.data.filter((row) => row.apiKeyId === options.apiKey)
|
|
41
|
+
: permissionsResult.data;
|
|
42
|
+
const keyById = new Map(keysResult.data.map((key) => [key.id, key]));
|
|
43
|
+
if (options.json) {
|
|
44
|
+
printJson(rows);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (rows.length === 0) {
|
|
48
|
+
printLine("No table permissions granted yet.");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
printLine(renderTable(["TABLE", "API KEY", "ENABLED", "ACCESS"], rows.map((row) => {
|
|
52
|
+
const key = keyById.get(row.apiKeyId);
|
|
53
|
+
return [
|
|
54
|
+
row.table,
|
|
55
|
+
key ? `${key.name} (${key.prefix})` : row.apiKeyId,
|
|
56
|
+
row.isEnabled ? "yes" : "no",
|
|
57
|
+
accessShorthand(row)
|
|
58
|
+
];
|
|
59
|
+
})));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/commands/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B9D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { ConfigStore } from "../config/store.js";
|
|
2
|
+
import { requireControlPlaneClient } from "../http/authenticated-client.js";
|
|
3
|
+
import { CliError } from "../http/errors.js";
|
|
4
|
+
import { printJson, printKeyValueBlock, printLine } from "../output/print.js";
|
|
5
|
+
import { renderTable } from "../output/table.js";
|
|
6
|
+
import { runWithErrorHandling } from "../report-error.js";
|
|
7
|
+
import { resolveByIdOrSlug } from "../resolve-entity.js";
|
|
8
|
+
export function registerProjectsCommand(program) {
|
|
9
|
+
const projects = program.command("projects").description("Inspect and select the active project");
|
|
10
|
+
projects
|
|
11
|
+
.command("list")
|
|
12
|
+
.description("List projects in the active organisation")
|
|
13
|
+
.action(async function () {
|
|
14
|
+
const options = this.optsWithGlobals();
|
|
15
|
+
await runWithErrorHandling(() => runList(options), options);
|
|
16
|
+
});
|
|
17
|
+
projects
|
|
18
|
+
.command("show <project>")
|
|
19
|
+
.description("Show one project's connection status (id or slug)")
|
|
20
|
+
.action(async function (project, _opts, command) {
|
|
21
|
+
const options = command.optsWithGlobals();
|
|
22
|
+
await runWithErrorHandling(() => runShow(project, options), options);
|
|
23
|
+
});
|
|
24
|
+
projects
|
|
25
|
+
.command("use <project>")
|
|
26
|
+
.description("Set the active project for subsequent commands (id or slug)")
|
|
27
|
+
.action(async function (project, _opts, command) {
|
|
28
|
+
const options = command.optsWithGlobals();
|
|
29
|
+
await runWithErrorHandling(() => runUse(project, options), options);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function fetchAndResolveProject(idOrSlug, options) {
|
|
33
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
34
|
+
const { data } = await client.get("/api/v1/projects");
|
|
35
|
+
const match = resolveByIdOrSlug(idOrSlug, data);
|
|
36
|
+
if (!match) {
|
|
37
|
+
throw new CliError("AXTRA_CLI_NOT_FOUND", `No project matches "${idOrSlug}" in the active organisation. Run \`axtrabase projects list\` to see what's available.`, { status: 0 });
|
|
38
|
+
}
|
|
39
|
+
return { project: match, client };
|
|
40
|
+
}
|
|
41
|
+
async function runList(options) {
|
|
42
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
43
|
+
const { data } = await client.get("/api/v1/projects");
|
|
44
|
+
if (options.json) {
|
|
45
|
+
printJson(data);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (data.length === 0) {
|
|
49
|
+
printLine("No projects found.");
|
|
50
|
+
printLine();
|
|
51
|
+
printLine("Create one in the AxtraBase dashboard, then run `axtrabase projects list` again.");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
printLine(renderTable(["NAME", "SLUG", "ID"], data.map((project) => [project.name, project.slug, project.id])));
|
|
55
|
+
}
|
|
56
|
+
async function runShow(idOrSlug, options) {
|
|
57
|
+
const { project, client } = await fetchAndResolveProject(idOrSlug, options);
|
|
58
|
+
let connection;
|
|
59
|
+
try {
|
|
60
|
+
const result = await client.get(`/api/v1/projects/${project.id}/dataverse-connection`);
|
|
61
|
+
connection = result.data;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (!(error instanceof CliError) || error.code !== "AXTRA_RECORD_NOT_FOUND")
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
if (options.json) {
|
|
68
|
+
printJson({ project, connection: connection ?? null });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
printKeyValueBlock([
|
|
72
|
+
["Project", project.name],
|
|
73
|
+
["Slug", project.slug],
|
|
74
|
+
["ID", project.id],
|
|
75
|
+
["Created", project.createdAt]
|
|
76
|
+
]);
|
|
77
|
+
printLine();
|
|
78
|
+
if (connection) {
|
|
79
|
+
printKeyValueBlock([
|
|
80
|
+
["Connection mode", connection.mode],
|
|
81
|
+
["Status", connection.status],
|
|
82
|
+
["Environment", connection.environmentDisplayName ?? connection.environmentUrl ?? "—"],
|
|
83
|
+
["Last verified", connection.lastVerifiedAt ?? "never"]
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
printLine("No Dataverse connection yet.");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function runUse(idOrSlug, options) {
|
|
91
|
+
const { project } = await fetchAndResolveProject(idOrSlug, options);
|
|
92
|
+
new ConfigStore().update({ projectId: project.id, projectSlug: project.slug });
|
|
93
|
+
if (options.json) {
|
|
94
|
+
printJson({ project });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
printLine(`Active project: ${project.name} (${project.slug})`);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/commands/requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B9D"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { resolveActiveProjectId } from "../active-project.js";
|
|
2
|
+
import { requireControlPlaneClient } from "../http/authenticated-client.js";
|
|
3
|
+
import { printJson, printKeyValueBlock, printLine } from "../output/print.js";
|
|
4
|
+
import { renderTable } from "../output/table.js";
|
|
5
|
+
import { runWithErrorHandling } from "../report-error.js";
|
|
6
|
+
export function registerRequestsCommand(program) {
|
|
7
|
+
const requests = program.command("requests").description("Inspect data-plane request telemetry");
|
|
8
|
+
requests
|
|
9
|
+
.command("list")
|
|
10
|
+
.description("List recent requests for the active project")
|
|
11
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
12
|
+
.option("--status <code>", "filter by HTTP status code")
|
|
13
|
+
.option("--method <verb>", "filter by HTTP method")
|
|
14
|
+
.option("--table <name>", "filter by table")
|
|
15
|
+
.option("--error-code <code>", "filter by AxtraBase error code")
|
|
16
|
+
.option("--failed", "shorthand for requests with a 4xx/5xx status")
|
|
17
|
+
.option("--limit <n>", "max rows (default 25, max 100)")
|
|
18
|
+
.option("--cursor <cursor>", "continue from a previous response's nextCursor")
|
|
19
|
+
.action(async function () {
|
|
20
|
+
const options = this.optsWithGlobals();
|
|
21
|
+
await runWithErrorHandling(() => runList(options), options);
|
|
22
|
+
});
|
|
23
|
+
requests
|
|
24
|
+
.command("get <requestId>")
|
|
25
|
+
.description("Show one request's full detail (never the record payload)")
|
|
26
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
27
|
+
.action(async function (requestId, _opts, command) {
|
|
28
|
+
const options = command.optsWithGlobals();
|
|
29
|
+
await runWithErrorHandling(() => runGet(requestId, options), options);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function runList(options) {
|
|
33
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
34
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
35
|
+
const result = await client.get(`/api/v1/projects/${projectId}/requests`, {
|
|
36
|
+
status: options.failed ? undefined : options.status,
|
|
37
|
+
method: options.method,
|
|
38
|
+
table: options.table,
|
|
39
|
+
errorCode: options.errorCode,
|
|
40
|
+
limit: options.limit,
|
|
41
|
+
cursor: options.cursor
|
|
42
|
+
});
|
|
43
|
+
const rows = options.failed ? result.data.filter((row) => row.statusCode >= 400) : result.data;
|
|
44
|
+
if (options.json) {
|
|
45
|
+
printJson({ data: rows, nextCursor: result.meta.nextCursor ?? null });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (rows.length === 0) {
|
|
49
|
+
printLine("No requests match.");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
printLine(renderTable(["REQUEST ID", "METHOD", "TABLE", "STATUS", "ERROR", "LATENCY", "CREATED"], rows.map((row) => [
|
|
53
|
+
row.requestId,
|
|
54
|
+
row.method,
|
|
55
|
+
row.tableLogicalName ?? "—",
|
|
56
|
+
String(row.statusCode),
|
|
57
|
+
row.errorCode ?? "—",
|
|
58
|
+
`${row.durationMs}ms`,
|
|
59
|
+
row.createdAt
|
|
60
|
+
])));
|
|
61
|
+
if (result.meta.nextCursor) {
|
|
62
|
+
printLine();
|
|
63
|
+
printLine(`More results: axtrabase requests list --cursor ${result.meta.nextCursor}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function runGet(requestId, options) {
|
|
67
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
68
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
69
|
+
const { data } = await client.get(`/api/v1/projects/${projectId}/requests/${requestId}`);
|
|
70
|
+
if (options.json) {
|
|
71
|
+
printJson(data);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
printKeyValueBlock([
|
|
75
|
+
["Request ID", data.requestId],
|
|
76
|
+
["Timestamp", data.createdAt],
|
|
77
|
+
["Method", data.method],
|
|
78
|
+
["Path", data.path],
|
|
79
|
+
["Table", data.tableLogicalName ?? "—"],
|
|
80
|
+
["Status", String(data.statusCode)],
|
|
81
|
+
["Error code", data.errorCode ?? "—"],
|
|
82
|
+
["Total latency", `${data.durationMs}ms`],
|
|
83
|
+
[
|
|
84
|
+
"Dataverse latency",
|
|
85
|
+
data.dataverseDurationMs !== null ? `${data.dataverseDurationMs}ms` : "—"
|
|
86
|
+
],
|
|
87
|
+
["Retries", String(data.retryCount)],
|
|
88
|
+
["Client", data.client ?? "—"]
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/commands/requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB5D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolveActiveProjectId } from "../active-project.js";
|
|
3
|
+
import { mapWithConcurrencyLimit } from "../concurrency.js";
|
|
4
|
+
import { requireControlPlaneClient } from "../http/authenticated-client.js";
|
|
5
|
+
import { CliError } from "../http/errors.js";
|
|
6
|
+
import { generateTypeScriptModule } from "../generators/typescript.js";
|
|
7
|
+
import { writeFileSafely } from "../output/file-writer.js";
|
|
8
|
+
import { printProgress } from "../output/print.js";
|
|
9
|
+
import { runWithErrorHandling } from "../report-error.js";
|
|
10
|
+
/** Caps how many table-metadata requests are ever in flight at once during a schema export — see concurrency.ts. Conservative on purpose: this hits the same control plane a human might be using interactively. */
|
|
11
|
+
const METADATA_FETCH_CONCURRENCY = 6;
|
|
12
|
+
export function registerSchemaCommand(program) {
|
|
13
|
+
const schema = program.command("schema").description("Export the active project's schema");
|
|
14
|
+
schema
|
|
15
|
+
.command("export")
|
|
16
|
+
.description("Export table metadata as JSON or generated TypeScript interfaces")
|
|
17
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
18
|
+
.option("--format <format>", "json or typescript", "json")
|
|
19
|
+
.option("--table <name>", "restrict to this table (repeatable); defaults to every enabled table", collectTable, [])
|
|
20
|
+
.option("-o, --output <file>", "write to this file instead of stdout")
|
|
21
|
+
.option("--force", "overwrite --output if it already exists")
|
|
22
|
+
.action(async function () {
|
|
23
|
+
const options = this.optsWithGlobals();
|
|
24
|
+
await runWithErrorHandling(() => runExport(options), options);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function collectTable(value, previous) {
|
|
28
|
+
return [...previous, value];
|
|
29
|
+
}
|
|
30
|
+
async function resolveTableNames(client, projectId, explicitTables) {
|
|
31
|
+
if (explicitTables.length > 0)
|
|
32
|
+
return explicitTables;
|
|
33
|
+
const { data } = await client.get(`/api/v1/projects/${projectId}/tables`);
|
|
34
|
+
const enabled = data.filter((table) => table.isEnabled).map((table) => table.logicalName);
|
|
35
|
+
if (enabled.length === 0) {
|
|
36
|
+
throw new CliError("AXTRA_CLI_VALIDATION_ERROR", "No tables are enabled for this project. Pass --table <name> explicitly, or enable tables in the dashboard first.", { status: 0 });
|
|
37
|
+
}
|
|
38
|
+
return enabled;
|
|
39
|
+
}
|
|
40
|
+
async function runExport(options) {
|
|
41
|
+
const format = options.format ?? "json";
|
|
42
|
+
if (format !== "json" && format !== "typescript") {
|
|
43
|
+
throw new CliError("AXTRA_CLI_VALIDATION_ERROR", `--format must be "json" or "typescript".`, {
|
|
44
|
+
status: 0
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Fail fast on a would-be overwrite before spending any network calls —
|
|
48
|
+
// no point fetching metadata for a write we already know will be refused.
|
|
49
|
+
if (options.output && existsSync(options.output) && !options.force) {
|
|
50
|
+
throw new CliError("AXTRA_CLI_FILE_EXISTS", `${options.output} already exists. Pass --force to overwrite it.`, { status: 0 });
|
|
51
|
+
}
|
|
52
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
53
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
54
|
+
const tableNames = await resolveTableNames(client, projectId, options.table ?? []);
|
|
55
|
+
printProgress(`Fetching metadata for ${tableNames.length} table(s)...`);
|
|
56
|
+
const tables = await mapWithConcurrencyLimit(tableNames, METADATA_FETCH_CONCURRENCY, async (table) => {
|
|
57
|
+
const { data } = await client.get(`/api/v1/projects/${projectId}/tables/${table}/metadata`);
|
|
58
|
+
return data;
|
|
59
|
+
});
|
|
60
|
+
const { data: projectRows } = await client.get("/api/v1/projects");
|
|
61
|
+
const project = projectRows.find((p) => p.id === projectId);
|
|
62
|
+
const content = format === "typescript"
|
|
63
|
+
? generateTypeScriptModule(tables)
|
|
64
|
+
: `${JSON.stringify({
|
|
65
|
+
project: project ? { id: project.id, name: project.name, slug: project.slug } : null,
|
|
66
|
+
generatedAt: new Date().toISOString(),
|
|
67
|
+
tables
|
|
68
|
+
}, null, 2)}\n`;
|
|
69
|
+
if (options.output) {
|
|
70
|
+
writeFileSafely(options.output, content, Boolean(options.force));
|
|
71
|
+
printProgress(`Wrote ${options.output}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Deliberately bypasses printJson (which pretty-prints via
|
|
75
|
+
// JSON.stringify again) for the json format — `content` is already the
|
|
76
|
+
// exact, final file content, and writing it verbatim to stdout keeps the
|
|
77
|
+
// "what -o would have written" and "what printed to stdout" identical.
|
|
78
|
+
process.stdout.write(content);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* The fastest "am I ready to work" check — distinct from `connection
|
|
4
|
+
* status`, which is Dataverse-connection detail only. Reuses the same
|
|
5
|
+
* `/context` endpoint `axtrabase context` calls (build brief §13's
|
|
6
|
+
* composed payload), just rendered as a compact summary rather than the
|
|
7
|
+
* full agent-oriented shape.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerStatusCommand(program: Command): void;
|
|
10
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS5D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { resolveActiveProjectId } from "../active-project.js";
|
|
2
|
+
import { resolveApiUrl } from "../config/resolve.js";
|
|
3
|
+
import { requireControlPlaneClient } from "../http/authenticated-client.js";
|
|
4
|
+
import { printJson, printKeyValueBlock } from "../output/print.js";
|
|
5
|
+
import { runWithErrorHandling } from "../report-error.js";
|
|
6
|
+
/**
|
|
7
|
+
* The fastest "am I ready to work" check — distinct from `connection
|
|
8
|
+
* status`, which is Dataverse-connection detail only. Reuses the same
|
|
9
|
+
* `/context` endpoint `axtrabase context` calls (build brief §13's
|
|
10
|
+
* composed payload), just rendered as a compact summary rather than the
|
|
11
|
+
* full agent-oriented shape.
|
|
12
|
+
*/
|
|
13
|
+
export function registerStatusCommand(program) {
|
|
14
|
+
program
|
|
15
|
+
.command("status")
|
|
16
|
+
.description('Quick "am I ready to work" summary: auth, org, project, connection, tables, keys')
|
|
17
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
18
|
+
.action(async function () {
|
|
19
|
+
const options = this.optsWithGlobals();
|
|
20
|
+
await runWithErrorHandling(() => runStatus(options), options);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async function runStatus(options) {
|
|
24
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
25
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
26
|
+
const { data } = await client.get(`/api/v1/projects/${projectId}/context`);
|
|
27
|
+
if (options.json) {
|
|
28
|
+
printJson({ authenticated: true, ...data });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const connectionConnected = data.connection?.status === "CONNECTED";
|
|
32
|
+
printKeyValueBlock([
|
|
33
|
+
["Authentication", "✓"],
|
|
34
|
+
["Organisation", data.organisation?.name ?? "—"],
|
|
35
|
+
["Project", data.project.name],
|
|
36
|
+
[
|
|
37
|
+
"Dataverse connection",
|
|
38
|
+
data.connection ? (connectionConnected ? "✓" : data.connection.status) : "✗ not connected"
|
|
39
|
+
],
|
|
40
|
+
["Tables available", String(data.tableCounts.available)],
|
|
41
|
+
["Tables enabled", String(data.tableCounts.enabled)],
|
|
42
|
+
["API keys", `${data.apiKeys.length} active`],
|
|
43
|
+
["API", resolveApiUrl(options.apiUrl)]
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,qBAAqB,EAAE,0CAA0C,CAAC;SACzE,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAiB,CAAC;QACtD,MAAM,oBAAoB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAsB;IAC7C,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,oBAAoB,SAAS,UAAU,CACxC,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,WAAW,CAAC;IACpE,kBAAkB,CAAC;QACjB,CAAC,gBAAgB,EAAE,GAAG,CAAC;QACvB,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,GAAG,CAAC;QAChD,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9B;YACE,sBAAsB;YACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB;SAC3F;QACD,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC;QAC7C,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;KACvC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/commands/tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B5D"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { resolveActiveProjectId } from "../active-project.js";
|
|
2
|
+
import { requireControlPlaneClient } from "../http/authenticated-client.js";
|
|
3
|
+
import { printJson, printKeyValueBlock, printLine } from "../output/print.js";
|
|
4
|
+
import { renderTable } from "../output/table.js";
|
|
5
|
+
import { runWithErrorHandling } from "../report-error.js";
|
|
6
|
+
export function registerTablesCommand(program) {
|
|
7
|
+
const tables = program.command("tables").description("Inspect the active project's tables");
|
|
8
|
+
tables
|
|
9
|
+
.command("list")
|
|
10
|
+
.description("List every table AxtraBase can see in the connected Dataverse environment")
|
|
11
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
12
|
+
.option("--custom", "only custom tables")
|
|
13
|
+
.option("--standard", "only standard (out-of-the-box) tables")
|
|
14
|
+
.option("--enabled", "only tables enabled for API access")
|
|
15
|
+
.option("--disabled", "only tables not yet enabled for API access")
|
|
16
|
+
.option("--search <term>", "filter by logical or display name (case-insensitive substring)")
|
|
17
|
+
.option("--api-key <id>", "show this API key's per-table CRUD access in the ACCESS column")
|
|
18
|
+
.action(async function () {
|
|
19
|
+
const options = this.optsWithGlobals();
|
|
20
|
+
await runWithErrorHandling(() => runList(options), options);
|
|
21
|
+
});
|
|
22
|
+
tables
|
|
23
|
+
.command("describe <table>")
|
|
24
|
+
.description("Show one table's columns, lookups, and known permissions")
|
|
25
|
+
.option("--project <project>", "override the active project (id or slug)")
|
|
26
|
+
.action(async function (table, _opts, command) {
|
|
27
|
+
const options = command.optsWithGlobals();
|
|
28
|
+
await runWithErrorHandling(() => runDescribe(table, options), options);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function accessShorthand(permissions) {
|
|
32
|
+
return ((permissions.read ? "R" : "-") +
|
|
33
|
+
(permissions.create ? "C" : "-") +
|
|
34
|
+
(permissions.update ? "U" : "-") +
|
|
35
|
+
(permissions.delete ? "D" : "-"));
|
|
36
|
+
}
|
|
37
|
+
async function runList(options) {
|
|
38
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
39
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
40
|
+
const { data } = await client.get(`/api/v1/projects/${projectId}/tables`, {
|
|
41
|
+
apiKeyId: options.apiKey
|
|
42
|
+
});
|
|
43
|
+
const search = options.search?.toLowerCase();
|
|
44
|
+
const filtered = data.filter((table) => {
|
|
45
|
+
if (options.custom && !table.isCustom)
|
|
46
|
+
return false;
|
|
47
|
+
if (options.standard && table.isCustom)
|
|
48
|
+
return false;
|
|
49
|
+
if (options.enabled && !table.isEnabled)
|
|
50
|
+
return false;
|
|
51
|
+
if (options.disabled && table.isEnabled)
|
|
52
|
+
return false;
|
|
53
|
+
if (search &&
|
|
54
|
+
!table.logicalName.toLowerCase().includes(search) &&
|
|
55
|
+
!table.displayName.toLowerCase().includes(search)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
});
|
|
60
|
+
if (options.json) {
|
|
61
|
+
printJson(filtered);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (filtered.length === 0) {
|
|
65
|
+
printLine("No tables match.");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const headers = ["TABLE", "LOGICAL NAME", "TYPE", "ENABLED"];
|
|
69
|
+
if (options.apiKey)
|
|
70
|
+
headers.push("ACCESS");
|
|
71
|
+
printLine(renderTable(headers, filtered.map((table) => {
|
|
72
|
+
const row = [
|
|
73
|
+
table.displayName,
|
|
74
|
+
table.logicalName,
|
|
75
|
+
table.isCustom ? "Custom" : "Standard",
|
|
76
|
+
table.isEnabled ? "yes" : "no"
|
|
77
|
+
];
|
|
78
|
+
if (options.apiKey)
|
|
79
|
+
row.push(accessShorthand(table.permissions));
|
|
80
|
+
return row;
|
|
81
|
+
})));
|
|
82
|
+
}
|
|
83
|
+
async function runDescribe(tableName, options) {
|
|
84
|
+
const client = requireControlPlaneClient({ apiUrl: options.apiUrl });
|
|
85
|
+
const projectId = await resolveActiveProjectId(client, options.project);
|
|
86
|
+
const { data } = await client.get(`/api/v1/projects/${projectId}/tables/${tableName}/metadata`);
|
|
87
|
+
if (options.json) {
|
|
88
|
+
printJson({
|
|
89
|
+
...data,
|
|
90
|
+
metadataGaps: [
|
|
91
|
+
"Incoming (one-to-many) relationships are not resolved.",
|
|
92
|
+
"Choice/option-set values are not resolved — only which columns are choice-typed."
|
|
93
|
+
]
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
printKeyValueBlock([
|
|
98
|
+
["Table", data.displayName],
|
|
99
|
+
["Logical name", data.logicalName],
|
|
100
|
+
["Entity set", data.entitySetName],
|
|
101
|
+
["Type", data.isCustomEntity ? "Custom" : "Standard"],
|
|
102
|
+
["Primary ID", data.primaryIdAttribute],
|
|
103
|
+
["Primary name", data.primaryNameAttribute ?? "—"]
|
|
104
|
+
]);
|
|
105
|
+
printLine();
|
|
106
|
+
printLine("Columns:");
|
|
107
|
+
printLine(renderTable(["LOGICAL NAME", "TYPE", "REQUIRED", "LOOKUP TARGET"], data.columns.map((column) => [
|
|
108
|
+
column.logicalName,
|
|
109
|
+
column.type,
|
|
110
|
+
column.isRequired ? "yes" : "no",
|
|
111
|
+
column.lookupTargets?.join(", ") || "—"
|
|
112
|
+
])));
|
|
113
|
+
if (data.permissions.length > 0) {
|
|
114
|
+
printLine();
|
|
115
|
+
printLine("Permissions:");
|
|
116
|
+
printLine(renderTable(["API KEY", "PREFIX", "ACCESS"], data.permissions.map((permission) => [
|
|
117
|
+
permission.apiKeyName,
|
|
118
|
+
permission.apiKeyPrefix,
|
|
119
|
+
(permission.canRead ? "R" : "-") +
|
|
120
|
+
(permission.canCreate ? "C" : "-") +
|
|
121
|
+
(permission.canUpdate ? "U" : "-") +
|
|
122
|
+
(permission.canDelete ? "D" : "-")
|
|
123
|
+
])));
|
|
124
|
+
}
|
|
125
|
+
printLine();
|
|
126
|
+
printLine("Note: incoming relationships and choice-option values are not resolved yet —");
|
|
127
|
+
printLine("only outgoing lookups (above) and which columns are choice-typed are known.");
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/commands/tables.ts"],"names":[],"mappings":"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"}
|