@ontologie/cli 0.1.0-preview.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/README.md +492 -0
- package/dist/cache/keys.d.ts +11 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +14 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/store.d.ts +23 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +160 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cli-compat.d.ts +6 -0
- package/dist/cli-compat.d.ts.map +1 -0
- package/dist/cli-compat.js +11 -0
- package/dist/cli-compat.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +119 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/actions.d.ts +22 -0
- package/dist/commands/actions.d.ts.map +1 -0
- package/dist/commands/actions.js +211 -0
- package/dist/commands/actions.js.map +1 -0
- package/dist/commands/agent-files.d.ts +27 -0
- package/dist/commands/agent-files.d.ts.map +1 -0
- package/dist/commands/agent-files.js +167 -0
- package/dist/commands/agent-files.js.map +1 -0
- package/dist/commands/agent.d.ts +23 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +314 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/audit.d.ts +11 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +94 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/cache.d.ts +8 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +40 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/capabilities.d.ts +56 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +304 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/check.d.ts +7 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +16 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +133 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/context.d.ts +6 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +226 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dev.d.ts +15 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +62 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/docs-alias.d.ts +14 -0
- package/dist/commands/docs-alias.d.ts.map +1 -0
- package/dist/commands/docs-alias.js +28 -0
- package/dist/commands/docs-alias.js.map +1 -0
- package/dist/commands/docs.d.ts +6 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +67 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +161 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +7 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +36 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/graph.d.ts +9 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +149 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/import.d.ts +19 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +330 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +80 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +345 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +101 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/instances.d.ts +7 -0
- package/dist/commands/instances.d.ts.map +1 -0
- package/dist/commands/instances.js +418 -0
- package/dist/commands/instances.js.map +1 -0
- package/dist/commands/keys.d.ts +6 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +113 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/knowledge.d.ts +6 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +76 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/model.d.ts +3 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +40 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/nodes.d.ts +6 -0
- package/dist/commands/nodes.d.ts.map +1 -0
- package/dist/commands/nodes.js +111 -0
- package/dist/commands/nodes.js.map +1 -0
- package/dist/commands/openapi.d.ts +7 -0
- package/dist/commands/openapi.d.ts.map +1 -0
- package/dist/commands/openapi.js +17 -0
- package/dist/commands/openapi.js.map +1 -0
- package/dist/commands/plan.d.ts +19 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +563 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/process.d.ts +3 -0
- package/dist/commands/process.d.ts.map +1 -0
- package/dist/commands/process.js +67 -0
- package/dist/commands/process.js.map +1 -0
- package/dist/commands/query.d.ts +26 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +253 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/schema.d.ts +24 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +933 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +10 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +74 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/shared.d.ts +32 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +63 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/usage.d.ts +6 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +86 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/validators.d.ts +30 -0
- package/dist/commands/validators.d.ts.map +1 -0
- package/dist/commands/validators.js +93 -0
- package/dist/commands/validators.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +48 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +9 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +79 -0
- package/dist/credentials.js.map +1 -0
- package/dist/keychain.d.ts +9 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +51 -0
- package/dist/keychain.js.map +1 -0
- package/dist/output/csv.d.ts +5 -0
- package/dist/output/csv.d.ts.map +1 -0
- package/dist/output/csv.js +22 -0
- package/dist/output/csv.js.map +1 -0
- package/dist/output/envelope.schema.d.ts +1053 -0
- package/dist/output/envelope.schema.d.ts.map +1 -0
- package/dist/output/envelope.schema.js +256 -0
- package/dist/output/envelope.schema.js.map +1 -0
- package/dist/output/errors.d.ts +58 -0
- package/dist/output/errors.d.ts.map +1 -0
- package/dist/output/errors.js +339 -0
- package/dist/output/errors.js.map +1 -0
- package/dist/output/formatter.d.ts +27 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +80 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/json.d.ts +41 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +215 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/markdown.d.ts +6 -0
- package/dist/output/markdown.d.ts.map +1 -0
- package/dist/output/markdown.js +51 -0
- package/dist/output/markdown.js.map +1 -0
- package/dist/output/meta.d.ts +49 -0
- package/dist/output/meta.d.ts.map +1 -0
- package/dist/output/meta.js +96 -0
- package/dist/output/meta.js.map +1 -0
- package/dist/output/plain.d.ts +6 -0
- package/dist/output/plain.d.ts.map +1 -0
- package/dist/output/plain.js +51 -0
- package/dist/output/plain.js.map +1 -0
- package/dist/output/table.d.ts +5 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +54 -0
- package/dist/output/table.js.map +1 -0
- package/dist/output/types.d.ts +54 -0
- package/dist/output/types.d.ts.map +1 -0
- package/dist/output/types.js +80 -0
- package/dist/output/types.js.map +1 -0
- package/dist/output/warnings.d.ts +15 -0
- package/dist/output/warnings.d.ts.map +1 -0
- package/dist/output/warnings.js +46 -0
- package/dist/output/warnings.js.map +1 -0
- package/dist/output/yaml.d.ts +6 -0
- package/dist/output/yaml.d.ts.map +1 -0
- package/dist/output/yaml.js +9 -0
- package/dist/output/yaml.js.map +1 -0
- package/dist/schema/breaking-changes.d.ts +17 -0
- package/dist/schema/breaking-changes.d.ts.map +1 -0
- package/dist/schema/breaking-changes.js +108 -0
- package/dist/schema/breaking-changes.js.map +1 -0
- package/dist/schema/helpers.d.ts +18 -0
- package/dist/schema/helpers.d.ts.map +1 -0
- package/dist/schema/helpers.js +48 -0
- package/dist/schema/helpers.js.map +1 -0
- package/dist/schema/load-schema-file.d.ts +13 -0
- package/dist/schema/load-schema-file.d.ts.map +1 -0
- package/dist/schema/load-schema-file.js +88 -0
- package/dist/schema/load-schema-file.js.map +1 -0
- package/dist/schema/lockfile.d.ts +6 -0
- package/dist/schema/lockfile.d.ts.map +1 -0
- package/dist/schema/lockfile.js +34 -0
- package/dist/schema/lockfile.js.map +1 -0
- package/dist/schema/manifest-client.d.ts +31 -0
- package/dist/schema/manifest-client.d.ts.map +1 -0
- package/dist/schema/manifest-client.js +282 -0
- package/dist/schema/manifest-client.js.map +1 -0
- package/dist/schema/output.d.ts +38 -0
- package/dist/schema/output.d.ts.map +1 -0
- package/dist/schema/output.js +95 -0
- package/dist/schema/output.js.map +1 -0
- package/dist/stdin.d.ts +8 -0
- package/dist/stdin.d.ts.map +1 -0
- package/dist/stdin.js +21 -0
- package/dist/stdin.js.map +1 -0
- package/dist/templates/basic.d.ts +6 -0
- package/dist/templates/basic.d.ts.map +1 -0
- package/dist/templates/basic.js +90 -0
- package/dist/templates/basic.js.map +1 -0
- package/dist/templates/contract-review.d.ts +9 -0
- package/dist/templates/contract-review.d.ts.map +1 -0
- package/dist/templates/contract-review.js +172 -0
- package/dist/templates/contract-review.js.map +1 -0
- package/dist/templates/customer-onboarding.d.ts +9 -0
- package/dist/templates/customer-onboarding.d.ts.map +1 -0
- package/dist/templates/customer-onboarding.js +176 -0
- package/dist/templates/customer-onboarding.js.map +1 -0
- package/dist/templates/index.d.ts +11 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +16 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/react-dashboard.d.ts +6 -0
- package/dist/templates/react-dashboard.d.ts.map +1 -0
- package/dist/templates/react-dashboard.js +146 -0
- package/dist/templates/react-dashboard.js.map +1 -0
- package/dist/templates/vendor-risk.d.ts +9 -0
- package/dist/templates/vendor-risk.d.ts.map +1 -0
- package/dist/templates/vendor-risk.js +186 -0
- package/dist/templates/vendor-risk.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ontologie import -- import data from CSV/JSON/JSONL files into ObjectType instances
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { resolveConfig } from '../config.js';
|
|
7
|
+
import { createDfClient } from '../client.js';
|
|
8
|
+
import { buildCliMeta, extractMetaFromHeaders } from '../output/meta.js';
|
|
9
|
+
import { output } from '../output/formatter.js';
|
|
10
|
+
import { withErrorHandler, getGlobalFlags, resolveTypeId } from './shared.js';
|
|
11
|
+
import { resolveMutationMode } from './validators.js';
|
|
12
|
+
import { getExitCode } from '../output/errors.js';
|
|
13
|
+
export function detectFormat(filePath, explicit) {
|
|
14
|
+
if (explicit) {
|
|
15
|
+
const fmt = explicit.toLowerCase();
|
|
16
|
+
if (fmt === 'csv' || fmt === 'json' || fmt === 'jsonl')
|
|
17
|
+
return fmt;
|
|
18
|
+
throw Object.assign(new Error(`Unsupported input format "${explicit}". Use csv, json, or jsonl.`), { code: 'INVALID_USAGE', statusCode: 400 });
|
|
19
|
+
}
|
|
20
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
21
|
+
switch (ext) {
|
|
22
|
+
case '.csv':
|
|
23
|
+
return 'csv';
|
|
24
|
+
case '.json':
|
|
25
|
+
return 'json';
|
|
26
|
+
case '.jsonl':
|
|
27
|
+
case '.ndjson':
|
|
28
|
+
return 'jsonl';
|
|
29
|
+
default:
|
|
30
|
+
throw Object.assign(new Error(`Cannot detect format from extension "${ext}". Use --format-input csv|json|jsonl.`), { code: 'INVALID_USAGE', statusCode: 400 });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a CSV field, handling quoted values with embedded commas and escaped quotes.
|
|
35
|
+
*/
|
|
36
|
+
export function parseCsvLine(line) {
|
|
37
|
+
const fields = [];
|
|
38
|
+
let current = '';
|
|
39
|
+
let inQuotes = false;
|
|
40
|
+
for (let i = 0; i < line.length; i++) {
|
|
41
|
+
const ch = line[i];
|
|
42
|
+
if (inQuotes) {
|
|
43
|
+
if (ch === '"') {
|
|
44
|
+
// Check for escaped quote ""
|
|
45
|
+
if (i + 1 < line.length && line[i + 1] === '"') {
|
|
46
|
+
current += '"';
|
|
47
|
+
i++; // skip next quote
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
inQuotes = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
current += ch;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
if (ch === '"') {
|
|
59
|
+
inQuotes = true;
|
|
60
|
+
}
|
|
61
|
+
else if (ch === ',') {
|
|
62
|
+
fields.push(current.trim());
|
|
63
|
+
current = '';
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
current += ch;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
fields.push(current.trim());
|
|
71
|
+
return fields;
|
|
72
|
+
}
|
|
73
|
+
export function parseCsv(content) {
|
|
74
|
+
// IM2: Strip UTF-8 BOM if present
|
|
75
|
+
const cleaned = content.startsWith('\uFEFF') ? content.slice(1) : content;
|
|
76
|
+
const lines = cleaned.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
77
|
+
if (lines.length < 2)
|
|
78
|
+
return [];
|
|
79
|
+
const headers = parseCsvLine(lines[0]);
|
|
80
|
+
const rows = [];
|
|
81
|
+
for (let i = 1; i < lines.length; i++) {
|
|
82
|
+
const values = parseCsvLine(lines[i]);
|
|
83
|
+
const row = {};
|
|
84
|
+
for (let j = 0; j < headers.length; j++) {
|
|
85
|
+
row[headers[j]] = values[j] ?? '';
|
|
86
|
+
}
|
|
87
|
+
rows.push(row);
|
|
88
|
+
}
|
|
89
|
+
return rows;
|
|
90
|
+
}
|
|
91
|
+
export function parseJson(content) {
|
|
92
|
+
const parsed = JSON.parse(content);
|
|
93
|
+
if (Array.isArray(parsed))
|
|
94
|
+
return parsed;
|
|
95
|
+
throw Object.assign(new Error('JSON file must contain an array of objects.'), { code: 'VALIDATION_ERROR', statusCode: 422 });
|
|
96
|
+
}
|
|
97
|
+
export function parseJsonl(content) {
|
|
98
|
+
return content
|
|
99
|
+
.split(/\r?\n/)
|
|
100
|
+
.filter((l) => l.trim().length > 0)
|
|
101
|
+
.map((line, idx) => {
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(line);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
throw Object.assign(new Error(`Invalid JSON on line ${idx + 1}.`), { code: 'VALIDATION_ERROR', statusCode: 422 });
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
export function parseFile(filePath, format, encoding) {
|
|
111
|
+
const content = fs.readFileSync(filePath, encoding);
|
|
112
|
+
switch (format) {
|
|
113
|
+
case 'csv':
|
|
114
|
+
return parseCsv(content);
|
|
115
|
+
case 'json':
|
|
116
|
+
return parseJson(content);
|
|
117
|
+
case 'jsonl':
|
|
118
|
+
return parseJsonl(content);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Dedup helper
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
export function dedupRows(rows, keyField) {
|
|
125
|
+
const seen = new Set();
|
|
126
|
+
const deduped = [];
|
|
127
|
+
for (const row of rows) {
|
|
128
|
+
const keyValue = String(row[keyField] ?? '');
|
|
129
|
+
if (!keyValue) {
|
|
130
|
+
deduped.push(row);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!seen.has(keyValue)) {
|
|
134
|
+
seen.add(keyValue);
|
|
135
|
+
deduped.push(row);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return deduped;
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Batch helpers
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
export function chunk(arr, size) {
|
|
144
|
+
const chunks = [];
|
|
145
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
146
|
+
chunks.push(arr.slice(i, i + size));
|
|
147
|
+
}
|
|
148
|
+
return chunks;
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Command registration
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
export function registerImport(program) {
|
|
154
|
+
const getFormat = () => {
|
|
155
|
+
const f = getGlobalFlags(program);
|
|
156
|
+
return f.format === 'json' ? 'json' : f.format === 'jsonl' ? 'jsonl' : 'text';
|
|
157
|
+
};
|
|
158
|
+
program
|
|
159
|
+
.command('import <file>')
|
|
160
|
+
.description('Import data from CSV/JSON/JSONL into ObjectType instances')
|
|
161
|
+
.requiredOption('--type <typeName>', 'Target ObjectType name')
|
|
162
|
+
.option('--key <field>', 'Dedup key field (e.g., externalId)')
|
|
163
|
+
.option('--dry-run', 'Validate without importing')
|
|
164
|
+
.option('--apply-plan <planId>', 'Apply a previously validated plan')
|
|
165
|
+
.option('--plan-hash <hash>', 'Plan hash from dry-run (used with --apply-plan)')
|
|
166
|
+
.option('--idempotency-key <key>', 'Idempotency key for safe retries')
|
|
167
|
+
.option('--validate-only', 'Parse, validate, and resolve type without importing')
|
|
168
|
+
.option('--format-input <fmt>', 'Input format: csv|json|jsonl (auto-detected from extension)')
|
|
169
|
+
.option('--encoding <enc>', 'File encoding', 'utf-8')
|
|
170
|
+
.option('--batch-size <n>', 'Batch size for import', '100')
|
|
171
|
+
.action(async (file, opts) => withErrorHandler(async () => {
|
|
172
|
+
const flags = getGlobalFlags(program);
|
|
173
|
+
const config = resolveConfig(flags);
|
|
174
|
+
const client = createDfClient(config);
|
|
175
|
+
// ---------------------------------------------------------------
|
|
176
|
+
// Resolve the file path
|
|
177
|
+
// ---------------------------------------------------------------
|
|
178
|
+
const filePath = path.resolve(file);
|
|
179
|
+
if (!fs.existsSync(filePath)) {
|
|
180
|
+
throw Object.assign(new Error(`File not found: ${filePath}`), { code: 'INVALID_USAGE', statusCode: 400 });
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------
|
|
183
|
+
// Parse the input file
|
|
184
|
+
// ---------------------------------------------------------------
|
|
185
|
+
const format = detectFormat(filePath, opts.formatInput);
|
|
186
|
+
const encoding = (opts.encoding || 'utf-8');
|
|
187
|
+
let rows = parseFile(filePath, format, encoding);
|
|
188
|
+
if (rows.length === 0) {
|
|
189
|
+
process.stderr.write('Warning: File contains no data rows.\n');
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------
|
|
192
|
+
// Dedup by key field if specified
|
|
193
|
+
// ---------------------------------------------------------------
|
|
194
|
+
const originalCount = rows.length;
|
|
195
|
+
if (opts.key && rows.length > 0) {
|
|
196
|
+
rows = dedupRows(rows, opts.key);
|
|
197
|
+
if (rows.length < originalCount) {
|
|
198
|
+
process.stderr.write(`Dedup: ${originalCount - rows.length} duplicate(s) removed by key "${opts.key}".\n`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------
|
|
202
|
+
// Resolve type name to ID
|
|
203
|
+
// ---------------------------------------------------------------
|
|
204
|
+
process.stderr.write(`Resolving type "${opts.type}"...\n`);
|
|
205
|
+
const typeId = await resolveTypeId(client, opts.type);
|
|
206
|
+
process.stderr.write(`Resolved type "${opts.type}" -> ${typeId}\n`);
|
|
207
|
+
// ---------------------------------------------------------------
|
|
208
|
+
// Validate-only mode: parse + resolve + report (no import)
|
|
209
|
+
// This is read-only — exempt from mutation guards.
|
|
210
|
+
// ---------------------------------------------------------------
|
|
211
|
+
if (opts.validateOnly) {
|
|
212
|
+
const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
213
|
+
const plan = {
|
|
214
|
+
typeId,
|
|
215
|
+
typeName: opts.type,
|
|
216
|
+
rowCount: rows.length,
|
|
217
|
+
columnsDetected: columns,
|
|
218
|
+
dedupKey: opts.key ?? null,
|
|
219
|
+
duplicatesRemoved: originalCount - rows.length,
|
|
220
|
+
sampleRows: rows.slice(0, 3),
|
|
221
|
+
validated: true,
|
|
222
|
+
};
|
|
223
|
+
const meta = buildCliMeta({
|
|
224
|
+
command: 'import.validate',
|
|
225
|
+
workspaceId: config.workspaceId,
|
|
226
|
+
apiUrl: config.apiUrl,
|
|
227
|
+
});
|
|
228
|
+
output(plan, meta, flags);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// ---------------------------------------------------------------
|
|
232
|
+
// Mutation guards: mutual exclusion, plan-hash, idempotency-key
|
|
233
|
+
// (checked after validate-only, which is read-only)
|
|
234
|
+
// ---------------------------------------------------------------
|
|
235
|
+
const mode = resolveMutationMode(opts);
|
|
236
|
+
// ---------------------------------------------------------------
|
|
237
|
+
// Dry-run mode: validate and report
|
|
238
|
+
// ---------------------------------------------------------------
|
|
239
|
+
if (mode === 'dry-run') {
|
|
240
|
+
const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
241
|
+
const plan = {
|
|
242
|
+
typeId,
|
|
243
|
+
typeName: opts.type,
|
|
244
|
+
rowCount: rows.length,
|
|
245
|
+
columnsDetected: columns,
|
|
246
|
+
dedupKey: opts.key ?? null,
|
|
247
|
+
duplicatesRemoved: originalCount - rows.length,
|
|
248
|
+
sampleRows: rows.slice(0, 3),
|
|
249
|
+
};
|
|
250
|
+
const meta = buildCliMeta({
|
|
251
|
+
command: 'import.dry-run',
|
|
252
|
+
workspaceId: config.workspaceId,
|
|
253
|
+
apiUrl: config.apiUrl,
|
|
254
|
+
});
|
|
255
|
+
output(plan, meta, flags);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
// ---------------------------------------------------------------
|
|
259
|
+
// Import: batch-create instances
|
|
260
|
+
// ---------------------------------------------------------------
|
|
261
|
+
const batchSize = Math.max(1, Number(opts.batchSize) || 100);
|
|
262
|
+
const batches = chunk(rows, batchSize);
|
|
263
|
+
const errors = [];
|
|
264
|
+
const warnings = [];
|
|
265
|
+
let imported = 0;
|
|
266
|
+
process.stderr.write(`Importing ${rows.length} row(s) in ${batches.length} batch(es) (batch size: ${batchSize})...\n`);
|
|
267
|
+
for (let batchIdx = 0; batchIdx < batches.length; batchIdx++) {
|
|
268
|
+
const batch = batches[batchIdx];
|
|
269
|
+
const batchStart = batchIdx * batchSize;
|
|
270
|
+
for (let i = 0; i < batch.length; i++) {
|
|
271
|
+
const rowIndex = batchStart + i;
|
|
272
|
+
const row = batch[i];
|
|
273
|
+
try {
|
|
274
|
+
await client.transport.requestWithHeaders({
|
|
275
|
+
method: 'POST',
|
|
276
|
+
path: `/api/v1/object-types/${typeId}/instances`,
|
|
277
|
+
body: {
|
|
278
|
+
data: row,
|
|
279
|
+
sourceType: 'import',
|
|
280
|
+
...(opts.key && row[opts.key] != null
|
|
281
|
+
? { externalId: String(row[opts.key]) }
|
|
282
|
+
: {}),
|
|
283
|
+
...(opts.applyPlan ? { planId: opts.applyPlan, ...(opts.planHash ? { planHash: opts.planHash } : {}) } : {}),
|
|
284
|
+
},
|
|
285
|
+
idempotencyKey: opts.idempotencyKey
|
|
286
|
+
? `${opts.idempotencyKey}:${rowIndex}`
|
|
287
|
+
: undefined,
|
|
288
|
+
});
|
|
289
|
+
imported++;
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
293
|
+
errors.push({ row: rowIndex + 1, message });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Progress on stderr
|
|
297
|
+
const processed = Math.min((batchIdx + 1) * batchSize, rows.length);
|
|
298
|
+
process.stderr.write(`Progress: ${processed}/${rows.length} rows processed.\n`);
|
|
299
|
+
}
|
|
300
|
+
if (errors.length > 0 && errors.length < rows.length) {
|
|
301
|
+
warnings.push(`${errors.length} row(s) failed out of ${rows.length}.`);
|
|
302
|
+
}
|
|
303
|
+
// ---------------------------------------------------------------
|
|
304
|
+
// Output results
|
|
305
|
+
// ---------------------------------------------------------------
|
|
306
|
+
const result = {
|
|
307
|
+
imported,
|
|
308
|
+
total: rows.length,
|
|
309
|
+
errors: errors.slice(0, 50), // Cap error output for readability
|
|
310
|
+
warnings,
|
|
311
|
+
typeId,
|
|
312
|
+
typeName: opts.type,
|
|
313
|
+
};
|
|
314
|
+
const headerMeta = errors.length === 0
|
|
315
|
+
? extractMetaFromHeaders({})
|
|
316
|
+
: {};
|
|
317
|
+
const meta = buildCliMeta({
|
|
318
|
+
command: 'import',
|
|
319
|
+
workspaceId: config.workspaceId,
|
|
320
|
+
apiUrl: config.apiUrl,
|
|
321
|
+
...headerMeta,
|
|
322
|
+
});
|
|
323
|
+
output(result, meta, flags);
|
|
324
|
+
// Exit with error code if all rows failed
|
|
325
|
+
if (imported === 0 && rows.length > 0) {
|
|
326
|
+
process.exitCode = getExitCode('INTERNAL_ERROR');
|
|
327
|
+
}
|
|
328
|
+
}, getFormat)());
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical CLI commands registry — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Every command registered on the `dataforge` Commander program lives in this
|
|
5
|
+
* array. Consumers:
|
|
6
|
+
* - `sdk/packages/cli/src/cli.ts` iterates this list to call `registerFn`.
|
|
7
|
+
* - `tests/structural/sdk-cli-parity.test.ts` ratchet diffs this list
|
|
8
|
+
* against the tests in `sdk/tests/verify/` and the contract docs
|
|
9
|
+
* (`CLI-CONFORM-01`). The SDK-path ↔ backend-mount diff
|
|
10
|
+
* (`SDK-PARITY-02`) is `it.todo()` until AST or runtime probe lands —
|
|
11
|
+
* see #990 / #992 review notes.
|
|
12
|
+
* - Future doc generators / shell completions read it instead of duplicating
|
|
13
|
+
* the command list.
|
|
14
|
+
*
|
|
15
|
+
* Stability tiers map to `sdk/docs/SDK-PUBLIC-STRATEGY.md`:
|
|
16
|
+
* - `stable` — committed surface, SemVer + 12-month deprecation window
|
|
17
|
+
* - `preview` — best-effort, may change in minor versions
|
|
18
|
+
* - `internal` — hidden from `--help`, not part of the public contract
|
|
19
|
+
*
|
|
20
|
+
* **Rule** (no double SOT): if a command is added or removed, this array is the
|
|
21
|
+
* authoritative location. Do not register commands directly in `cli.ts`.
|
|
22
|
+
*/
|
|
23
|
+
export type CliCommandStability = 'stable' | 'preview' | 'internal';
|
|
24
|
+
export interface CliCommandSpec {
|
|
25
|
+
/** Top-level Commander command name, e.g. `whoami`, `schema`. */
|
|
26
|
+
readonly name: string;
|
|
27
|
+
/** Direct subcommands (one level deep). Empty for leaf commands. */
|
|
28
|
+
readonly subcommands: readonly string[];
|
|
29
|
+
/** Source file relative to `commands/`, used for traceability and doc gen. */
|
|
30
|
+
readonly source: string;
|
|
31
|
+
/** Stability tier — see `sdk/docs/SDK-PUBLIC-STRATEGY.md`. */
|
|
32
|
+
readonly stability: CliCommandStability;
|
|
33
|
+
/** One-line description shown in `--help` and generated docs. */
|
|
34
|
+
readonly description: string;
|
|
35
|
+
/**
|
|
36
|
+
* Commander registration callback. Signature varies — some `register*`
|
|
37
|
+
* fns take a second `options` arg (`registerCache(program, { hidden:true })`),
|
|
38
|
+
* others don't (`registerWhoami(program)`).
|
|
39
|
+
*
|
|
40
|
+
* Typed as `(program: any, options?)` to side-step a Commander `^12.x`
|
|
41
|
+
* typings quirk where `Command` (the instance type) and the static
|
|
42
|
+
* `CommanderStatic.Command` namespace are flagged as incompatible at the
|
|
43
|
+
* call site even when both resolve to the same constructor. Tightening
|
|
44
|
+
* this to `Command` causes a spurious `TS2345` at `cli.ts:62` —
|
|
45
|
+
* `Argument of type 'Command' is not assignable to parameter of type
|
|
46
|
+
* 'CommanderStatic.Command'`. Runtime is unaffected.
|
|
47
|
+
*
|
|
48
|
+
* If a future `register*` fn is written with a *required* options arg,
|
|
49
|
+
* TypeScript will not catch the mismatch — `registerOptions` is the
|
|
50
|
+
* authoritative input contract on this entry. Keep both in sync.
|
|
51
|
+
*/
|
|
52
|
+
readonly registerFn: (program: any, options?: Record<string, unknown>) => void;
|
|
53
|
+
/** Optional options forwarded to `registerFn` (e.g. `{hidden: true}`). */
|
|
54
|
+
readonly registerOptions?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Every command registered on the `dataforge` program. Counts are pinned in
|
|
58
|
+
* `tests/structural/sdk-cli-parity.test.ts` (`CLI-CONFORM-01`) so any
|
|
59
|
+
* add/remove/tier-change forces an intentional update on both sides.
|
|
60
|
+
* Order matches the original `cli.ts` to preserve `--help` output stability.
|
|
61
|
+
*/
|
|
62
|
+
export declare const CANONICAL_CLI_COMMANDS: readonly CliCommandSpec[];
|
|
63
|
+
/**
|
|
64
|
+
* Returns the immutable registry of canonical CLI commands.
|
|
65
|
+
*
|
|
66
|
+
* Exposed as a function (rather than re-exporting the `const`) so callers can
|
|
67
|
+
* mock it in tests or wrap it with extra logic without circular imports.
|
|
68
|
+
*/
|
|
69
|
+
export declare function getCanonicalCliCommands(): readonly CliCommandSpec[];
|
|
70
|
+
/**
|
|
71
|
+
* Convenience helper used by `cli.ts` to wire every command in one pass.
|
|
72
|
+
* Honors `registerOptions` so commands like `cache` keep their `hidden:true`.
|
|
73
|
+
*
|
|
74
|
+
* `program` is intentionally typed as `any` — Commander ships two
|
|
75
|
+
* incompatible-looking exports (`Command` and `CommanderStatic.Command`) that
|
|
76
|
+
* TypeScript narrows differently depending on the call site, causing a
|
|
77
|
+
* spurious mismatch. The runtime is unaffected.
|
|
78
|
+
*/
|
|
79
|
+
export declare function registerAllCommands(program: any): void;
|
|
80
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAmCH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC/E,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpD;AAMD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,cAAc,EAgQ3D,CAAC;AAMF;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,SAAS,cAAc,EAAE,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAWtD"}
|