@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
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# @dataforge/schema
|
|
2
|
+
|
|
3
|
+
[](./) [](./)
|
|
4
|
+
|
|
5
|
+
> **Schema authoring DSL for DataForge** -- define your ontology in code, compile, diff, push, and pull.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @dataforge/schema
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
Define your business model in a `dataforge.schema.ts` file:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { objectType, string, number, boolean, date, link } from '@dataforge/schema';
|
|
23
|
+
|
|
24
|
+
export const Company = objectType('Company', {
|
|
25
|
+
name: string().required(),
|
|
26
|
+
industry: string(),
|
|
27
|
+
revenue: number(),
|
|
28
|
+
isActive: boolean().default(true),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const Employee = objectType('Employee', {
|
|
32
|
+
name: string().required(),
|
|
33
|
+
email: string().email(),
|
|
34
|
+
salary: number().indexed(),
|
|
35
|
+
startDate: date(),
|
|
36
|
+
company: link.toOne(() => Company),
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Then use the CLI:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
dataforge schema diff # compare local vs remote
|
|
44
|
+
dataforge schema push --yes # apply changes
|
|
45
|
+
dataforge schema pull # generate from remote
|
|
46
|
+
dataforge schema check # verify lockfile integrity
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## API
|
|
52
|
+
|
|
53
|
+
### Property Builders
|
|
54
|
+
|
|
55
|
+
| Builder | Type | Modifiers |
|
|
56
|
+
|---------|------|-----------|
|
|
57
|
+
| `string()` | string | `.required()`, `.indexed()`, `.unique()`, `.default(v)`, `.description(s)`, `.email()`, `.enum([...])` |
|
|
58
|
+
| `number()` | number | `.required()`, `.indexed()`, `.unique()`, `.default(v)`, `.min(n)`, `.max(n)` |
|
|
59
|
+
| `boolean()` | boolean | `.required()`, `.default(v)` |
|
|
60
|
+
| `date()` | date | `.required()`, `.indexed()`, `.datetime()` |
|
|
61
|
+
| `object()` | object | `.required()` |
|
|
62
|
+
| `array()` | array | `.required()` |
|
|
63
|
+
|
|
64
|
+
### Link Builders
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
link.toOne(() => TargetType) // N:1 relationship
|
|
68
|
+
link.toMany(() => TargetType) // 1:N relationship
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Modifiers: `.inverseName(s)`, `.label(s)`, `.description(s)`
|
|
72
|
+
|
|
73
|
+
Lazy `() => Type` references support circular dependencies.
|
|
74
|
+
|
|
75
|
+
### Object Type
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
objectType('ApiName', { ...fields })
|
|
79
|
+
.displayName('Human Name')
|
|
80
|
+
.description('A description')
|
|
81
|
+
.primaryKey('fieldName')
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Compiler
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { compile } from '@dataforge/schema';
|
|
88
|
+
|
|
89
|
+
const manifest = compile([Company, Employee]);
|
|
90
|
+
// -> OntologyManifest (deterministic IDs, sorted)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Diff
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { diff, formatDiff } from '@dataforge/schema';
|
|
97
|
+
|
|
98
|
+
const result = diff(localManifest, remoteManifest);
|
|
99
|
+
console.log(formatDiff(result));
|
|
100
|
+
// + ObjectType: Invoice (new)
|
|
101
|
+
// ~ ObjectType: Employee
|
|
102
|
+
// + property: department (string, required)
|
|
103
|
+
// ~ property: salary (indexed: false -> true)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Push
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
import { planPush, executePush } from '@dataforge/schema';
|
|
110
|
+
|
|
111
|
+
const commands = planPush(diffResult, remoteManifest, { workspaceId });
|
|
112
|
+
await executePush({ transport, commands, onProgress: console.log });
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Pull
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { emitSchema } from '@dataforge/schema';
|
|
119
|
+
|
|
120
|
+
const source = emitSchema(remoteManifest);
|
|
121
|
+
// -> valid TypeScript source using the DSL
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Lockfile
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
import { generateLockfile, verifyLockfile } from '@dataforge/schema';
|
|
128
|
+
|
|
129
|
+
const lock = generateLockfile(manifest);
|
|
130
|
+
const { drifted } = verifyLockfile(lock, currentManifest);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Dependencies
|
|
136
|
+
|
|
137
|
+
| Package | Role |
|
|
138
|
+
|---------|------|
|
|
139
|
+
| `@dataforge/sdk-types` | `OntologyManifest`, `PropertyDescriptor`, etc. |
|
|
140
|
+
|
|
141
|
+
No dependency on `@dataforge/sdk-client` -- the schema package is standalone. Only the CLI depends on both.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## See Also
|
|
146
|
+
|
|
147
|
+
- [SDK README](../../README.md) -- Getting started
|
|
148
|
+
- [CLI README](../cli/README.md) -- CLI commands
|
|
149
|
+
- [CHANGELOG](../../CHANGELOG.md) -- Version history
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile a set of ObjectTypeDefinitions into an OntologyManifest.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: definitions → resolve → validate → manifest
|
|
5
|
+
*
|
|
6
|
+
* Fixes over V1:
|
|
7
|
+
* - deterministicId uses SHA-256 truncated to 128 bits (not custom 64-bit hash)
|
|
8
|
+
* - espaceId included in ID seed to avoid cross-espace collisions
|
|
9
|
+
* - generatedAt configurable via options for test/lockfile determinism
|
|
10
|
+
* - relationshipType decoupled from label (uses linkName for stability)
|
|
11
|
+
* - interfaces array sorted on objectTypes for diff stability
|
|
12
|
+
* - compileProperty cleans undefined fields via compactRecord
|
|
13
|
+
*/
|
|
14
|
+
import type { OntologyManifest } from '@dataforge/sdk-types';
|
|
15
|
+
import type { ObjectTypeDefinition, ActionDefinition, ResolvedSchema } from '../types.js';
|
|
16
|
+
export interface CompileOptions {
|
|
17
|
+
workspaceId?: string;
|
|
18
|
+
espaceId?: string;
|
|
19
|
+
actions?: ActionDefinition[];
|
|
20
|
+
/** Override generatedAt for deterministic output in tests/lockfiles */
|
|
21
|
+
generatedAt?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compile ObjectTypeDefinitions (and optional ActionDefinitions) into an OntologyManifest.
|
|
25
|
+
*
|
|
26
|
+
* @param definitions - Array of ObjectTypeDefinitions from DSL
|
|
27
|
+
* @param options - Optional workspaceId/espaceId, action definitions, generatedAt
|
|
28
|
+
* @throws if validation fails
|
|
29
|
+
*/
|
|
30
|
+
export declare function compile(definitions: ObjectTypeDefinition[], options?: CompileOptions): OntologyManifest;
|
|
31
|
+
/**
|
|
32
|
+
* Compile an already-resolved and validated schema into a manifest.
|
|
33
|
+
* Exported for advanced use cases where resolve/validate are called separately.
|
|
34
|
+
*/
|
|
35
|
+
export declare function compileResolved(schema: ResolvedSchema, options?: CompileOptions): OntologyManifest;
|
|
36
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAuG,MAAM,sBAAsB,CAAC;AAClK,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA8H1F,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,oBAAoB,EAAE,EACnC,OAAO,CAAC,EAAE,cAAc,GACvB,gBAAgB,CAUlB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,gBAAgB,CA0KlB"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile a set of ObjectTypeDefinitions into an OntologyManifest.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: definitions → resolve → validate → manifest
|
|
5
|
+
*
|
|
6
|
+
* Fixes over V1:
|
|
7
|
+
* - deterministicId uses SHA-256 truncated to 128 bits (not custom 64-bit hash)
|
|
8
|
+
* - espaceId included in ID seed to avoid cross-espace collisions
|
|
9
|
+
* - generatedAt configurable via options for test/lockfile determinism
|
|
10
|
+
* - relationshipType decoupled from label (uses linkName for stability)
|
|
11
|
+
* - interfaces array sorted on objectTypes for diff stability
|
|
12
|
+
* - compileProperty cleans undefined fields via compactRecord
|
|
13
|
+
*/
|
|
14
|
+
import { createHash } from 'node:crypto';
|
|
15
|
+
import { resolve } from './resolve.js';
|
|
16
|
+
import { validate } from './validate.js';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Deterministic ID generation (SHA-256 based)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Generate a deterministic UUID from seed parts using SHA-256.
|
|
22
|
+
* Truncates to 128 bits and formats as RFC 4122 UUID with version 5 marker.
|
|
23
|
+
*/
|
|
24
|
+
function deterministicId(parts) {
|
|
25
|
+
const seed = JSON.stringify(parts);
|
|
26
|
+
const bytes = Buffer.from(createHash('sha256').update(seed).digest().subarray(0, 16));
|
|
27
|
+
// UUID version 5 marker
|
|
28
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x50;
|
|
29
|
+
// RFC 4122 variant
|
|
30
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
31
|
+
const hex = bytes.toString('hex');
|
|
32
|
+
return [
|
|
33
|
+
hex.slice(0, 8),
|
|
34
|
+
hex.slice(8, 12),
|
|
35
|
+
hex.slice(12, 16),
|
|
36
|
+
hex.slice(16, 20),
|
|
37
|
+
hex.slice(20, 32),
|
|
38
|
+
].join('-');
|
|
39
|
+
}
|
|
40
|
+
/** Build the seed array for entity ID generation, including workspace + espace context */
|
|
41
|
+
function entityIdSeed(options, kind, ...names) {
|
|
42
|
+
return [
|
|
43
|
+
options?.workspaceId ?? '',
|
|
44
|
+
options?.espaceId ?? '',
|
|
45
|
+
kind,
|
|
46
|
+
...names,
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Helpers
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
function toDisplayName(apiName) {
|
|
53
|
+
return apiName
|
|
54
|
+
.replace(/_/g, ' ')
|
|
55
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
56
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
57
|
+
}
|
|
58
|
+
/** Recursively sort object keys for deterministic JSON serialization */
|
|
59
|
+
function sortKeysDeep(val) {
|
|
60
|
+
if (val === null || val === undefined)
|
|
61
|
+
return val;
|
|
62
|
+
if (Array.isArray(val))
|
|
63
|
+
return val.map(sortKeysDeep);
|
|
64
|
+
if (typeof val === 'object') {
|
|
65
|
+
const obj = val;
|
|
66
|
+
const sorted = {};
|
|
67
|
+
for (const key of Object.keys(obj).sort()) {
|
|
68
|
+
const v = sortKeysDeep(obj[key]);
|
|
69
|
+
if (v !== undefined)
|
|
70
|
+
sorted[key] = v;
|
|
71
|
+
}
|
|
72
|
+
return sorted;
|
|
73
|
+
}
|
|
74
|
+
return val;
|
|
75
|
+
}
|
|
76
|
+
/** Remove undefined values for cleaner manifest output */
|
|
77
|
+
function compactRecord(input) {
|
|
78
|
+
const output = {};
|
|
79
|
+
for (const [key, value] of Object.entries(input)) {
|
|
80
|
+
if (value !== undefined) {
|
|
81
|
+
output[key] = value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return output;
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Property compilation
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
function compileProperty(fieldName, prop) {
|
|
90
|
+
// Keep the original dataType ('string') — do NOT promote to 'enum'.
|
|
91
|
+
// The backend normalises 'enum' → 'string'; keeping 'string' here avoids
|
|
92
|
+
// permanent phantom diffs in the roundtrip (DRIFT-1 fix).
|
|
93
|
+
const dataType = prop.dataType;
|
|
94
|
+
const enumValues = (prop.constraints?.enum && Array.isArray(prop.constraints.enum))
|
|
95
|
+
? prop.constraints.enum
|
|
96
|
+
.filter((v) => typeof v === 'string')
|
|
97
|
+
: undefined;
|
|
98
|
+
// Preserve the author's enum order. It is user-visible in generated schemas
|
|
99
|
+
// and keeps defaults/example docs copy-paste stable.
|
|
100
|
+
const constraints = prop.constraints ? { ...prop.constraints } : undefined;
|
|
101
|
+
if (constraints?.enum && Array.isArray(constraints.enum) && enumValues) {
|
|
102
|
+
constraints.enum = [...enumValues];
|
|
103
|
+
}
|
|
104
|
+
return compactRecord({
|
|
105
|
+
name: fieldName,
|
|
106
|
+
apiName: fieldName,
|
|
107
|
+
description: prop.description,
|
|
108
|
+
dataType,
|
|
109
|
+
semanticType: prop.semanticType,
|
|
110
|
+
required: prop.required,
|
|
111
|
+
indexed: prop.indexed,
|
|
112
|
+
unique: prop.unique,
|
|
113
|
+
defaultValue: prop.defaultValue,
|
|
114
|
+
constraints,
|
|
115
|
+
enumValues: enumValues && enumValues.length > 0 ? enumValues : undefined,
|
|
116
|
+
mutableBy: prop.mutableBy && prop.mutableBy.length > 0 ? [...prop.mutableBy] : undefined,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Compile ObjectTypeDefinitions (and optional ActionDefinitions) into an OntologyManifest.
|
|
121
|
+
*
|
|
122
|
+
* @param definitions - Array of ObjectTypeDefinitions from DSL
|
|
123
|
+
* @param options - Optional workspaceId/espaceId, action definitions, generatedAt
|
|
124
|
+
* @throws if validation fails
|
|
125
|
+
*/
|
|
126
|
+
export function compile(definitions, options) {
|
|
127
|
+
const resolved = resolve(definitions, options?.actions);
|
|
128
|
+
const validation = validate(resolved);
|
|
129
|
+
if (!validation.valid) {
|
|
130
|
+
const messages = validation.errors.map(e => ` - ${e.path}: ${e.message}`).join('\n');
|
|
131
|
+
throw new Error(`Schema validation failed:\n${messages}`);
|
|
132
|
+
}
|
|
133
|
+
return compileResolved(resolved, options);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Compile an already-resolved and validated schema into a manifest.
|
|
137
|
+
* Exported for advanced use cases where resolve/validate are called separately.
|
|
138
|
+
*/
|
|
139
|
+
export function compileResolved(schema, options) {
|
|
140
|
+
const workspaceId = options?.workspaceId ?? '';
|
|
141
|
+
const espaceId = options?.espaceId ?? '';
|
|
142
|
+
// Sort types alphabetically for determinism
|
|
143
|
+
const sortedTypes = [...schema.objectTypes].sort((a, b) => a.apiName.localeCompare(b.apiName));
|
|
144
|
+
const objectTypes = sortedTypes.map(ot => {
|
|
145
|
+
const properties = Object.entries(ot.properties)
|
|
146
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
147
|
+
.map(([name, prop]) => compileProperty(name, prop));
|
|
148
|
+
const interfaces = [...(ot.interfaces ?? [])].sort((a, b) => a.localeCompare(b));
|
|
149
|
+
return compactRecord({
|
|
150
|
+
id: deterministicId(entityIdSeed(options, 'objectType', ot.apiName)),
|
|
151
|
+
apiName: ot.apiName,
|
|
152
|
+
displayName: ot.displayName ?? toDisplayName(ot.apiName),
|
|
153
|
+
description: ot.description,
|
|
154
|
+
status: 'active',
|
|
155
|
+
properties,
|
|
156
|
+
interfaces: interfaces.length > 0 ? interfaces : undefined,
|
|
157
|
+
primaryKey: ot.primaryKey,
|
|
158
|
+
metadata: ot.metadata && Object.keys(ot.metadata).length > 0 ? ot.metadata : undefined,
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
// Collect all links across types
|
|
162
|
+
const linkTypes = [];
|
|
163
|
+
for (const ot of sortedTypes) {
|
|
164
|
+
const sortedLinks = Object.entries(ot.links).sort(([a], [b]) => a.localeCompare(b));
|
|
165
|
+
for (const [linkName, linkDef] of sortedLinks) {
|
|
166
|
+
const linkApiName = `${ot.apiName}__${linkName}`;
|
|
167
|
+
linkTypes.push({
|
|
168
|
+
id: deterministicId(entityIdSeed(options, 'linkType', linkApiName)),
|
|
169
|
+
apiName: linkApiName,
|
|
170
|
+
sourceTypeApiName: ot.apiName,
|
|
171
|
+
targetTypeApiName: linkDef.targetApiName,
|
|
172
|
+
// Use linkName (stable identifier), not label (user-facing text)
|
|
173
|
+
relationshipType: linkName,
|
|
174
|
+
cardinality: linkDef.cardinality,
|
|
175
|
+
label: linkDef.label,
|
|
176
|
+
inverseName: linkDef.inverseName,
|
|
177
|
+
properties: [],
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Sort linkTypes for determinism
|
|
182
|
+
linkTypes.sort((a, b) => a.apiName.localeCompare(b.apiName));
|
|
183
|
+
// Compile actions
|
|
184
|
+
const sortedActions = [...(schema.actions ?? [])].sort((a, b) => {
|
|
185
|
+
const cmp = a.objectTypeApiName.localeCompare(b.objectTypeApiName);
|
|
186
|
+
return cmp !== 0 ? cmp : a.apiName.localeCompare(b.apiName);
|
|
187
|
+
});
|
|
188
|
+
const actions = sortedActions.map(act => {
|
|
189
|
+
const actRecord = act;
|
|
190
|
+
// Compile effects with V1 kind support
|
|
191
|
+
const compiledEffects = act.effects.length > 0
|
|
192
|
+
? act.effects.map(e => {
|
|
193
|
+
const eRecord = e;
|
|
194
|
+
const kind = eRecord.kind;
|
|
195
|
+
if (kind && kind !== 'set') {
|
|
196
|
+
// createRelated / link / unlink effects
|
|
197
|
+
return compactRecord({
|
|
198
|
+
kind,
|
|
199
|
+
linkName: eRecord.linkName,
|
|
200
|
+
targetType: typeof eRecord.targetType === 'function'
|
|
201
|
+
? eRecord.targetType().apiName
|
|
202
|
+
: eRecord.targetType,
|
|
203
|
+
fields: eRecord.fields,
|
|
204
|
+
ref: eRecord.ref,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// Legacy 'set' effect (field + value)
|
|
208
|
+
return compactRecord({ kind: kind ?? 'set', field: eRecord.field, value: eRecord.value });
|
|
209
|
+
})
|
|
210
|
+
: undefined;
|
|
211
|
+
// Compute definitionHash — SHA-256 of behavioral fields
|
|
212
|
+
const behavioralDef = {
|
|
213
|
+
targetType: act.objectTypeApiName,
|
|
214
|
+
inputSchema: act.parameters,
|
|
215
|
+
preconditions: act.conditions,
|
|
216
|
+
effects: compiledEffects,
|
|
217
|
+
executionMode: actRecord.executionMode ?? 'twin_apply',
|
|
218
|
+
limits: actRecord.limits,
|
|
219
|
+
risk: actRecord.risk,
|
|
220
|
+
requiredScopes: act.requiredScopes.length > 0
|
|
221
|
+
? [...act.requiredScopes].sort((a2, b2) => a2.localeCompare(b2))
|
|
222
|
+
: undefined,
|
|
223
|
+
};
|
|
224
|
+
const behavioralJson = JSON.stringify(sortKeysDeep(behavioralDef));
|
|
225
|
+
const definitionHash = createHash('sha256').update(behavioralJson, 'utf8').digest('hex');
|
|
226
|
+
return compactRecord({
|
|
227
|
+
id: deterministicId(entityIdSeed(options, 'action', act.objectTypeApiName, act.apiName)),
|
|
228
|
+
apiName: act.apiName,
|
|
229
|
+
displayName: act.displayName ?? toDisplayName(act.apiName),
|
|
230
|
+
description: act.description,
|
|
231
|
+
objectTypeApiName: act.objectTypeApiName,
|
|
232
|
+
actionType: act.actionType,
|
|
233
|
+
trigger: act.trigger,
|
|
234
|
+
parameters: act.parameters.map(p => {
|
|
235
|
+
const pRecord = p;
|
|
236
|
+
return compactRecord({
|
|
237
|
+
name: p.name,
|
|
238
|
+
apiName: p.name,
|
|
239
|
+
dataType: p.dataType,
|
|
240
|
+
required: p.required,
|
|
241
|
+
defaultValue: p.defaultValue,
|
|
242
|
+
description: p.description,
|
|
243
|
+
sensitive: pRecord.sensitive,
|
|
244
|
+
ref: pRecord.ref,
|
|
245
|
+
});
|
|
246
|
+
}),
|
|
247
|
+
conditions: act.conditions.length > 0
|
|
248
|
+
? act.conditions.map(c => ({ field: c.field, operator: c.operator, value: c.value }))
|
|
249
|
+
: undefined,
|
|
250
|
+
effects: compiledEffects,
|
|
251
|
+
requiredScopes: act.requiredScopes.length > 0
|
|
252
|
+
? [...act.requiredScopes].sort((a2, b2) => a2.localeCompare(b2))
|
|
253
|
+
: undefined,
|
|
254
|
+
timeout: act.timeout,
|
|
255
|
+
// V1 DSL fields
|
|
256
|
+
definitionHash,
|
|
257
|
+
executionMode: actRecord.executionMode ?? 'twin_apply',
|
|
258
|
+
risk: actRecord.risk,
|
|
259
|
+
limits: actRecord.limits,
|
|
260
|
+
// Extended action fields (workflow/agent integration)
|
|
261
|
+
inputMapping: actRecord.inputMapping,
|
|
262
|
+
outputMapping: actRecord.outputMapping,
|
|
263
|
+
retryConfig: actRecord.retryConfig,
|
|
264
|
+
implementationType: actRecord.implementationType,
|
|
265
|
+
workflowId: actRecord.workflowId,
|
|
266
|
+
agentId: actRecord.agentId,
|
|
267
|
+
// V2 Model Assurance metadata
|
|
268
|
+
metadata: actRecord.metadata && typeof actRecord.metadata === 'object' && Object.keys(actRecord.metadata).length > 0
|
|
269
|
+
? actRecord.metadata
|
|
270
|
+
: undefined,
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
// Compile interfaces
|
|
274
|
+
const sortedInterfaces = [...(schema.interfaces ?? [])].sort((a, b) => a.apiName.localeCompare(b.apiName));
|
|
275
|
+
const interfaces = sortedInterfaces.map(iface => compactRecord({
|
|
276
|
+
id: deterministicId(entityIdSeed(options, 'interface', iface.apiName)),
|
|
277
|
+
apiName: iface.apiName,
|
|
278
|
+
displayName: iface.displayName ?? toDisplayName(iface.apiName),
|
|
279
|
+
description: iface.description,
|
|
280
|
+
sharedProperties: Object.entries(iface.properties)
|
|
281
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
282
|
+
.map(([name, prop]) => compileProperty(name, prop)),
|
|
283
|
+
}));
|
|
284
|
+
return {
|
|
285
|
+
version: '1.0',
|
|
286
|
+
generatedAt: options?.generatedAt ?? new Date().toISOString(),
|
|
287
|
+
workspaceId,
|
|
288
|
+
espaceId,
|
|
289
|
+
objectTypes,
|
|
290
|
+
linkTypes,
|
|
291
|
+
interfaces,
|
|
292
|
+
actions,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve lazy link references and build a flat, materialized schema graph.
|
|
3
|
+
*/
|
|
4
|
+
import type { ObjectTypeDefinition, ActionDefinition, ResolvedSchema } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve all lazy `() => Type` link references in a set of object type definitions,
|
|
7
|
+
* and resolve action target types.
|
|
8
|
+
*
|
|
9
|
+
* @param definitions - Array of ObjectTypeDefinitions (from DSL `objectType()` calls)
|
|
10
|
+
* @param actionDefs - Optional array of ActionDefinitions (from DSL `action()` calls)
|
|
11
|
+
* @returns ResolvedSchema with all references materialized
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolve(definitions: ObjectTypeDefinition[], actionDefs?: ActionDefinition[]): ResolvedSchema;
|
|
14
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/compiler/resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAGpB,gBAAgB,EAChB,cAAc,EAKf,MAAM,aAAa,CAAC;AAOrB;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,oBAAoB,EAAE,EACnC,UAAU,CAAC,EAAE,gBAAgB,EAAE,GAC9B,cAAc,CAuIhB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve lazy link references and build a flat, materialized schema graph.
|
|
3
|
+
*/
|
|
4
|
+
import { materializeProperty } from '../dsl/property.js';
|
|
5
|
+
import { materializeLink } from '../dsl/link.js';
|
|
6
|
+
import { materializeAction } from '../dsl/action.js';
|
|
7
|
+
import { materializeInterface } from '../dsl/interface.js';
|
|
8
|
+
import { materializeObjectType } from '../dsl/object-type.js';
|
|
9
|
+
/**
|
|
10
|
+
* Resolve all lazy `() => Type` link references in a set of object type definitions,
|
|
11
|
+
* and resolve action target types.
|
|
12
|
+
*
|
|
13
|
+
* @param definitions - Array of ObjectTypeDefinitions (from DSL `objectType()` calls)
|
|
14
|
+
* @param actionDefs - Optional array of ActionDefinitions (from DSL `action()` calls)
|
|
15
|
+
* @returns ResolvedSchema with all references materialized
|
|
16
|
+
*/
|
|
17
|
+
export function resolve(definitions, actionDefs) {
|
|
18
|
+
const materializedDefinitions = definitions.map(def => materializeObjectType(def));
|
|
19
|
+
const knownApiNames = new Set(materializedDefinitions.map(d => d.apiName));
|
|
20
|
+
// Collect all interfaces from type definitions
|
|
21
|
+
const interfaceMap = new Map();
|
|
22
|
+
const objectTypes = materializedDefinitions.map(def => {
|
|
23
|
+
const properties = {};
|
|
24
|
+
const links = {};
|
|
25
|
+
const implementedInterfaces = [];
|
|
26
|
+
// Resolve interfaces — merge their properties into this type
|
|
27
|
+
for (const rawIface of def.interfaces ?? []) {
|
|
28
|
+
const iface = materializeInterface(rawIface);
|
|
29
|
+
if (!interfaceMap.has(iface.apiName)) {
|
|
30
|
+
const ifaceProps = {};
|
|
31
|
+
for (const [fieldName, field] of Object.entries(iface.fields)) {
|
|
32
|
+
ifaceProps[fieldName] = materializeProperty(field);
|
|
33
|
+
}
|
|
34
|
+
interfaceMap.set(iface.apiName, {
|
|
35
|
+
apiName: iface.apiName,
|
|
36
|
+
displayName: iface.displayName,
|
|
37
|
+
description: iface.description,
|
|
38
|
+
properties: ifaceProps,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
implementedInterfaces.push(iface.apiName);
|
|
42
|
+
// Merge interface properties into the type (interface props are defaults, type props override)
|
|
43
|
+
const resolved = interfaceMap.get(iface.apiName);
|
|
44
|
+
for (const [fieldName, prop] of Object.entries(resolved.properties)) {
|
|
45
|
+
if (!(fieldName in def.fields)) {
|
|
46
|
+
properties[fieldName] = prop;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
for (const [fieldName, field] of Object.entries(def.fields)) {
|
|
51
|
+
const materialized = field._kind === 'link'
|
|
52
|
+
? materializeLink(field)
|
|
53
|
+
: materializeProperty(field);
|
|
54
|
+
if (materialized._kind === 'property') {
|
|
55
|
+
properties[fieldName] = materialized;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Invoke the lazy thunk to get the target ObjectTypeDefinition
|
|
59
|
+
let targetApiName;
|
|
60
|
+
try {
|
|
61
|
+
const targetDef = materialized.target();
|
|
62
|
+
targetApiName = targetDef.apiName;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
throw new Error(`Failed to resolve link "${fieldName}" on type "${def.apiName}": target thunk threw an error`);
|
|
66
|
+
}
|
|
67
|
+
if (!knownApiNames.has(targetApiName)) {
|
|
68
|
+
throw new Error(`Link "${fieldName}" on type "${def.apiName}" points to unknown type "${targetApiName}"`);
|
|
69
|
+
}
|
|
70
|
+
links[fieldName] = {
|
|
71
|
+
_kind: 'link',
|
|
72
|
+
targetApiName,
|
|
73
|
+
cardinality: materialized.cardinality,
|
|
74
|
+
inverseName: materialized.inverseName,
|
|
75
|
+
label: materialized.label,
|
|
76
|
+
description: materialized.description,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
apiName: def.apiName,
|
|
82
|
+
displayName: def.displayName,
|
|
83
|
+
description: def.description,
|
|
84
|
+
primaryKey: def.primaryKey,
|
|
85
|
+
properties,
|
|
86
|
+
links,
|
|
87
|
+
interfaces: implementedInterfaces,
|
|
88
|
+
metadata: def.metadata,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
// Resolve actions
|
|
92
|
+
const actions = (actionDefs ?? []).map(rawAction => {
|
|
93
|
+
const actionDef = materializeAction(rawAction);
|
|
94
|
+
let objectTypeApiName;
|
|
95
|
+
try {
|
|
96
|
+
const targetDef = actionDef.objectType();
|
|
97
|
+
objectTypeApiName = targetDef.apiName;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new Error(`Failed to resolve action "${actionDef.apiName}": target type thunk threw an error. Did you call .on(() => Type)?`);
|
|
101
|
+
}
|
|
102
|
+
if (!knownApiNames.has(objectTypeApiName)) {
|
|
103
|
+
throw new Error(`Action "${actionDef.apiName}" targets unknown type "${objectTypeApiName}"`);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
apiName: actionDef.apiName,
|
|
107
|
+
objectTypeApiName,
|
|
108
|
+
displayName: actionDef.displayName,
|
|
109
|
+
description: actionDef.description,
|
|
110
|
+
actionType: actionDef.actionType,
|
|
111
|
+
trigger: actionDef.trigger,
|
|
112
|
+
parameters: actionDef.parameters,
|
|
113
|
+
conditions: actionDef.conditions,
|
|
114
|
+
effects: actionDef.effects,
|
|
115
|
+
requiredScopes: actionDef.requiredScopes,
|
|
116
|
+
timeout: actionDef.timeout,
|
|
117
|
+
executionMode: actionDef.executionMode,
|
|
118
|
+
risk: actionDef.risk,
|
|
119
|
+
limits: actionDef.limits,
|
|
120
|
+
inputMapping: actionDef.inputMapping,
|
|
121
|
+
outputMapping: actionDef.outputMapping,
|
|
122
|
+
retryConfig: actionDef.retryConfig,
|
|
123
|
+
implementationType: actionDef.implementationType,
|
|
124
|
+
workflowId: actionDef.workflowId,
|
|
125
|
+
agentId: actionDef.agentId,
|
|
126
|
+
metadata: actionDef.metadata,
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
const interfaces = [...interfaceMap.values()];
|
|
130
|
+
return { objectTypes, actions, interfaces };
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/compiler/resolve.ts"],"names":[],"mappings":"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"}
|