@ifc-lite/ids 1.14.11 → 1.15.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/dist/audit/coherence/index.d.ts +12 -0
- package/dist/audit/coherence/index.d.ts.map +1 -0
- package/dist/audit/coherence/index.js +392 -0
- package/dist/audit/coherence/index.js.map +1 -0
- package/dist/audit/coherence/regex.d.ts +57 -0
- package/dist/audit/coherence/regex.d.ts.map +1 -0
- package/dist/audit/coherence/regex.js +111 -0
- package/dist/audit/coherence/regex.js.map +1 -0
- package/dist/audit/ifc-schema/index.d.ts +4 -0
- package/dist/audit/ifc-schema/index.d.ts.map +1 -0
- package/dist/audit/ifc-schema/index.js +637 -0
- package/dist/audit/ifc-schema/index.js.map +1 -0
- package/dist/audit/index.d.ts +37 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +60 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/parser-shim.d.ts +13 -0
- package/dist/audit/parser-shim.d.ts.map +1 -0
- package/dist/audit/parser-shim.js +66 -0
- package/dist/audit/parser-shim.js.map +1 -0
- package/dist/audit/structural/index.d.ts +22 -0
- package/dist/audit/structural/index.d.ts.map +1 -0
- package/dist/audit/structural/index.js +441 -0
- package/dist/audit/structural/index.js.map +1 -0
- package/dist/audit/types.d.ts +91 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +5 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/xsd/index.d.ts +13 -0
- package/dist/audit/xsd/index.d.ts.map +1 -0
- package/dist/audit/xsd/index.js +203 -0
- package/dist/audit/xsd/index.js.map +1 -0
- package/dist/bridge/classifications.d.ts +15 -0
- package/dist/bridge/classifications.d.ts.map +1 -0
- package/dist/bridge/classifications.js +114 -0
- package/dist/bridge/classifications.js.map +1 -0
- package/dist/bridge/data-accessor.d.ts +16 -0
- package/dist/bridge/data-accessor.d.ts.map +1 -0
- package/dist/bridge/data-accessor.js +205 -0
- package/dist/bridge/data-accessor.js.map +1 -0
- package/dist/bridge/data-types.d.ts +11 -0
- package/dist/bridge/data-types.d.ts.map +1 -0
- package/dist/bridge/data-types.js +47 -0
- package/dist/bridge/data-types.js.map +1 -0
- package/dist/bridge/index.d.ts +17 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +20 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/materials.d.ts +11 -0
- package/dist/bridge/materials.d.ts.map +1 -0
- package/dist/bridge/materials.js +68 -0
- package/dist/bridge/materials.js.map +1 -0
- package/dist/bridge/predefined-types.d.ts +19 -0
- package/dist/bridge/predefined-types.d.ts.map +1 -0
- package/dist/bridge/predefined-types.js +84 -0
- package/dist/bridge/predefined-types.js.map +1 -0
- package/dist/bridge/properties.d.ts +20 -0
- package/dist/bridge/properties.d.ts.map +1 -0
- package/dist/bridge/properties.js +168 -0
- package/dist/bridge/properties.js.map +1 -0
- package/dist/bridge/schema-version.d.ts +10 -0
- package/dist/bridge/schema-version.d.ts.map +1 -0
- package/dist/bridge/schema-version.js +25 -0
- package/dist/bridge/schema-version.js.map +1 -0
- package/dist/bridge/units.d.ts +18 -0
- package/dist/bridge/units.d.ts.map +1 -0
- package/dist/bridge/units.js +55 -0
- package/dist/bridge/units.js.map +1 -0
- package/dist/constraints/comparators.d.ts +32 -0
- package/dist/constraints/comparators.d.ts.map +1 -0
- package/dist/constraints/comparators.js +94 -0
- package/dist/constraints/comparators.js.map +1 -0
- package/dist/constraints/index.d.ts.map +1 -1
- package/dist/constraints/index.js +68 -54
- package/dist/constraints/index.js.map +1 -1
- package/dist/constraints/xsd-cast.d.ts +20 -0
- package/dist/constraints/xsd-cast.d.ts.map +1 -0
- package/dist/constraints/xsd-cast.js +89 -0
- package/dist/constraints/xsd-cast.js.map +1 -0
- package/dist/facets/attribute-facet.d.ts.map +1 -1
- package/dist/facets/attribute-facet.js +51 -4
- package/dist/facets/attribute-facet.js.map +1 -1
- package/dist/facets/entity-facet.d.ts.map +1 -1
- package/dist/facets/entity-facet.js +55 -5
- package/dist/facets/entity-facet.js.map +1 -1
- package/dist/facets/partof-facet.d.ts.map +1 -1
- package/dist/facets/partof-facet.js +33 -3
- package/dist/facets/partof-facet.js.map +1 -1
- package/dist/facets/property-facet.d.ts.map +1 -1
- package/dist/facets/property-facet.js +119 -25
- package/dist/facets/property-facet.js.map +1 -1
- package/dist/facets/test-helpers.d.ts +7 -1
- package/dist/facets/test-helpers.d.ts.map +1 -1
- package/dist/facets/test-helpers.js +4 -0
- package/dist/facets/test-helpers.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/parser/xml-parser.d.ts.map +1 -1
- package/dist/parser/xml-parser.js +166 -64
- package/dist/parser/xml-parser.js.map +1 -1
- package/dist/translation/locales/de.d.ts +1 -0
- package/dist/translation/locales/de.d.ts.map +1 -1
- package/dist/translation/locales/de.js +1 -0
- package/dist/translation/locales/de.js.map +1 -1
- package/dist/translation/locales/en.d.ts +1 -0
- package/dist/translation/locales/en.d.ts.map +1 -1
- package/dist/translation/locales/en.js +1 -0
- package/dist/translation/locales/en.js.map +1 -1
- package/dist/translation/locales/fr.d.ts +1 -0
- package/dist/translation/locales/fr.d.ts.map +1 -1
- package/dist/translation/locales/fr.js +1 -0
- package/dist/translation/locales/fr.js.map +1 -1
- package/dist/types.d.ts +115 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/validation/validator.js +45 -3
- package/dist/validation/validator.js.map +1 -1
- package/package.json +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constraints/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAc/D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constraints/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true iff the IDS literal `value` casts successfully under at
|
|
3
|
+
* least one of `xsdTypes`. Empty / undefined `xsdTypes` returns `true`
|
|
4
|
+
* (no constraint). Unknown XSD types are accepted permissively so a
|
|
5
|
+
* future schema addition doesn't silently break validation.
|
|
6
|
+
*/
|
|
7
|
+
export declare function literalCastsUnderAnyType(value: string, xsdTypes: readonly string[] | undefined): boolean;
|
|
8
|
+
export declare function literalCastsUnder(value: string, xsdType: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Map an IFC measure name (`IFCINTEGER`, `IFCREAL`, `IFCBOOLEAN`,
|
|
11
|
+
* `IFCDATE`, `IFCLENGTHMEASURE`, …) to the XSD primitive types it
|
|
12
|
+
* casts to. Used by the property facet to apply the same strict-cast
|
|
13
|
+
* gate to property literals — properties carry their measure name
|
|
14
|
+
* (not an XSD type) so we map first.
|
|
15
|
+
*
|
|
16
|
+
* Returns an empty array for measures we don't have a mapping for —
|
|
17
|
+
* `literalCastsUnderAnyType` then no-ops.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ifcMeasureToXsdTypes(measure: string | undefined): readonly string[];
|
|
20
|
+
//# sourceMappingURL=xsd-cast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xsd-cast.d.ts","sourceRoot":"","sources":["../../src/constraints/xsd-cast.ts"],"names":[],"mappings":"AAsBA;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACtC,OAAO,CAGT;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAoBzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAuBnF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* XSD strict-cast helpers shared by the attribute and property facets.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors the `int.TryParse` / `double.TryParse` / `DateTime.TryParse`
|
|
8
|
+
* rules upstream `IDS-Audit-tool` applies before doing the value
|
|
9
|
+
* comparison. An IDS literal must cast successfully under at least one
|
|
10
|
+
* of the slot's declared XSD types — `xs:integer` rejects `42.0`,
|
|
11
|
+
* `xs:double` accepts either, etc.
|
|
12
|
+
*/
|
|
13
|
+
const INTEGER_RE = /^[+-]?\d+$/;
|
|
14
|
+
const DOUBLE_RE = /^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/;
|
|
15
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}(Z|[+-]\d{2}:\d{2})?$/;
|
|
16
|
+
const DATETIME_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$/;
|
|
17
|
+
const DURATION_RE = /^-?P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/;
|
|
18
|
+
/**
|
|
19
|
+
* Returns true iff the IDS literal `value` casts successfully under at
|
|
20
|
+
* least one of `xsdTypes`. Empty / undefined `xsdTypes` returns `true`
|
|
21
|
+
* (no constraint). Unknown XSD types are accepted permissively so a
|
|
22
|
+
* future schema addition doesn't silently break validation.
|
|
23
|
+
*/
|
|
24
|
+
export function literalCastsUnderAnyType(value, xsdTypes) {
|
|
25
|
+
if (!xsdTypes || xsdTypes.length === 0)
|
|
26
|
+
return true;
|
|
27
|
+
return xsdTypes.some((t) => literalCastsUnder(value, t));
|
|
28
|
+
}
|
|
29
|
+
export function literalCastsUnder(value, xsdType) {
|
|
30
|
+
switch (xsdType) {
|
|
31
|
+
case 'xs:integer':
|
|
32
|
+
return INTEGER_RE.test(value);
|
|
33
|
+
case 'xs:double':
|
|
34
|
+
return DOUBLE_RE.test(value);
|
|
35
|
+
case 'xs:boolean':
|
|
36
|
+
return value === 'true' || value === 'false';
|
|
37
|
+
case 'xs:date':
|
|
38
|
+
return DATE_RE.test(value);
|
|
39
|
+
case 'xs:dateTime':
|
|
40
|
+
return DATETIME_RE.test(value);
|
|
41
|
+
case 'xs:duration':
|
|
42
|
+
return DURATION_RE.test(value);
|
|
43
|
+
case 'xs:string':
|
|
44
|
+
return true;
|
|
45
|
+
default:
|
|
46
|
+
// Unknown XSD type — be permissive rather than reject.
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Map an IFC measure name (`IFCINTEGER`, `IFCREAL`, `IFCBOOLEAN`,
|
|
52
|
+
* `IFCDATE`, `IFCLENGTHMEASURE`, …) to the XSD primitive types it
|
|
53
|
+
* casts to. Used by the property facet to apply the same strict-cast
|
|
54
|
+
* gate to property literals — properties carry their measure name
|
|
55
|
+
* (not an XSD type) so we map first.
|
|
56
|
+
*
|
|
57
|
+
* Returns an empty array for measures we don't have a mapping for —
|
|
58
|
+
* `literalCastsUnderAnyType` then no-ops.
|
|
59
|
+
*/
|
|
60
|
+
export function ifcMeasureToXsdTypes(measure) {
|
|
61
|
+
if (!measure)
|
|
62
|
+
return [];
|
|
63
|
+
const m = measure.toUpperCase();
|
|
64
|
+
if (m === 'IFCINTEGER' || m === 'IFCCOUNTMEASURE')
|
|
65
|
+
return ['xs:integer'];
|
|
66
|
+
if (m === 'IFCBOOLEAN')
|
|
67
|
+
return ['xs:boolean'];
|
|
68
|
+
if (m === 'IFCLOGICAL')
|
|
69
|
+
return ['xs:boolean', 'xs:string'];
|
|
70
|
+
if (m === 'IFCDATE')
|
|
71
|
+
return ['xs:date'];
|
|
72
|
+
if (m === 'IFCDATETIME')
|
|
73
|
+
return ['xs:dateTime'];
|
|
74
|
+
if (m === 'IFCDURATION' || m === 'IFCTIMESTAMP')
|
|
75
|
+
return ['xs:duration'];
|
|
76
|
+
// All numeric measures (REAL, *MEASURE, *RATIO) accept doubles.
|
|
77
|
+
if (m === 'IFCREAL' || m.endsWith('MEASURE') || m.endsWith('RATIO')) {
|
|
78
|
+
return ['xs:double'];
|
|
79
|
+
}
|
|
80
|
+
// Any text-flavoured type defaults to permissive string.
|
|
81
|
+
if (m === 'IFCLABEL' ||
|
|
82
|
+
m === 'IFCTEXT' ||
|
|
83
|
+
m === 'IFCIDENTIFIER' ||
|
|
84
|
+
m === 'IFCSTRING') {
|
|
85
|
+
return ['xs:string'];
|
|
86
|
+
}
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=xsd-cast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xsd-cast.js","sourceRoot":"","sources":["../../src/constraints/xsd-cast.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;GAQG;AAEH,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,SAAS,GAAG,yCAAyC,CAAC;AAC5D,MAAM,OAAO,GAAG,yCAAyC,CAAC;AAC1D,MAAM,WAAW,GACf,mEAAmE,CAAC;AACtE,MAAM,WAAW,GACf,6EAA6E,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAa,EACb,QAAuC;IAEvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,OAAe;IAC9D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,WAAW;YACd,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,YAAY;YACf,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;QAC/C,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;QACd;YACE,uDAAuD;YACvD,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC9D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,iBAAiB;QAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,CAAC,KAAK,YAAY;QAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,YAAY;QAAE,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,aAAa;QAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,cAAc;QAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxE,gEAAgE;IAChE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IACD,yDAAyD;IACzD,IACE,CAAC,KAAK,UAAU;QAChB,CAAC,KAAK,SAAS;QACf,CAAC,KAAK,eAAe;QACrB,CAAC,KAAK,WAAW,EACjB,CAAC;QACD,OAAO,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -1 +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;
|
|
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;AAiBnD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAsDlB"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { matchConstraint, formatConstraint } from '../constraints/index.js';
|
|
5
|
+
import { literalCastsUnderAnyType } from '../constraints/xsd-cast.js';
|
|
5
6
|
/** Attribute name matching is case-insensitive (IFC schema-defined names) */
|
|
6
7
|
const ATTR_NAME_OPTS = { caseInsensitive: true };
|
|
7
8
|
/** Standard IFC attributes that can be checked */
|
|
@@ -24,8 +25,13 @@ export function checkAttributeFacet(facet, expressId, accessor) {
|
|
|
24
25
|
attrNamesToCheck = [attrNameConstraint.value];
|
|
25
26
|
}
|
|
26
27
|
else {
|
|
27
|
-
// For patterns/enumerations,
|
|
28
|
-
|
|
28
|
+
// For patterns/enumerations, prefer the entity's own schema-defined
|
|
29
|
+
// attribute list (so e.g. `IfcMaterialLayerSet.LayerSetName` shows
|
|
30
|
+
// up for a `.*Name.*` pattern). Fall back to the small standard
|
|
31
|
+
// list when the accessor doesn't surface one.
|
|
32
|
+
const allNames = accessor.getAttributeNames?.(expressId);
|
|
33
|
+
const candidates = allNames && allNames.length > 0 ? allNames : STANDARD_ATTRIBUTES;
|
|
34
|
+
attrNamesToCheck = candidates.filter((a) => matchConstraint(attrNameConstraint, a, ATTR_NAME_OPTS));
|
|
29
35
|
if (attrNamesToCheck.length === 0) {
|
|
30
36
|
return {
|
|
31
37
|
passed: false,
|
|
@@ -61,8 +67,11 @@ export function checkAttributeFacet(facet, expressId, accessor) {
|
|
|
61
67
|
*/
|
|
62
68
|
function checkSingleAttribute(facet, attrName, expressId, accessor) {
|
|
63
69
|
const attrValue = getAttributeValue(attrName, expressId, accessor);
|
|
64
|
-
//
|
|
65
|
-
|
|
70
|
+
// Distinguish "slot truly absent" (undefined/null — IFC `$`) from
|
|
71
|
+
// "slot explicitly empty" (`''`). Per IDS spec the latter is a
|
|
72
|
+
// value mismatch, not a missing attribute, so optional facets won't
|
|
73
|
+
// give it a free pass.
|
|
74
|
+
if (attrValue === undefined || attrValue === null) {
|
|
66
75
|
return {
|
|
67
76
|
passed: false,
|
|
68
77
|
actualValue: undefined,
|
|
@@ -76,6 +85,21 @@ function checkSingleAttribute(facet, attrName, expressId, accessor) {
|
|
|
76
85
|
},
|
|
77
86
|
};
|
|
78
87
|
}
|
|
88
|
+
if (attrValue === '') {
|
|
89
|
+
return {
|
|
90
|
+
passed: false,
|
|
91
|
+
actualValue: '(empty)',
|
|
92
|
+
expectedValue: facet.value
|
|
93
|
+
? formatConstraint(facet.value)
|
|
94
|
+
: `attribute "${attrName}" must have a non-empty value`,
|
|
95
|
+
failure: {
|
|
96
|
+
type: 'ATTRIBUTE_VALUE_MISMATCH',
|
|
97
|
+
field: attrName,
|
|
98
|
+
actual: '(empty)',
|
|
99
|
+
expected: facet.value ? formatConstraint(facet.value) : 'a non-empty value',
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
79
103
|
// If no value constraint, just check existence
|
|
80
104
|
if (!facet.value) {
|
|
81
105
|
return {
|
|
@@ -84,6 +108,29 @@ function checkSingleAttribute(facet, attrName, expressId, accessor) {
|
|
|
84
108
|
expectedValue: `attribute "${attrName}" to exist`,
|
|
85
109
|
};
|
|
86
110
|
}
|
|
111
|
+
// Strict XSD-cast check: the IDS literal MUST cast successfully under
|
|
112
|
+
// at least one of the attribute's schema-declared XSD types. This
|
|
113
|
+
// rejects `42.0` against an `xs:integer`-only slot like
|
|
114
|
+
// `IfcStairFlight.NumberOfRisers`, even though the numbers compare
|
|
115
|
+
// equal. The accessor returns `undefined` when type info is missing,
|
|
116
|
+
// in which case we skip the gate and fall back to permissive
|
|
117
|
+
// comparison (back-compat for accessors that don't surface schema).
|
|
118
|
+
if (facet.value.type === 'simpleValue') {
|
|
119
|
+
const xsdTypes = accessor.getAttributeXsdTypes?.(expressId, attrName);
|
|
120
|
+
if (xsdTypes && !literalCastsUnderAnyType(facet.value.value, xsdTypes)) {
|
|
121
|
+
return {
|
|
122
|
+
passed: false,
|
|
123
|
+
actualValue: String(attrValue),
|
|
124
|
+
expectedValue: formatConstraint(facet.value),
|
|
125
|
+
failure: {
|
|
126
|
+
type: 'ATTRIBUTE_VALUE_MISMATCH',
|
|
127
|
+
field: attrName,
|
|
128
|
+
actual: String(attrValue),
|
|
129
|
+
expected: formatConstraint(facet.value),
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
87
134
|
// Check value constraint
|
|
88
135
|
if (!matchConstraint(facet.value, attrValue)) {
|
|
89
136
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribute-facet.js","sourceRoot":"","sources":["../../src/facets/attribute-facet.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAqB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"attribute-facet.js","sourceRoot":"","sources":["../../src/facets/attribute-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;AAMnD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,
|
|
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;AAMnD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CA+HlB;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"}
|
|
@@ -22,6 +22,24 @@ export function checkEntityFacet(facet, expressId, accessor) {
|
|
|
22
22
|
},
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
// Per IDS 1.0 spec, entity-name simpleValue literals MUST be
|
|
26
|
+
// uppercase (`IFCWALL`, not `IfcWall`). Reject malformed authoring
|
|
27
|
+
// outright before attempting the case-insensitive comparison —
|
|
28
|
+
// otherwise mixed-case literals would silently match.
|
|
29
|
+
if (facet.name.type === 'simpleValue' &&
|
|
30
|
+
facet.name.value !== facet.name.value.toUpperCase()) {
|
|
31
|
+
return {
|
|
32
|
+
passed: false,
|
|
33
|
+
actualValue: entityType,
|
|
34
|
+
expectedValue: formatConstraint(facet.name),
|
|
35
|
+
failure: {
|
|
36
|
+
type: 'ENTITY_TYPE_MISMATCH',
|
|
37
|
+
field: 'entityType',
|
|
38
|
+
actual: entityType,
|
|
39
|
+
expected: formatConstraint(facet.name),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
25
43
|
// Check entity type (case-insensitive per IDS spec — IFC entity names are case-agnostic)
|
|
26
44
|
if (!matchConstraint(facet.name, entityType, IFC_CASE_INSENSITIVE)) {
|
|
27
45
|
return {
|
|
@@ -38,8 +56,18 @@ export function checkEntityFacet(facet, expressId, accessor) {
|
|
|
38
56
|
}
|
|
39
57
|
// Check predefined type if specified
|
|
40
58
|
if (facet.predefinedType) {
|
|
41
|
-
|
|
42
|
-
|
|
59
|
+
// Per IDS spec, predefined-type matching has two distinct paths:
|
|
60
|
+
// 1. Compare against the raw IFC `PredefinedType` enum token
|
|
61
|
+
// (BEAM, USERDEFINED, NOTDEFINED, …) — case-insensitive.
|
|
62
|
+
// 2. When the raw token is `USERDEFINED`, fall back to the
|
|
63
|
+
// user-defined name (`ObjectType`/`ElementType`/`ProcessType`)
|
|
64
|
+
// — case-sensitive.
|
|
65
|
+
// The order matters: a fixture asking for `USERDEFINED` literally
|
|
66
|
+
// must match an entity whose enum is `USERDEFINED` regardless of
|
|
67
|
+
// its accompanying user-defined name.
|
|
68
|
+
const rawType = accessor.getPredefinedTypeRaw?.(expressId);
|
|
69
|
+
const userDefinedType = accessor.getObjectType(expressId);
|
|
70
|
+
if (!rawType && !userDefinedType) {
|
|
43
71
|
return {
|
|
44
72
|
passed: false,
|
|
45
73
|
actualValue: entityType,
|
|
@@ -51,15 +79,37 @@ export function checkEntityFacet(facet, expressId, accessor) {
|
|
|
51
79
|
},
|
|
52
80
|
};
|
|
53
81
|
}
|
|
54
|
-
|
|
82
|
+
let matched = false;
|
|
83
|
+
// Predefined-type enum tokens (BEAM, USERDEFINED, …) MUST be
|
|
84
|
+
// uppercase per the IFC schema, and the IDS literal MUST match
|
|
85
|
+
// exactly. Case-sensitive comparison is the spec.
|
|
86
|
+
if (rawType && matchConstraint(facet.predefinedType, rawType)) {
|
|
87
|
+
matched = true;
|
|
88
|
+
}
|
|
89
|
+
else if (rawType === 'USERDEFINED' &&
|
|
90
|
+
userDefinedType &&
|
|
91
|
+
userDefinedType !== rawType &&
|
|
92
|
+
matchConstraint(facet.predefinedType, userDefinedType)) {
|
|
93
|
+
// Case-sensitive comparison for user-defined names.
|
|
94
|
+
matched = true;
|
|
95
|
+
}
|
|
96
|
+
else if (!rawType &&
|
|
97
|
+
userDefinedType &&
|
|
98
|
+
matchConstraint(facet.predefinedType, userDefinedType)) {
|
|
99
|
+
// No raw enum reported (legacy accessor) — case-sensitive match
|
|
100
|
+
// against the substituted form.
|
|
101
|
+
matched = true;
|
|
102
|
+
}
|
|
103
|
+
if (!matched) {
|
|
104
|
+
const display = userDefinedType || rawType || '(none)';
|
|
55
105
|
return {
|
|
56
106
|
passed: false,
|
|
57
|
-
actualValue: `${entityType}[${
|
|
107
|
+
actualValue: `${entityType}[${display}]`,
|
|
58
108
|
expectedValue: `${formatConstraint(facet.name)} with predefinedType ${formatConstraint(facet.predefinedType)}`,
|
|
59
109
|
failure: {
|
|
60
110
|
type: 'PREDEFINED_TYPE_MISMATCH',
|
|
61
111
|
field: 'predefinedType',
|
|
62
|
-
actual:
|
|
112
|
+
actual: display,
|
|
63
113
|
expected: formatConstraint(facet.predefinedType),
|
|
64
114
|
},
|
|
65
115
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-facet.js","sourceRoot":"","sources":["../../src/facets/entity-facet.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,+EAA+E;AAC/E,MAAM,oBAAoB,GAAG,EAAE,eAAe,EAAE,IAAI,EAAW,CAAC;AAEhE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAqB,EACrB,SAAiB,EACjB,QAAyB;IAEzB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,SAAS;YACtB,aAAa,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3C,OAAO,EAAE;gBACP,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;aACvC;SACF,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACnE,OAAO;YACL,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3C,OAAO,EAAE;gBACP,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;aACvC;SACF,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,
|
|
1
|
+
{"version":3,"file":"entity-facet.js","sourceRoot":"","sources":["../../src/facets/entity-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,EAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgBnD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAoDlB"}
|
|
@@ -7,6 +7,7 @@ const IFC_CASE_INSENSITIVE = { caseInsensitive: true };
|
|
|
7
7
|
/** Human-readable relation names */
|
|
8
8
|
const RELATION_NAMES = {
|
|
9
9
|
IfcRelAggregates: 'aggregated in',
|
|
10
|
+
IfcRelAssignsToGroup: 'grouped in',
|
|
10
11
|
IfcRelContainedInSpatialStructure: 'contained in',
|
|
11
12
|
IfcRelNests: 'nested in',
|
|
12
13
|
IfcRelVoidsElement: 'voiding',
|
|
@@ -16,9 +17,20 @@ const RELATION_NAMES = {
|
|
|
16
17
|
* Check if an entity matches a partOf facet
|
|
17
18
|
*/
|
|
18
19
|
export function checkPartOfFacet(facet, expressId, accessor) {
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
if
|
|
20
|
+
// Per IDS spec, partOf is transitive — a wall contained in a storey
|
|
21
|
+
// in a building IS partOf the building. Walk every ancestor and
|
|
22
|
+
// pass if ANY matches the requirement entity. Fall back to single-
|
|
23
|
+
// step `getParent` when the accessor doesn't expose ancestor
|
|
24
|
+
// traversal.
|
|
25
|
+
const ancestors = accessor.getAncestors
|
|
26
|
+
? accessor.getAncestors(expressId, facet.relation)
|
|
27
|
+
: [];
|
|
28
|
+
if (ancestors.length === 0) {
|
|
29
|
+
const direct = accessor.getParent(expressId, facet.relation);
|
|
30
|
+
if (direct)
|
|
31
|
+
ancestors.push(direct);
|
|
32
|
+
}
|
|
33
|
+
if (ancestors.length === 0) {
|
|
22
34
|
const relationName = RELATION_NAMES[facet.relation] || facet.relation;
|
|
23
35
|
const expectedEntity = facet.entity
|
|
24
36
|
? formatConstraint(facet.entity.name)
|
|
@@ -37,6 +49,24 @@ export function checkPartOfFacet(facet, expressId, accessor) {
|
|
|
37
49
|
},
|
|
38
50
|
};
|
|
39
51
|
}
|
|
52
|
+
// Try each ancestor against the requirement; pass on the first
|
|
53
|
+
// match. Track the most-specific failure so a partial match (right
|
|
54
|
+
// entity, wrong predefinedType, say) is reported instead of the
|
|
55
|
+
// generic "no match" form.
|
|
56
|
+
let bestFailure;
|
|
57
|
+
for (const parent of ancestors) {
|
|
58
|
+
const result = checkAncestorAgainstFacet(facet, parent);
|
|
59
|
+
if (result.passed)
|
|
60
|
+
return result;
|
|
61
|
+
if (!bestFailure ||
|
|
62
|
+
(result.failure?.type !== 'PARTOF_ENTITY_MISMATCH' &&
|
|
63
|
+
bestFailure.failure?.type === 'PARTOF_ENTITY_MISMATCH')) {
|
|
64
|
+
bestFailure = result;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return bestFailure;
|
|
68
|
+
}
|
|
69
|
+
function checkAncestorAgainstFacet(facet, parent) {
|
|
40
70
|
// If no entity constraint, just check if relationship exists
|
|
41
71
|
if (!facet.entity) {
|
|
42
72
|
const relationName = RELATION_NAMES[facet.relation] || facet.relation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partof-facet.js","sourceRoot":"","sources":["../../src/facets/partof-facet.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"partof-facet.js","sourceRoot":"","sources":["../../src/facets/partof-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-facet.d.ts","sourceRoot":"","sources":["../../src/facets/property-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"property-facet.d.ts","sourceRoot":"","sources":["../../src/facets/property-facet.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,GACxB,gBAAgB,CAmGlB"}
|