gitsheets-axi 2.0.0 → 2.2.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/dist/src/cli.d.ts +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +17 -9
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/count.d.ts +4 -0
- package/dist/src/commands/count.d.ts.map +1 -0
- package/dist/src/commands/count.js +84 -0
- package/dist/src/commands/count.js.map +1 -0
- package/dist/src/commands/delete.d.ts +1 -1
- package/dist/src/commands/delete.d.ts.map +1 -1
- package/dist/src/commands/delete.js +132 -43
- package/dist/src/commands/delete.js.map +1 -1
- package/dist/src/commands/distinct.d.ts +4 -0
- package/dist/src/commands/distinct.d.ts.map +1 -0
- package/dist/src/commands/distinct.js +81 -0
- package/dist/src/commands/distinct.js.map +1 -0
- package/dist/src/commands/home.js +2 -2
- package/dist/src/commands/home.js.map +1 -1
- package/dist/src/commands/patch.d.ts +1 -1
- package/dist/src/commands/patch.d.ts.map +1 -1
- package/dist/src/commands/patch.js +238 -49
- package/dist/src/commands/patch.js.map +1 -1
- package/dist/src/commands/query.d.ts +1 -1
- package/dist/src/commands/query.d.ts.map +1 -1
- package/dist/src/commands/query.js +129 -58
- package/dist/src/commands/query.js.map +1 -1
- package/dist/src/commands/rename.d.ts +4 -0
- package/dist/src/commands/rename.d.ts.map +1 -0
- package/dist/src/commands/rename.js +131 -0
- package/dist/src/commands/rename.js.map +1 -0
- package/dist/src/commands/sheets.js +15 -6
- package/dist/src/commands/sheets.js.map +1 -1
- package/dist/src/commands/upsert.d.ts +9 -1
- package/dist/src/commands/upsert.d.ts.map +1 -1
- package/dist/src/commands/upsert.js +134 -33
- package/dist/src/commands/upsert.js.map +1 -1
- package/dist/src/output/sheet-schema.d.ts +2 -3
- package/dist/src/output/sheet-schema.d.ts.map +1 -1
- package/dist/src/output/sheet-schema.js +3 -5
- package/dist/src/output/sheet-schema.js.map +1 -1
- package/dist/src/util/aggregate.d.ts +13 -0
- package/dist/src/util/aggregate.d.ts.map +1 -0
- package/dist/src/util/aggregate.js +44 -0
- package/dist/src/util/aggregate.js.map +1 -0
- package/dist/src/util/export-file.d.ts +22 -0
- package/dist/src/util/export-file.d.ts.map +1 -0
- package/dist/src/util/export-file.js +67 -0
- package/dist/src/util/export-file.js.map +1 -0
- package/dist/src/util/filter.d.ts +30 -0
- package/dist/src/util/filter.d.ts.map +1 -0
- package/dist/src/util/filter.js +138 -0
- package/dist/src/util/filter.js.map +1 -0
- package/dist/src/util/hints.d.ts +8 -0
- package/dist/src/util/hints.d.ts.map +1 -0
- package/dist/src/util/hints.js +8 -0
- package/dist/src/util/hints.js.map +1 -0
- package/dist/src/util/open-sheet.d.ts +13 -0
- package/dist/src/util/open-sheet.d.ts.map +1 -0
- package/dist/src/util/open-sheet.js +31 -0
- package/dist/src/util/open-sheet.js.map +1 -0
- package/dist/src/util/parse-records.d.ts +26 -0
- package/dist/src/util/parse-records.d.ts.map +1 -0
- package/dist/src/util/parse-records.js +76 -0
- package/dist/src/util/parse-records.js.map +1 -0
- package/package.json +3 -2
|
@@ -1,20 +1,36 @@
|
|
|
1
1
|
import { AxiError } from 'axi-sdk-js';
|
|
2
2
|
import { translateError } from '../errors.js';
|
|
3
|
-
import { renderObject } from '../output/render.js';
|
|
3
|
+
import { joinBlocks, renderHelp, renderList, renderObject } from '../output/render.js';
|
|
4
|
+
import { field } from '../output/schema.js';
|
|
4
5
|
import { readStdin } from '../util/stdin.js';
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
import { openSheetForCommand } from '../util/open-sheet.js';
|
|
7
|
+
import { parseRecordsInput, recordLabel } from '../util/parse-records.js';
|
|
8
|
+
import { MATERIALIZE_HINT } from '../util/hints.js';
|
|
9
|
+
const PATH_KEY = Symbol.for('gitsheets-path');
|
|
10
|
+
export const UPSERT_HELP = `usage: gitsheets-axi upsert <sheet> [--data <json>] [--delete-missing] [--dry-run] [--allow-missing-body] [--prefix p] [--message m]
|
|
11
|
+
flags[6]:
|
|
7
12
|
--data <json> Record JSON inline. If omitted, reads stdin.
|
|
13
|
+
--delete-missing After upserting, delete existing records NOT in the input
|
|
14
|
+
set (make the sheet exactly match the batch). One commit.
|
|
15
|
+
--dry-run Preview {will-change, no-op, invalid, delete} — no commit.
|
|
8
16
|
--allow-missing-body Content-typed sheets only — permit upsert without body field
|
|
9
17
|
--prefix <p> Tenant sub-tree scope
|
|
10
18
|
--message <m> Commit message (default: "<sheet> upsert <path>")
|
|
19
|
+
bulk:
|
|
20
|
+
Input may be a single JSON object, a JSON array of objects, or NDJSON (one
|
|
21
|
+
compact object per line) — autodetected. A batch upserts in ONE commit.
|
|
11
22
|
examples:
|
|
12
|
-
gitsheets-axi upsert users --data '{"slug":"jane","email":"jane@x.org"}'
|
|
13
23
|
echo '{"slug":"jane","email":"jane@x.org"}' | gitsheets-axi upsert users
|
|
24
|
+
jq -c '.[]' repos.json | gitsheets-axi upsert repos # NDJSON, one commit
|
|
25
|
+
gitsheets-axi upsert repos --data "$(cat repos.json)" --delete-missing # exact re-sync
|
|
26
|
+
gitsheets-axi upsert repos --data "$(cat repos.json)" --dry-run # preview
|
|
14
27
|
idempotency:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
28
|
+
Unchanged records are skipped; a batch where nothing changed is a no-op with
|
|
29
|
+
no commit. A single invalid record aborts the batch (nothing committed) and
|
|
30
|
+
names the row — run --dry-run to see all invalid rows at once.
|
|
31
|
+
note:
|
|
32
|
+
gitsheets writes to the git ref, not your working tree. After a commit run
|
|
33
|
+
\`git checkout HEAD -- .\` to materialize the record files on disk.
|
|
18
34
|
`;
|
|
19
35
|
function parseUpsertFlags(args) {
|
|
20
36
|
const flags = {
|
|
@@ -23,6 +39,8 @@ function parseUpsertFlags(args) {
|
|
|
23
39
|
allowMissingBody: false,
|
|
24
40
|
prefix: undefined,
|
|
25
41
|
message: undefined,
|
|
42
|
+
deleteMissing: false,
|
|
43
|
+
dryRun: false,
|
|
26
44
|
};
|
|
27
45
|
const positional = [];
|
|
28
46
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -40,6 +58,12 @@ function parseUpsertFlags(args) {
|
|
|
40
58
|
case '--allow-missing-body':
|
|
41
59
|
flags.allowMissingBody = true;
|
|
42
60
|
break;
|
|
61
|
+
case '--delete-missing':
|
|
62
|
+
flags.deleteMissing = true;
|
|
63
|
+
break;
|
|
64
|
+
case '--dry-run':
|
|
65
|
+
flags.dryRun = true;
|
|
66
|
+
break;
|
|
43
67
|
case '--prefix':
|
|
44
68
|
if (!next)
|
|
45
69
|
throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
|
|
@@ -75,29 +99,18 @@ export async function upsertCommand(args, ctx) {
|
|
|
75
99
|
}
|
|
76
100
|
const flags = parseUpsertFlags(args);
|
|
77
101
|
const recordJson = flags.data ?? (await readStdin());
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
let record;
|
|
82
|
-
try {
|
|
83
|
-
record = JSON.parse(recordJson);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
throw new AxiError(`Could not parse record JSON: ${error instanceof Error ? error.message : String(error)}`, 'INVALID_JSON', ['Ensure the input is a valid JSON object']);
|
|
87
|
-
}
|
|
88
|
-
if (!record || typeof record !== 'object' || Array.isArray(record)) {
|
|
89
|
-
throw new AxiError('Record must be a JSON object', 'VALIDATION_ERROR');
|
|
90
|
-
}
|
|
102
|
+
const { records } = parseRecordsInput(recordJson);
|
|
103
|
+
const prefixOpts = flags.prefix !== undefined ? { prefix: flags.prefix } : {};
|
|
104
|
+
const upsertOpts = flags.allowMissingBody ? { allowMissingBody: true } : {};
|
|
91
105
|
const repo = await ctx.repo();
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
const sheet = await openSheetForCommand(repo, flags.sheet, prefixOpts);
|
|
107
|
+
// Fast single-record path only when no set-level flag is in play.
|
|
108
|
+
if (records.length === 1 && !flags.deleteMissing && !flags.dryRun) {
|
|
109
|
+
return singleUpsert(repo, sheet, flags, records[0], upsertOpts, prefixOpts);
|
|
95
110
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const upsertOpts = flags.allowMissingBody ? { allowMissingBody: true } : {};
|
|
100
|
-
// Pre-flight idempotency check.
|
|
111
|
+
return batchUpsert(repo, sheet, flags, records, upsertOpts, prefixOpts);
|
|
112
|
+
}
|
|
113
|
+
async function singleUpsert(repo, sheet, flags, record, upsertOpts, prefixOpts) {
|
|
101
114
|
let willResult;
|
|
102
115
|
try {
|
|
103
116
|
willResult = await sheet.willChange(record, upsertOpts);
|
|
@@ -113,25 +126,113 @@ export async function upsertCommand(args, ctx) {
|
|
|
113
126
|
hash: willResult.currentBlobHash ?? '',
|
|
114
127
|
});
|
|
115
128
|
}
|
|
116
|
-
// Carry through. willChange validated already; this re-validates inside
|
|
117
|
-
// upsert (cheap, idempotent at the validate layer). Future optimization
|
|
118
|
-
// could expose a "skip validation" path keyed off willChange's result.
|
|
119
129
|
const commitMessage = flags.message ?? `${flags.sheet} upsert ${willResult.path}`;
|
|
120
130
|
try {
|
|
121
131
|
const result = await repo.transact({ message: commitMessage }, async (tx) => {
|
|
122
|
-
const txSheet = tx.sheet(flags.sheet,
|
|
132
|
+
const txSheet = tx.sheet(flags.sheet, prefixOpts);
|
|
123
133
|
return txSheet.upsert(record, upsertOpts);
|
|
124
134
|
});
|
|
125
|
-
return renderObject({
|
|
135
|
+
return joinBlocks(renderObject({
|
|
126
136
|
result: 'committed',
|
|
127
137
|
sheet: flags.sheet,
|
|
128
138
|
path: result.value.path,
|
|
129
139
|
hash: result.value.blob.hash,
|
|
130
140
|
commit: result.commitHash,
|
|
141
|
+
}), renderHelp([MATERIALIZE_HINT]));
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw translateError(error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function batchUpsert(repo, sheet, flags, records, upsertOpts, prefixOpts) {
|
|
148
|
+
// Pre-flight: categorize into changed / unchanged / invalid. Unlike the
|
|
149
|
+
// commit path, we never throw here — dry-run needs every invalid row, and the
|
|
150
|
+
// normal path aborts explicitly after collecting.
|
|
151
|
+
const changed = [];
|
|
152
|
+
const batchPaths = new Set();
|
|
153
|
+
const invalid = [];
|
|
154
|
+
let unchanged = 0;
|
|
155
|
+
for (let i = 0; i < records.length; i++) {
|
|
156
|
+
const record = records[i];
|
|
157
|
+
try {
|
|
158
|
+
const wc = await sheet.willChange(record, upsertOpts);
|
|
159
|
+
batchPaths.add(wc.path);
|
|
160
|
+
if (wc.changed)
|
|
161
|
+
changed.push(record);
|
|
162
|
+
else
|
|
163
|
+
unchanged++;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const axi = translateError(error);
|
|
167
|
+
invalid.push({ row: i + 1, id: recordLabel(record), reason: axi.message, code: axi.code });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// --delete-missing: existing records whose path isn't in the input set.
|
|
171
|
+
const deletions = [];
|
|
172
|
+
if (flags.deleteMissing) {
|
|
173
|
+
const existing = await sheet.queryAll({}, { withBody: false });
|
|
174
|
+
for (const r of existing) {
|
|
175
|
+
const p = r[PATH_KEY];
|
|
176
|
+
if (typeof p === 'string' && !batchPaths.has(p))
|
|
177
|
+
deletions.push(p);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (flags.dryRun) {
|
|
181
|
+
return renderDryRun(flags.sheet, {
|
|
182
|
+
willChange: changed.length,
|
|
183
|
+
noOp: unchanged,
|
|
184
|
+
invalid: invalid.length,
|
|
185
|
+
...(flags.deleteMissing ? { willDelete: deletions.length } : {}),
|
|
186
|
+
}, invalid);
|
|
187
|
+
}
|
|
188
|
+
if (invalid.length > 0) {
|
|
189
|
+
const first = invalid[0];
|
|
190
|
+
throw new AxiError(`Record ${first.row} (${first.id}): ${first.reason}`, first.code, [
|
|
191
|
+
`${invalid.length} record(s) invalid — the whole batch was aborted, nothing committed. Run --dry-run to see all.`,
|
|
192
|
+
]);
|
|
193
|
+
}
|
|
194
|
+
if (changed.length === 0 && deletions.length === 0) {
|
|
195
|
+
return renderObject({
|
|
196
|
+
result: 'no-op',
|
|
197
|
+
sheet: flags.sheet,
|
|
198
|
+
upserted: 0,
|
|
199
|
+
unchanged: records.length,
|
|
200
|
+
...(flags.deleteMissing ? { deleted: 0 } : {}),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const commitMessage = flags.message ?? `${flags.sheet} upsert (${changed.length})`;
|
|
204
|
+
try {
|
|
205
|
+
const result = await repo.transact({ message: commitMessage }, async (tx) => {
|
|
206
|
+
const txSheet = tx.sheet(flags.sheet, prefixOpts);
|
|
207
|
+
for (const record of changed)
|
|
208
|
+
await txSheet.upsert(record, upsertOpts);
|
|
209
|
+
for (const path of deletions)
|
|
210
|
+
await txSheet.delete(path);
|
|
211
|
+
return changed.length;
|
|
131
212
|
});
|
|
213
|
+
return joinBlocks(renderObject({
|
|
214
|
+
result: 'committed',
|
|
215
|
+
sheet: flags.sheet,
|
|
216
|
+
upserted: changed.length,
|
|
217
|
+
unchanged: records.length - changed.length,
|
|
218
|
+
...(flags.deleteMissing ? { deleted: deletions.length } : {}),
|
|
219
|
+
commit: result.commitHash,
|
|
220
|
+
}), renderHelp([MATERIALIZE_HINT]));
|
|
132
221
|
}
|
|
133
222
|
catch (error) {
|
|
134
223
|
throw translateError(error);
|
|
135
224
|
}
|
|
136
225
|
}
|
|
226
|
+
/** Shared dry-run renderer: a `dry-run` summary of counts + an invalid-rows table. */
|
|
227
|
+
export function renderDryRun(sheet, counts, invalid) {
|
|
228
|
+
const blocks = [renderObject({ result: 'dry-run', sheet, ...counts })];
|
|
229
|
+
if (invalid.length > 0) {
|
|
230
|
+
blocks.push(renderList('invalid', invalid, [
|
|
231
|
+
field('row'),
|
|
232
|
+
field('id'),
|
|
233
|
+
field('reason'),
|
|
234
|
+
]));
|
|
235
|
+
}
|
|
236
|
+
return joinBlocks(...blocks);
|
|
237
|
+
}
|
|
137
238
|
//# sourceMappingURL=upsert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert.js","sourceRoot":"","sources":["../../../src/commands/upsert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"upsert.js","sourceRoot":"","sources":["../../../src/commands/upsert.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,9 +19,8 @@ export declare function defaultSheetSchema(config: SheetConfig): FieldDef[];
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function fieldsWithExtras(defaults: FieldDef[], extras: string[]): FieldDef[];
|
|
21
21
|
/**
|
|
22
|
-
* Count records in a sheet. Uses
|
|
23
|
-
*
|
|
24
|
-
* corpus pushes higher.
|
|
22
|
+
* Count records in a sheet. Uses `Sheet.count()`, which walks candidate paths
|
|
23
|
+
* without parsing any record, so counting stays cheap even on large sheets.
|
|
25
24
|
*/
|
|
26
25
|
export declare function countRecords(sheet: Sheet): Promise<number>;
|
|
27
26
|
//# sourceMappingURL=sheet-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-schema.d.ts","sourceRoot":"","sources":["../../../src/output/sheet-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAA8B,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAcxE;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,EAAE,CAuClE;AAuBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,EAAE,MAAM,EAAE,GACf,QAAQ,EAAE,CAUZ;AAED
|
|
1
|
+
{"version":3,"file":"sheet-schema.d.ts","sourceRoot":"","sources":["../../../src/output/sheet-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAA8B,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAcxE;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,EAAE,CAuClE;AAuBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,EAAE,MAAM,EAAE,GACf,QAAQ,EAAE,CAUZ;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE"}
|
|
@@ -103,12 +103,10 @@ export function fieldsWithExtras(defaults, extras) {
|
|
|
103
103
|
return out;
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
|
-
* Count records in a sheet. Uses
|
|
107
|
-
*
|
|
108
|
-
* corpus pushes higher.
|
|
106
|
+
* Count records in a sheet. Uses `Sheet.count()`, which walks candidate paths
|
|
107
|
+
* without parsing any record, so counting stays cheap even on large sheets.
|
|
109
108
|
*/
|
|
110
109
|
export async function countRecords(sheet) {
|
|
111
|
-
|
|
112
|
-
return rows.length;
|
|
110
|
+
return sheet.count();
|
|
113
111
|
}
|
|
114
112
|
//# sourceMappingURL=sheet-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-schema.js","sourceRoot":"","sources":["../../../src/output/sheet-schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sheet-schema.js","sourceRoot":"","sources":["../../../src/output/sheet-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface Facet {
|
|
2
|
+
value: string;
|
|
3
|
+
count: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Faceted counts of a field across records — the `--group-by` / `distinct`
|
|
7
|
+
* primitive. Sorted by count descending, then value ascending, so the biggest
|
|
8
|
+
* buckets read first. A missing field counts under the empty-string key.
|
|
9
|
+
*/
|
|
10
|
+
export declare function facetCounts(records: Array<Record<string, unknown>>, field: string): Facet[];
|
|
11
|
+
/** Sort records by a field. Undefined/null sort last regardless of direction. */
|
|
12
|
+
export declare function sortRecords(records: Array<Record<string, unknown>>, field: string, desc: boolean): Array<Record<string, unknown>>;
|
|
13
|
+
//# sourceMappingURL=aggregate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/util/aggregate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,KAAK,EAAE,MAAM,GACZ,KAAK,EAAE,CAST;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CACzB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYhC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { scalarString } from './filter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Faceted counts of a field across records — the `--group-by` / `distinct`
|
|
4
|
+
* primitive. Sorted by count descending, then value ascending, so the biggest
|
|
5
|
+
* buckets read first. A missing field counts under the empty-string key.
|
|
6
|
+
*/
|
|
7
|
+
export function facetCounts(records, field) {
|
|
8
|
+
const counts = new Map();
|
|
9
|
+
for (const r of records) {
|
|
10
|
+
const key = scalarString(r[field]);
|
|
11
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
12
|
+
}
|
|
13
|
+
return [...counts.entries()]
|
|
14
|
+
.map(([value, count]) => ({ value, count }))
|
|
15
|
+
.sort((a, b) => b.count - a.count || compareStrings(a.value, b.value));
|
|
16
|
+
}
|
|
17
|
+
/** Sort records by a field. Undefined/null sort last regardless of direction. */
|
|
18
|
+
export function sortRecords(records, field, desc) {
|
|
19
|
+
const dir = desc ? -1 : 1;
|
|
20
|
+
return [...records].sort((a, b) => {
|
|
21
|
+
const av = a[field];
|
|
22
|
+
const bv = b[field];
|
|
23
|
+
const am = av === undefined || av === null;
|
|
24
|
+
const bm = bv === undefined || bv === null;
|
|
25
|
+
if (am && bm)
|
|
26
|
+
return 0;
|
|
27
|
+
if (am)
|
|
28
|
+
return 1; // missing always last
|
|
29
|
+
if (bm)
|
|
30
|
+
return -1;
|
|
31
|
+
return dir * compareScalars(av, bv);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function compareScalars(a, b) {
|
|
35
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
36
|
+
return Math.sign(a - b);
|
|
37
|
+
if (a instanceof Date && b instanceof Date)
|
|
38
|
+
return Math.sign(a.getTime() - b.getTime());
|
|
39
|
+
return compareStrings(scalarString(a), scalarString(b));
|
|
40
|
+
}
|
|
41
|
+
function compareStrings(a, b) {
|
|
42
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/util/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,OAAuC,EACvC,KAAa;IAEb,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,WAAW,CACzB,OAAuC,EACvC,KAAa,EACb,IAAa;IAEb,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;QAC3C,MAAM,EAAE,GAAG,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;QAC3C,IAAI,EAAE,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC;QACvB,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB;QACxC,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QAClB,OAAO,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,CAAU,EAAE,CAAU;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,OAAO,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS;IAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type ExportFormat = 'json' | 'ndjson' | 'csv';
|
|
2
|
+
export interface ExportResult {
|
|
3
|
+
path: string;
|
|
4
|
+
rows: number;
|
|
5
|
+
cols: number;
|
|
6
|
+
columns: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Write the full record set to a side-channel file — the metabase-axi export
|
|
10
|
+
* pattern (see kunchenguid/axi#32). This is purely additive: stdout keeps the
|
|
11
|
+
* agent-optimized TOON preview; the file carries the complete payload only when
|
|
12
|
+
* an export flag is passed. A bare flag auto-generates an owner-only (0600)
|
|
13
|
+
* file under the OS temp dir (which the OS prunes); an explicit `=path`
|
|
14
|
+
* persists wherever the caller points it.
|
|
15
|
+
*
|
|
16
|
+
* The JSON/NDJSON files are written verbatim (no injected fields), so they
|
|
17
|
+
* round-trip straight back into `gitsheets-axi upsert` — JSON array for `json`,
|
|
18
|
+
* one object per line for `ndjson`. CSV is flat: nested values are JSON-encoded
|
|
19
|
+
* into their cell, so it's a lossy view for reporting, not a round-trip format.
|
|
20
|
+
*/
|
|
21
|
+
export declare function exportRecords(records: Array<Record<string, unknown>>, format: ExportFormat, explicitPath: string | undefined, sheetName: string): ExportResult;
|
|
22
|
+
//# sourceMappingURL=export-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-file.d.ts","sourceRoot":"","sources":["../../../src/util/export-file.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAChB,YAAY,CASd"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { stringify as csvStringify } from 'csv-stringify/sync';
|
|
5
|
+
/**
|
|
6
|
+
* Write the full record set to a side-channel file — the metabase-axi export
|
|
7
|
+
* pattern (see kunchenguid/axi#32). This is purely additive: stdout keeps the
|
|
8
|
+
* agent-optimized TOON preview; the file carries the complete payload only when
|
|
9
|
+
* an export flag is passed. A bare flag auto-generates an owner-only (0600)
|
|
10
|
+
* file under the OS temp dir (which the OS prunes); an explicit `=path`
|
|
11
|
+
* persists wherever the caller points it.
|
|
12
|
+
*
|
|
13
|
+
* The JSON/NDJSON files are written verbatim (no injected fields), so they
|
|
14
|
+
* round-trip straight back into `gitsheets-axi upsert` — JSON array for `json`,
|
|
15
|
+
* one object per line for `ndjson`. CSV is flat: nested values are JSON-encoded
|
|
16
|
+
* into their cell, so it's a lossy view for reporting, not a round-trip format.
|
|
17
|
+
*/
|
|
18
|
+
export function exportRecords(records, format, explicitPath, sheetName) {
|
|
19
|
+
const path = explicitPath ?? autoPath(sheetName, format);
|
|
20
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
21
|
+
const columns = unionColumns(records);
|
|
22
|
+
const body = serialize(records, format, columns);
|
|
23
|
+
writeFileSync(path, body, { mode: 0o600 });
|
|
24
|
+
return { path, rows: records.length, cols: columns.length, columns };
|
|
25
|
+
}
|
|
26
|
+
function serialize(records, format, columns) {
|
|
27
|
+
if (format === 'ndjson') {
|
|
28
|
+
return (records.map((r) => JSON.stringify(r)).join('\n') +
|
|
29
|
+
(records.length > 0 ? '\n' : ''));
|
|
30
|
+
}
|
|
31
|
+
if (format === 'csv') {
|
|
32
|
+
// Flat CSV: a stable header (union of keys) + one row per record. Nested
|
|
33
|
+
// values (arrays / tables) are JSON-encoded so cells never read as
|
|
34
|
+
// "[object Object]"; this makes CSV a lossy reporting view, not lossless.
|
|
35
|
+
return csvStringify(records, {
|
|
36
|
+
header: true,
|
|
37
|
+
columns,
|
|
38
|
+
cast: {
|
|
39
|
+
object: (v) => JSON.stringify(v),
|
|
40
|
+
boolean: (v) => (v ? 'true' : 'false'),
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return JSON.stringify(records);
|
|
45
|
+
}
|
|
46
|
+
function autoPath(sheetName, format) {
|
|
47
|
+
const dir = join(tmpdir(), 'gitsheets-axi');
|
|
48
|
+
const ext = format;
|
|
49
|
+
const safe = sheetName.replace(/[^A-Za-z0-9_.-]/g, '_') || 'sheet';
|
|
50
|
+
const stamp = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
51
|
+
return join(dir, `${safe}-${stamp}.${ext}`);
|
|
52
|
+
}
|
|
53
|
+
/** Keys across all records, first-seen order — the exported file's columns. */
|
|
54
|
+
function unionColumns(records) {
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
const cols = [];
|
|
57
|
+
for (const record of records) {
|
|
58
|
+
for (const key of Object.keys(record)) {
|
|
59
|
+
if (!seen.has(key)) {
|
|
60
|
+
seen.add(key);
|
|
61
|
+
cols.push(key);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return cols;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=export-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-file.js","sourceRoot":"","sources":["../../../src/util/export-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A parsed `--filter` clause: the field it targets and a predicate over that
|
|
3
|
+
* field's value (with the whole record available for completeness).
|
|
4
|
+
*/
|
|
5
|
+
export interface FilterClause {
|
|
6
|
+
field: string;
|
|
7
|
+
op: string;
|
|
8
|
+
test: (value: unknown, record: Record<string, unknown>) => boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse the axi `--filter` mini-DSL. One clause per `--filter` arg; multiple
|
|
12
|
+
* clauses AND together. Supported forms (checked in this order):
|
|
13
|
+
*
|
|
14
|
+
* field:present field exists and is non-empty
|
|
15
|
+
* field:empty field is absent / null / '' / []
|
|
16
|
+
* field in (a,b,c) value is one of the listed strings
|
|
17
|
+
* field!=value not equal
|
|
18
|
+
* field>=value field<=value field>value field<value comparison
|
|
19
|
+
* field~regex String(value) matches the JS regex
|
|
20
|
+
* field=value equality (the original behavior)
|
|
21
|
+
*
|
|
22
|
+
* Comparison is numeric when the field holds a number, time-based for Date
|
|
23
|
+
* fields, else lexical (ISO-8601 date strings sort correctly).
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseFilter(expr: string): FilterClause;
|
|
26
|
+
/** Compose many `--filter` clauses into one AND predicate over a record. */
|
|
27
|
+
export declare function buildPredicate(exprs: string[]): (record: Record<string, unknown>) => boolean;
|
|
28
|
+
/** Stable string form for set membership / grouping keys. */
|
|
29
|
+
export declare function scalarString(v: unknown): string;
|
|
30
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../src/util/filter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;CACpE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA6CtD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,GACd,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAI9C;AAgED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAI/C"}
|