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.
Files changed (65) hide show
  1. package/dist/src/cli.d.ts +1 -1
  2. package/dist/src/cli.d.ts.map +1 -1
  3. package/dist/src/cli.js +17 -9
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/commands/count.d.ts +4 -0
  6. package/dist/src/commands/count.d.ts.map +1 -0
  7. package/dist/src/commands/count.js +84 -0
  8. package/dist/src/commands/count.js.map +1 -0
  9. package/dist/src/commands/delete.d.ts +1 -1
  10. package/dist/src/commands/delete.d.ts.map +1 -1
  11. package/dist/src/commands/delete.js +132 -43
  12. package/dist/src/commands/delete.js.map +1 -1
  13. package/dist/src/commands/distinct.d.ts +4 -0
  14. package/dist/src/commands/distinct.d.ts.map +1 -0
  15. package/dist/src/commands/distinct.js +81 -0
  16. package/dist/src/commands/distinct.js.map +1 -0
  17. package/dist/src/commands/home.js +2 -2
  18. package/dist/src/commands/home.js.map +1 -1
  19. package/dist/src/commands/patch.d.ts +1 -1
  20. package/dist/src/commands/patch.d.ts.map +1 -1
  21. package/dist/src/commands/patch.js +238 -49
  22. package/dist/src/commands/patch.js.map +1 -1
  23. package/dist/src/commands/query.d.ts +1 -1
  24. package/dist/src/commands/query.d.ts.map +1 -1
  25. package/dist/src/commands/query.js +129 -58
  26. package/dist/src/commands/query.js.map +1 -1
  27. package/dist/src/commands/rename.d.ts +4 -0
  28. package/dist/src/commands/rename.d.ts.map +1 -0
  29. package/dist/src/commands/rename.js +131 -0
  30. package/dist/src/commands/rename.js.map +1 -0
  31. package/dist/src/commands/sheets.js +15 -6
  32. package/dist/src/commands/sheets.js.map +1 -1
  33. package/dist/src/commands/upsert.d.ts +9 -1
  34. package/dist/src/commands/upsert.d.ts.map +1 -1
  35. package/dist/src/commands/upsert.js +134 -33
  36. package/dist/src/commands/upsert.js.map +1 -1
  37. package/dist/src/output/sheet-schema.d.ts +2 -3
  38. package/dist/src/output/sheet-schema.d.ts.map +1 -1
  39. package/dist/src/output/sheet-schema.js +3 -5
  40. package/dist/src/output/sheet-schema.js.map +1 -1
  41. package/dist/src/util/aggregate.d.ts +13 -0
  42. package/dist/src/util/aggregate.d.ts.map +1 -0
  43. package/dist/src/util/aggregate.js +44 -0
  44. package/dist/src/util/aggregate.js.map +1 -0
  45. package/dist/src/util/export-file.d.ts +22 -0
  46. package/dist/src/util/export-file.d.ts.map +1 -0
  47. package/dist/src/util/export-file.js +67 -0
  48. package/dist/src/util/export-file.js.map +1 -0
  49. package/dist/src/util/filter.d.ts +30 -0
  50. package/dist/src/util/filter.d.ts.map +1 -0
  51. package/dist/src/util/filter.js +138 -0
  52. package/dist/src/util/filter.js.map +1 -0
  53. package/dist/src/util/hints.d.ts +8 -0
  54. package/dist/src/util/hints.d.ts.map +1 -0
  55. package/dist/src/util/hints.js +8 -0
  56. package/dist/src/util/hints.js.map +1 -0
  57. package/dist/src/util/open-sheet.d.ts +13 -0
  58. package/dist/src/util/open-sheet.d.ts.map +1 -0
  59. package/dist/src/util/open-sheet.js +31 -0
  60. package/dist/src/util/open-sheet.js.map +1 -0
  61. package/dist/src/util/parse-records.d.ts +26 -0
  62. package/dist/src/util/parse-records.d.ts.map +1 -0
  63. package/dist/src/util/parse-records.js +76 -0
  64. package/dist/src/util/parse-records.js.map +1 -0
  65. 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
- export const UPSERT_HELP = `usage: gitsheets-axi upsert <sheet> [--data <json>] [--allow-missing-body] [--prefix p] [--message m]
6
- flags[4]:
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
- Compares the canonical bytes the upsert would write against the
16
- existing blob at the rendered path. If identical, exits 0 with
17
- result: "no-op" and no commit is produced.
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
- if (!recordJson.trim()) {
79
- throw new AxiError('upsert needs a record pass --data <json> or pipe JSON on stdin', 'VALIDATION_ERROR', ['Example: gitsheets-axi upsert users --data \'{"slug":"jane"}\'']);
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
- let sheet;
93
- try {
94
- sheet = await repo.openSheet(flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
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
- catch (error) {
97
- throw translateError(error);
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, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
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":"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"}
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 queryAll under the hood — fine for repos
23
- * with thousands of records; cap-checking is the consumer's job if their
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;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE"}
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 queryAll under the hood — fine for repos
107
- * with thousands of records; cap-checking is the consumer's job if their
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
- const rows = await sheet.queryAll({}, { withBody: false });
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"}