@origostudio/core 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +365 -0
  2. package/README.md +11 -0
  3. package/package.json +25 -0
  4. package/package.json.bak +25 -0
  5. package/src/extension-api/extension-manager.d.ts +35 -0
  6. package/src/extension-api/extension-manager.js +300 -0
  7. package/src/extension-api/extension-manager.js.map +1 -0
  8. package/src/extension-api/index.d.ts +2 -0
  9. package/src/extension-api/index.js +6 -0
  10. package/src/extension-api/index.js.map +1 -0
  11. package/src/extension-api/types.d.ts +34 -0
  12. package/src/extension-api/types.js +3 -0
  13. package/src/extension-api/types.js.map +1 -0
  14. package/src/index.d.ts +3 -0
  15. package/src/index.js +7 -0
  16. package/src/index.js.map +1 -0
  17. package/src/schemas/capability.schema.json +104 -0
  18. package/src/schemas/contract.schema.json +52 -0
  19. package/src/schemas/domain.schema.json +47 -0
  20. package/src/schemas/entity.schema.json +72 -0
  21. package/src/schemas/extension.schema.json +39 -0
  22. package/src/schemas/permission.schema.json +21 -0
  23. package/src/types/ast.d.ts +17 -0
  24. package/src/types/ast.js +3 -0
  25. package/src/types/ast.js.map +1 -0
  26. package/src/types/domain.d.ts +101 -0
  27. package/src/types/domain.js +8 -0
  28. package/src/types/domain.js.map +1 -0
  29. package/src/types/validation.d.ts +12 -0
  30. package/src/types/validation.js +16 -0
  31. package/src/types/validation.js.map +1 -0
  32. package/src/validator/ast-validator.d.ts +11 -0
  33. package/src/validator/ast-validator.js +388 -0
  34. package/src/validator/ast-validator.js.map +1 -0
  35. package/src/validator/index.d.ts +23 -0
  36. package/src/validator/index.js +143 -0
  37. package/src/validator/index.js.map +1 -0
  38. package/src/validator/serializer.d.ts +11 -0
  39. package/src/validator/serializer.js +99 -0
  40. package/src/validator/serializer.js.map +1 -0
@@ -0,0 +1,388 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_AST_DEPTH = void 0;
4
+ exports.validateAST = validateAST;
5
+ const tslib_1 = require("tslib");
6
+ const semver = tslib_1.__importStar(require("semver"));
7
+ exports.MAX_AST_DEPTH = 250;
8
+ /**
9
+ * Performs deep semantic validation on the Canonical AST before downstream code generation.
10
+ * Specifically checks for cyclic entity relationships and missing references.
11
+ *
12
+ * @param ast The Canonical AST to validate
13
+ * @returns {ValidationError[]} Array of validation errors, or empty array if valid.
14
+ */
15
+ function validateAST(ast, localManifest) {
16
+ const errors = [];
17
+ if (!ast || !Array.isArray(ast.domains)) {
18
+ errors.push({ type: 'INVALID_FORMAT', message: 'Invalid AST: missing domains array' });
19
+ return errors;
20
+ }
21
+ const entityDomainMap = new Map();
22
+ const extensionIds = new Set();
23
+ const capabilityIds = new Set();
24
+ const contractMap = new Map();
25
+ const entityCapabilities = new Map();
26
+ // First pass: Collect all entities, capabilities, and contracts to ensure unique IDs and for quick lookup
27
+ for (let dIndex = 0; dIndex < ast.domains.length; dIndex++) {
28
+ const domain = ast.domains[dIndex];
29
+ if (!domain)
30
+ continue;
31
+ const entities = Array.isArray(domain.entities) ? domain.entities : [];
32
+ for (let eIndex = 0; eIndex < entities.length; eIndex++) {
33
+ const entity = entities[eIndex];
34
+ if (!entity || !entity.id)
35
+ continue;
36
+ if (entityDomainMap.has(entity.id)) {
37
+ errors.push({
38
+ type: 'DUPLICATE_ID',
39
+ message: `Duplicate entity ID found: ${entity.id}`,
40
+ path: `/domains/${dIndex}/entities/${eIndex}/id`,
41
+ });
42
+ }
43
+ else {
44
+ entityDomainMap.set(entity.id, domain.id);
45
+ }
46
+ }
47
+ const capabilities = Array.isArray(domain.capabilities) ? domain.capabilities : [];
48
+ for (let cIndex = 0; cIndex < capabilities.length; cIndex++) {
49
+ const capability = capabilities[cIndex];
50
+ if (!capability || !capability.id) {
51
+ errors.push({
52
+ type: 'INVALID_FORMAT',
53
+ message: `Capability missing id in domain ${domain.id}`,
54
+ path: `/domains/${dIndex}/capabilities/${cIndex}`,
55
+ });
56
+ continue;
57
+ }
58
+ if (capabilityIds.has(capability.id)) {
59
+ errors.push({
60
+ type: 'DUPLICATE_ID',
61
+ message: `Duplicate capability ID found: ${capability.id}`,
62
+ path: `/domains/${dIndex}/capabilities/${cIndex}/id`,
63
+ });
64
+ continue;
65
+ }
66
+ else {
67
+ capabilityIds.add(capability.id);
68
+ }
69
+ if (capability.entityId) {
70
+ const existingCaps = entityCapabilities.get(capability.entityId) || [];
71
+ existingCaps.push(capability);
72
+ entityCapabilities.set(capability.entityId, existingCaps);
73
+ }
74
+ }
75
+ const contracts = Array.isArray(domain.contracts) ? domain.contracts : [];
76
+ for (let cIdx = 0; cIdx < contracts.length; cIdx++) {
77
+ const contract = contracts[cIdx];
78
+ if (!contract || !contract.id) {
79
+ errors.push({
80
+ type: 'INVALID_FORMAT',
81
+ message: 'Contract missing id',
82
+ path: `/domains/${dIndex}/contracts/${cIdx}`,
83
+ });
84
+ continue;
85
+ }
86
+ if (contractMap.has(contract.id)) {
87
+ errors.push({
88
+ type: 'DUPLICATE_ID',
89
+ message: `Duplicate contract ID found: ${contract.id}`,
90
+ path: `/domains/${dIndex}/contracts/${cIdx}/id`,
91
+ });
92
+ }
93
+ else {
94
+ contractMap.set(contract.id, contract);
95
+ }
96
+ }
97
+ const extensions = Array.isArray(domain.extensions) ? domain.extensions : [];
98
+ for (let eIdx = 0; eIdx < extensions.length; eIdx++) {
99
+ const ext = extensions[eIdx];
100
+ if (!ext || !ext.id) {
101
+ errors.push({
102
+ type: 'INVALID_FORMAT',
103
+ message: 'Extension missing id',
104
+ path: `/domains/${dIndex}/extensions/${eIdx}`,
105
+ });
106
+ continue;
107
+ }
108
+ if (contractMap.has(ext.id) ||
109
+ capabilityIds.has(ext.id) ||
110
+ entityDomainMap.has(ext.id) ||
111
+ extensionIds.has(ext.id)) {
112
+ errors.push({
113
+ type: 'DUPLICATE_ID',
114
+ message: `Duplicate ID found across extensions and other types: ${ext.id}`,
115
+ path: `/domains/${dIndex}/extensions/${eIdx}/id`,
116
+ });
117
+ }
118
+ else {
119
+ extensionIds.add(ext.id);
120
+ }
121
+ }
122
+ }
123
+ // Second pass: Validate field references and detect cycles
124
+ const adjList = new Map();
125
+ for (let dIndex = 0; dIndex < ast.domains.length; dIndex++) {
126
+ const domain = ast.domains[dIndex];
127
+ if (!domain)
128
+ continue;
129
+ const entities = Array.isArray(domain.entities) ? domain.entities : [];
130
+ for (let eIndex = 0; eIndex < entities.length; eIndex++) {
131
+ const entity = entities[eIndex];
132
+ if (!entity || !entity.id)
133
+ continue;
134
+ const dependencies = [];
135
+ const processFields = (fieldList, currentPath, depth = 1) => {
136
+ if (depth > exports.MAX_AST_DEPTH) {
137
+ errors.push({
138
+ type: 'MAX_DEPTH_EXCEEDED',
139
+ message: `Maximum AST depth exceeded (${exports.MAX_AST_DEPTH}) in entity fields for ${entity.id}`,
140
+ path: currentPath,
141
+ });
142
+ return;
143
+ }
144
+ for (let fIndex = 0; fIndex < fieldList.length; fIndex++) {
145
+ const field = fieldList[fIndex];
146
+ if (!field || typeof field !== 'object')
147
+ continue;
148
+ const fieldPath = `${currentPath}/${fIndex}`;
149
+ if (field.references) {
150
+ if (!entityDomainMap.has(field.references)) {
151
+ errors.push({
152
+ type: 'MISSING_REFERENCE',
153
+ message: `Invalid consumption rule: Entity "${field.references}" referenced by field "${field.id}" does not exist`,
154
+ path: `${fieldPath}/references`,
155
+ });
156
+ }
157
+ else {
158
+ dependencies.push(field.references);
159
+ }
160
+ }
161
+ if (Array.isArray(field.fields)) {
162
+ processFields(field.fields, `${fieldPath}/fields`, depth + 1);
163
+ }
164
+ }
165
+ };
166
+ const fields = Array.isArray(entity.fields) ? entity.fields : [];
167
+ processFields(fields, `/domains/${dIndex}/entities/${eIndex}/fields`);
168
+ const existingDeps = adjList.get(entity.id) || [];
169
+ adjList.set(entity.id, [...existingDeps, ...dependencies]);
170
+ if (Array.isArray(entity.implements)) {
171
+ for (const contractId of entity.implements) {
172
+ const contract = contractMap.get(contractId);
173
+ if (!contract) {
174
+ errors.push({
175
+ type: 'MISSING_REFERENCE',
176
+ message: `Entity "${entity.id}" implements missing contract "${contractId}"`,
177
+ path: `domains[${dIndex}].entities[${eIndex}].implements`,
178
+ });
179
+ continue;
180
+ }
181
+ if (Array.isArray(contract.requiredFields)) {
182
+ const flattenFields = (fieldList) => {
183
+ let res = [];
184
+ for (const f of fieldList) {
185
+ if (!f)
186
+ continue;
187
+ res.push(f);
188
+ if (Array.isArray(f.fields)) {
189
+ res = res.concat(flattenFields(f.fields));
190
+ }
191
+ }
192
+ return res;
193
+ };
194
+ const allEntityFields = flattenFields(entity.fields || []);
195
+ for (const reqField of contract.requiredFields) {
196
+ if (!reqField || typeof reqField !== 'object' || !reqField.name)
197
+ continue;
198
+ const entityField = allEntityFields.find((f) => f.name === reqField.name);
199
+ if (!entityField) {
200
+ errors.push({
201
+ type: 'CONTRACT_BREACH',
202
+ message: `Entity "${entity.id}" missing required field "${reqField.name}" for contract "${contract.id}"`,
203
+ path: `/domains/${dIndex}/entities/${eIndex}/implements`,
204
+ });
205
+ }
206
+ else if (entityField.type !== reqField.type) {
207
+ errors.push({
208
+ type: 'CONTRACT_BREACH',
209
+ message: `Entity "${entity.id}" field "${reqField.name}" has type "${entityField.type}" but contract "${contract.id}" requires "${reqField.type}"`,
210
+ path: `/domains/${dIndex}/entities/${eIndex}/fields`,
211
+ });
212
+ }
213
+ }
214
+ }
215
+ if (Array.isArray(contract.requiredCapabilities)) {
216
+ const caps = entityCapabilities.get(entity.id) || [];
217
+ for (const reqCap of contract.requiredCapabilities) {
218
+ if (!reqCap || typeof reqCap !== 'object' || !reqCap.name || !reqCap.type)
219
+ continue;
220
+ const hasCap = caps.some((c) => c.name === reqCap.name && c.type === reqCap.type);
221
+ if (!hasCap) {
222
+ errors.push({
223
+ type: 'CONTRACT_BREACH',
224
+ message: `Entity "${entity.id}" missing required capability "${reqCap.name}" (${reqCap.type}) for contract "${contract.id}"`,
225
+ path: `/domains/${dIndex}/entities/${eIndex}/implements`,
226
+ });
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ const capabilities = Array.isArray(domain.capabilities) ? domain.capabilities : [];
234
+ for (let cIndex = 0; cIndex < capabilities.length; cIndex++) {
235
+ const capability = capabilities[cIndex];
236
+ if (!capability || !capability.id)
237
+ continue;
238
+ const capPath = `/domains/${dIndex}/capabilities/${cIndex}`;
239
+ if (!capability.entityId) {
240
+ errors.push({
241
+ type: 'MISSING_REFERENCE',
242
+ message: `Capability missing entityId: ${capability.id}`,
243
+ path: `${capPath}/entityId`,
244
+ });
245
+ continue;
246
+ }
247
+ const targetDomainId = entityDomainMap.get(capability.entityId);
248
+ if (!targetDomainId) {
249
+ errors.push({
250
+ type: 'MISSING_REFERENCE',
251
+ message: `Invalid capability reference: Entity "${capability.entityId}" referenced by capability "${capability.id}" does not exist`,
252
+ path: `${capPath}/entityId`,
253
+ });
254
+ }
255
+ if (!capability.permissions ||
256
+ !Array.isArray(capability.permissions) ||
257
+ capability.permissions.length === 0) {
258
+ errors.push({
259
+ type: 'UNSECURED_CAPABILITY',
260
+ message: `Capability "${capability.id}" is unsecured. Fail-closed policy requires at least one permission.`,
261
+ path: `${capPath}/permissions`,
262
+ });
263
+ }
264
+ else {
265
+ for (let pIndex = 0; pIndex < capability.permissions.length; pIndex++) {
266
+ const perm = capability.permissions[pIndex];
267
+ if (!perm ||
268
+ typeof perm !== 'object' ||
269
+ !perm.role ||
270
+ typeof perm.role !== 'string' ||
271
+ perm.role.trim() === '') {
272
+ errors.push({
273
+ type: 'INVALID_PERMISSION',
274
+ message: `Capability "${capability.id}" has an invalid permission definition. Role is required.`,
275
+ path: `${capPath}/permissions/${pIndex}`,
276
+ });
277
+ }
278
+ else {
279
+ perm.role = perm.role.trim();
280
+ if (perm.access === undefined) {
281
+ perm.access = 'grant';
282
+ }
283
+ if (perm.access !== 'grant' && perm.access !== 'deny') {
284
+ errors.push({
285
+ type: 'INVALID_PERMISSION',
286
+ message: `Capability "${capability.id}" has an invalid access definition. Must be "grant" or "deny".`,
287
+ path: `${capPath}/permissions/${pIndex}/access`,
288
+ });
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+ const extensions = Array.isArray(domain.extensions) ? domain.extensions : [];
295
+ for (let eIndex = 0; eIndex < extensions.length; eIndex++) {
296
+ const ext = extensions[eIndex];
297
+ if (!ext || !ext.id)
298
+ continue;
299
+ const extPath = `/domains/${dIndex}/extensions/${eIndex}`;
300
+ if (!Array.isArray(ext.implements) || ext.implements.length === 0) {
301
+ errors.push({
302
+ type: 'MISSING_REFERENCE',
303
+ message: `Extension missing implements contract reference: ${ext.id}`,
304
+ path: `${extPath}/implements`,
305
+ });
306
+ }
307
+ else {
308
+ for (const imp of ext.implements) {
309
+ if (!contractMap.has(imp)) {
310
+ errors.push({
311
+ type: 'MISSING_REFERENCE',
312
+ message: `Invalid extension reference: Contract "${imp}" referenced by extension "${ext.id}" does not exist`,
313
+ path: `${extPath}/implements`,
314
+ });
315
+ }
316
+ }
317
+ }
318
+ if (localManifest && ext.name && ext.plugin_version_range) {
319
+ const localVersion = localManifest[ext.name];
320
+ if (!localVersion) {
321
+ errors.push({
322
+ type: 'MISSING_MANIFEST_VERSION',
323
+ message: `Local manifest is missing version for extension "${ext.name}"`,
324
+ path: `${extPath}/name`,
325
+ });
326
+ }
327
+ else if (!semver.valid(localVersion) || !semver.validRange(ext.plugin_version_range)) {
328
+ errors.push({
329
+ type: 'VERSION_MISMATCH',
330
+ message: `Invalid semver format for extension "${ext.name}"`,
331
+ path: `${extPath}/plugin_version_range`,
332
+ });
333
+ }
334
+ else if (!semver.satisfies(localVersion, ext.plugin_version_range)) {
335
+ errors.push({
336
+ type: 'VERSION_MISMATCH',
337
+ message: `Extension "${ext.name}" requires plugin version "${ext.plugin_version_range}" but local manifest provides "${localVersion}"`,
338
+ path: `${extPath}/plugin_version_range`,
339
+ });
340
+ }
341
+ }
342
+ }
343
+ }
344
+ // Detect cycles using DFS
345
+ const visited = new Set();
346
+ const visiting = new Set();
347
+ function dfs(nodeId, path, depth) {
348
+ if (depth > exports.MAX_AST_DEPTH) {
349
+ errors.push({
350
+ type: 'MAX_DEPTH_EXCEEDED',
351
+ message: `Maximum AST depth exceeded (${exports.MAX_AST_DEPTH}) at entity ${nodeId}`,
352
+ path: [...path, nodeId].join(' -> '),
353
+ });
354
+ return;
355
+ }
356
+ if (visiting.has(nodeId)) {
357
+ // Cycle detected: isolate the loop part
358
+ const cycleStartIndex = path.indexOf(nodeId);
359
+ const loop = cycleStartIndex >= 0 ? path.slice(cycleStartIndex) : path;
360
+ const cyclePath = [...loop, nodeId].join(' -> ');
361
+ errors.push({
362
+ type: 'CIRCULAR_REFERENCE',
363
+ message: `Circular dependency detected: ${cyclePath}`,
364
+ path: cyclePath,
365
+ });
366
+ return;
367
+ }
368
+ if (visited.has(nodeId)) {
369
+ return;
370
+ }
371
+ visiting.add(nodeId);
372
+ path.push(nodeId);
373
+ const deps = adjList.get(nodeId) || [];
374
+ for (const dep of deps) {
375
+ dfs(dep, path, depth + 1);
376
+ }
377
+ path.pop();
378
+ visiting.delete(nodeId);
379
+ visited.add(nodeId);
380
+ }
381
+ for (const entityId of entityDomainMap.keys()) {
382
+ if (!visited.has(entityId)) {
383
+ dfs(entityId, [], 1);
384
+ }
385
+ }
386
+ return errors;
387
+ }
388
+ //# sourceMappingURL=ast-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-validator.js","sourceRoot":"","sources":["../../../../../packages/core/src/validator/ast-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ErrorObject } from 'ajv/dist/2020';
2
+ export interface ValidatorOptions {
3
+ maxDepth?: number;
4
+ }
5
+ export interface EnhancedErrorObject extends ErrorObject {
6
+ code?: string;
7
+ context?: {
8
+ line?: number;
9
+ column?: number;
10
+ [key: string]: unknown;
11
+ };
12
+ }
13
+ export declare class BADLValidator {
14
+ private ajv;
15
+ errors: EnhancedErrorObject[] | null | undefined;
16
+ constructor();
17
+ private checkCircularDependency;
18
+ private runValidation;
19
+ validateDomain(data: unknown, options?: ValidatorOptions): boolean;
20
+ validateEntity(data: unknown, options?: ValidatorOptions): boolean;
21
+ }
22
+ export * from './serializer';
23
+ export * from './ast-validator';
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BADLValidator = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const _2020_1 = tslib_1.__importDefault(require("ajv/dist/2020"));
6
+ const ajv_formats_1 = tslib_1.__importDefault(require("ajv-formats"));
7
+ const ajv_errors_1 = tslib_1.__importDefault(require("ajv-errors"));
8
+ const json_source_map_1 = require("json-source-map");
9
+ const domainSchema = tslib_1.__importStar(require("../schemas/domain.schema.json"));
10
+ const entitySchema = tslib_1.__importStar(require("../schemas/entity.schema.json"));
11
+ const capabilitySchema = tslib_1.__importStar(require("../schemas/capability.schema.json"));
12
+ const contractSchema = tslib_1.__importStar(require("../schemas/contract.schema.json"));
13
+ const permissionSchema = tslib_1.__importStar(require("../schemas/permission.schema.json"));
14
+ const extensionSchema = tslib_1.__importStar(require("../schemas/extension.schema.json"));
15
+ class BADLValidator {
16
+ ajv;
17
+ errors = null;
18
+ constructor() {
19
+ this.ajv = new _2020_1.default({
20
+ allErrors: true,
21
+ strict: true,
22
+ });
23
+ (0, ajv_formats_1.default)(this.ajv);
24
+ (0, ajv_errors_1.default)(this.ajv);
25
+ const resolvedEntitySchema = entitySchema['default'] ?? entitySchema;
26
+ const resolvedDomainSchema = domainSchema['default'] ?? domainSchema;
27
+ const resolvedCapabilitySchema = capabilitySchema['default'] ?? capabilitySchema;
28
+ const resolvedPermissionSchema = permissionSchema['default'] ?? permissionSchema;
29
+ const resolvedContractSchema = contractSchema['default'] ?? contractSchema;
30
+ const resolvedExtensionSchema = extensionSchema['default'] ?? extensionSchema;
31
+ this.ajv.addSchema(resolvedCapabilitySchema, 'https://origo.design/schemas/v1/capability.schema.json');
32
+ this.ajv.addSchema(resolvedContractSchema, 'https://origo.design/schemas/v1/contract.schema.json');
33
+ this.ajv.addSchema(resolvedPermissionSchema, 'https://origo.design/schemas/v1/permission.schema.json');
34
+ this.ajv.addSchema(resolvedExtensionSchema, 'https://origo.design/schemas/v1/extension.schema.json');
35
+ this.ajv.addSchema(resolvedEntitySchema, 'https://origo.design/schemas/v1/entity.schema.json');
36
+ this.ajv.addSchema(resolvedDomainSchema, 'https://origo.design/schemas/v1/domain.schema.json');
37
+ }
38
+ checkCircularDependency(obj, currentDepth, maxDepth, visited) {
39
+ if (currentDepth > maxDepth) {
40
+ throw new Error('Maximum depth exceeded. Possible circular dependency detected.');
41
+ }
42
+ if (obj && typeof obj === 'object') {
43
+ if (visited.has(obj)) {
44
+ throw new Error('Maximum depth exceeded. Possible circular dependency detected.');
45
+ }
46
+ visited.add(obj);
47
+ for (const key in obj) {
48
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
49
+ this.checkCircularDependency(obj[key], currentDepth + 1, maxDepth, visited);
50
+ }
51
+ }
52
+ visited.delete(obj);
53
+ }
54
+ }
55
+ runValidation(schemaUrl, data, options = {}) {
56
+ this.errors = null;
57
+ let parsedData = data;
58
+ let sourceMapPointers;
59
+ if (typeof data === 'string') {
60
+ try {
61
+ const parsed = (0, json_source_map_1.parse)(data);
62
+ parsedData = parsed.data;
63
+ sourceMapPointers = parsed.pointers;
64
+ }
65
+ catch (err) {
66
+ let line;
67
+ let column;
68
+ if (err && typeof err === 'object') {
69
+ const errMsg = err.message || '';
70
+ const match = /line (\d+) column (\d+)/.exec(errMsg);
71
+ if (match) {
72
+ line = parseInt(match[1], 10);
73
+ column = parseInt(match[2], 10);
74
+ }
75
+ }
76
+ this.errors = [
77
+ {
78
+ keyword: 'parse',
79
+ message: err?.message || 'Invalid JSON string',
80
+ instancePath: '',
81
+ schemaPath: '',
82
+ params: {},
83
+ code: 'parse',
84
+ context: { line, column },
85
+ },
86
+ ];
87
+ return false;
88
+ }
89
+ }
90
+ if (typeof options.maxDepth === 'number' && options.maxDepth < 0) {
91
+ throw new Error('maxDepth must be >= 0');
92
+ }
93
+ const maxDepth = options.maxDepth ?? 100;
94
+ this.checkCircularDependency(parsedData, 0, maxDepth, new Set());
95
+ const validate = this.ajv.getSchema(schemaUrl);
96
+ if (!validate) {
97
+ throw new Error(`Schema not found: ${schemaUrl}`);
98
+ }
99
+ const isValid = validate(parsedData);
100
+ if (!isValid && validate.errors) {
101
+ this.errors = validate.errors.map(err => {
102
+ const newErr = { ...err, code: err.keyword };
103
+ if (sourceMapPointers) {
104
+ const decodedPath = (err.instancePath ?? '').replace(/~1/g, '/').replace(/~0/g, '~');
105
+ let lookupPath = decodedPath;
106
+ if (err.keyword === 'additionalProperties' &&
107
+ err.params['additionalProperty']) {
108
+ const additionalProperty = err.params['additionalProperty'];
109
+ const additionalPath = `${decodedPath === '' ? '' : decodedPath}/${additionalProperty.replace(/~/g, '~0').replace(/\//g, '~1')}`;
110
+ if (sourceMapPointers[additionalPath]) {
111
+ lookupPath = additionalPath;
112
+ }
113
+ }
114
+ if (sourceMapPointers[lookupPath] !== undefined) {
115
+ const pointer = sourceMapPointers[lookupPath];
116
+ const loc = pointer.key || pointer.value;
117
+ if (loc != null) {
118
+ newErr.context = {
119
+ line: loc.line + 1,
120
+ column: loc.column + 1,
121
+ };
122
+ }
123
+ }
124
+ }
125
+ return newErr;
126
+ });
127
+ }
128
+ else {
129
+ this.errors = null;
130
+ }
131
+ return isValid;
132
+ }
133
+ validateDomain(data, options = {}) {
134
+ return this.runValidation('https://origo.design/schemas/v1/domain.schema.json', data, options);
135
+ }
136
+ validateEntity(data, options = {}) {
137
+ return this.runValidation('https://origo.design/schemas/v1/entity.schema.json', data, options);
138
+ }
139
+ }
140
+ exports.BADLValidator = BADLValidator;
141
+ tslib_1.__exportStar(require("./serializer"), exports);
142
+ tslib_1.__exportStar(require("./ast-validator"), exports);
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/core/src/validator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { CanonicalAST } from '../types/ast';
2
+ import { ValidationError } from '../types/validation';
3
+ /**
4
+ * Serializes the parsed memory model into a canonical JSON AST.
5
+ * Enforces `schemaVersion`, stable key ordering, and stable array ordering.
6
+ *
7
+ * @param ast The canonical AST to serialize
8
+ * @returns Byte-for-byte deterministic JSON string
9
+ * @throws {ASTValidationError} If validation or canonicalization fails
10
+ */
11
+ export declare function serializeAST(ast: CanonicalAST): [string | null, ValidationError[]];