@ontologie/schema 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 +149 -0
- package/dist/compiler/compile.d.ts +36 -0
- package/dist/compiler/compile.d.ts.map +1 -0
- package/dist/compiler/compile.js +295 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/resolve.d.ts +14 -0
- package/dist/compiler/resolve.d.ts.map +1 -0
- package/dist/compiler/resolve.js +132 -0
- package/dist/compiler/resolve.js.map +1 -0
- package/dist/compiler/validate.d.ts +15 -0
- package/dist/compiler/validate.d.ts.map +1 -0
- package/dist/compiler/validate.js +188 -0
- package/dist/compiler/validate.js.map +1 -0
- package/dist/diff/diff.d.ts +20 -0
- package/dist/diff/diff.d.ts.map +1 -0
- package/dist/diff/diff.js +393 -0
- package/dist/diff/diff.js.map +1 -0
- package/dist/diff/format.d.ts +21 -0
- package/dist/diff/format.d.ts.map +1 -0
- package/dist/diff/format.js +88 -0
- package/dist/diff/format.js.map +1 -0
- package/dist/dsl/action.d.ts +148 -0
- package/dist/dsl/action.d.ts.map +1 -0
- package/dist/dsl/action.js +330 -0
- package/dist/dsl/action.js.map +1 -0
- package/dist/dsl/interface.d.ts +32 -0
- package/dist/dsl/interface.d.ts.map +1 -0
- package/dist/dsl/interface.js +77 -0
- package/dist/dsl/interface.js.map +1 -0
- package/dist/dsl/link.d.ts +34 -0
- package/dist/dsl/link.d.ts.map +1 -0
- package/dist/dsl/link.js +95 -0
- package/dist/dsl/link.js.map +1 -0
- package/dist/dsl/object-type.d.ts +35 -0
- package/dist/dsl/object-type.d.ts.map +1 -0
- package/dist/dsl/object-type.js +102 -0
- package/dist/dsl/object-type.js.map +1 -0
- package/dist/dsl/property.d.ts +43 -0
- package/dist/dsl/property.d.ts.map +1 -0
- package/dist/dsl/property.js +125 -0
- package/dist/dsl/property.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/lock/lockfile.d.ts +31 -0
- package/dist/lock/lockfile.d.ts.map +1 -0
- package/dist/lock/lockfile.js +86 -0
- package/dist/lock/lockfile.js.map +1 -0
- package/dist/model-assurance.d.ts +27 -0
- package/dist/model-assurance.d.ts.map +1 -0
- package/dist/model-assurance.js +194 -0
- package/dist/model-assurance.js.map +1 -0
- package/dist/pull/emit-schema.d.ts +24 -0
- package/dist/pull/emit-schema.d.ts.map +1 -0
- package/dist/pull/emit-schema.js +476 -0
- package/dist/pull/emit-schema.js.map +1 -0
- package/dist/push/execute.d.ts +34 -0
- package/dist/push/execute.d.ts.map +1 -0
- package/dist/push/execute.js +119 -0
- package/dist/push/execute.js.map +1 -0
- package/dist/push/plan.d.ts +37 -0
- package/dist/push/plan.d.ts.map +1 -0
- package/dist/push/plan.js +484 -0
- package/dist/push/plan.js.map +1 -0
- package/dist/types.d.ts +330 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull — generate a `dataforge.schema.ts` source file from an OntologyManifest.
|
|
3
|
+
*
|
|
4
|
+
* Performs topological sort so types without link dependencies come first,
|
|
5
|
+
* uses lazy `() => Type` for forward references.
|
|
6
|
+
*
|
|
7
|
+
* Fixes over V2:
|
|
8
|
+
* - apiName preserved exactly (no toCamelCase mangling) — round-trip safe
|
|
9
|
+
* - Chained declarations via pushChainedDeclaration (no fragile lastLine surgery)
|
|
10
|
+
* - ObjectType metadata emitted (displayName, description, primaryKey, implements)
|
|
11
|
+
* - All string interpolation uses JSON.stringify (injection-safe)
|
|
12
|
+
* - N:N cardinality maps to toMany (not toOne)
|
|
13
|
+
* - Variable name allocator: sanitizes identifiers, deduplicates, avoids reserved words
|
|
14
|
+
*/
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Reserved words & identifier safety
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const RESERVED_WORDS = new Set([
|
|
19
|
+
'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger',
|
|
20
|
+
'default', 'delete', 'do', 'else', 'export', 'extends', 'finally',
|
|
21
|
+
'for', 'function', 'if', 'import', 'in', 'instanceof', 'new',
|
|
22
|
+
'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof',
|
|
23
|
+
'var', 'void', 'while', 'with', 'yield', 'let', 'static',
|
|
24
|
+
'enum', 'await', 'implements', 'package', 'protected',
|
|
25
|
+
'interface', 'private', 'public',
|
|
26
|
+
]);
|
|
27
|
+
/** JSON.stringify shorthand for safe string quoting */
|
|
28
|
+
function q(value) {
|
|
29
|
+
return JSON.stringify(value);
|
|
30
|
+
}
|
|
31
|
+
function isValidIdentifier(value) {
|
|
32
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value) && !RESERVED_WORDS.has(value);
|
|
33
|
+
}
|
|
34
|
+
/** Emit an object key that preserves the exact apiName for round-trip safety */
|
|
35
|
+
function emitObjectKey(apiName) {
|
|
36
|
+
return isValidIdentifier(apiName) ? apiName : q(apiName);
|
|
37
|
+
}
|
|
38
|
+
function sanitizeIdentifier(raw, fallback) {
|
|
39
|
+
let value = raw
|
|
40
|
+
.replace(/[^A-Za-z0-9_$]/g, '_')
|
|
41
|
+
.replace(/^[^A-Za-z_$]+/, '');
|
|
42
|
+
if (!value)
|
|
43
|
+
value = fallback;
|
|
44
|
+
if (/^[0-9]/.test(value)) {
|
|
45
|
+
value = `_${value}`;
|
|
46
|
+
}
|
|
47
|
+
if (RESERVED_WORDS.has(value)) {
|
|
48
|
+
value = `${value}_`;
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function uniqueIdentifier(base, used) {
|
|
53
|
+
let candidate = base;
|
|
54
|
+
let suffix = 2;
|
|
55
|
+
while (used.has(candidate) || RESERVED_WORDS.has(candidate)) {
|
|
56
|
+
candidate = `${base}${suffix}`;
|
|
57
|
+
suffix += 1;
|
|
58
|
+
}
|
|
59
|
+
used.add(candidate);
|
|
60
|
+
return candidate;
|
|
61
|
+
}
|
|
62
|
+
function allocateVarNames(items, getApiName, makeBase) {
|
|
63
|
+
const used = new Set();
|
|
64
|
+
const result = new Map();
|
|
65
|
+
for (const item of items) {
|
|
66
|
+
const apiName = getApiName(item);
|
|
67
|
+
const base = sanitizeIdentifier(makeBase(apiName), 'Generated');
|
|
68
|
+
result.set(apiName, uniqueIdentifier(base, used));
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Naming helpers (used only for variable names, NOT for apiName keys)
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
function toDisplayName(apiName) {
|
|
76
|
+
return apiName
|
|
77
|
+
.replace(/_/g, ' ')
|
|
78
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
79
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
80
|
+
}
|
|
81
|
+
function toPascalCase(apiName) {
|
|
82
|
+
return apiName
|
|
83
|
+
.split('_')
|
|
84
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
|
|
85
|
+
.join('');
|
|
86
|
+
}
|
|
87
|
+
function toCamelCase(apiName) {
|
|
88
|
+
const pascal = toPascalCase(apiName);
|
|
89
|
+
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
90
|
+
}
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Link helpers
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
/** Extract the field-level apiName for a link, stripping the Source__ prefix */
|
|
95
|
+
function linkFieldApiName(link) {
|
|
96
|
+
const prefix = `${link.sourceTypeApiName}__`;
|
|
97
|
+
if (link.apiName.startsWith(prefix)) {
|
|
98
|
+
return link.apiName.slice(prefix.length);
|
|
99
|
+
}
|
|
100
|
+
return link.relationshipType || link.apiName;
|
|
101
|
+
}
|
|
102
|
+
/** Map cardinality to DSL method */
|
|
103
|
+
function linkMethod(cardinality) {
|
|
104
|
+
switch (cardinality) {
|
|
105
|
+
case 'N:N':
|
|
106
|
+
return 'toManyToMany';
|
|
107
|
+
case '1:N':
|
|
108
|
+
return 'toMany';
|
|
109
|
+
case '1:1':
|
|
110
|
+
case 'N:1':
|
|
111
|
+
default:
|
|
112
|
+
return 'toOne';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Chained declaration builder (replaces fragile lastLine surgery)
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
function pushChainedDeclaration(lines, firstLine, bodyLines, modifiers) {
|
|
119
|
+
lines.push(firstLine);
|
|
120
|
+
lines.push(...bodyLines);
|
|
121
|
+
if (modifiers.length > 0) {
|
|
122
|
+
lines.push('})');
|
|
123
|
+
for (const modifier of modifiers) {
|
|
124
|
+
lines.push(` ${modifier}`);
|
|
125
|
+
}
|
|
126
|
+
// Append semicolon to the last modifier line
|
|
127
|
+
lines[lines.length - 1] += ';';
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
lines.push('});');
|
|
131
|
+
}
|
|
132
|
+
lines.push('');
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Property emission
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/** Build the DSL call for a single property */
|
|
138
|
+
function emitProperty(prop) {
|
|
139
|
+
// money() sugar: number + semanticType 'money'
|
|
140
|
+
if (prop.dataType === 'number' && prop.semanticType === 'money') {
|
|
141
|
+
let expr = 'money()';
|
|
142
|
+
if (prop.required)
|
|
143
|
+
expr += '.required()';
|
|
144
|
+
if (prop.indexed && !prop.unique)
|
|
145
|
+
expr += '.indexed()';
|
|
146
|
+
if (prop.unique)
|
|
147
|
+
expr += '.unique()';
|
|
148
|
+
if (prop.defaultValue !== undefined)
|
|
149
|
+
expr += `.default(${JSON.stringify(prop.defaultValue)})`;
|
|
150
|
+
if (prop.constraints?.min !== undefined)
|
|
151
|
+
expr += `.min(${JSON.stringify(prop.constraints.min)})`;
|
|
152
|
+
if (prop.constraints?.max !== undefined)
|
|
153
|
+
expr += `.max(${JSON.stringify(prop.constraints.max)})`;
|
|
154
|
+
if (prop.description)
|
|
155
|
+
expr += `.description(${q(prop.description)})`;
|
|
156
|
+
if (prop.mutableBy && prop.mutableBy.length > 0)
|
|
157
|
+
expr += `.mutableBy(${JSON.stringify(prop.mutableBy)})`;
|
|
158
|
+
return { expr, usesMoney: true };
|
|
159
|
+
}
|
|
160
|
+
// Defense-in-depth: if dataType is 'enum' (legacy manifests), emit as string().enum(...)
|
|
161
|
+
const baseType = prop.dataType === 'enum' ? 'string' : prop.dataType;
|
|
162
|
+
let expr = `${baseType}()`;
|
|
163
|
+
if (prop.required)
|
|
164
|
+
expr += '.required()';
|
|
165
|
+
if (prop.indexed && !prop.unique)
|
|
166
|
+
expr += '.indexed()';
|
|
167
|
+
if (prop.unique)
|
|
168
|
+
expr += '.unique()';
|
|
169
|
+
if (prop.semanticType === 'email') {
|
|
170
|
+
expr += '.email()';
|
|
171
|
+
}
|
|
172
|
+
else if (prop.semanticType === 'datetime') {
|
|
173
|
+
expr += '.datetime()';
|
|
174
|
+
}
|
|
175
|
+
else if (prop.semanticType) {
|
|
176
|
+
expr += `.semantic(${q(prop.semanticType)})`;
|
|
177
|
+
}
|
|
178
|
+
if (prop.defaultValue !== undefined) {
|
|
179
|
+
expr += `.default(${JSON.stringify(prop.defaultValue)})`;
|
|
180
|
+
}
|
|
181
|
+
if (prop.constraints?.enum) {
|
|
182
|
+
const values = JSON.stringify(prop.constraints.enum);
|
|
183
|
+
expr += `.enum(${values})`;
|
|
184
|
+
}
|
|
185
|
+
else if (prop.dataType === 'enum' && prop.enumValues) {
|
|
186
|
+
// Fallback for manifests that have enumValues but no constraints.enum
|
|
187
|
+
expr += `.enum(${JSON.stringify(prop.enumValues)})`;
|
|
188
|
+
}
|
|
189
|
+
if (prop.constraints?.min !== undefined)
|
|
190
|
+
expr += `.min(${JSON.stringify(prop.constraints.min)})`;
|
|
191
|
+
if (prop.constraints?.max !== undefined)
|
|
192
|
+
expr += `.max(${JSON.stringify(prop.constraints.max)})`;
|
|
193
|
+
if (prop.mutableBy && prop.mutableBy.length > 0) {
|
|
194
|
+
expr += `.mutableBy(${JSON.stringify(prop.mutableBy)})`;
|
|
195
|
+
}
|
|
196
|
+
if (prop.description) {
|
|
197
|
+
expr += `.description(${q(prop.description)})`;
|
|
198
|
+
}
|
|
199
|
+
return { expr, usesMoney: false };
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Topological sort
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
/**
|
|
205
|
+
* Topological sort: types with no outgoing links (or only self-refs) first.
|
|
206
|
+
* Returns sorted apiName list.
|
|
207
|
+
*/
|
|
208
|
+
function topoSort(types, links) {
|
|
209
|
+
const apiNames = types.map(t => t.apiName);
|
|
210
|
+
const nameSet = new Set(apiNames);
|
|
211
|
+
// Build adjacency as dependency -> dependents (excluding self-refs), so target
|
|
212
|
+
// object types are emitted before sources that reference them.
|
|
213
|
+
const deps = new Map();
|
|
214
|
+
for (const name of apiNames) {
|
|
215
|
+
deps.set(name, new Set());
|
|
216
|
+
}
|
|
217
|
+
for (const link of links) {
|
|
218
|
+
if (link.sourceTypeApiName !== link.targetTypeApiName && nameSet.has(link.targetTypeApiName)) {
|
|
219
|
+
deps.get(link.targetTypeApiName)?.add(link.sourceTypeApiName);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Kahn's algorithm
|
|
223
|
+
const inDegree = new Map();
|
|
224
|
+
for (const name of apiNames)
|
|
225
|
+
inDegree.set(name, 0);
|
|
226
|
+
for (const [, targets] of deps) {
|
|
227
|
+
for (const t of targets) {
|
|
228
|
+
inDegree.set(t, (inDegree.get(t) ?? 0) + 1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const queue = [];
|
|
232
|
+
for (const [name, deg] of inDegree) {
|
|
233
|
+
if (deg === 0)
|
|
234
|
+
queue.push(name);
|
|
235
|
+
}
|
|
236
|
+
queue.sort();
|
|
237
|
+
const sorted = [];
|
|
238
|
+
while (queue.length > 0) {
|
|
239
|
+
const name = queue.shift();
|
|
240
|
+
sorted.push(name);
|
|
241
|
+
for (const target of deps.get(name) ?? []) {
|
|
242
|
+
const newDeg = (inDegree.get(target) ?? 1) - 1;
|
|
243
|
+
inDegree.set(target, newDeg);
|
|
244
|
+
if (newDeg === 0) {
|
|
245
|
+
queue.push(target);
|
|
246
|
+
queue.sort();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// If cycle detected, append remaining nodes alphabetically
|
|
251
|
+
if (sorted.length < apiNames.length) {
|
|
252
|
+
const remaining = apiNames.filter(n => !sorted.includes(n)).sort();
|
|
253
|
+
sorted.push(...remaining);
|
|
254
|
+
}
|
|
255
|
+
return sorted;
|
|
256
|
+
}
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
// ObjectType modifier builder
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
function objectTypeModifiers(ot, ifaceRefs) {
|
|
261
|
+
const modifiers = [];
|
|
262
|
+
if (ot.displayName && ot.displayName !== toDisplayName(ot.apiName)) {
|
|
263
|
+
modifiers.push(`.displayName(${q(ot.displayName)})`);
|
|
264
|
+
}
|
|
265
|
+
if (ot.description) {
|
|
266
|
+
modifiers.push(`.description(${q(ot.description)})`);
|
|
267
|
+
}
|
|
268
|
+
if (ot.primaryKey) {
|
|
269
|
+
modifiers.push(`.primaryKey(${q(ot.primaryKey)})`);
|
|
270
|
+
}
|
|
271
|
+
if (ifaceRefs.length > 0) {
|
|
272
|
+
modifiers.push(`.implements(${ifaceRefs.join(', ')})`);
|
|
273
|
+
}
|
|
274
|
+
return modifiers;
|
|
275
|
+
}
|
|
276
|
+
// ---------------------------------------------------------------------------
|
|
277
|
+
// Main entry point
|
|
278
|
+
// ---------------------------------------------------------------------------
|
|
279
|
+
/**
|
|
280
|
+
* Generate TypeScript source code using the `@dataforge/schema` DSL
|
|
281
|
+
* from an OntologyManifest.
|
|
282
|
+
*
|
|
283
|
+
* @param manifest - The remote OntologyManifest
|
|
284
|
+
* @returns Valid TypeScript source string
|
|
285
|
+
*/
|
|
286
|
+
export function emitSchema(manifest) {
|
|
287
|
+
const lines = [];
|
|
288
|
+
// Collect which DSL functions we need to import
|
|
289
|
+
const usedTypes = new Set();
|
|
290
|
+
let usesLink = false;
|
|
291
|
+
let usesMoney = false;
|
|
292
|
+
const hasActions = (manifest.actions ?? []).length > 0;
|
|
293
|
+
const hasInterfaces = (manifest.interfaces ?? []).length > 0;
|
|
294
|
+
for (const ot of manifest.objectTypes) {
|
|
295
|
+
for (const prop of ot.properties) {
|
|
296
|
+
if (prop.dataType === 'number' && prop.semanticType === 'money') {
|
|
297
|
+
usesMoney = true;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
usedTypes.add(prop.dataType === 'enum' ? 'string' : prop.dataType);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
for (const iface of manifest.interfaces ?? []) {
|
|
305
|
+
for (const prop of iface.sharedProperties) {
|
|
306
|
+
if (prop.dataType === 'number' && prop.semanticType === 'money') {
|
|
307
|
+
usesMoney = true;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
usedTypes.add(prop.dataType === 'enum' ? 'string' : prop.dataType);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (manifest.linkTypes.length > 0) {
|
|
315
|
+
usesLink = true;
|
|
316
|
+
}
|
|
317
|
+
// Build import line
|
|
318
|
+
const imports = ['objectType'];
|
|
319
|
+
if (hasInterfaces)
|
|
320
|
+
imports.push('defineInterface');
|
|
321
|
+
for (const dt of ['string', 'number', 'boolean', 'date', 'object', 'array']) {
|
|
322
|
+
if (usedTypes.has(dt))
|
|
323
|
+
imports.push(dt);
|
|
324
|
+
}
|
|
325
|
+
if (usesMoney)
|
|
326
|
+
imports.push('money');
|
|
327
|
+
if (usesLink)
|
|
328
|
+
imports.push('link');
|
|
329
|
+
if (hasActions)
|
|
330
|
+
imports.push('action');
|
|
331
|
+
lines.push(`import { ${imports.join(', ')} } from '@dataforge/schema';`);
|
|
332
|
+
lines.push('');
|
|
333
|
+
// Allocate safe, unique variable names for all entities
|
|
334
|
+
const objectVarNames = allocateVarNames(manifest.objectTypes, t => t.apiName, toPascalCase);
|
|
335
|
+
const interfaceVarNames = allocateVarNames(manifest.interfaces ?? [], i => i.apiName, toPascalCase);
|
|
336
|
+
const actionVarNames = allocateVarNames(manifest.actions ?? [], a => `${a.objectTypeApiName}_${a.apiName}`, key => toCamelCase(key.replace(/\./g, '_')));
|
|
337
|
+
// Build lookup maps
|
|
338
|
+
const typeMap = new Map(manifest.objectTypes.map(t => [t.apiName, t]));
|
|
339
|
+
// Links grouped by source type
|
|
340
|
+
const linksBySource = new Map();
|
|
341
|
+
for (const lt of manifest.linkTypes) {
|
|
342
|
+
const list = linksBySource.get(lt.sourceTypeApiName) ?? [];
|
|
343
|
+
list.push(lt);
|
|
344
|
+
linksBySource.set(lt.sourceTypeApiName, list);
|
|
345
|
+
}
|
|
346
|
+
// Emit interfaces before types
|
|
347
|
+
for (const iface of manifest.interfaces ?? []) {
|
|
348
|
+
const varName = interfaceVarNames.get(iface.apiName);
|
|
349
|
+
const propLines = [];
|
|
350
|
+
for (const prop of iface.sharedProperties) {
|
|
351
|
+
propLines.push(` ${emitObjectKey(prop.apiName)}: ${emitProperty(prop).expr},`);
|
|
352
|
+
}
|
|
353
|
+
const modifiers = [];
|
|
354
|
+
if (iface.displayName && iface.displayName !== toDisplayName(iface.apiName)) {
|
|
355
|
+
modifiers.push(`.displayName(${q(iface.displayName)})`);
|
|
356
|
+
}
|
|
357
|
+
if (iface.description) {
|
|
358
|
+
modifiers.push(`.description(${q(iface.description)})`);
|
|
359
|
+
}
|
|
360
|
+
pushChainedDeclaration(lines, `export const ${varName} = defineInterface(${q(iface.apiName)}, {`, propLines, modifiers);
|
|
361
|
+
}
|
|
362
|
+
// Build interface membership: type apiName -> interface apiNames
|
|
363
|
+
const typeInterfaces = new Map();
|
|
364
|
+
for (const ot of manifest.objectTypes) {
|
|
365
|
+
if (ot.interfaces && ot.interfaces.length > 0) {
|
|
366
|
+
typeInterfaces.set(ot.apiName, ot.interfaces);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Topological sort
|
|
370
|
+
const sortedNames = topoSort(manifest.objectTypes, manifest.linkTypes);
|
|
371
|
+
for (const apiName of sortedNames) {
|
|
372
|
+
const ot = typeMap.get(apiName);
|
|
373
|
+
if (!ot)
|
|
374
|
+
continue;
|
|
375
|
+
const varName = objectVarNames.get(apiName);
|
|
376
|
+
const fieldLines = [];
|
|
377
|
+
// Properties — preserve exact apiName as key
|
|
378
|
+
for (const prop of ot.properties) {
|
|
379
|
+
fieldLines.push(` ${emitObjectKey(prop.apiName)}: ${emitProperty(prop).expr},`);
|
|
380
|
+
}
|
|
381
|
+
// Links for this type
|
|
382
|
+
const typeLinks = linksBySource.get(apiName) ?? [];
|
|
383
|
+
for (const lt of typeLinks) {
|
|
384
|
+
const fieldName = linkFieldApiName(lt);
|
|
385
|
+
const targetVar = objectVarNames.get(lt.targetTypeApiName) ?? toPascalCase(lt.targetTypeApiName);
|
|
386
|
+
const method = linkMethod(lt.cardinality);
|
|
387
|
+
let linkExpr = `link.${method}(() => ${targetVar})`;
|
|
388
|
+
if (lt.inverseName)
|
|
389
|
+
linkExpr += `.inverseName(${q(lt.inverseName)})`;
|
|
390
|
+
if (lt.label)
|
|
391
|
+
linkExpr += `.label(${q(lt.label)})`;
|
|
392
|
+
fieldLines.push(` ${emitObjectKey(fieldName)}: ${linkExpr},`);
|
|
393
|
+
}
|
|
394
|
+
// ObjectType modifiers (displayName, description, primaryKey, implements)
|
|
395
|
+
const ifaceList = typeInterfaces.get(apiName) ?? [];
|
|
396
|
+
const ifaceRefs = ifaceList
|
|
397
|
+
.map(name => interfaceVarNames.get(name))
|
|
398
|
+
.filter((name) => typeof name === 'string');
|
|
399
|
+
const modifiers = objectTypeModifiers(ot, ifaceRefs);
|
|
400
|
+
pushChainedDeclaration(lines, `export const ${varName} = objectType(${q(apiName)}, {`, fieldLines, modifiers);
|
|
401
|
+
}
|
|
402
|
+
// Emit actions
|
|
403
|
+
const actions = manifest.actions ?? [];
|
|
404
|
+
if (actions.length > 0) {
|
|
405
|
+
const sortedActions = [...actions].sort((a, b) => {
|
|
406
|
+
const cmp = a.objectTypeApiName.localeCompare(b.objectTypeApiName);
|
|
407
|
+
return cmp !== 0 ? cmp : a.apiName.localeCompare(b.apiName);
|
|
408
|
+
});
|
|
409
|
+
for (const act of sortedActions) {
|
|
410
|
+
const varName = actionVarNames.get(`${act.objectTypeApiName}_${act.apiName}`);
|
|
411
|
+
const targetVar = objectVarNames.get(act.objectTypeApiName) ?? toPascalCase(act.objectTypeApiName);
|
|
412
|
+
let expr = `action(${q(act.apiName)})\n .on(() => ${targetVar})`;
|
|
413
|
+
if (act.actionType && act.actionType !== 'CUSTOM') {
|
|
414
|
+
expr += `\n .type(${q(act.actionType)})`;
|
|
415
|
+
}
|
|
416
|
+
if (act.trigger && act.trigger !== 'MANUAL') {
|
|
417
|
+
expr += `\n .trigger(${q(act.trigger)})`;
|
|
418
|
+
}
|
|
419
|
+
if (act.parameters.length > 0) {
|
|
420
|
+
const inputFields = act.parameters.map(p => {
|
|
421
|
+
const parts = [`dataType: ${q(p.dataType)}`];
|
|
422
|
+
if (p.required)
|
|
423
|
+
parts.push('required: true');
|
|
424
|
+
if (p.defaultValue !== undefined)
|
|
425
|
+
parts.push(`defaultValue: ${JSON.stringify(p.defaultValue)}`);
|
|
426
|
+
if (p.description)
|
|
427
|
+
parts.push(`description: ${q(p.description)}`);
|
|
428
|
+
return ` ${emitObjectKey(p.name)}: { ${parts.join(', ')} }`;
|
|
429
|
+
});
|
|
430
|
+
expr += `\n .input({\n${inputFields.join(',\n')},\n })`;
|
|
431
|
+
}
|
|
432
|
+
if (act.conditions && act.conditions.length > 0) {
|
|
433
|
+
for (const cond of act.conditions) {
|
|
434
|
+
expr += `\n .when({ field: ${q(cond.field)}, operator: ${q(cond.operator)}, value: ${JSON.stringify(cond.value)} })`;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (act.effects && act.effects.length > 0) {
|
|
438
|
+
for (const eff of act.effects) {
|
|
439
|
+
const effRecord = eff;
|
|
440
|
+
const kind = effRecord.kind ?? 'set';
|
|
441
|
+
switch (kind) {
|
|
442
|
+
case 'createRelated':
|
|
443
|
+
expr += `\n .createRelated(${q(String(effRecord.linkName ?? ''))}, ${q(String(effRecord.targetType ?? ''))}, ${JSON.stringify(effRecord.fields ?? {})})`;
|
|
444
|
+
break;
|
|
445
|
+
case 'link':
|
|
446
|
+
expr += `\n .link(${q(String(effRecord.linkName ?? ''))}, ${q(String(effRecord.targetType ?? ''))})`;
|
|
447
|
+
break;
|
|
448
|
+
case 'unlink':
|
|
449
|
+
expr += `\n .unlink(${q(String(effRecord.linkName ?? ''))}, ${q(String(effRecord.targetType ?? ''))})`;
|
|
450
|
+
break;
|
|
451
|
+
case 'set':
|
|
452
|
+
default:
|
|
453
|
+
expr += `\n .set({ field: ${q(String(effRecord.field ?? ''))}, value: ${JSON.stringify(effRecord.value)} })`;
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (act.requiredScopes && act.requiredScopes.length > 0) {
|
|
459
|
+
expr += `\n .requires(${act.requiredScopes.map(s => q(s)).join(', ')})`;
|
|
460
|
+
}
|
|
461
|
+
if (act.timeout !== undefined) {
|
|
462
|
+
expr += `\n .timeout(${act.timeout})`;
|
|
463
|
+
}
|
|
464
|
+
if (act.displayName) {
|
|
465
|
+
expr += `\n .displayName(${q(act.displayName)})`;
|
|
466
|
+
}
|
|
467
|
+
if (act.description) {
|
|
468
|
+
expr += `\n .description(${q(act.description)})`;
|
|
469
|
+
}
|
|
470
|
+
lines.push(`export const ${varName} = ${expr};`);
|
|
471
|
+
lines.push('');
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return lines.join('\n');
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=emit-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-schema.js","sourceRoot":"","sources":["../../src/pull/emit-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute — run a list of CQRS commands against the backend.
|
|
3
|
+
*/
|
|
4
|
+
import type { CqrsCommand, PushProgress } from '../types.js';
|
|
5
|
+
export interface HttpTransport {
|
|
6
|
+
request<T>(opts: {
|
|
7
|
+
method: string;
|
|
8
|
+
path: string;
|
|
9
|
+
body?: unknown;
|
|
10
|
+
}): Promise<T>;
|
|
11
|
+
}
|
|
12
|
+
export interface ExecuteOptions {
|
|
13
|
+
transport: HttpTransport;
|
|
14
|
+
commands: CqrsCommand[];
|
|
15
|
+
onProgress?: (progress: PushProgress) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute CQRS commands sequentially via the backend command endpoint.
|
|
19
|
+
*
|
|
20
|
+
* After each successful command, captures `metadata.currentVersion` for the
|
|
21
|
+
* next command's `expectedVersion` (OCC chain).
|
|
22
|
+
*
|
|
23
|
+
* @returns Summary of executed commands
|
|
24
|
+
*/
|
|
25
|
+
export declare function executePush(options: ExecuteOptions): Promise<{
|
|
26
|
+
total: number;
|
|
27
|
+
succeeded: number;
|
|
28
|
+
failed: number;
|
|
29
|
+
errors: Array<{
|
|
30
|
+
command: CqrsCommand;
|
|
31
|
+
error: string;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/push/execute.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C;AAOD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CAAC,CA0ED"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute — run a list of CQRS commands against the backend.
|
|
3
|
+
*/
|
|
4
|
+
import { ROUTES } from '@dataforge/sdk-types';
|
|
5
|
+
/**
|
|
6
|
+
* Execute CQRS commands sequentially via the backend command endpoint.
|
|
7
|
+
*
|
|
8
|
+
* After each successful command, captures `metadata.currentVersion` for the
|
|
9
|
+
* next command's `expectedVersion` (OCC chain).
|
|
10
|
+
*
|
|
11
|
+
* @returns Summary of executed commands
|
|
12
|
+
*/
|
|
13
|
+
export async function executePush(options) {
|
|
14
|
+
const { transport, commands, onProgress } = options;
|
|
15
|
+
const errors = [];
|
|
16
|
+
let succeeded = 0;
|
|
17
|
+
// Bug 1.8 fix: Per-entity version tracking instead of a single global version
|
|
18
|
+
const entityVersions = new Map();
|
|
19
|
+
for (let i = 0; i < commands.length; i++) {
|
|
20
|
+
const command = commands[i];
|
|
21
|
+
onProgress?.({
|
|
22
|
+
total: commands.length,
|
|
23
|
+
completed: i,
|
|
24
|
+
current: `${command.type} ${describeCommand(command)}`,
|
|
25
|
+
errors,
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
const body = {
|
|
29
|
+
type: command.type,
|
|
30
|
+
payload: command.payload,
|
|
31
|
+
};
|
|
32
|
+
// Bug 1.8 + P1-9 fix: Version tracks entity, not command type.
|
|
33
|
+
// Extract the correct entity ID based on command type.
|
|
34
|
+
const entityKey = extractEntityKey(command);
|
|
35
|
+
const expectedVersion = entityKey ? entityVersions.get(entityKey) : undefined;
|
|
36
|
+
if (expectedVersion !== undefined) {
|
|
37
|
+
body.expectedVersion = expectedVersion;
|
|
38
|
+
}
|
|
39
|
+
const result = await transport.request({
|
|
40
|
+
method: 'POST',
|
|
41
|
+
path: ROUTES.commands.execute,
|
|
42
|
+
body,
|
|
43
|
+
});
|
|
44
|
+
// Bug 1.7 fix: Treat { success: false } as an error
|
|
45
|
+
if (result && result.success === false) {
|
|
46
|
+
throw new Error(result.error?.message ?? 'Command failed');
|
|
47
|
+
}
|
|
48
|
+
if (result.metadata?.currentVersion !== undefined && entityKey) {
|
|
49
|
+
entityVersions.set(entityKey, result.metadata.currentVersion);
|
|
50
|
+
}
|
|
51
|
+
succeeded++;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
55
|
+
errors.push({ command, error: message });
|
|
56
|
+
// Stop on first error
|
|
57
|
+
onProgress?.({
|
|
58
|
+
total: commands.length,
|
|
59
|
+
completed: i,
|
|
60
|
+
current: `FAILED: ${command.type}`,
|
|
61
|
+
errors,
|
|
62
|
+
});
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
onProgress?.({
|
|
67
|
+
total: commands.length,
|
|
68
|
+
completed: succeeded,
|
|
69
|
+
current: succeeded === commands.length ? 'done' : 'stopped',
|
|
70
|
+
errors,
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
total: commands.length,
|
|
74
|
+
succeeded,
|
|
75
|
+
failed: errors.length,
|
|
76
|
+
errors,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Extract the entity ID used for OCC version tracking */
|
|
80
|
+
function extractEntityKey(cmd) {
|
|
81
|
+
const payload = cmd.payload;
|
|
82
|
+
switch (cmd.type) {
|
|
83
|
+
case 'CREATE_NODE':
|
|
84
|
+
case 'UPDATE_NODE':
|
|
85
|
+
return (payload.node?.id ?? payload.id);
|
|
86
|
+
case 'CREATE_EDGE':
|
|
87
|
+
return (payload.edge?.id ?? payload.id);
|
|
88
|
+
case 'CREATE_ACTION':
|
|
89
|
+
return (payload.action?.id ?? payload.id);
|
|
90
|
+
case 'UPDATE_ACTION':
|
|
91
|
+
case 'DELETE_ACTION':
|
|
92
|
+
return payload.actionId;
|
|
93
|
+
case 'DELETE_EDGE':
|
|
94
|
+
case 'DELETE_NODE':
|
|
95
|
+
return payload.id;
|
|
96
|
+
default:
|
|
97
|
+
return payload.id;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function describeCommand(cmd) {
|
|
101
|
+
const payload = cmd.payload;
|
|
102
|
+
if (cmd.type === 'CREATE_NODE') {
|
|
103
|
+
const node = payload.node;
|
|
104
|
+
return String(node?.api_name ?? node?.name ?? '');
|
|
105
|
+
}
|
|
106
|
+
if (cmd.type === 'CREATE_EDGE') {
|
|
107
|
+
const edge = payload.edge;
|
|
108
|
+
return String(edge?.api_name ?? '');
|
|
109
|
+
}
|
|
110
|
+
if (cmd.type === 'CREATE_ACTION') {
|
|
111
|
+
const action = payload.action;
|
|
112
|
+
return String(action?.name ?? '');
|
|
113
|
+
}
|
|
114
|
+
if (cmd.type === 'UPDATE_ACTION' || cmd.type === 'DELETE_ACTION') {
|
|
115
|
+
return String(payload.actionId ?? '');
|
|
116
|
+
}
|
|
117
|
+
return String(payload.id ?? '');
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=execute.js.map
|