@axtrabase/cli 0.1.5 → 0.1.6

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.
@@ -0,0 +1,10 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * File and image column content (Sprint #12 P0-1). Reading needs the same
4
+ * table grant as reading the record; writing needs update access.
5
+ *
6
+ * Content streams to and from disk rather than through memory, so a large
7
+ * attachment is not this process's problem to hold.
8
+ */
9
+ export declare function registerFilesCommand(program: Command): void;
10
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkD3D"}
@@ -0,0 +1,138 @@
1
+ import { createReadStream, createWriteStream, existsSync, statSync } from "node:fs";
2
+ import { basename } from "node:path";
3
+ import { Readable } from "node:stream";
4
+ import { pipeline } from "node:stream/promises";
5
+ import { requireTableClient } from "../http/authenticated-client.js";
6
+ import { CliError } from "../http/errors.js";
7
+ import { printJson, printLine } from "../output/print.js";
8
+ import { runWithErrorHandling } from "../report-error.js";
9
+ const FILES_EXAMPLES = [
10
+ "",
11
+ "Examples:",
12
+ " axtrabase files download adp_expenseitem <record-id> adp_receipt -o receipt.pdf",
13
+ " axtrabase files download adp_expenseitem <record-id> adp_photo --thumbnail -o thumb.png",
14
+ " axtrabase files upload adp_expenseitem <record-id> adp_receipt ./receipt.pdf",
15
+ "",
16
+ "Files are data-plane content: they use AXTRABASE_API_KEY, never your CLI login."
17
+ ].join("\n");
18
+ /**
19
+ * File and image column content (Sprint #12 P0-1). Reading needs the same
20
+ * table grant as reading the record; writing needs update access.
21
+ *
22
+ * Content streams to and from disk rather than through memory, so a large
23
+ * attachment is not this process's problem to hold.
24
+ */
25
+ export function registerFilesCommand(program) {
26
+ const files = program
27
+ .command("files")
28
+ .description("Read and write file/image column content (needs AXTRABASE_API_KEY)")
29
+ .addHelpText("after", FILES_EXAMPLES);
30
+ files
31
+ .command("download")
32
+ .description("Download a file or image column's content")
33
+ .argument("<table>", "the table's logical name")
34
+ .argument("<record-id>", "the record's GUID")
35
+ .argument("<column>", "the file or image column's logical name")
36
+ .option("-o, --output <path>", "write to this path (default: the name Dataverse reports)")
37
+ .option("--force", "overwrite the output file if it already exists")
38
+ .option("--thumbnail", "image columns: fetch the stored thumbnail rather than the original")
39
+ .action(async function (table, recordId, column) {
40
+ const options = this.optsWithGlobals();
41
+ await runWithErrorHandling(() => runDownload(table, recordId, column, options), options);
42
+ });
43
+ files
44
+ .command("upload")
45
+ .description("Replace a file or image column's content")
46
+ .argument("<table>", "the table's logical name")
47
+ .argument("<record-id>", "the record's GUID")
48
+ .argument("<column>", "the file or image column's logical name")
49
+ .argument("<path>", "the local file to upload")
50
+ .option("--name <name>", "store it under this name (default: the local file's name)")
51
+ .option("--content-type <type>", "the file's media type (default: application/octet-stream)")
52
+ .action(async function (table, recordId, column, path) {
53
+ const options = this.optsWithGlobals();
54
+ await runWithErrorHandling(() => runUpload(table, recordId, column, path, options), options);
55
+ });
56
+ files
57
+ .command("delete")
58
+ .description("Clear a file or image column's content")
59
+ .argument("<table>", "the table's logical name")
60
+ .argument("<record-id>", "the record's GUID")
61
+ .argument("<column>", "the file or image column's logical name")
62
+ .action(async function (table, recordId, column) {
63
+ const options = this.optsWithGlobals();
64
+ await runWithErrorHandling(() => runDelete(table, recordId, column, options), options);
65
+ });
66
+ }
67
+ /**
68
+ * Where the bytes go. Writing to a path is the default because a terminal is
69
+ * a poor place to put a PDF; `-o -` is the explicit opt-in to stdout for
70
+ * piping, and is the only case where nothing is written to disk.
71
+ */
72
+ function resolveOutputPath(requested, reportedName, column) {
73
+ if (requested)
74
+ return requested;
75
+ // Dataverse's own name is used when it gives one — never a guess from the
76
+ // column's type, which would put the wrong extension on the file.
77
+ return reportedName ?? column;
78
+ }
79
+ async function runDownload(table, recordId, column, options) {
80
+ const client = requireTableClient(table, { apiUrl: options.apiUrl });
81
+ const file = await client.downloadFile(recordId, column, {
82
+ ...(options.thumbnail ? { size: "thumbnail" } : {})
83
+ });
84
+ const toStdout = options.output === "-";
85
+ const target = toStdout ? "-" : resolveOutputPath(options.output, file.fileName, column);
86
+ if (!toStdout && existsSync(target) && !options.force) {
87
+ throw new CliError("AXTRA_CLI_FILE_EXISTS", `${target} already exists. Pass --force to overwrite it.`, { status: 0 });
88
+ }
89
+ const destination = toStdout ? process.stdout : createWriteStream(target);
90
+ await pipeline(Readable.fromWeb(file.body), destination);
91
+ if (toStdout)
92
+ return;
93
+ if (options.json) {
94
+ printJson({
95
+ table,
96
+ recordId,
97
+ column,
98
+ output: target,
99
+ contentType: file.contentType,
100
+ ...(file.fileName ? { fileName: file.fileName } : {}),
101
+ isThumbnailOnly: file.isThumbnailOnly,
102
+ requestId: file.requestId
103
+ });
104
+ return;
105
+ }
106
+ printLine(`Saved ${target} (${file.contentType}).`);
107
+ if (file.isThumbnailOnly) {
108
+ // The bytes look like an image either way, so a caller expecting the
109
+ // original would otherwise never find out it did not get one.
110
+ printLine("This image column stores only a thumbnail, so that is what this is — the full-size original is not kept.");
111
+ }
112
+ }
113
+ async function runUpload(table, recordId, column, path, options) {
114
+ if (!existsSync(path) || !statSync(path).isFile()) {
115
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", `${path} is not a file.`, { status: 0 });
116
+ }
117
+ const client = requireTableClient(table, { apiUrl: options.apiUrl });
118
+ const body = Readable.toWeb(createReadStream(path));
119
+ const { requestId } = await client.uploadFile(recordId, column, body, {
120
+ fileName: options.name ?? basename(path),
121
+ ...(options.contentType ? { contentType: options.contentType } : {})
122
+ });
123
+ if (options.json) {
124
+ printJson({ table, recordId, column, uploaded: true, requestId });
125
+ return;
126
+ }
127
+ printLine(`Uploaded ${basename(path)} to ${table}.${column}.`);
128
+ }
129
+ async function runDelete(table, recordId, column, options) {
130
+ const client = requireTableClient(table, { apiUrl: options.apiUrl });
131
+ const result = await client.deleteFile(recordId, column);
132
+ if (options.json) {
133
+ printJson({ table, recordId, column, ...result.data, requestId: result.requestId });
134
+ return;
135
+ }
136
+ printLine(`Cleared ${table}.${column}.`);
137
+ }
138
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { FilterExpression } from "@axtrabase/sdk";
2
+ import type { Command } from "commander";
3
+ /**
4
+ * The first data-plane READ command in this CLI. It exists because a
5
+ * clean-room tester could understand a schema completely and still not
6
+ * answer "show me this week's claims" without paging a whole table by hand.
7
+ *
8
+ * `--where` covers the common case in a form that is quick to type;
9
+ * `--filter` takes the full expression, the same JSON the SDK sends. Both
10
+ * are validated server-side against the table's real metadata — this CLI
11
+ * never builds OData, and neither does the caller.
12
+ */
13
+ export declare function registerRecordsCommand(program: Command): void;
14
+ /** `adp_status=1`, `adp_amount:gt=100`, `adp_name:contains=taxi`. */
15
+ export declare function parseWhere(conditions: string[]): FilterExpression;
16
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/commands/records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB7D;AAwBD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAmCjE"}
@@ -0,0 +1,182 @@
1
+ import { requireTableClient } from "../http/authenticated-client.js";
2
+ import { CliError } from "../http/errors.js";
3
+ import { printJson, printLine } from "../output/print.js";
4
+ import { renderTable } from "../output/table.js";
5
+ import { runWithErrorHandling } from "../report-error.js";
6
+ const RECORDS_EXAMPLES = [
7
+ "",
8
+ "Examples:",
9
+ " axtrabase records list adp_expenseitem --where adp_status=1 --count",
10
+ " axtrabase records list adp_expenseitem --where adp_amount:gt=100 --order-by createdon:desc",
11
+ ' axtrabase records list adp_expenseitem --filter \'{"or":[{"adp_status":{"eq":1}},{"adp_status":{"eq":2}}]}\'',
12
+ "",
13
+ "Reads use a project API key (AXTRABASE_API_KEY), never your CLI login."
14
+ ].join("\n");
15
+ /**
16
+ * The first data-plane READ command in this CLI. It exists because a
17
+ * clean-room tester could understand a schema completely and still not
18
+ * answer "show me this week's claims" without paging a whole table by hand.
19
+ *
20
+ * `--where` covers the common case in a form that is quick to type;
21
+ * `--filter` takes the full expression, the same JSON the SDK sends. Both
22
+ * are validated server-side against the table's real metadata — this CLI
23
+ * never builds OData, and neither does the caller.
24
+ */
25
+ export function registerRecordsCommand(program) {
26
+ const records = program
27
+ .command("records")
28
+ .description("Read records through the data plane (needs AXTRABASE_API_KEY)");
29
+ records
30
+ .command("list")
31
+ .description("List records from a table, with optional filtering, sorting and a count")
32
+ .argument("<table>", "the table's logical name")
33
+ .option("--limit <n>", "rows per page (1-100)")
34
+ .option("--select <columns>", "comma-separated columns to return")
35
+ .option("--where <condition...>", "column=value, or column:op=value (op: eq, ne, gt, ge, lt, le, contains, startswith). Repeatable; all must hold")
36
+ .option("--filter <json>", "the full filter expression as JSON — supports and/or/not")
37
+ .option("--order-by <columns>", "comma-separated column[:asc|desc]")
38
+ .option("--count", "also report how many rows match")
39
+ .addHelpText("after", RECORDS_EXAMPLES)
40
+ .action(async function (table) {
41
+ const options = this.optsWithGlobals();
42
+ await runWithErrorHandling(() => runList(table, options), options);
43
+ });
44
+ }
45
+ const WHERE_OPERATORS = ["eq", "ne", "gt", "ge", "lt", "le", "contains", "startswith"];
46
+ function isWhereOperator(value) {
47
+ return WHERE_OPERATORS.includes(value);
48
+ }
49
+ /**
50
+ * `--where` values arrive as text, so a bare `1` is ambiguous between the
51
+ * number 1 and the string "1". Numbers and booleans are the readings a
52
+ * caller almost always means; anything else stays a string, and the server
53
+ * rejects a mismatch against the column's real type rather than guessing
54
+ * further.
55
+ */
56
+ function coerce(raw) {
57
+ if (raw === "true")
58
+ return true;
59
+ if (raw === "false")
60
+ return false;
61
+ if (raw !== "" && !Number.isNaN(Number(raw)))
62
+ return Number(raw);
63
+ return raw;
64
+ }
65
+ /** `adp_status=1`, `adp_amount:gt=100`, `adp_name:contains=taxi`. */
66
+ export function parseWhere(conditions) {
67
+ const leaf = {};
68
+ for (const condition of conditions) {
69
+ const separator = condition.indexOf("=");
70
+ if (separator < 1) {
71
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", `--where expects column=value or column:operator=value, received "${condition}".`, { status: 0 });
72
+ }
73
+ const left = condition.slice(0, separator);
74
+ const value = condition.slice(separator + 1);
75
+ const [column, operator = "eq"] = left.split(":");
76
+ if (!column) {
77
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", "--where expects a column name.", {
78
+ status: 0
79
+ });
80
+ }
81
+ if (!isWhereOperator(operator)) {
82
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", `Unknown --where operator "${operator}". Use one of: ${WHERE_OPERATORS.join(", ")}, or --filter for anything more complex.`, { status: 0 });
83
+ }
84
+ const existing = leaf[column] ?? {};
85
+ existing[operator] = coerce(value);
86
+ leaf[column] = existing;
87
+ }
88
+ return leaf;
89
+ }
90
+ function parseFilterJson(raw) {
91
+ try {
92
+ return JSON.parse(raw);
93
+ }
94
+ catch {
95
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", '--filter expects JSON, e.g. \'{"adp_status":{"eq":1}}\'.', { status: 0 });
96
+ }
97
+ }
98
+ function parseOrderBy(raw) {
99
+ return raw
100
+ .split(",")
101
+ .map((entry) => entry.trim())
102
+ .filter(Boolean)
103
+ .map((entry) => {
104
+ const [column, direction] = entry.split(":");
105
+ if (!column) {
106
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", "--order-by expects a column name.", {
107
+ status: 0
108
+ });
109
+ }
110
+ if (direction !== undefined && direction !== "asc" && direction !== "desc") {
111
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", `--order-by direction must be asc or desc, received "${direction}".`, { status: 0 });
112
+ }
113
+ return direction ? { column, direction } : { column };
114
+ });
115
+ }
116
+ function parseLimit(raw) {
117
+ if (raw === undefined)
118
+ return undefined;
119
+ const limit = Number(raw);
120
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
121
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", "--limit must be a whole number from 1 to 100.", {
122
+ status: 0
123
+ });
124
+ }
125
+ return limit;
126
+ }
127
+ /** Cells are values from a customer's own data, so they are printed as-is but never interpreted. */
128
+ function cell(value) {
129
+ if (value === null || value === undefined)
130
+ return "";
131
+ if (typeof value === "object")
132
+ return JSON.stringify(value);
133
+ return String(value);
134
+ }
135
+ async function runList(table, options) {
136
+ if (options.filter && options.where?.length) {
137
+ throw new CliError("AXTRA_CLI_VALIDATION_ERROR", "Use --where or --filter, not both. --filter takes the full expression.", { status: 0 });
138
+ }
139
+ const filter = options.filter
140
+ ? parseFilterJson(options.filter)
141
+ : options.where?.length
142
+ ? parseWhere(options.where)
143
+ : undefined;
144
+ const client = requireTableClient(table, { apiUrl: options.apiUrl });
145
+ const result = await client.list({
146
+ limit: parseLimit(options.limit),
147
+ ...(options.select ? { select: options.select.split(",").map((c) => c.trim()) } : {}),
148
+ ...(filter ? { filter } : {}),
149
+ ...(options.orderBy ? { orderBy: parseOrderBy(options.orderBy) } : {}),
150
+ ...(options.count ? { count: true } : {})
151
+ });
152
+ if (options.json) {
153
+ printJson({
154
+ data: result.data,
155
+ nextCursor: result.nextCursor,
156
+ ...(result.totalCount ? { totalCount: result.totalCount } : {})
157
+ });
158
+ return;
159
+ }
160
+ if (result.data.length === 0) {
161
+ printLine("No records match.");
162
+ }
163
+ else {
164
+ // Columns come from the rows themselves rather than a fixed list: the
165
+ // caller may have used --select, and every table's shape differs.
166
+ const columns = Object.keys(result.data[0] ?? {}).filter((key) => !key.startsWith("@"));
167
+ printLine(renderTable(columns, result.data.map((record) => columns.map((column) => cell(record[column])))));
168
+ }
169
+ if (result.totalCount) {
170
+ printLine();
171
+ // Dataverse stops counting at 5,000 rows for a standard table. Saying
172
+ // "5000" flat would read as an exact total it is not.
173
+ printLine(result.totalCount.isLowerBound
174
+ ? `Matching rows: at least ${result.totalCount.value} (Dataverse stops counting here).`
175
+ : `Matching rows: ${result.totalCount.value}.`);
176
+ }
177
+ if (result.nextCursor) {
178
+ printLine();
179
+ printLine("More rows are available. Use --json to read nextCursor and page through them.");
180
+ }
181
+ }
182
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/commands/records.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type EventsClient } from "@axtrabase/sdk";
1
+ import { type EventsClient, type TableClient } from "@axtrabase/sdk";
2
2
  import { ControlPlaneClient } from "./client.js";
3
3
  export interface ClientOverrides {
4
4
  apiUrl?: string;
@@ -21,4 +21,12 @@ export declare function requireControlPlaneClient(overrides?: ClientOverrides):
21
21
  * `ControlPlaneClient` for this, and never a third credential model.
22
22
  */
23
23
  export declare function requireEventsClient(overrides?: ClientOverrides): EventsClient;
24
+ /**
25
+ * A data-plane table client, on the same credential rules as
26
+ * `requireEventsClient` above: a project API key, never the CLI token.
27
+ * Reading records is what a key is FOR, so the error here says how to get
28
+ * one and how to have it granted — the two steps a clean-room tester had to
29
+ * discover separately.
30
+ */
31
+ export declare function requireTableClient(table: string, overrides?: ClientOverrides): TableClient;
24
32
  //# sourceMappingURL=authenticated-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticated-client.d.ts","sourceRoot":"","sources":["../../src/http/authenticated-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,yJAAyJ;AACzJ,wBAAgB,wBAAwB,CAAC,SAAS,GAAE,eAAoB,GAAG,kBAAkB,CAM5F;AAED,+LAA+L;AAC/L,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,eAAoB,GAAG,kBAAkB,CAc7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,GAAE,eAAoB,GAAG,YAAY,CA+BjF"}
1
+ {"version":3,"file":"authenticated-client.d.ts","sourceRoot":"","sources":["../../src/http/authenticated-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,yJAAyJ;AACzJ,wBAAgB,wBAAwB,CAAC,SAAS,GAAE,eAAoB,GAAG,kBAAkB,CAM5F;AAED,+LAA+L;AAC/L,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,eAAoB,GAAG,kBAAkB,CAc7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,GAAE,eAAoB,GAAG,YAAY,CA+BjF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,eAAoB,GAAG,WAAW,CAgB9F"}
@@ -58,4 +58,24 @@ export function requireEventsClient(overrides = {}) {
58
58
  }
59
59
  return events;
60
60
  }
61
+ /**
62
+ * A data-plane table client, on the same credential rules as
63
+ * `requireEventsClient` above: a project API key, never the CLI token.
64
+ * Reading records is what a key is FOR, so the error here says how to get
65
+ * one and how to have it granted — the two steps a clean-room tester had to
66
+ * discover separately.
67
+ */
68
+ export function requireTableClient(table, overrides = {}) {
69
+ const apiKey = resolveApiKey();
70
+ if (!apiKey) {
71
+ throw new CliError("AXTRA_CLI_NO_API_KEY", "No API key available. Records are data-plane resources authenticated by a project API key, not your CLI login.\n\n" +
72
+ "Create one if you don't have one yet:\n" +
73
+ " axtrabase keys create --name <name>\n\n" +
74
+ "Grant it the tables you need to read:\n" +
75
+ " axtrabase permissions grant <key-id> <table>\n\n" +
76
+ "Then set it for this shell (never persisted or logged by this CLI):\n" +
77
+ " export AXTRABASE_API_KEY=<the printed key>", { status: 0 });
78
+ }
79
+ return new AxtraBase({ apiKey, baseUrl: resolveApiUrl(overrides.apiUrl) }).table(table);
80
+ }
61
81
  //# sourceMappingURL=authenticated-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticated-client.js","sourceRoot":"","sources":["../../src/http/authenticated-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC,yJAAyJ;AACzJ,MAAM,UAAU,wBAAwB,CAAC,YAA6B,EAAE;IACtE,OAAO,IAAI,kBAAkB,CAAC;QAC5B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;QACxC,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK;QAC5B,cAAc,EAAE,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAED,+LAA+L;AAC/L,MAAM,UAAU,yBAAyB,CAAC,YAA6B,EAAE;IACvE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAChB,yBAAyB,EACzB,2FAA2F,EAC3F,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,kBAAkB,CAAC;QAC5B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;QACxC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,cAAc,EAAE,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAA6B,EAAE;IACjE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,mHAAmH;YACjH,yCAAyC;YACzC,2CAA2C;YAC3C,uEAAuE;YACvE,8CAA8C,EAChD,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,+DAA+D;QAC/D,iEAAiE;QACjE,kEAAkE;QAClE,sEAAsE;QACtE,iEAAiE;QACjE,iEAAiE;QACjE,mEAAmE;QACnE,uBAAuB;QACvB,MAAM,IAAI,QAAQ,CAChB,2BAA2B,EAC3B,sEAAsE;YACpE,qCAAqC,EACvC,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"authenticated-client.js","sourceRoot":"","sources":["../../src/http/authenticated-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuC,MAAM,gBAAgB,CAAC;AAChF,OAAO,EACL,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC,yJAAyJ;AACzJ,MAAM,UAAU,wBAAwB,CAAC,YAA6B,EAAE;IACtE,OAAO,IAAI,kBAAkB,CAAC;QAC5B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;QACxC,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK;QAC5B,cAAc,EAAE,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAED,+LAA+L;AAC/L,MAAM,UAAU,yBAAyB,CAAC,YAA6B,EAAE;IACvE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAChB,yBAAyB,EACzB,2FAA2F,EAC3F,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,kBAAkB,CAAC;QAC5B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;QACxC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,cAAc,EAAE,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAA6B,EAAE;IACjE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,mHAAmH;YACjH,yCAAyC;YACzC,2CAA2C;YAC3C,uEAAuE;YACvE,8CAA8C,EAChD,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,+DAA+D;QAC/D,iEAAiE;QACjE,kEAAkE;QAClE,sEAAsE;QACtE,iEAAiE;QACjE,iEAAiE;QACjE,mEAAmE;QACnE,uBAAuB;QACvB,MAAM,IAAI,QAAQ,CAChB,2BAA2B,EAC3B,sEAAsE;YACpE,qCAAqC,EACvC,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,YAA6B,EAAE;IAC/E,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,oHAAoH;YAClH,yCAAyC;YACzC,2CAA2C;YAC3C,yCAAyC;YACzC,oDAAoD;YACpD,uEAAuE;YACvE,8CAA8C,EAChD,EAAE,MAAM,EAAE,CAAC,EAAE,CACd,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1F,CAAC"}
package/dist/index.js CHANGED
@@ -11,6 +11,8 @@ import { registerLogoutCommand } from "./commands/logout.js";
11
11
  import { registerOpenApiCommand } from "./commands/openapi.js";
12
12
  import { registerOrganisationsCommand } from "./commands/organisations.js";
13
13
  import { registerPermissionsCommand } from "./commands/permissions.js";
14
+ import { registerFilesCommand } from "./commands/files.js";
15
+ import { registerRecordsCommand } from "./commands/records.js";
14
16
  import { registerProjectsCommand } from "./commands/projects.js";
15
17
  import { registerRequestsCommand } from "./commands/requests.js";
16
18
  import { registerSchemaCommand } from "./commands/schema.js";
@@ -40,6 +42,8 @@ registerStatusCommand(program);
40
42
  registerContextCommand(program);
41
43
  registerSchemaCommand(program);
42
44
  registerPermissionsCommand(program);
45
+ registerRecordsCommand(program);
46
+ registerFilesCommand(program);
43
47
  registerKeysCommand(program);
44
48
  registerRequestsCommand(program);
45
49
  registerEventsCommand(program);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CACV,6FAA6F;IAC3F,kGAAkG,CACrG;KACA,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,uBAAuB,CAAC;KAC1D,MAAM,CAAC,QAAQ,EAAE,4DAA4D,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;KAC5E,MAAM,CAAC,SAAS,EAAE,uDAAuD,CAAC;KAC1E,YAAY,EAAE,CAAC;AAElB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,4BAA4B,CAAC,OAAO,CAAC,CAAC;AACtC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,IAAI,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,uEAAuE;QACvE,sEAAsE;QACtE,iEAAiE;QACjE,oEAAoE;QACpE,mEAAmE;QACnE,mCAAmC;QACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  /** Bump alongside package.json's version — read at runtime for --version and the X-AxtraBase-Client User-Agent, same convention as @axtrabase/sdk's SDK_VERSION. */
2
- export declare const CLI_VERSION = "0.1.5";
2
+ export declare const CLI_VERSION = "0.1.6";
3
3
  export declare const CLI_CLIENT_NAME = "axtrabase-cli";
4
4
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  /** Bump alongside package.json's version — read at runtime for --version and the X-AxtraBase-Client User-Agent, same convention as @axtrabase/sdk's SDK_VERSION. */
2
- export const CLI_VERSION = "0.1.5";
2
+ export const CLI_VERSION = "0.1.6";
3
3
  export const CLI_CLIENT_NAME = "axtrabase-cli";
4
4
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axtrabase/cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "The AxtraBase CLI — inspect an AxtraBase project's schema, permissions, and environment, and build against it without touching Dataverse directly.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -34,7 +34,7 @@
34
34
  ],
35
35
  "dependencies": {
36
36
  "commander": "^12.1.0",
37
- "@axtrabase/sdk": "^0.1.1"
37
+ "@axtrabase/sdk": "^0.1.2"
38
38
  },
39
39
  "devDependencies": {
40
40
  "typescript": "^5.5.3",