@clossys/architect 0.1.2
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/CHANGELOG.md +31 -0
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/assessment.d.ts +9 -0
- package/dist/assessment.d.ts.map +1 -0
- package/dist/assessment.js +98 -0
- package/dist/assessment.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +96 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/ontology/compatibility.d.ts +7 -0
- package/dist/ontology/compatibility.d.ts.map +1 -0
- package/dist/ontology/compatibility.js +135 -0
- package/dist/ontology/compatibility.js.map +1 -0
- package/dist/ontology/define.d.ts +8 -0
- package/dist/ontology/define.d.ts.map +1 -0
- package/dist/ontology/define.js +30 -0
- package/dist/ontology/define.js.map +1 -0
- package/dist/ontology/index.d.ts +9 -0
- package/dist/ontology/index.d.ts.map +1 -0
- package/dist/ontology/index.js +8 -0
- package/dist/ontology/index.js.map +1 -0
- package/dist/ontology/normalize.d.ts +6 -0
- package/dist/ontology/normalize.d.ts.map +1 -0
- package/dist/ontology/normalize.js +60 -0
- package/dist/ontology/normalize.js.map +1 -0
- package/dist/ontology/snapshot.d.ts +14 -0
- package/dist/ontology/snapshot.d.ts.map +1 -0
- package/dist/ontology/snapshot.js +299 -0
- package/dist/ontology/snapshot.js.map +1 -0
- package/dist/ontology/types.d.ts +123 -0
- package/dist/ontology/types.d.ts.map +1 -0
- package/dist/ontology/types.js +16 -0
- package/dist/ontology/types.js.map +1 -0
- package/dist/ontology/validate.d.ts +8 -0
- package/dist/ontology/validate.d.ts.map +1 -0
- package/dist/ontology/validate.js +190 -0
- package/dist/ontology/validate.js.map +1 -0
- package/dist/topology.d.ts +11 -0
- package/dist/topology.d.ts.map +1 -0
- package/dist/topology.js +237 -0
- package/dist/topology.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/package.json +69 -0
- package/src/assessment.ts +98 -0
- package/src/cli.ts +74 -0
- package/src/index.ts +39 -0
- package/src/ontology/compatibility.ts +132 -0
- package/src/ontology/define.ts +35 -0
- package/src/ontology/index.ts +29 -0
- package/src/ontology/normalize.ts +63 -0
- package/src/ontology/snapshot.ts +324 -0
- package/src/ontology/types.ts +156 -0
- package/src/ontology/validate.ts +208 -0
- package/src/topology.ts +211 -0
- package/src/types.ts +142 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../src/ontology/compatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,SAAS,OAAO,CAA2B,KAAmB;IAC5D,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CACpB,QAAoC,EACpC,IAAgC,EAChC,OAAsC,EACtC,OAAe,EACf,OAA4B;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,KAAK,EAAE,uBAAuB,OAAO,IAAI,EAAE,CAAC,CAAC;YAC9G,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;gBACvD,OAAO;gBACP,EAAE;gBACF,OAAO,EAAE,GAAG,OAAO,KAAK,EAAE,mBAAmB,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG;aACzG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAwC,EAAE,IAAoC,EAAE,OAA4B;IACrI,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAC;aACpI,IAAI,SAAS,CAAC,SAAS,KAAK,WAAW,CAAC,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC1K,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;AACzJ,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAyC,EAAE,IAAqC,EAAE,OAA4B;IACzI,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC1G,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,cAAc;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,KAAK,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;QACxN,KAAK,MAAM,KAAK,IAAI,UAAU;YAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,KAAK,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACtN,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;AACzJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAyC,EAAE,IAAqC,EAAE,OAA4B;IAClI,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;;YACxH,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;AAC7I,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAuC,EAAE,IAAmC,EAAE,OAA4B;IAClI,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACtG,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACxL,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,CAAC,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACpK,aAAa,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,EAAE,WAAW,CAAC,UAAU,IAAI,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3G,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;AACrJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA+B,EAAE,IAA2B;IAC9F,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QAC7H,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC;IAC5E,CAAC;IACD,MAAM,MAAM,GAAgB,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAgB,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,0BAA0B,MAAM,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAClK,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChE,mBAAmB,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACtE,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjD,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE7D,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;QAC/D,OAAO;QACP,gBAAgB;QAChB,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DomainModel, DomainModelDefinition } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a detached model value for authoring and later validation. This
|
|
4
|
+
* function deliberately does not claim the definition is valid; call
|
|
5
|
+
* `validateDomainModel` against the returned value before consuming it.
|
|
6
|
+
*/
|
|
7
|
+
export declare function defineDomainModel(definition: DomainModelDefinition): DomainModel;
|
|
8
|
+
//# sourceMappingURL=define.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/ontology/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAwG,MAAM,YAAY,CAAC;AAc3K;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,qBAAqB,GAAG,WAAW,CAehF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function copyField(field) {
|
|
2
|
+
return { ...field, required: field.required === true };
|
|
3
|
+
}
|
|
4
|
+
function copyType(type) {
|
|
5
|
+
return { ...type, fields: (type.fields ?? []).map(copyField) };
|
|
6
|
+
}
|
|
7
|
+
function copyRelation(relation) {
|
|
8
|
+
return { ...relation, properties: (relation.properties ?? []).map(copyField) };
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates a detached model value for authoring and later validation. This
|
|
12
|
+
* function deliberately does not claim the definition is valid; call
|
|
13
|
+
* `validateDomainModel` against the returned value before consuming it.
|
|
14
|
+
*/
|
|
15
|
+
export function defineDomainModel(definition) {
|
|
16
|
+
const valueTypes = (definition.valueTypes ?? []).map((valueType) => ({ ...valueType }));
|
|
17
|
+
const vocabularies = (definition.vocabularies ?? []).map((vocabulary) => ({
|
|
18
|
+
...vocabulary,
|
|
19
|
+
values: [...vocabulary.values],
|
|
20
|
+
}));
|
|
21
|
+
return {
|
|
22
|
+
id: definition.id,
|
|
23
|
+
schemaVersion: definition.schemaVersion,
|
|
24
|
+
valueTypes,
|
|
25
|
+
vocabularies,
|
|
26
|
+
types: (definition.types ?? []).map(copyType),
|
|
27
|
+
relations: (definition.relations ?? []).map(copyRelation),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/ontology/define.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,KAAsB;IACvC,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,QAAQ,CAAC,IAA0B;IAC1C,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,YAAY,CAAC,QAA4B;IAChD,OAAO,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;AACjF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAiC;IACjE,MAAM,UAAU,GAA0B,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;IAC/G,MAAM,YAAY,GAA2B,CAAC,UAAU,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAChG,GAAG,UAAU;QACb,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;KAC/B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,UAAU;QACV,YAAY;QACZ,KAAK,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7C,SAAS,EAAE,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Dependency-free machinery for product-owned domain models, never product values. */
|
|
2
|
+
export { defineDomainModel } from "./define.js";
|
|
3
|
+
export { normalizeDomainModel, serializeDomainModel } from "./normalize.js";
|
|
4
|
+
export { validateDomainModel } from "./validate.js";
|
|
5
|
+
export { compareDomainModels } from "./compatibility.js";
|
|
6
|
+
export { defineDomainSnapshot, normalizeDomainSnapshot, serializeDomainSnapshot, validateDomainSnapshot } from "./snapshot.js";
|
|
7
|
+
export { PRIMITIVE_VALUE_TYPES, RELATION_CARDINALITIES } from "./types.js";
|
|
8
|
+
export type { DomainModel, DomainModelChange, DomainModelCompatibilityReport, DomainModelDefinition, DomainModelFinding, DomainRecord, DomainRecordDefinition, DomainRelation, DomainRelationDefinition, DomainSnapshot, DomainSnapshotDefinition, DomainSnapshotFinding, DomainTypeDefinition, FieldDefinition, FieldValueType, PrimitiveValueType, RelationCardinality, RelationDefinition, ValueTypeDefinition, VocabularyDefinition, } from "./types.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ontology/index.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC/H,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3E,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,8BAA8B,EAC9B,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Dependency-free machinery for product-owned domain models, never product values. */
|
|
2
|
+
export { defineDomainModel } from "./define.js";
|
|
3
|
+
export { normalizeDomainModel, serializeDomainModel } from "./normalize.js";
|
|
4
|
+
export { validateDomainModel } from "./validate.js";
|
|
5
|
+
export { compareDomainModels } from "./compatibility.js";
|
|
6
|
+
export { defineDomainSnapshot, normalizeDomainSnapshot, serializeDomainSnapshot, validateDomainSnapshot } from "./snapshot.js";
|
|
7
|
+
export { PRIMITIVE_VALUE_TYPES, RELATION_CARDINALITIES } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ontology/index.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC/H,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DomainModel, DomainModelDefinition } from "./types.js";
|
|
2
|
+
/** Returns one canonical ordering and property layout for the same model value. */
|
|
3
|
+
export declare function normalizeDomainModel(model: DomainModelDefinition): DomainModel;
|
|
4
|
+
/** Serializes a normalized model as stable, language-neutral JSON followed by one newline. */
|
|
5
|
+
export declare function serializeDomainModel(model: DomainModelDefinition): string;
|
|
6
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/ontology/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAwG,MAAM,YAAY,CAAC;AA6C3K,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,WAAW,CAU9E;AAED,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { defineDomainModel } from "./define.js";
|
|
2
|
+
function byId(left, right) {
|
|
3
|
+
return left.id.localeCompare(right.id);
|
|
4
|
+
}
|
|
5
|
+
function normalizeField(field) {
|
|
6
|
+
const normalized = { id: field.id, valueType: field.valueType, required: field.required === true };
|
|
7
|
+
if (field.label !== undefined)
|
|
8
|
+
normalized.label = field.label;
|
|
9
|
+
return normalized;
|
|
10
|
+
}
|
|
11
|
+
function normalizeType(type) {
|
|
12
|
+
const normalized = {
|
|
13
|
+
id: type.id,
|
|
14
|
+
fields: [...(type.fields ?? [])].map(normalizeField).sort(byId),
|
|
15
|
+
};
|
|
16
|
+
if (type.label !== undefined)
|
|
17
|
+
normalized.label = type.label;
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
function normalizeRelation(relation) {
|
|
21
|
+
const normalized = {
|
|
22
|
+
id: relation.id,
|
|
23
|
+
from: relation.from,
|
|
24
|
+
to: relation.to,
|
|
25
|
+
cardinality: relation.cardinality,
|
|
26
|
+
properties: [...(relation.properties ?? [])].map(normalizeField).sort(byId),
|
|
27
|
+
};
|
|
28
|
+
if (relation.label !== undefined)
|
|
29
|
+
normalized.label = relation.label;
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
function normalizeValueType(valueType) {
|
|
33
|
+
const normalized = { id: valueType.id, primitive: valueType.primitive };
|
|
34
|
+
if (valueType.label !== undefined)
|
|
35
|
+
normalized.label = valueType.label;
|
|
36
|
+
return normalized;
|
|
37
|
+
}
|
|
38
|
+
function normalizeVocabulary(vocabulary) {
|
|
39
|
+
const normalized = { id: vocabulary.id, values: [...vocabulary.values].sort() };
|
|
40
|
+
if (vocabulary.label !== undefined)
|
|
41
|
+
normalized.label = vocabulary.label;
|
|
42
|
+
return normalized;
|
|
43
|
+
}
|
|
44
|
+
/** Returns one canonical ordering and property layout for the same model value. */
|
|
45
|
+
export function normalizeDomainModel(model) {
|
|
46
|
+
const copied = defineDomainModel(model);
|
|
47
|
+
return {
|
|
48
|
+
id: copied.id,
|
|
49
|
+
schemaVersion: copied.schemaVersion,
|
|
50
|
+
valueTypes: copied.valueTypes.map(normalizeValueType).sort(byId),
|
|
51
|
+
vocabularies: copied.vocabularies.map(normalizeVocabulary).sort(byId),
|
|
52
|
+
types: copied.types.map(normalizeType).sort(byId),
|
|
53
|
+
relations: copied.relations.map(normalizeRelation).sort(byId),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Serializes a normalized model as stable, language-neutral JSON followed by one newline. */
|
|
57
|
+
export function serializeDomainModel(model) {
|
|
58
|
+
return `${JSON.stringify(normalizeDomainModel(model), null, 2)}\n`;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/ontology/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DomainModelDefinition, DomainSnapshot, DomainSnapshotDefinition, DomainSnapshotFinding } from "./types.js";
|
|
2
|
+
/** Creates a detached snapshot without asserting that its values satisfy a model. */
|
|
3
|
+
export declare function defineDomainSnapshot(definition: DomainSnapshotDefinition): DomainSnapshot;
|
|
4
|
+
/**
|
|
5
|
+
* Validates a snapshot against a domain model without throwing for malformed
|
|
6
|
+
* input. Model validation runs first so instance findings never rely on an
|
|
7
|
+
* ambiguous declaration.
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateDomainSnapshot(model: DomainModelDefinition, value: unknown): DomainSnapshotFinding[];
|
|
10
|
+
/** Returns one canonical ordering and property layout for the same snapshot value. */
|
|
11
|
+
export declare function normalizeDomainSnapshot(snapshot: DomainSnapshotDefinition): DomainSnapshot;
|
|
12
|
+
/** Serializes a normalized snapshot as stable, language-neutral JSON followed by one newline. */
|
|
13
|
+
export declare function serializeDomainSnapshot(snapshot: DomainSnapshotDefinition): string;
|
|
14
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/ontology/snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EAKrB,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EAItB,MAAM,YAAY,CAAC;AA4BpB,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,wBAAwB,GAAG,cAAc,CAazF;AA4HD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,qBAAqB,EAAE,CAkG5G;AAyBD,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,cAAc,CAS1F;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,CAElF"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { defineDomainModel } from "./define.js";
|
|
2
|
+
import { validateDomainModel } from "./validate.js";
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
5
|
+
return false;
|
|
6
|
+
const prototype = Object.getPrototypeOf(value);
|
|
7
|
+
return prototype === Object.prototype || prototype === null;
|
|
8
|
+
}
|
|
9
|
+
function copyValue(value) {
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.map(copyValue);
|
|
12
|
+
if (!isRecord(value))
|
|
13
|
+
return value;
|
|
14
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, copyValue(entry)]));
|
|
15
|
+
}
|
|
16
|
+
function copyValues(values) {
|
|
17
|
+
return Object.fromEntries(Object.entries(values ?? {}).map(([key, value]) => [key, copyValue(value)]));
|
|
18
|
+
}
|
|
19
|
+
/** Creates a detached snapshot without asserting that its values satisfy a model. */
|
|
20
|
+
export function defineDomainSnapshot(definition) {
|
|
21
|
+
const records = (definition.records ?? []).map((record) => ({
|
|
22
|
+
id: record.id,
|
|
23
|
+
type: record.type,
|
|
24
|
+
values: copyValues(record.values),
|
|
25
|
+
}));
|
|
26
|
+
const relations = (definition.relations ?? []).map((relation) => ({
|
|
27
|
+
type: relation.type,
|
|
28
|
+
from: relation.from,
|
|
29
|
+
to: relation.to,
|
|
30
|
+
values: copyValues(relation.values),
|
|
31
|
+
}));
|
|
32
|
+
return { records, relations };
|
|
33
|
+
}
|
|
34
|
+
function finding(rule, message, path) {
|
|
35
|
+
return { rule, severity: "error", message, path };
|
|
36
|
+
}
|
|
37
|
+
function arrayAt(record, key, findings, path) {
|
|
38
|
+
const value = record[key];
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
return [];
|
|
41
|
+
if (Array.isArray(value))
|
|
42
|
+
return value;
|
|
43
|
+
findings.push(finding("collection-shape", `${key} must be an array when provided.`, path));
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
function nonEmptyStringAt(record, key, findings, path) {
|
|
47
|
+
const value = record[key];
|
|
48
|
+
if (typeof value === "string" && value.length > 0)
|
|
49
|
+
return value;
|
|
50
|
+
findings.push(finding("required-string", `${key} must be a non-empty string.`, path));
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function valuesAt(record, findings, path) {
|
|
54
|
+
const value = record.values;
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
return {};
|
|
57
|
+
if (isRecord(value))
|
|
58
|
+
return value;
|
|
59
|
+
findings.push(finding("values-shape", "values must be an object when provided.", path));
|
|
60
|
+
return {};
|
|
61
|
+
}
|
|
62
|
+
function isCalendarDate(value) {
|
|
63
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
|
|
64
|
+
if (!match)
|
|
65
|
+
return false;
|
|
66
|
+
const year = Number(match[1]);
|
|
67
|
+
const month = Number(match[2]);
|
|
68
|
+
const day = Number(match[3]);
|
|
69
|
+
if (month < 1 || month > 12 || day < 1)
|
|
70
|
+
return false;
|
|
71
|
+
const daysInMonth = [31, year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
72
|
+
return day <= (daysInMonth[month - 1] ?? 0);
|
|
73
|
+
}
|
|
74
|
+
function isDateTime(value) {
|
|
75
|
+
const match = /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})$/.exec(value);
|
|
76
|
+
if (!match)
|
|
77
|
+
return false;
|
|
78
|
+
if (!isCalendarDate(match[1] ?? ""))
|
|
79
|
+
return false;
|
|
80
|
+
const hour = Number(match[2]);
|
|
81
|
+
const minute = Number(match[3]);
|
|
82
|
+
const second = Number(match[4]);
|
|
83
|
+
if (hour > 23 || minute > 59 || second > 59)
|
|
84
|
+
return false;
|
|
85
|
+
const offset = match[6] ?? "";
|
|
86
|
+
if (offset !== "Z") {
|
|
87
|
+
const [offsetHour, offsetMinute] = offset.slice(1).split(":").map(Number);
|
|
88
|
+
if (offsetHour === undefined || offsetMinute === undefined || offsetHour > 23 || offsetMinute > 59)
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
function isJsonValue(value, seen = new WeakSet()) {
|
|
94
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
95
|
+
return true;
|
|
96
|
+
if (typeof value === "number")
|
|
97
|
+
return Number.isFinite(value);
|
|
98
|
+
if (Array.isArray(value)) {
|
|
99
|
+
if (seen.has(value))
|
|
100
|
+
return false;
|
|
101
|
+
seen.add(value);
|
|
102
|
+
return value.every((entry) => isJsonValue(entry, seen));
|
|
103
|
+
}
|
|
104
|
+
if (!isRecord(value))
|
|
105
|
+
return false;
|
|
106
|
+
if (seen.has(value))
|
|
107
|
+
return false;
|
|
108
|
+
seen.add(value);
|
|
109
|
+
return Object.values(value).every((entry) => isJsonValue(entry, seen));
|
|
110
|
+
}
|
|
111
|
+
function matchesPrimitive(value, primitive) {
|
|
112
|
+
switch (primitive) {
|
|
113
|
+
case "string": return typeof value === "string";
|
|
114
|
+
case "number": return typeof value === "number" && Number.isFinite(value);
|
|
115
|
+
case "integer": return typeof value === "number" && Number.isInteger(value);
|
|
116
|
+
case "boolean": return typeof value === "boolean";
|
|
117
|
+
case "date": return typeof value === "string" && isCalendarDate(value);
|
|
118
|
+
case "datetime": return typeof value === "string" && isDateTime(value);
|
|
119
|
+
case "json": return isJsonValue(value);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function validateValues(values, fields, primitiveByValueType, vocabularyValues, findings, path) {
|
|
123
|
+
const fieldsById = new Map(fields.map((field) => [field.id, field]));
|
|
124
|
+
for (const key of Object.keys(values)) {
|
|
125
|
+
if (!fieldsById.has(key))
|
|
126
|
+
findings.push(finding("unknown-value", `values.${key} is not declared by this type.`, `${path}.values.${key}`));
|
|
127
|
+
}
|
|
128
|
+
for (const field of fields) {
|
|
129
|
+
const value = values[field.id];
|
|
130
|
+
const valuePath = `${path}.values.${field.id}`;
|
|
131
|
+
if (value === undefined) {
|
|
132
|
+
if (field.required === true)
|
|
133
|
+
findings.push(finding("required-value", `Required value "${field.id}" is missing.`, valuePath));
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const vocabulary = vocabularyValues.get(field.valueType);
|
|
137
|
+
if (vocabulary !== undefined) {
|
|
138
|
+
if (typeof value !== "string" || !vocabulary.has(value)) {
|
|
139
|
+
findings.push(finding("vocabulary-value", `Value for "${field.id}" must be a declared vocabulary member.`, valuePath));
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const primitive = primitiveByValueType.get(field.valueType) ?? field.valueType;
|
|
144
|
+
if (!matchesPrimitive(value, primitive)) {
|
|
145
|
+
findings.push(finding("value-type", `Value for "${field.id}" does not match "${field.valueType}".`, valuePath));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function cardinalityViolation(cardinality, fromCount, toCount) {
|
|
150
|
+
switch (cardinality) {
|
|
151
|
+
case "one-to-one": return fromCount > 1 || toCount > 1;
|
|
152
|
+
case "one-to-many": return toCount > 1;
|
|
153
|
+
case "many-to-one": return fromCount > 1;
|
|
154
|
+
case "many-to-many": return false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Validates a snapshot against a domain model without throwing for malformed
|
|
159
|
+
* input. Model validation runs first so instance findings never rely on an
|
|
160
|
+
* ambiguous declaration.
|
|
161
|
+
*/
|
|
162
|
+
export function validateDomainSnapshot(model, value) {
|
|
163
|
+
const modelFindings = validateDomainModel(model);
|
|
164
|
+
if (modelFindings.length > 0) {
|
|
165
|
+
return modelFindings.map((entry) => ({ ...entry, rule: `model-${entry.rule}`, message: `Domain model: ${entry.message}` }));
|
|
166
|
+
}
|
|
167
|
+
if (!isRecord(value))
|
|
168
|
+
return [finding("snapshot-shape", "A domain snapshot must be an object.", "$")];
|
|
169
|
+
const normalizedModel = defineDomainModel(model);
|
|
170
|
+
const findings = [];
|
|
171
|
+
const records = arrayAt(value, "records", findings, "records");
|
|
172
|
+
const relations = arrayAt(value, "relations", findings, "relations");
|
|
173
|
+
const typesById = new Map(normalizedModel.types.map((type) => [type.id, type]));
|
|
174
|
+
const relationsById = new Map(normalizedModel.relations.map((relation) => [relation.id, relation]));
|
|
175
|
+
const primitiveByValueType = new Map(normalizedModel.valueTypes.map((valueType) => [valueType.id, valueType.primitive]));
|
|
176
|
+
const vocabularyValues = new Map(normalizedModel.vocabularies.map((vocabulary) => [vocabulary.id, new Set(vocabulary.values)]));
|
|
177
|
+
const recordTypes = new Map();
|
|
178
|
+
records.forEach((candidate, index) => {
|
|
179
|
+
const path = `records[${index}]`;
|
|
180
|
+
if (!isRecord(candidate)) {
|
|
181
|
+
findings.push(finding("record-shape", "A record must be an object.", path));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const id = nonEmptyStringAt(candidate, "id", findings, `${path}.id`);
|
|
185
|
+
const type = nonEmptyStringAt(candidate, "type", findings, `${path}.type`);
|
|
186
|
+
const values = valuesAt(candidate, findings, `${path}.values`);
|
|
187
|
+
if (id !== undefined) {
|
|
188
|
+
if (recordTypes.has(id))
|
|
189
|
+
findings.push(finding("duplicate-record-id", `Duplicate record id "${id}".`, `${path}.id`));
|
|
190
|
+
else if (type !== undefined)
|
|
191
|
+
recordTypes.set(id, type);
|
|
192
|
+
}
|
|
193
|
+
if (type === undefined)
|
|
194
|
+
return;
|
|
195
|
+
const typeDefinition = typesById.get(type);
|
|
196
|
+
if (typeDefinition === undefined) {
|
|
197
|
+
findings.push(finding("unknown-record-type", `Record type "${type}" is not declared by the model.`, `${path}.type`));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
validateValues(values, typeDefinition.fields ?? [], primitiveByValueType, vocabularyValues, findings, path);
|
|
201
|
+
});
|
|
202
|
+
const relationCandidates = [];
|
|
203
|
+
relations.forEach((candidate, index) => {
|
|
204
|
+
const path = `relations[${index}]`;
|
|
205
|
+
if (!isRecord(candidate)) {
|
|
206
|
+
findings.push(finding("relation-shape", "A relation must be an object.", path));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const type = nonEmptyStringAt(candidate, "type", findings, `${path}.type`);
|
|
210
|
+
const from = nonEmptyStringAt(candidate, "from", findings, `${path}.from`);
|
|
211
|
+
const to = nonEmptyStringAt(candidate, "to", findings, `${path}.to`);
|
|
212
|
+
const values = valuesAt(candidate, findings, `${path}.values`);
|
|
213
|
+
if (type === undefined || from === undefined || to === undefined)
|
|
214
|
+
return;
|
|
215
|
+
const relationDefinition = relationsById.get(type);
|
|
216
|
+
if (relationDefinition === undefined) {
|
|
217
|
+
findings.push(finding("unknown-relation-type", `Relation type "${type}" is not declared by the model.`, `${path}.type`));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const fromType = recordTypes.get(from);
|
|
221
|
+
const toType = recordTypes.get(to);
|
|
222
|
+
if (fromType === undefined)
|
|
223
|
+
findings.push(finding("relation-from-record", `from record "${from}" is not present in this snapshot.`, `${path}.from`));
|
|
224
|
+
else if (fromType !== relationDefinition.from)
|
|
225
|
+
findings.push(finding("relation-from-type", `from record "${from}" must have type "${relationDefinition.from}".`, `${path}.from`));
|
|
226
|
+
if (toType === undefined)
|
|
227
|
+
findings.push(finding("relation-to-record", `to record "${to}" is not present in this snapshot.`, `${path}.to`));
|
|
228
|
+
else if (toType !== relationDefinition.to)
|
|
229
|
+
findings.push(finding("relation-to-type", `to record "${to}" must have type "${relationDefinition.to}".`, `${path}.to`));
|
|
230
|
+
validateValues(values, relationDefinition.properties ?? [], primitiveByValueType, vocabularyValues, findings, path);
|
|
231
|
+
if (fromType === relationDefinition.from && toType === relationDefinition.to) {
|
|
232
|
+
relationCandidates.push({
|
|
233
|
+
index,
|
|
234
|
+
type,
|
|
235
|
+
from,
|
|
236
|
+
to,
|
|
237
|
+
// A snapshot is a graph of facts. Repeating the same fact in input
|
|
238
|
+
// must not turn a valid one-to-one or many-to-one fact into a false
|
|
239
|
+
// cardinality violation.
|
|
240
|
+
identity: `${type}\u0000${from}\u0000${to}\u0000${comparable(values)}`,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
for (const relationDefinition of normalizedModel.relations) {
|
|
245
|
+
const seen = new Set();
|
|
246
|
+
const candidates = relationCandidates.filter((candidate) => {
|
|
247
|
+
if (candidate.type !== relationDefinition.id || seen.has(candidate.identity))
|
|
248
|
+
return false;
|
|
249
|
+
seen.add(candidate.identity);
|
|
250
|
+
return true;
|
|
251
|
+
});
|
|
252
|
+
const byFrom = new Map();
|
|
253
|
+
const byTo = new Map();
|
|
254
|
+
for (const candidate of candidates) {
|
|
255
|
+
byFrom.set(candidate.from, (byFrom.get(candidate.from) ?? 0) + 1);
|
|
256
|
+
byTo.set(candidate.to, (byTo.get(candidate.to) ?? 0) + 1);
|
|
257
|
+
}
|
|
258
|
+
for (const candidate of candidates) {
|
|
259
|
+
if (cardinalityViolation(relationDefinition.cardinality, byFrom.get(candidate.from) ?? 0, byTo.get(candidate.to) ?? 0)) {
|
|
260
|
+
findings.push(finding("relation-cardinality", `Relation "${relationDefinition.id}" violates its ${relationDefinition.cardinality} cardinality.`, `relations[${candidate.index}]`));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return findings;
|
|
265
|
+
}
|
|
266
|
+
function normalizeValue(value) {
|
|
267
|
+
if (Array.isArray(value))
|
|
268
|
+
return value.map(normalizeValue);
|
|
269
|
+
if (!isRecord(value))
|
|
270
|
+
return value;
|
|
271
|
+
return Object.fromEntries(Object.keys(value).sort().map((key) => [key, normalizeValue(value[key])]));
|
|
272
|
+
}
|
|
273
|
+
function comparable(value) {
|
|
274
|
+
try {
|
|
275
|
+
const serialized = JSON.stringify(normalizeValue(value));
|
|
276
|
+
return serialized ?? String(value);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return String(value);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
function normalizeRecord(record) {
|
|
283
|
+
return { id: record.id, type: record.type, values: normalizeValue(copyValues(record.values)) };
|
|
284
|
+
}
|
|
285
|
+
function normalizeRelation(relation) {
|
|
286
|
+
return { type: relation.type, from: relation.from, to: relation.to, values: normalizeValue(copyValues(relation.values)) };
|
|
287
|
+
}
|
|
288
|
+
/** Returns one canonical ordering and property layout for the same snapshot value. */
|
|
289
|
+
export function normalizeDomainSnapshot(snapshot) {
|
|
290
|
+
const copied = defineDomainSnapshot(snapshot);
|
|
291
|
+
const records = copied.records.map(normalizeRecord).sort((left, right) => left.id.localeCompare(right.id) || left.type.localeCompare(right.type) || comparable(left.values).localeCompare(comparable(right.values)));
|
|
292
|
+
const relations = copied.relations.map(normalizeRelation).sort((left, right) => left.type.localeCompare(right.type) || left.from.localeCompare(right.from) || left.to.localeCompare(right.to) || comparable(left.values).localeCompare(comparable(right.values)));
|
|
293
|
+
return { records, relations };
|
|
294
|
+
}
|
|
295
|
+
/** Serializes a normalized snapshot as stable, language-neutral JSON followed by one newline. */
|
|
296
|
+
export function serializeDomainSnapshot(snapshot) {
|
|
297
|
+
return `${JSON.stringify(normalizeDomainSnapshot(snapshot), null, 2)}\n`;
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/ontology/snapshot.ts"],"names":[],"mappings":"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"}
|