@ifc-lite/ids 1.0.0
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/LICENSE +373 -0
- package/README.md +76 -0
- package/dist/constraints/index.d.ts +17 -0
- package/dist/constraints/index.d.ts.map +1 -0
- package/dist/constraints/index.js +226 -0
- package/dist/constraints/index.js.map +1 -0
- package/dist/facets/attribute-facet.d.ts +10 -0
- package/dist/facets/attribute-facet.d.ts.map +1 -0
- package/dist/facets/attribute-facet.js +107 -0
- package/dist/facets/attribute-facet.js.map +1 -0
- package/dist/facets/classification-facet.d.ts +10 -0
- package/dist/facets/classification-facet.d.ts.map +1 -0
- package/dist/facets/classification-facet.js +98 -0
- package/dist/facets/classification-facet.js.map +1 -0
- package/dist/facets/entity-facet.d.ts +18 -0
- package/dist/facets/entity-facet.d.ts.map +1 -0
- package/dist/facets/entity-facet.js +116 -0
- package/dist/facets/entity-facet.js.map +1 -0
- package/dist/facets/index.d.ts +31 -0
- package/dist/facets/index.d.ts.map +1 -0
- package/dist/facets/index.js +57 -0
- package/dist/facets/index.js.map +1 -0
- package/dist/facets/material-facet.d.ts +10 -0
- package/dist/facets/material-facet.d.ts.map +1 -0
- package/dist/facets/material-facet.js +67 -0
- package/dist/facets/material-facet.js.map +1 -0
- package/dist/facets/partof-facet.d.ts +10 -0
- package/dist/facets/partof-facet.d.ts.map +1 -0
- package/dist/facets/partof-facet.js +112 -0
- package/dist/facets/partof-facet.js.map +1 -0
- package/dist/facets/property-facet.d.ts +10 -0
- package/dist/facets/property-facet.d.ts.map +1 -0
- package/dist/facets/property-facet.js +156 -0
- package/dist/facets/property-facet.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/xml-parser.d.ts +15 -0
- package/dist/parser/xml-parser.d.ts.map +1 -0
- package/dist/parser/xml-parser.js +486 -0
- package/dist/parser/xml-parser.js.map +1 -0
- package/dist/translation/index.d.ts +3 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +6 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/locales/de.d.ts +189 -0
- package/dist/translation/locales/de.d.ts.map +1 -0
- package/dist/translation/locales/de.js +226 -0
- package/dist/translation/locales/de.js.map +1 -0
- package/dist/translation/locales/en.d.ts +190 -0
- package/dist/translation/locales/en.d.ts.map +1 -0
- package/dist/translation/locales/en.js +226 -0
- package/dist/translation/locales/en.js.map +1 -0
- package/dist/translation/locales/fr.d.ts +189 -0
- package/dist/translation/locales/fr.d.ts.map +1 -0
- package/dist/translation/locales/fr.js +226 -0
- package/dist/translation/locales/fr.js.map +1 -0
- package/dist/translation/locales/index.d.ts +4 -0
- package/dist/translation/locales/index.d.ts.map +1 -0
- package/dist/translation/locales/index.js +7 -0
- package/dist/translation/locales/index.js.map +1 -0
- package/dist/translation/service.d.ts +62 -0
- package/dist/translation/service.d.ts.map +1 -0
- package/dist/translation/service.js +569 -0
- package/dist/translation/service.js.map +1 -0
- package/dist/types.d.ts +407 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/validator.d.ts +9 -0
- package/dist/validation/validator.d.ts.map +1 -0
- package/dist/validation/validator.js +431 -0
- package/dist/validation/validator.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constraints/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAc/D,sEAAsE;AACtE,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAyB,EACzB,WAAyD;IAEzD,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,aAAa;YAChB,OAAO,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnD,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/C,KAAK,aAAa;YAChB,OAAO,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC9C;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,UAA0B,EAC1B,WAAsC;IAEtC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAEtC,qBAAqB;IACrB,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAExC,4CAA4C;IAC5C,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IAEpE,oCAAoC;IACpC,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GACb,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAExE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,IAAI,iBAAiB,CAAC;IAChE,CAAC;IAED,qBAAqB;IACrB,IAAI,OAAO,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;YACtD,OAAO,WAAW,KAAK,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,aAAa,KAAK,OAAO,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;YACvD,OAAO,WAAW,KAAK,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC7C,IACE,CAAC,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC;QACnD,CAAC,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,OAAO,CAAC,EACvD,CAAC;QACD,OAAO,WAAW,KAAK,aAAa,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,UAAgC,EAChC,WAAsC;IAEtC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,wCAAwC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,4CAA4C;QAC5C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,UAAkB;IACtC,OAAO,CACL,UAAU;QACR,2CAA2C;SAC1C,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC;QAC9B,wCAAwC;SACvC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC;QACnC,sDAAsD;SACrD,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;QAC9B,+DAA+D;SAC9D,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,UAAoC,EACpC,WAAsC;IAEtC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAE5C,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,wBAAwB;QACxB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACjC,yBAAyB;QACzB,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QACjD,qBAAqB;QACrB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,SAAS,GACb,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,iBAAiB,CAAC;QACzD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,UAA+B,EAC/B,WAAsC;IAEtC,MAAM,GAAG,GACP,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7B,IACE,UAAU,CAAC,YAAY,KAAK,SAAS;QACrC,GAAG,GAAG,UAAU,CAAC,YAAY,GAAG,iBAAiB,EACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IACE,UAAU,CAAC,YAAY,KAAK,SAAS;QACrC,GAAG,GAAG,UAAU,CAAC,YAAY,GAAG,iBAAiB,EACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAAyB,EACzB,WAAyD;IAEzD,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,aAAa;YAChB,OAAO,aAAa,UAAU,CAAC,KAAK,WAAW,WAAW,GAAG,CAAC;QAChE,KAAK,SAAS;YACZ,OAAO,IAAI,WAAW,6BAA6B,UAAU,CAAC,OAAO,GAAG,CAAC;QAC3E,KAAK,aAAa;YAChB,OAAO,IAAI,WAAW,oBAAoB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACjG,KAAK,QAAQ;YACX,OAAO,uBAAuB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC1D;YACE,OAAO,yBAAyB,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,UAA+B,EAC/B,WAAsC;IAEtC,MAAM,GAAG,GACP,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,IAAI,WAAW,yBAAyB,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IACE,UAAU,CAAC,YAAY,KAAK,SAAS;QACrC,GAAG,GAAG,UAAU,CAAC,YAAY,GAAG,iBAAiB,EACjD,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IACE,UAAU,CAAC,YAAY,KAAK,SAAS;QACrC,GAAG,GAAG,UAAU,CAAC,YAAY,GAAG,iBAAiB,EACjD,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5E,UAAU,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5E,UAAU,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAyB;IACxD,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,aAAa;YAChB,OAAO,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,YAAY,UAAU,CAAC,OAAO,GAAG,CAAC;QAC3C,KAAK,aAAa;YAChB,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YACrC,CAAC;YACD,OAAO,WAAW,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACzE,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;QAClC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,UAA+B;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IACE,UAAU,CAAC,YAAY,KAAK,SAAS;QACrC,UAAU,CAAC,YAAY,KAAK,SAAS,EACrC,CAAC;QACD,OAAO,WAAW,UAAU,CAAC,YAAY,QAAQ,UAAU,CAAC,YAAY,EAAE,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attribute facet checker
|
|
3
|
+
*/
|
|
4
|
+
import type { IDSAttributeFacet, IFCDataAccessor } from '../types.js';
|
|
5
|
+
import type { FacetCheckResult } from './index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if an entity matches an attribute facet
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkAttributeFacet(facet: IDSAttributeFacet, expressId: number, accessor: IFCDataAccessor): FacetCheckResult;
|
|
10
|
+
//# sourceMappingURL=attribute-facet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-facet.d.ts","sourceRoot":"","sources":["../../src/facets/attribute-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAanD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CA8ElB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { matchConstraint, formatConstraint } from '../constraints/index.js';
|
|
5
|
+
/** Standard IFC attributes that can be checked */
|
|
6
|
+
const STANDARD_ATTRIBUTES = [
|
|
7
|
+
'Name',
|
|
8
|
+
'Description',
|
|
9
|
+
'ObjectType',
|
|
10
|
+
'Tag',
|
|
11
|
+
'GlobalId',
|
|
12
|
+
'LongName',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Check if an entity matches an attribute facet
|
|
16
|
+
*/
|
|
17
|
+
export function checkAttributeFacet(facet, expressId, accessor) {
|
|
18
|
+
// Get the attribute name to check
|
|
19
|
+
const attrNameConstraint = facet.name;
|
|
20
|
+
let attrName;
|
|
21
|
+
// For simple value, use the name directly
|
|
22
|
+
if (attrNameConstraint.type === 'simpleValue') {
|
|
23
|
+
attrName = attrNameConstraint.value;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// For patterns/enumerations, we need to check all matching attributes
|
|
27
|
+
// Simplified: just check the first standard attribute that matches
|
|
28
|
+
const matchingAttrs = STANDARD_ATTRIBUTES.filter((a) => matchConstraint(attrNameConstraint, a));
|
|
29
|
+
if (matchingAttrs.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
passed: false,
|
|
32
|
+
failure: {
|
|
33
|
+
type: 'ATTRIBUTE_MISSING',
|
|
34
|
+
field: formatConstraint(attrNameConstraint),
|
|
35
|
+
expected: formatConstraint(attrNameConstraint),
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
attrName = matchingAttrs[0];
|
|
40
|
+
}
|
|
41
|
+
// Get the attribute value
|
|
42
|
+
const attrValue = getAttributeValue(attrName, expressId, accessor);
|
|
43
|
+
// Check if attribute exists
|
|
44
|
+
if (attrValue === undefined || attrValue === null || attrValue === '') {
|
|
45
|
+
return {
|
|
46
|
+
passed: false,
|
|
47
|
+
actualValue: undefined,
|
|
48
|
+
expectedValue: facet.value
|
|
49
|
+
? formatConstraint(facet.value)
|
|
50
|
+
: `attribute "${attrName}" to exist`,
|
|
51
|
+
failure: {
|
|
52
|
+
type: 'ATTRIBUTE_MISSING',
|
|
53
|
+
field: attrName,
|
|
54
|
+
expected: facet.value ? formatConstraint(facet.value) : 'any value',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// If no value constraint, just check existence
|
|
59
|
+
if (!facet.value) {
|
|
60
|
+
return {
|
|
61
|
+
passed: true,
|
|
62
|
+
actualValue: String(attrValue),
|
|
63
|
+
expectedValue: `attribute "${attrName}" to exist`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Check value constraint
|
|
67
|
+
if (!matchConstraint(facet.value, attrValue)) {
|
|
68
|
+
return {
|
|
69
|
+
passed: false,
|
|
70
|
+
actualValue: String(attrValue),
|
|
71
|
+
expectedValue: formatConstraint(facet.value),
|
|
72
|
+
failure: {
|
|
73
|
+
type: facet.value.type === 'pattern'
|
|
74
|
+
? 'ATTRIBUTE_PATTERN_MISMATCH'
|
|
75
|
+
: 'ATTRIBUTE_VALUE_MISMATCH',
|
|
76
|
+
field: attrName,
|
|
77
|
+
actual: String(attrValue),
|
|
78
|
+
expected: formatConstraint(facet.value),
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
passed: true,
|
|
84
|
+
actualValue: String(attrValue),
|
|
85
|
+
expectedValue: formatConstraint(facet.value),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get an attribute value from an entity
|
|
90
|
+
*/
|
|
91
|
+
function getAttributeValue(attrName, expressId, accessor) {
|
|
92
|
+
const normalizedName = attrName.toLowerCase();
|
|
93
|
+
switch (normalizedName) {
|
|
94
|
+
case 'name':
|
|
95
|
+
return accessor.getEntityName(expressId);
|
|
96
|
+
case 'description':
|
|
97
|
+
return accessor.getDescription(expressId);
|
|
98
|
+
case 'objecttype':
|
|
99
|
+
return accessor.getObjectType(expressId);
|
|
100
|
+
case 'globalid':
|
|
101
|
+
return accessor.getGlobalId(expressId);
|
|
102
|
+
default:
|
|
103
|
+
// Try generic attribute access
|
|
104
|
+
return accessor.getAttribute(expressId, attrName);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=attribute-facet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-facet.js","sourceRoot":"","sources":["../../src/facets/attribute-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification facet checker
|
|
3
|
+
*/
|
|
4
|
+
import type { IDSClassificationFacet, IFCDataAccessor } from '../types.js';
|
|
5
|
+
import type { FacetCheckResult } from './index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if an entity matches a classification facet
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkClassificationFacet(facet: IDSClassificationFacet, expressId: number, accessor: IFCDataAccessor): FacetCheckResult;
|
|
10
|
+
//# sourceMappingURL=classification-facet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classification-facet.d.ts","sourceRoot":"","sources":["../../src/facets/classification-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,sBAAsB,EAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAuGlB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { matchConstraint, formatConstraint } from '../constraints/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if an entity matches a classification facet
|
|
7
|
+
*/
|
|
8
|
+
export function checkClassificationFacet(facet, expressId, accessor) {
|
|
9
|
+
// Get classifications for the entity
|
|
10
|
+
const classifications = accessor.getClassifications(expressId);
|
|
11
|
+
// If no value or system constraint, just check if any classification exists
|
|
12
|
+
if (!facet.system && !facet.value) {
|
|
13
|
+
if (classifications.length === 0) {
|
|
14
|
+
return {
|
|
15
|
+
passed: false,
|
|
16
|
+
actualValue: '(none)',
|
|
17
|
+
expectedValue: 'any classification',
|
|
18
|
+
failure: {
|
|
19
|
+
type: 'CLASSIFICATION_MISSING',
|
|
20
|
+
expected: 'any classification',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
passed: true,
|
|
26
|
+
actualValue: classifications
|
|
27
|
+
.map((c) => `${c.system}:${c.value}`)
|
|
28
|
+
.join(', '),
|
|
29
|
+
expectedValue: 'any classification',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Filter by system if specified
|
|
33
|
+
let matchingClassifications = classifications;
|
|
34
|
+
if (facet.system) {
|
|
35
|
+
matchingClassifications = classifications.filter((c) => matchConstraint(facet.system, c.system));
|
|
36
|
+
if (matchingClassifications.length === 0) {
|
|
37
|
+
const availableSystems = [
|
|
38
|
+
...new Set(classifications.map((c) => c.system)),
|
|
39
|
+
].join(', ');
|
|
40
|
+
return {
|
|
41
|
+
passed: false,
|
|
42
|
+
actualValue: availableSystems || '(none)',
|
|
43
|
+
expectedValue: formatConstraint(facet.system),
|
|
44
|
+
failure: {
|
|
45
|
+
type: 'CLASSIFICATION_SYSTEM_MISMATCH',
|
|
46
|
+
field: 'system',
|
|
47
|
+
actual: availableSystems,
|
|
48
|
+
expected: formatConstraint(facet.system),
|
|
49
|
+
context: {
|
|
50
|
+
availableSystems,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Check value if specified
|
|
57
|
+
if (facet.value) {
|
|
58
|
+
const matchingValues = matchingClassifications.filter((c) => matchConstraint(facet.value, c.value));
|
|
59
|
+
if (matchingValues.length === 0) {
|
|
60
|
+
const availableValues = matchingClassifications
|
|
61
|
+
.map((c) => c.value)
|
|
62
|
+
.join(', ');
|
|
63
|
+
return {
|
|
64
|
+
passed: false,
|
|
65
|
+
actualValue: availableValues || '(none)',
|
|
66
|
+
expectedValue: formatConstraint(facet.value),
|
|
67
|
+
failure: {
|
|
68
|
+
type: 'CLASSIFICATION_VALUE_MISMATCH',
|
|
69
|
+
field: 'value',
|
|
70
|
+
actual: availableValues,
|
|
71
|
+
expected: formatConstraint(facet.value),
|
|
72
|
+
context: {
|
|
73
|
+
system: facet.system ? formatConstraint(facet.system) : 'any',
|
|
74
|
+
availableValues,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
passed: true,
|
|
81
|
+
actualValue: matchingValues
|
|
82
|
+
.map((c) => `${c.system}:${c.value}`)
|
|
83
|
+
.join(', '),
|
|
84
|
+
expectedValue: facet.system
|
|
85
|
+
? `${formatConstraint(facet.system)}:${formatConstraint(facet.value)}`
|
|
86
|
+
: formatConstraint(facet.value),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// System matched, no value constraint
|
|
90
|
+
return {
|
|
91
|
+
passed: true,
|
|
92
|
+
actualValue: matchingClassifications
|
|
93
|
+
.map((c) => `${c.system}:${c.value}`)
|
|
94
|
+
.join(', '),
|
|
95
|
+
expectedValue: formatConstraint(facet.system),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=classification-facet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classification-facet.js","sourceRoot":"","sources":["../../src/facets/classification-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity facet checker
|
|
3
|
+
*/
|
|
4
|
+
import type { IDSEntityFacet, IDSConstraint, IFCDataAccessor } from '../types.js';
|
|
5
|
+
import type { FacetCheckResult } from './index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if an entity matches an entity facet
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkEntityFacet(facet: IDSEntityFacet, expressId: number, accessor: IFCDataAccessor): FacetCheckResult;
|
|
10
|
+
/**
|
|
11
|
+
* Get candidate entity IDs that might match an entity facet (broadphase filter)
|
|
12
|
+
*/
|
|
13
|
+
export declare function filterByEntityFacet(facet: IDSEntityFacet, accessor: IFCDataAccessor): number[] | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Get all entity types that could match a constraint
|
|
16
|
+
*/
|
|
17
|
+
export declare function getMatchingEntityTypes(constraint: IDSConstraint, allTypes: string[]): string[];
|
|
18
|
+
//# sourceMappingURL=entity-facet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-facet.d.ts","sourceRoot":"","sources":["../../src/facets/entity-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,eAAe,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAuElB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,eAAe,GACxB,MAAM,EAAE,GAAG,SAAS,CAoBtB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,EAAE,CAsBV"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { matchConstraint, formatConstraint } from '../constraints/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if an entity matches an entity facet
|
|
7
|
+
*/
|
|
8
|
+
export function checkEntityFacet(facet, expressId, accessor) {
|
|
9
|
+
const entityType = accessor.getEntityType(expressId);
|
|
10
|
+
if (!entityType) {
|
|
11
|
+
return {
|
|
12
|
+
passed: false,
|
|
13
|
+
actualValue: undefined,
|
|
14
|
+
expectedValue: formatConstraint(facet.name),
|
|
15
|
+
failure: {
|
|
16
|
+
type: 'ENTITY_TYPE_MISMATCH',
|
|
17
|
+
field: 'entityType',
|
|
18
|
+
actual: 'unknown',
|
|
19
|
+
expected: formatConstraint(facet.name),
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Check entity type
|
|
24
|
+
if (!matchConstraint(facet.name, entityType)) {
|
|
25
|
+
return {
|
|
26
|
+
passed: false,
|
|
27
|
+
actualValue: entityType,
|
|
28
|
+
expectedValue: formatConstraint(facet.name),
|
|
29
|
+
failure: {
|
|
30
|
+
type: 'ENTITY_TYPE_MISMATCH',
|
|
31
|
+
field: 'entityType',
|
|
32
|
+
actual: entityType,
|
|
33
|
+
expected: formatConstraint(facet.name),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Check predefined type if specified
|
|
38
|
+
if (facet.predefinedType) {
|
|
39
|
+
const objectType = accessor.getObjectType(expressId);
|
|
40
|
+
if (!objectType) {
|
|
41
|
+
return {
|
|
42
|
+
passed: false,
|
|
43
|
+
actualValue: entityType,
|
|
44
|
+
expectedValue: `${formatConstraint(facet.name)} with predefinedType ${formatConstraint(facet.predefinedType)}`,
|
|
45
|
+
failure: {
|
|
46
|
+
type: 'PREDEFINED_TYPE_MISSING',
|
|
47
|
+
field: 'predefinedType',
|
|
48
|
+
expected: formatConstraint(facet.predefinedType),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (!matchConstraint(facet.predefinedType, objectType)) {
|
|
53
|
+
return {
|
|
54
|
+
passed: false,
|
|
55
|
+
actualValue: `${entityType}[${objectType}]`,
|
|
56
|
+
expectedValue: `${formatConstraint(facet.name)} with predefinedType ${formatConstraint(facet.predefinedType)}`,
|
|
57
|
+
failure: {
|
|
58
|
+
type: 'PREDEFINED_TYPE_MISMATCH',
|
|
59
|
+
field: 'predefinedType',
|
|
60
|
+
actual: objectType,
|
|
61
|
+
expected: formatConstraint(facet.predefinedType),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
passed: true,
|
|
68
|
+
actualValue: facet.predefinedType
|
|
69
|
+
? `${entityType}[${accessor.getObjectType(expressId) || ''}]`
|
|
70
|
+
: entityType,
|
|
71
|
+
expectedValue: formatConstraint(facet.name),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get candidate entity IDs that might match an entity facet (broadphase filter)
|
|
76
|
+
*/
|
|
77
|
+
export function filterByEntityFacet(facet, accessor) {
|
|
78
|
+
const constraint = facet.name;
|
|
79
|
+
// For simple values, we can efficiently filter by type
|
|
80
|
+
if (constraint.type === 'simpleValue') {
|
|
81
|
+
return accessor.getEntitiesByType(constraint.value);
|
|
82
|
+
}
|
|
83
|
+
// For enumerations, collect entities of all specified types
|
|
84
|
+
if (constraint.type === 'enumeration') {
|
|
85
|
+
const ids = [];
|
|
86
|
+
for (const value of constraint.values) {
|
|
87
|
+
ids.push(...accessor.getEntitiesByType(value));
|
|
88
|
+
}
|
|
89
|
+
return ids;
|
|
90
|
+
}
|
|
91
|
+
// For patterns, we need to check all entity types
|
|
92
|
+
// Return undefined to indicate full scan needed
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all entity types that could match a constraint
|
|
97
|
+
*/
|
|
98
|
+
export function getMatchingEntityTypes(constraint, allTypes) {
|
|
99
|
+
switch (constraint.type) {
|
|
100
|
+
case 'simpleValue':
|
|
101
|
+
return allTypes.filter((t) => t.toUpperCase() === constraint.value.toUpperCase());
|
|
102
|
+
case 'enumeration':
|
|
103
|
+
return allTypes.filter((t) => constraint.values.some((v) => v.toUpperCase() === t.toUpperCase()));
|
|
104
|
+
case 'pattern':
|
|
105
|
+
try {
|
|
106
|
+
const regex = new RegExp(`^${constraint.pattern}$`, 'i');
|
|
107
|
+
return allTypes.filter((t) => regex.test(t));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
default:
|
|
113
|
+
return allTypes;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=entity-facet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-facet.js","sourceRoot":"","sources":["../../src/facets/entity-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Facet checkers for IDS validation
|
|
3
|
+
*/
|
|
4
|
+
import type { IDSFacet, IFCDataAccessor, IDSFailureDetail } from '../types.js';
|
|
5
|
+
export { checkEntityFacet, filterByEntityFacet, } from './entity-facet.js';
|
|
6
|
+
export { checkAttributeFacet } from './attribute-facet.js';
|
|
7
|
+
export { checkPropertyFacet } from './property-facet.js';
|
|
8
|
+
export { checkClassificationFacet } from './classification-facet.js';
|
|
9
|
+
export { checkMaterialFacet } from './material-facet.js';
|
|
10
|
+
export { checkPartOfFacet } from './partof-facet.js';
|
|
11
|
+
/** Result of a facet check */
|
|
12
|
+
export interface FacetCheckResult {
|
|
13
|
+
/** Whether the facet check passed */
|
|
14
|
+
passed: boolean;
|
|
15
|
+
/** Actual value found (for diagnostics) */
|
|
16
|
+
actualValue?: string;
|
|
17
|
+
/** Expected value description */
|
|
18
|
+
expectedValue?: string;
|
|
19
|
+
/** Failure details if failed */
|
|
20
|
+
failure?: IDSFailureDetail;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if an entity matches a facet
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkFacet(facet: IDSFacet, expressId: number, accessor: IFCDataAccessor): FacetCheckResult;
|
|
26
|
+
/**
|
|
27
|
+
* Get candidate entity IDs that might match a facet (broadphase filter)
|
|
28
|
+
* Returns undefined if no efficient filtering is possible
|
|
29
|
+
*/
|
|
30
|
+
export declare function filterByFacet(facet: IDSFacet, accessor: IFCDataAccessor): number[] | undefined;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/facets/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,QAAQ,EAOR,eAAe,EACf,gBAAgB,EACjB,MAAM,aAAa,CAAC;AASrB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAwBlB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,eAAe,GACxB,MAAM,EAAE,GAAG,SAAS,CAQtB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { checkEntityFacet, filterByEntityFacet } from './entity-facet.js';
|
|
5
|
+
import { checkAttributeFacet } from './attribute-facet.js';
|
|
6
|
+
import { checkPropertyFacet } from './property-facet.js';
|
|
7
|
+
import { checkClassificationFacet } from './classification-facet.js';
|
|
8
|
+
import { checkMaterialFacet } from './material-facet.js';
|
|
9
|
+
import { checkPartOfFacet } from './partof-facet.js';
|
|
10
|
+
export { checkEntityFacet, filterByEntityFacet, } from './entity-facet.js';
|
|
11
|
+
export { checkAttributeFacet } from './attribute-facet.js';
|
|
12
|
+
export { checkPropertyFacet } from './property-facet.js';
|
|
13
|
+
export { checkClassificationFacet } from './classification-facet.js';
|
|
14
|
+
export { checkMaterialFacet } from './material-facet.js';
|
|
15
|
+
export { checkPartOfFacet } from './partof-facet.js';
|
|
16
|
+
/**
|
|
17
|
+
* Check if an entity matches a facet
|
|
18
|
+
*/
|
|
19
|
+
export function checkFacet(facet, expressId, accessor) {
|
|
20
|
+
switch (facet.type) {
|
|
21
|
+
case 'entity':
|
|
22
|
+
return checkEntityFacet(facet, expressId, accessor);
|
|
23
|
+
case 'attribute':
|
|
24
|
+
return checkAttributeFacet(facet, expressId, accessor);
|
|
25
|
+
case 'property':
|
|
26
|
+
return checkPropertyFacet(facet, expressId, accessor);
|
|
27
|
+
case 'classification':
|
|
28
|
+
return checkClassificationFacet(facet, expressId, accessor);
|
|
29
|
+
case 'material':
|
|
30
|
+
return checkMaterialFacet(facet, expressId, accessor);
|
|
31
|
+
case 'partOf':
|
|
32
|
+
return checkPartOfFacet(facet, expressId, accessor);
|
|
33
|
+
default:
|
|
34
|
+
return {
|
|
35
|
+
passed: false,
|
|
36
|
+
failure: {
|
|
37
|
+
type: 'ENTITY_TYPE_MISMATCH',
|
|
38
|
+
expected: 'known facet type',
|
|
39
|
+
actual: facet.type,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get candidate entity IDs that might match a facet (broadphase filter)
|
|
46
|
+
* Returns undefined if no efficient filtering is possible
|
|
47
|
+
*/
|
|
48
|
+
export function filterByFacet(facet, accessor) {
|
|
49
|
+
switch (facet.type) {
|
|
50
|
+
case 'entity':
|
|
51
|
+
return filterByEntityFacet(facet, accessor);
|
|
52
|
+
// Other facets don't have efficient broadphase filtering
|
|
53
|
+
default:
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/facets/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkB/D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAcrD;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAe,EACf,SAAiB,EACjB,QAAyB;IAEzB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtD,KAAK,WAAW;YACd,OAAO,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzD,KAAK,UAAU;YACb,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACxD,KAAK,gBAAgB;YACnB,OAAO,wBAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9D,KAAK,UAAU;YACb,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACxD,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtD;YACE,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,IAAI,EAAE,sBAAsB;oBAC5B,QAAQ,EAAE,kBAAkB;oBAC5B,MAAM,EAAG,KAAkB,CAAC,IAAI;iBACjC;aACF,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAe,EACf,QAAyB;IAEzB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9C,yDAAyD;QACzD;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Material facet checker
|
|
3
|
+
*/
|
|
4
|
+
import type { IDSMaterialFacet, IFCDataAccessor } from '../types.js';
|
|
5
|
+
import type { FacetCheckResult } from './index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if an entity matches a material facet
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkMaterialFacet(facet: IDSMaterialFacet, expressId: number, accessor: IFCDataAccessor): FacetCheckResult;
|
|
10
|
+
//# sourceMappingURL=material-facet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-facet.d.ts","sourceRoot":"","sources":["../../src/facets/material-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAoElB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { matchConstraint, formatConstraint } from '../constraints/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if an entity matches a material facet
|
|
7
|
+
*/
|
|
8
|
+
export function checkMaterialFacet(facet, expressId, accessor) {
|
|
9
|
+
// Get materials for the entity
|
|
10
|
+
const materials = accessor.getMaterials(expressId);
|
|
11
|
+
// If no value constraint, just check if any material exists
|
|
12
|
+
if (!facet.value) {
|
|
13
|
+
if (materials.length === 0) {
|
|
14
|
+
return {
|
|
15
|
+
passed: false,
|
|
16
|
+
actualValue: '(none)',
|
|
17
|
+
expectedValue: 'any material',
|
|
18
|
+
failure: {
|
|
19
|
+
type: 'MATERIAL_MISSING',
|
|
20
|
+
expected: 'any material',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
passed: true,
|
|
26
|
+
actualValue: materials.map((m) => m.name).join(', '),
|
|
27
|
+
expectedValue: 'any material',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Check if any material matches the value constraint
|
|
31
|
+
const matchingMaterials = materials.filter((m) => matchConstraint(facet.value, m.name) ||
|
|
32
|
+
(m.category && matchConstraint(facet.value, m.category)));
|
|
33
|
+
if (matchingMaterials.length === 0) {
|
|
34
|
+
if (materials.length === 0) {
|
|
35
|
+
return {
|
|
36
|
+
passed: false,
|
|
37
|
+
actualValue: '(none)',
|
|
38
|
+
expectedValue: formatConstraint(facet.value),
|
|
39
|
+
failure: {
|
|
40
|
+
type: 'MATERIAL_MISSING',
|
|
41
|
+
expected: formatConstraint(facet.value),
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const availableMaterials = materials.map((m) => m.name).join(', ');
|
|
46
|
+
return {
|
|
47
|
+
passed: false,
|
|
48
|
+
actualValue: availableMaterials,
|
|
49
|
+
expectedValue: formatConstraint(facet.value),
|
|
50
|
+
failure: {
|
|
51
|
+
type: 'MATERIAL_VALUE_MISMATCH',
|
|
52
|
+
field: 'material',
|
|
53
|
+
actual: availableMaterials,
|
|
54
|
+
expected: formatConstraint(facet.value),
|
|
55
|
+
context: {
|
|
56
|
+
availableMaterials,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
passed: true,
|
|
63
|
+
actualValue: matchingMaterials.map((m) => m.name).join(', '),
|
|
64
|
+
expectedValue: formatConstraint(facet.value),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=material-facet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-facet.js","sourceRoot":"","sources":["../../src/facets/material-facet.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAuB,EACvB,SAAiB,EACjB,QAAyB;IAEzB,+BAA+B;IAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAEnD,4DAA4D;IAC5D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,QAAQ;gBACrB,aAAa,EAAE,cAAc;gBAC7B,OAAO,EAAE;oBACP,IAAI,EAAE,kBAAkB;oBACxB,QAAQ,EAAE,cAAc;iBACzB;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACpD,aAAa,EAAE,cAAc;SAC9B,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,eAAe,CAAC,KAAK,CAAC,KAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC,QAAQ,IAAI,eAAe,CAAC,KAAK,CAAC,KAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC5D,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,QAAQ;gBACrB,aAAa,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC5C,OAAO,EAAE;oBACP,IAAI,EAAE,kBAAkB;oBACxB,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;iBACxC;aACF,CAAC;QACJ,CAAC;QAED,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,kBAAkB;YAC/B,aAAa,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAC5C,OAAO,EAAE;gBACP,IAAI,EAAE,yBAAyB;gBAC/B,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;gBACvC,OAAO,EAAE;oBACP,kBAAkB;iBACnB;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5D,aAAa,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PartOf facet checker
|
|
3
|
+
*/
|
|
4
|
+
import type { IDSPartOfFacet, IFCDataAccessor } from '../types.js';
|
|
5
|
+
import type { FacetCheckResult } from './index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if an entity matches a partOf facet
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkPartOfFacet(facet: IDSPartOfFacet, expressId: number, accessor: IFCDataAccessor): FacetCheckResult;
|
|
10
|
+
//# sourceMappingURL=partof-facet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partof-facet.d.ts","sourceRoot":"","sources":["../../src/facets/partof-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAYnD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAyGlB"}
|