gitsheets-axi 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +116 -0
- package/dist/bin/gitsheets-axi.d.ts +3 -0
- package/dist/bin/gitsheets-axi.d.ts.map +1 -0
- package/dist/bin/gitsheets-axi.js +4 -0
- package/dist/bin/gitsheets-axi.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +105 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/attachment.d.ts +4 -0
- package/dist/src/commands/attachment.d.ts.map +1 -0
- package/dist/src/commands/attachment.js +356 -0
- package/dist/src/commands/attachment.js.map +1 -0
- package/dist/src/commands/check.d.ts +4 -0
- package/dist/src/commands/check.d.ts.map +1 -0
- package/dist/src/commands/check.js +136 -0
- package/dist/src/commands/check.js.map +1 -0
- package/dist/src/commands/delete.d.ts +4 -0
- package/dist/src/commands/delete.d.ts.map +1 -0
- package/dist/src/commands/delete.js +132 -0
- package/dist/src/commands/delete.js.map +1 -0
- package/dist/src/commands/diff.d.ts +4 -0
- package/dist/src/commands/diff.d.ts.map +1 -0
- package/dist/src/commands/diff.js +139 -0
- package/dist/src/commands/diff.js.map +1 -0
- package/dist/src/commands/home.d.ts +3 -0
- package/dist/src/commands/home.d.ts.map +1 -0
- package/dist/src/commands/home.js +71 -0
- package/dist/src/commands/home.js.map +1 -0
- package/dist/src/commands/infer.d.ts +4 -0
- package/dist/src/commands/infer.d.ts.map +1 -0
- package/dist/src/commands/infer.js +214 -0
- package/dist/src/commands/infer.js.map +1 -0
- package/dist/src/commands/init.d.ts +4 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +172 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/migrate-config.d.ts +4 -0
- package/dist/src/commands/migrate-config.d.ts.map +1 -0
- package/dist/src/commands/migrate-config.js +161 -0
- package/dist/src/commands/migrate-config.js.map +1 -0
- package/dist/src/commands/normalize.d.ts +4 -0
- package/dist/src/commands/normalize.d.ts.map +1 -0
- package/dist/src/commands/normalize.js +142 -0
- package/dist/src/commands/normalize.js.map +1 -0
- package/dist/src/commands/patch.d.ts +4 -0
- package/dist/src/commands/patch.d.ts.map +1 -0
- package/dist/src/commands/patch.js +172 -0
- package/dist/src/commands/patch.js.map +1 -0
- package/dist/src/commands/push.d.ts +4 -0
- package/dist/src/commands/push.d.ts.map +1 -0
- package/dist/src/commands/push.js +112 -0
- package/dist/src/commands/push.js.map +1 -0
- package/dist/src/commands/query.d.ts +4 -0
- package/dist/src/commands/query.d.ts.map +1 -0
- package/dist/src/commands/query.js +141 -0
- package/dist/src/commands/query.js.map +1 -0
- package/dist/src/commands/read.d.ts +4 -0
- package/dist/src/commands/read.d.ts.map +1 -0
- package/dist/src/commands/read.js +149 -0
- package/dist/src/commands/read.js.map +1 -0
- package/dist/src/commands/sheets.d.ts +4 -0
- package/dist/src/commands/sheets.d.ts.map +1 -0
- package/dist/src/commands/sheets.js +142 -0
- package/dist/src/commands/sheets.js.map +1 -0
- package/dist/src/commands/upsert.d.ts +4 -0
- package/dist/src/commands/upsert.d.ts.map +1 -0
- package/dist/src/commands/upsert.js +137 -0
- package/dist/src/commands/upsert.js.map +1 -0
- package/dist/src/context.d.ts +17 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +47 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/errors.d.ts +13 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +58 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/output/index.d.ts +3 -0
- package/dist/src/output/index.d.ts.map +1 -0
- package/dist/src/output/index.js +3 -0
- package/dist/src/output/index.js.map +1 -0
- package/dist/src/output/render.d.ts +28 -0
- package/dist/src/output/render.d.ts.map +1 -0
- package/dist/src/output/render.js +49 -0
- package/dist/src/output/render.js.map +1 -0
- package/dist/src/output/schema.d.ts +29 -0
- package/dist/src/output/schema.d.ts.map +1 -0
- package/dist/src/output/schema.js +51 -0
- package/dist/src/output/schema.js.map +1 -0
- package/dist/src/output/sheet-schema.d.ts +27 -0
- package/dist/src/output/sheet-schema.d.ts.map +1 -0
- package/dist/src/output/sheet-schema.js +114 -0
- package/dist/src/output/sheet-schema.js.map +1 -0
- package/dist/src/util/stdin.d.ts +7 -0
- package/dist/src/util/stdin.d.ts.map +1 -0
- package/dist/src/util/stdin.js +19 -0
- package/dist/src/util/stdin.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GitsheetsContext } from '../context.js';
|
|
2
|
+
export declare const DIFF_HELP = "usage: gitsheets-axi diff <sheet> [<src-ref>] [--patches] [--limit n] [--prefix p]\nflags[3]:\n --patches Include RFC 6902 JSON Patch ops on each change (default: false)\n --limit <n> Cap results (default: 1000)\n --prefix <p> Tenant sub-tree scope\nexamples:\n gitsheets-axi diff users\n gitsheets-axi diff posts HEAD~10\n gitsheets-axi diff users origin/main --patches\noutput:\n Default columns: status (added/modified/deleted/renamed), path, srcHash, dstHash.\n --patches adds an inline patch column (RFC 6902 ops).\nsrc-ref:\n Optional. Defaults to the empty tree, which makes every current record\n show up as \"added\" \u2014 useful for a one-shot snapshot of the sheet.\n";
|
|
3
|
+
export declare function diffCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,eAAO,MAAM,SAAS,ktBAerB,CAAC;AAwDF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CA0EjB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { AxiError } from 'axi-sdk-js';
|
|
2
|
+
import { translateError } from '../errors.js';
|
|
3
|
+
import { renderListResponse } from '../output/render.js';
|
|
4
|
+
import { display, field } from '../output/schema.js';
|
|
5
|
+
export const DIFF_HELP = `usage: gitsheets-axi diff <sheet> [<src-ref>] [--patches] [--limit n] [--prefix p]
|
|
6
|
+
flags[3]:
|
|
7
|
+
--patches Include RFC 6902 JSON Patch ops on each change (default: false)
|
|
8
|
+
--limit <n> Cap results (default: 1000)
|
|
9
|
+
--prefix <p> Tenant sub-tree scope
|
|
10
|
+
examples:
|
|
11
|
+
gitsheets-axi diff users
|
|
12
|
+
gitsheets-axi diff posts HEAD~10
|
|
13
|
+
gitsheets-axi diff users origin/main --patches
|
|
14
|
+
output:
|
|
15
|
+
Default columns: status (added/modified/deleted/renamed), path, srcHash, dstHash.
|
|
16
|
+
--patches adds an inline patch column (RFC 6902 ops).
|
|
17
|
+
src-ref:
|
|
18
|
+
Optional. Defaults to the empty tree, which makes every current record
|
|
19
|
+
show up as "added" — useful for a one-shot snapshot of the sheet.
|
|
20
|
+
`;
|
|
21
|
+
function parseDiffFlags(args) {
|
|
22
|
+
const flags = {
|
|
23
|
+
sheet: '',
|
|
24
|
+
srcRef: undefined,
|
|
25
|
+
patches: false,
|
|
26
|
+
limit: 1000,
|
|
27
|
+
prefix: undefined,
|
|
28
|
+
};
|
|
29
|
+
const positional = [];
|
|
30
|
+
for (let i = 0; i < args.length; i++) {
|
|
31
|
+
const arg = args[i];
|
|
32
|
+
if (arg === undefined)
|
|
33
|
+
continue;
|
|
34
|
+
const next = args[i + 1];
|
|
35
|
+
if (arg === '--patches') {
|
|
36
|
+
flags.patches = true;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (arg === '--limit') {
|
|
40
|
+
if (!next)
|
|
41
|
+
throw new AxiError('--limit expects an integer', 'VALIDATION_ERROR');
|
|
42
|
+
flags.limit = Math.min(100_000, Math.max(1, parseInt(next, 10) || 1000));
|
|
43
|
+
i++;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (arg === '--prefix') {
|
|
47
|
+
if (!next)
|
|
48
|
+
throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
|
|
49
|
+
flags.prefix = next;
|
|
50
|
+
i++;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (arg.startsWith('-')) {
|
|
54
|
+
throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
|
|
55
|
+
'Run `gitsheets-axi diff --help`',
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
positional.push(arg);
|
|
59
|
+
}
|
|
60
|
+
if (positional.length < 1 || positional.length > 2) {
|
|
61
|
+
throw new AxiError('diff requires <sheet> [<src-ref>]', 'VALIDATION_ERROR', [
|
|
62
|
+
'Example: gitsheets-axi diff users HEAD~10',
|
|
63
|
+
]);
|
|
64
|
+
}
|
|
65
|
+
flags.sheet = positional[0];
|
|
66
|
+
if (positional.length === 2)
|
|
67
|
+
flags.srcRef = positional[1];
|
|
68
|
+
return flags;
|
|
69
|
+
}
|
|
70
|
+
export async function diffCommand(args, ctx) {
|
|
71
|
+
if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
|
|
72
|
+
return DIFF_HELP;
|
|
73
|
+
}
|
|
74
|
+
const flags = parseDiffFlags(args);
|
|
75
|
+
const repo = await ctx.repo();
|
|
76
|
+
let sheet;
|
|
77
|
+
try {
|
|
78
|
+
sheet = await repo.openSheet(flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw translateError(error);
|
|
82
|
+
}
|
|
83
|
+
const items = [];
|
|
84
|
+
let total = 0;
|
|
85
|
+
try {
|
|
86
|
+
const opts = flags.patches ? { patches: true } : {};
|
|
87
|
+
for await (const change of sheet.diffFrom(flags.srcRef, opts)) {
|
|
88
|
+
total++;
|
|
89
|
+
if (items.length >= flags.limit)
|
|
90
|
+
continue;
|
|
91
|
+
const row = {
|
|
92
|
+
status: change.status,
|
|
93
|
+
path: change.path,
|
|
94
|
+
src_hash: change.srcHash ?? '',
|
|
95
|
+
dst_hash: change.dstHash ?? '',
|
|
96
|
+
};
|
|
97
|
+
if (flags.patches && change.patch !== undefined) {
|
|
98
|
+
// Serialize the RFC 6902 patch as JSON so it fits in a TOON cell.
|
|
99
|
+
// Empty arrays render as "[]"; small patches render compactly.
|
|
100
|
+
const patch = change.patch;
|
|
101
|
+
row['patch'] = JSON.stringify(patch ?? []);
|
|
102
|
+
}
|
|
103
|
+
items.push(row);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw translateError(error);
|
|
108
|
+
}
|
|
109
|
+
const schema = [
|
|
110
|
+
field('status'),
|
|
111
|
+
field('path'),
|
|
112
|
+
display('src_hash'),
|
|
113
|
+
display('dst_hash'),
|
|
114
|
+
];
|
|
115
|
+
if (flags.patches)
|
|
116
|
+
schema.push(field('patch'));
|
|
117
|
+
const suggestions = [];
|
|
118
|
+
if (total === 0) {
|
|
119
|
+
suggestions.push('No changes between src ref and current tree');
|
|
120
|
+
}
|
|
121
|
+
else if (total > items.length) {
|
|
122
|
+
suggestions.push(`${total - items.length} changes hidden by --limit ${flags.limit}; raise --limit to see more`);
|
|
123
|
+
}
|
|
124
|
+
if (!flags.patches && total > 0) {
|
|
125
|
+
suggestions.push('Add `--patches` to include RFC 6902 ops per change');
|
|
126
|
+
}
|
|
127
|
+
return renderListResponse({
|
|
128
|
+
summary: {
|
|
129
|
+
count: `${items.length} of ${total} total`,
|
|
130
|
+
src_ref: flags.srcRef ?? '(empty tree)',
|
|
131
|
+
},
|
|
132
|
+
name: 'changes',
|
|
133
|
+
items,
|
|
134
|
+
schema,
|
|
135
|
+
suggestions,
|
|
136
|
+
emptyMessage: 'no changes',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/commands/home.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAkBtD,wBAAsB,WAAW,CAC/B,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,CAgE3C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { renderListResponse } from '../output/render.js';
|
|
4
|
+
import { countRecords } from '../output/sheet-schema.js';
|
|
5
|
+
import { computed, display, field } from '../output/schema.js';
|
|
6
|
+
import { translateError } from '../errors.js';
|
|
7
|
+
function collapseHome(path) {
|
|
8
|
+
const home = homedir();
|
|
9
|
+
return path.startsWith(home) ? `~${path.slice(home.length)}` : path;
|
|
10
|
+
}
|
|
11
|
+
export async function homeCommand(ctx) {
|
|
12
|
+
const repo = await ctx.tryRepo();
|
|
13
|
+
if (!repo) {
|
|
14
|
+
return {
|
|
15
|
+
status: 'no gitsheets repo here',
|
|
16
|
+
help: [
|
|
17
|
+
'`cd` into a directory inside a gitsheets-managed git repository',
|
|
18
|
+
'Run `gitsheets-axi sheets` from there to see configured sheets',
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
let sheets;
|
|
23
|
+
try {
|
|
24
|
+
sheets = await repo.openSheets();
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw translateError(error);
|
|
28
|
+
}
|
|
29
|
+
const summaries = [];
|
|
30
|
+
for (const [name, sheet] of Object.entries(sheets)) {
|
|
31
|
+
let format = 'toml';
|
|
32
|
+
let root = '.';
|
|
33
|
+
let records = 0;
|
|
34
|
+
try {
|
|
35
|
+
const config = await sheet.readConfig();
|
|
36
|
+
format = config.format.type ?? 'toml';
|
|
37
|
+
root = config.root ?? '.';
|
|
38
|
+
records = await countRecords(sheet);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// If a sheet's config is malformed, skip the record count but keep
|
|
42
|
+
// the row — agents need to see it exists.
|
|
43
|
+
}
|
|
44
|
+
summaries.push({ name, format, records, root });
|
|
45
|
+
}
|
|
46
|
+
summaries.sort((a, b) => a.name.localeCompare(b.name));
|
|
47
|
+
const help = [];
|
|
48
|
+
if (summaries.length === 0) {
|
|
49
|
+
help.push('No sheets configured — add a `.gitsheets/<name>.toml` to declare one');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
help.push('Run `gitsheets-axi sheets view <name>` to see a sheet\'s config');
|
|
53
|
+
help.push('Run `gitsheets-axi query <sheet>` to list records');
|
|
54
|
+
}
|
|
55
|
+
const gitDir = repo.gitDir;
|
|
56
|
+
const repoRoot = gitDir.endsWith('/.git') ? dirname(gitDir) : gitDir;
|
|
57
|
+
return renderListResponse({
|
|
58
|
+
header: { repo: collapseHome(repoRoot) },
|
|
59
|
+
name: 'sheets',
|
|
60
|
+
items: summaries,
|
|
61
|
+
schema: [
|
|
62
|
+
field('name'),
|
|
63
|
+
display('format'),
|
|
64
|
+
computed('records', (item) => `${item['records']}`),
|
|
65
|
+
field('root'),
|
|
66
|
+
],
|
|
67
|
+
suggestions: help,
|
|
68
|
+
emptyMessage: 'no sheets configured in this repository',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/commands/home.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GitsheetsContext } from '../context.js';
|
|
2
|
+
export declare const INFER_HELP = "usage: gitsheets-axi infer <sheet> [--prefix p] [--message m]\nflags[2]:\n --prefix <p> Tenant sub-tree scope\n --message <m> Commit message (default: \"<sheet> infer schema (N fields)\")\nexamples:\n gitsheets-axi infer users\nbehavior:\n Walks every record in the sheet, observes which fields appear with\n which types, and emits a generated `[gitsheet.schema]` block back\n into the sheet's config file. Fields that appear in every record\n are marked `required`.\nidempotency:\n If the inferred schema matches what's already in the config,\n exits 0 with result: \"no-op\" \u2014 no commit produced.\n";
|
|
3
|
+
export declare function inferCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=infer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../../src/commands/infer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,eAAO,MAAM,UAAU,0nBActB,CAAC;AAqFF,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAuHjB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { AxiError } from 'axi-sdk-js';
|
|
4
|
+
import { parseToml, stringifyRecord } from 'gitsheets';
|
|
5
|
+
import { translateError } from '../errors.js';
|
|
6
|
+
import { renderObject } from '../output/render.js';
|
|
7
|
+
const exec = promisify(execFile);
|
|
8
|
+
export const INFER_HELP = `usage: gitsheets-axi infer <sheet> [--prefix p] [--message m]
|
|
9
|
+
flags[2]:
|
|
10
|
+
--prefix <p> Tenant sub-tree scope
|
|
11
|
+
--message <m> Commit message (default: "<sheet> infer schema (N fields)")
|
|
12
|
+
examples:
|
|
13
|
+
gitsheets-axi infer users
|
|
14
|
+
behavior:
|
|
15
|
+
Walks every record in the sheet, observes which fields appear with
|
|
16
|
+
which types, and emits a generated \`[gitsheet.schema]\` block back
|
|
17
|
+
into the sheet's config file. Fields that appear in every record
|
|
18
|
+
are marked \`required\`.
|
|
19
|
+
idempotency:
|
|
20
|
+
If the inferred schema matches what's already in the config,
|
|
21
|
+
exits 0 with result: "no-op" — no commit produced.
|
|
22
|
+
`;
|
|
23
|
+
function parseInferFlags(args) {
|
|
24
|
+
const flags = { sheet: '', prefix: undefined, message: undefined };
|
|
25
|
+
const positional = [];
|
|
26
|
+
for (let i = 0; i < args.length; i++) {
|
|
27
|
+
const arg = args[i];
|
|
28
|
+
if (arg === undefined)
|
|
29
|
+
continue;
|
|
30
|
+
const next = args[i + 1];
|
|
31
|
+
if (arg === '--prefix') {
|
|
32
|
+
if (!next)
|
|
33
|
+
throw new AxiError('--prefix expects a path', 'VALIDATION_ERROR');
|
|
34
|
+
flags.prefix = next;
|
|
35
|
+
i++;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (arg === '--message') {
|
|
39
|
+
if (!next)
|
|
40
|
+
throw new AxiError('--message expects a string', 'VALIDATION_ERROR');
|
|
41
|
+
flags.message = next;
|
|
42
|
+
i++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (arg.startsWith('-')) {
|
|
46
|
+
throw new AxiError(`Unknown flag: ${arg}`, 'VALIDATION_ERROR', [
|
|
47
|
+
'Run `gitsheets-axi infer --help`',
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
positional.push(arg);
|
|
51
|
+
}
|
|
52
|
+
if (positional.length !== 1) {
|
|
53
|
+
throw new AxiError('infer requires <sheet>', 'VALIDATION_ERROR', [
|
|
54
|
+
'Example: gitsheets-axi infer users',
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
flags.sheet = positional[0];
|
|
58
|
+
return flags;
|
|
59
|
+
}
|
|
60
|
+
function observeValue(obs, value) {
|
|
61
|
+
if (value === null) {
|
|
62
|
+
obs.types.add('null');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
obs.types.add('array');
|
|
67
|
+
for (const item of value)
|
|
68
|
+
obs.items.add(typeOf(item));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (value instanceof Date) {
|
|
72
|
+
obs.types.add('string');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const t = typeOf(value);
|
|
76
|
+
obs.types.add(t);
|
|
77
|
+
if (t === 'integer' || t === 'number') {
|
|
78
|
+
const n = value;
|
|
79
|
+
if (obs.min === undefined || n < obs.min)
|
|
80
|
+
obs.min = n;
|
|
81
|
+
if (obs.max === undefined || n > obs.max)
|
|
82
|
+
obs.max = n;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function typeOf(value) {
|
|
86
|
+
if (value === null)
|
|
87
|
+
return 'null';
|
|
88
|
+
if (Array.isArray(value))
|
|
89
|
+
return 'array';
|
|
90
|
+
if (value instanceof Date)
|
|
91
|
+
return 'string';
|
|
92
|
+
const t = typeof value;
|
|
93
|
+
if (t === 'number') {
|
|
94
|
+
return Number.isInteger(value) ? 'integer' : 'number';
|
|
95
|
+
}
|
|
96
|
+
if (t === 'object')
|
|
97
|
+
return 'object';
|
|
98
|
+
return t;
|
|
99
|
+
}
|
|
100
|
+
export async function inferCommand(args, ctx) {
|
|
101
|
+
if (args.length === 0 || (args.length === 1 && args[0] === '--help')) {
|
|
102
|
+
return INFER_HELP;
|
|
103
|
+
}
|
|
104
|
+
const flags = parseInferFlags(args);
|
|
105
|
+
const repo = await ctx.repo();
|
|
106
|
+
const configPath = `.gitsheets/${flags.sheet}.toml`;
|
|
107
|
+
let sheet;
|
|
108
|
+
try {
|
|
109
|
+
sheet = await repo.openSheet(flags.sheet, flags.prefix !== undefined ? { prefix: flags.prefix } : {});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw translateError(error);
|
|
113
|
+
}
|
|
114
|
+
const observed = new Map();
|
|
115
|
+
const presence = new Map();
|
|
116
|
+
let recordCount = 0;
|
|
117
|
+
try {
|
|
118
|
+
for await (const record of sheet.query()) {
|
|
119
|
+
recordCount++;
|
|
120
|
+
for (const [k, v] of Object.entries(record)) {
|
|
121
|
+
presence.set(k, (presence.get(k) ?? 0) + 1);
|
|
122
|
+
let obs = observed.get(k);
|
|
123
|
+
if (!obs) {
|
|
124
|
+
obs = { types: new Set(), items: new Set() };
|
|
125
|
+
observed.set(k, obs);
|
|
126
|
+
}
|
|
127
|
+
observeValue(obs, v);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
throw translateError(error);
|
|
133
|
+
}
|
|
134
|
+
if (recordCount === 0) {
|
|
135
|
+
throw new AxiError(`${flags.sheet}: no records to infer from`, 'NO_RECORDS', [`Upsert at least one record first, then re-run \`gitsheets-axi infer ${flags.sheet}\``]);
|
|
136
|
+
}
|
|
137
|
+
const properties = {};
|
|
138
|
+
for (const [field, info] of observed.entries()) {
|
|
139
|
+
const types = [...info.types].sort();
|
|
140
|
+
const prop = {};
|
|
141
|
+
prop['type'] = types.length === 1 ? types[0] : types;
|
|
142
|
+
if (info.items.size > 0) {
|
|
143
|
+
const itemTypes = [...info.items].sort();
|
|
144
|
+
prop['items'] = { type: itemTypes.length === 1 ? itemTypes[0] : itemTypes };
|
|
145
|
+
}
|
|
146
|
+
if (info.min !== undefined)
|
|
147
|
+
prop['minimum'] = info.min;
|
|
148
|
+
if (info.max !== undefined)
|
|
149
|
+
prop['maximum'] = info.max;
|
|
150
|
+
properties[field] = prop;
|
|
151
|
+
}
|
|
152
|
+
const required = [...presence.entries()]
|
|
153
|
+
.filter(([, count]) => count === recordCount)
|
|
154
|
+
.map(([n]) => n)
|
|
155
|
+
.sort();
|
|
156
|
+
// Read existing config, merge schema into it.
|
|
157
|
+
const existingText = await readConfigText(repo.gitDir, configPath);
|
|
158
|
+
if (existingText === null) {
|
|
159
|
+
throw new AxiError(`infer: ${configPath} doesn't exist — run \`gitsheets-axi init ${flags.sheet}\` first`, 'NOT_FOUND');
|
|
160
|
+
}
|
|
161
|
+
const parsed = parseToml(existingText);
|
|
162
|
+
const gitsheet = (parsed['gitsheet'] ?? {});
|
|
163
|
+
const newSchema = { type: 'object', properties };
|
|
164
|
+
if (required.length > 0)
|
|
165
|
+
newSchema['required'] = required;
|
|
166
|
+
gitsheet['schema'] = newSchema;
|
|
167
|
+
parsed['gitsheet'] = gitsheet;
|
|
168
|
+
const newText = stringifyRecord(parsed);
|
|
169
|
+
if (newText === existingText) {
|
|
170
|
+
return renderObject({
|
|
171
|
+
result: 'no-op',
|
|
172
|
+
sheet: flags.sheet,
|
|
173
|
+
config: configPath,
|
|
174
|
+
properties: Object.keys(properties).length,
|
|
175
|
+
required: required.length,
|
|
176
|
+
records_observed: recordCount,
|
|
177
|
+
reason: 'inferred schema already matches',
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const commitMessage = flags.message ?? `${flags.sheet} infer schema (${Object.keys(properties).length} fields)`;
|
|
181
|
+
let commitHash = '';
|
|
182
|
+
try {
|
|
183
|
+
const result = await repo.transact({ message: commitMessage }, async (tx) => {
|
|
184
|
+
await tx.tree.writeChild(configPath, newText);
|
|
185
|
+
tx.markMutated();
|
|
186
|
+
});
|
|
187
|
+
commitHash = result.commitHash ?? '';
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
throw translateError(error);
|
|
191
|
+
}
|
|
192
|
+
return renderObject({
|
|
193
|
+
result: 'committed',
|
|
194
|
+
sheet: flags.sheet,
|
|
195
|
+
config: configPath,
|
|
196
|
+
properties: Object.keys(properties).length,
|
|
197
|
+
required: required.length,
|
|
198
|
+
records_observed: recordCount,
|
|
199
|
+
commit: commitHash,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async function readConfigText(gitDir, path) {
|
|
203
|
+
try {
|
|
204
|
+
const { stdout } = await exec('git', ['show', `HEAD:${path}`], {
|
|
205
|
+
cwd: gitDir,
|
|
206
|
+
maxBuffer: 100 * 1024 * 1024,
|
|
207
|
+
});
|
|
208
|
+
return stdout;
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=infer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer.js","sourceRoot":"","sources":["../../../src/commands/infer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GitsheetsContext } from '../context.js';
|
|
2
|
+
export declare const INIT_HELP = "usage: gitsheets-axi init <sheet> [--path <template>] [--schema <file>] [--force]\nflags[4]:\n --path <template> Path template (default: \"${{ id }}\")\n --schema <file> Path to a JSON file with the schema to embed\n --force Overwrite an existing config\n --message <m> Commit message (default: \"<sheet> init sheet config\")\nexamples:\n gitsheets-axi init users\n gitsheets-axi init posts --path '${{ slug }}'\n gitsheets-axi init users --schema users.schema.json\nbehavior:\n Writes a starter `.gitsheets/<sheet>.toml` with a default root,\n path template, and optional schema. Refuses to overwrite an\n existing config unless --force is set.\nidempotency:\n When the rendered config matches the existing config byte-for-byte,\n exits 0 with result: \"no-op\" \u2014 safe to re-run.\n";
|
|
3
|
+
export declare function initCommand(args: string[], ctx: GitsheetsContext): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,eAAO,MAAM,SAAS,g0BAiBrB,CAAC;AA+EF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CA6FjB"}
|