@ifc-lite/ids 1.14.10 → 1.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -44
- 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 +11 -1
- package/dist/constraints/index.d.ts.map +1 -1
- package/dist/constraints/index.js +74 -58
- 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 +80 -12
- package/dist/facets/attribute-facet.js.map +1 -1
- package/dist/facets/classification-facet.d.ts.map +1 -1
- package/dist/facets/classification-facet.js +21 -2
- package/dist/facets/classification-facet.js.map +1 -1
- package/dist/facets/entity-facet.d.ts.map +1 -1
- package/dist/facets/entity-facet.js +59 -7
- 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 +40 -8
- 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 +171 -55
- package/dist/facets/property-facet.js.map +1 -1
- package/dist/facets/test-helpers.d.ts +42 -0
- package/dist/facets/test-helpers.d.ts.map +1 -0
- package/dist/facets/test-helpers.js +106 -0
- package/dist/facets/test-helpers.js.map +1 -0
- 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 +198 -68
- 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 +116 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/validation/validator.js +49 -3
- package/dist/validation/validator.js.map +1 -1
- package/package.json +10 -3
|
@@ -2,6 +2,8 @@
|
|
|
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
|
+
/** IFC entity/predefined type comparisons are case-insensitive per IDS spec */
|
|
6
|
+
const IFC_CASE_INSENSITIVE = { caseInsensitive: true };
|
|
5
7
|
/**
|
|
6
8
|
* Check if an entity matches an entity facet
|
|
7
9
|
*/
|
|
@@ -20,8 +22,26 @@ export function checkEntityFacet(facet, expressId, accessor) {
|
|
|
20
22
|
},
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
|
-
//
|
|
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
|
+
}
|
|
43
|
+
// Check entity type (case-insensitive per IDS spec — IFC entity names are case-agnostic)
|
|
44
|
+
if (!matchConstraint(facet.name, entityType, IFC_CASE_INSENSITIVE)) {
|
|
25
45
|
return {
|
|
26
46
|
passed: false,
|
|
27
47
|
actualValue: entityType,
|
|
@@ -36,8 +56,18 @@ export function checkEntityFacet(facet, expressId, accessor) {
|
|
|
36
56
|
}
|
|
37
57
|
// Check predefined type if specified
|
|
38
58
|
if (facet.predefinedType) {
|
|
39
|
-
|
|
40
|
-
|
|
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) {
|
|
41
71
|
return {
|
|
42
72
|
passed: false,
|
|
43
73
|
actualValue: entityType,
|
|
@@ -49,15 +79,37 @@ export function checkEntityFacet(facet, expressId, accessor) {
|
|
|
49
79
|
},
|
|
50
80
|
};
|
|
51
81
|
}
|
|
52
|
-
|
|
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)';
|
|
53
105
|
return {
|
|
54
106
|
passed: false,
|
|
55
|
-
actualValue: `${entityType}[${
|
|
107
|
+
actualValue: `${entityType}[${display}]`,
|
|
56
108
|
expectedValue: `${formatConstraint(facet.name)} with predefinedType ${formatConstraint(facet.predefinedType)}`,
|
|
57
109
|
failure: {
|
|
58
110
|
type: 'PREDEFINED_TYPE_MISMATCH',
|
|
59
111
|
field: 'predefinedType',
|
|
60
|
-
actual:
|
|
112
|
+
actual: display,
|
|
61
113
|
expected: formatConstraint(facet.predefinedType),
|
|
62
114
|
},
|
|
63
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;;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,
|
|
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"}
|
|
@@ -2,9 +2,12 @@
|
|
|
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
|
+
/** IFC entity/predefined type comparisons are case-insensitive per IDS spec */
|
|
6
|
+
const IFC_CASE_INSENSITIVE = { caseInsensitive: true };
|
|
5
7
|
/** Human-readable relation names */
|
|
6
8
|
const RELATION_NAMES = {
|
|
7
9
|
IfcRelAggregates: 'aggregated in',
|
|
10
|
+
IfcRelAssignsToGroup: 'grouped in',
|
|
8
11
|
IfcRelContainedInSpatialStructure: 'contained in',
|
|
9
12
|
IfcRelNests: 'nested in',
|
|
10
13
|
IfcRelVoidsElement: 'voiding',
|
|
@@ -14,9 +17,20 @@ const RELATION_NAMES = {
|
|
|
14
17
|
* Check if an entity matches a partOf facet
|
|
15
18
|
*/
|
|
16
19
|
export function checkPartOfFacet(facet, expressId, accessor) {
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
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) {
|
|
20
34
|
const relationName = RELATION_NAMES[facet.relation] || facet.relation;
|
|
21
35
|
const expectedEntity = facet.entity
|
|
22
36
|
? formatConstraint(facet.entity.name)
|
|
@@ -35,6 +49,24 @@ export function checkPartOfFacet(facet, expressId, accessor) {
|
|
|
35
49
|
},
|
|
36
50
|
};
|
|
37
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) {
|
|
38
70
|
// If no entity constraint, just check if relationship exists
|
|
39
71
|
if (!facet.entity) {
|
|
40
72
|
const relationName = RELATION_NAMES[facet.relation] || facet.relation;
|
|
@@ -44,8 +76,8 @@ export function checkPartOfFacet(facet, expressId, accessor) {
|
|
|
44
76
|
expectedValue: `${relationName} any entity`,
|
|
45
77
|
};
|
|
46
78
|
}
|
|
47
|
-
// Check parent entity type
|
|
48
|
-
if (!matchConstraint(facet.entity.name, parent.entityType)) {
|
|
79
|
+
// Check parent entity type (case-insensitive for IFC entity names)
|
|
80
|
+
if (!matchConstraint(facet.entity.name, parent.entityType, IFC_CASE_INSENSITIVE)) {
|
|
49
81
|
const relationName = RELATION_NAMES[facet.relation] || facet.relation;
|
|
50
82
|
return {
|
|
51
83
|
passed: false,
|
|
@@ -71,7 +103,7 @@ export function checkPartOfFacet(facet, expressId, accessor) {
|
|
|
71
103
|
actualValue: `${parent.entityType} (no predefinedType)`,
|
|
72
104
|
expectedValue: `${formatConstraint(facet.entity.name)} with predefinedType ${formatConstraint(facet.entity.predefinedType)}`,
|
|
73
105
|
failure: {
|
|
74
|
-
type: '
|
|
106
|
+
type: 'PARTOF_PREDEFINED_TYPE_MISSING',
|
|
75
107
|
field: 'predefinedType',
|
|
76
108
|
expected: formatConstraint(facet.entity.predefinedType),
|
|
77
109
|
context: {
|
|
@@ -81,13 +113,13 @@ export function checkPartOfFacet(facet, expressId, accessor) {
|
|
|
81
113
|
},
|
|
82
114
|
};
|
|
83
115
|
}
|
|
84
|
-
if (!matchConstraint(facet.entity.predefinedType, parent.predefinedType)) {
|
|
116
|
+
if (!matchConstraint(facet.entity.predefinedType, parent.predefinedType, IFC_CASE_INSENSITIVE)) {
|
|
85
117
|
return {
|
|
86
118
|
passed: false,
|
|
87
119
|
actualValue: `${parent.entityType}[${parent.predefinedType}]`,
|
|
88
120
|
expectedValue: `${formatConstraint(facet.entity.name)}[${formatConstraint(facet.entity.predefinedType)}]`,
|
|
89
121
|
failure: {
|
|
90
|
-
type: '
|
|
122
|
+
type: 'PARTOF_PREDEFINED_TYPE_MISMATCH',
|
|
91
123
|
field: 'predefinedType',
|
|
92
124
|
actual: parent.predefinedType,
|
|
93
125
|
expected: formatConstraint(facet.entity.predefinedType),
|
|
@@ -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"}
|
|
@@ -2,6 +2,9 @@
|
|
|
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 { ifcMeasureToXsdTypes, literalCastsUnderAnyType } from '../constraints/xsd-cast.js';
|
|
6
|
+
/** IFC data type names (IFCLABEL, IFCREAL, etc.) are case-insensitive */
|
|
7
|
+
const DATATYPE_OPTS = { caseInsensitive: true };
|
|
5
8
|
/**
|
|
6
9
|
* Check if an entity matches a property facet
|
|
7
10
|
*/
|
|
@@ -36,12 +39,45 @@ export function checkPropertyFacet(facet, expressId, accessor) {
|
|
|
36
39
|
},
|
|
37
40
|
};
|
|
38
41
|
}
|
|
39
|
-
//
|
|
42
|
+
// Per IDS spec, when the property-set baseName matches multiple sets
|
|
43
|
+
// (pattern / enumeration cases), ALL of them must satisfy the
|
|
44
|
+
// requirement. A single-set match collapses to the same iteration
|
|
45
|
+
// with one element, so the semantics are uniform.
|
|
46
|
+
let lastPass;
|
|
47
|
+
let firstFailure;
|
|
40
48
|
for (const pset of matchingPsets) {
|
|
41
49
|
const result = checkPropertyInPset(facet, pset);
|
|
42
50
|
if (result.passed) {
|
|
43
|
-
|
|
51
|
+
lastPass = result;
|
|
52
|
+
continue;
|
|
44
53
|
}
|
|
54
|
+
if (!firstFailure) {
|
|
55
|
+
firstFailure = result;
|
|
56
|
+
}
|
|
57
|
+
else if (firstFailure.failure?.type === 'PROPERTY_MISSING' &&
|
|
58
|
+
result.failure?.type !== 'PROPERTY_MISSING') {
|
|
59
|
+
// Prefer the more specific failure for reporting.
|
|
60
|
+
firstFailure = result;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (firstFailure) {
|
|
64
|
+
if (firstFailure.failure?.type !== 'PROPERTY_MISSING') {
|
|
65
|
+
return firstFailure;
|
|
66
|
+
}
|
|
67
|
+
// Only PROPERTY_MISSING failures with no passing pset → fall
|
|
68
|
+
// through to the generic missing-property error below so the
|
|
69
|
+
// available-property list reflects every pset we checked.
|
|
70
|
+
if (!lastPass) {
|
|
71
|
+
// proceed to PROPERTY_MISSING fallthrough below
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Some psets passed and some are missing the property —
|
|
75
|
+
// iteration must report the missing-pset failure.
|
|
76
|
+
return firstFailure;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (lastPass) {
|
|
80
|
+
return lastPass;
|
|
45
81
|
}
|
|
46
82
|
// Property not found in any matching pset
|
|
47
83
|
const psetNames = matchingPsets.map((p) => p.name).join(', ');
|
|
@@ -64,7 +100,9 @@ export function checkPropertyFacet(facet, expressId, accessor) {
|
|
|
64
100
|
};
|
|
65
101
|
}
|
|
66
102
|
/**
|
|
67
|
-
* Check a property within a specific property set
|
|
103
|
+
* Check a property within a specific property set.
|
|
104
|
+
* Tries ALL matching properties and returns on first pass.
|
|
105
|
+
* If none pass, returns the most specific failure.
|
|
68
106
|
*/
|
|
69
107
|
function checkPropertyInPset(facet, pset) {
|
|
70
108
|
// Find matching properties
|
|
@@ -83,51 +121,113 @@ function checkPropertyInPset(facet, pset) {
|
|
|
83
121
|
},
|
|
84
122
|
};
|
|
85
123
|
}
|
|
86
|
-
//
|
|
124
|
+
// Per IDS spec: when the baseName constraint matches multiple
|
|
125
|
+
// properties (pattern / enumeration cases), ALL of them must satisfy
|
|
126
|
+
// the value constraint — not just one. Iterate every matching
|
|
127
|
+
// property and only report `pass` if every check passes.
|
|
128
|
+
let lastPass;
|
|
129
|
+
let firstFailure;
|
|
87
130
|
for (const prop of matchingProps) {
|
|
88
|
-
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
passed: false,
|
|
93
|
-
actualValue: `${pset.name}.${prop.name} (${prop.dataType})`,
|
|
94
|
-
expectedValue: `dataType ${formatConstraint(facet.dataType)}`,
|
|
95
|
-
failure: {
|
|
96
|
-
type: 'PROPERTY_DATATYPE_MISMATCH',
|
|
97
|
-
field: `${pset.name}.${prop.name}`,
|
|
98
|
-
actual: prop.dataType,
|
|
99
|
-
expected: formatConstraint(facet.dataType),
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
131
|
+
const result = checkSingleProperty(facet, pset, prop);
|
|
132
|
+
if (result.passed) {
|
|
133
|
+
lastPass = result;
|
|
134
|
+
continue;
|
|
103
135
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
136
|
+
if (!firstFailure) {
|
|
137
|
+
firstFailure = result;
|
|
138
|
+
}
|
|
139
|
+
else if (firstFailure.failure?.type === 'PROPERTY_MISSING' &&
|
|
140
|
+
result.failure?.type !== 'PROPERTY_MISSING') {
|
|
141
|
+
// Prefer the more specific failure when reporting back.
|
|
142
|
+
firstFailure = result;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (firstFailure)
|
|
146
|
+
return firstFailure;
|
|
147
|
+
return lastPass;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check a single property against the facet's dataType and value constraints.
|
|
151
|
+
*/
|
|
152
|
+
function checkSingleProperty(facet, pset, prop) {
|
|
153
|
+
// Per IDS spec, a property whose stored value is "no value" (null,
|
|
154
|
+
// undefined, empty string, or IfcLogical UNKNOWN) fails ANY check —
|
|
155
|
+
// including a name-only existence check. Detect those up front so
|
|
156
|
+
// the rest of the function can assume `prop.value` is meaningful.
|
|
157
|
+
if (prop.value === null ||
|
|
158
|
+
prop.value === undefined ||
|
|
159
|
+
prop.value === '') {
|
|
160
|
+
return {
|
|
161
|
+
passed: false,
|
|
162
|
+
actualValue: '(empty)',
|
|
163
|
+
expectedValue: facet.value
|
|
164
|
+
? formatConstraint(facet.value)
|
|
165
|
+
: `property "${pset.name}.${prop.name}" must have a value`,
|
|
166
|
+
failure: {
|
|
167
|
+
type: 'PROPERTY_VALUE_MISMATCH',
|
|
168
|
+
field: `${pset.name}.${prop.name}`,
|
|
169
|
+
actual: '(empty)',
|
|
170
|
+
expected: facet.value ? formatConstraint(facet.value) : 'a non-empty value',
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// Check data type if specified (IFC type names are case-insensitive).
|
|
175
|
+
// Skip the gate when the property carries no `dataType` AT ALL — for
|
|
176
|
+
// multi-typed table values (`IfcPropertyTableValue`) we deliberately
|
|
177
|
+
// omit a single representative type so the value match against the
|
|
178
|
+
// expanded `values[]` array can still satisfy the requirement.
|
|
179
|
+
if (facet.dataType && prop.dataType) {
|
|
180
|
+
if (!matchConstraint(facet.dataType, prop.dataType, DATATYPE_OPTS)) {
|
|
181
|
+
return {
|
|
182
|
+
passed: false,
|
|
183
|
+
actualValue: `${pset.name}.${prop.name} (${prop.dataType})`,
|
|
184
|
+
expectedValue: `dataType ${formatConstraint(facet.dataType)}`,
|
|
185
|
+
failure: {
|
|
186
|
+
type: 'PROPERTY_DATATYPE_MISMATCH',
|
|
187
|
+
field: `${pset.name}.${prop.name}`,
|
|
188
|
+
actual: prop.dataType,
|
|
189
|
+
expected: formatConstraint(facet.dataType),
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Check value if specified
|
|
195
|
+
if (facet.value) {
|
|
196
|
+
const propValue = prop.value;
|
|
197
|
+
if (propValue === null ||
|
|
198
|
+
propValue === undefined ||
|
|
199
|
+
// Per IDS spec: empty strings and IfcLogical UNKNOWN values are
|
|
200
|
+
// treated as "no value" — they fail any value check, including
|
|
201
|
+
// a name-only check that the property exists with a value.
|
|
202
|
+
propValue === '') {
|
|
203
|
+
return {
|
|
204
|
+
passed: false,
|
|
205
|
+
actualValue: '(empty)',
|
|
206
|
+
expectedValue: formatConstraint(facet.value),
|
|
207
|
+
failure: {
|
|
208
|
+
type: 'PROPERTY_VALUE_MISMATCH',
|
|
209
|
+
field: `${pset.name}.${prop.name}`,
|
|
210
|
+
actual: '(empty)',
|
|
211
|
+
expected: formatConstraint(facet.value),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Strict XSD-cast gate: the IDS literal MUST cast successfully
|
|
216
|
+
// under at least one of the IFC measure's XSD types. Mirrors the
|
|
217
|
+
// attribute facet's check — an `IFCINTEGER` slot rejects `42.0`,
|
|
218
|
+
// an `IFCBOOLEAN` slot rejects numeric literals, etc. The shared
|
|
219
|
+
// `ifcMeasureToXsdTypes` mapping turns the parser-side measure
|
|
220
|
+
// name into the XSD types the cast helper understands.
|
|
221
|
+
if (facet.value.type === 'simpleValue') {
|
|
222
|
+
const xsdTypes = ifcMeasureToXsdTypes(prop.dataType);
|
|
223
|
+
if (xsdTypes.length > 0 &&
|
|
224
|
+
!literalCastsUnderAnyType(facet.value.value, xsdTypes)) {
|
|
125
225
|
return {
|
|
126
226
|
passed: false,
|
|
127
227
|
actualValue: String(propValue),
|
|
128
228
|
expectedValue: formatConstraint(facet.value),
|
|
129
229
|
failure: {
|
|
130
|
-
type:
|
|
230
|
+
type: 'PROPERTY_VALUE_MISMATCH',
|
|
131
231
|
field: `${pset.name}.${prop.name}`,
|
|
132
232
|
actual: String(propValue),
|
|
133
233
|
expected: formatConstraint(facet.value),
|
|
@@ -135,22 +235,38 @@ function checkPropertyInPset(facet, pset) {
|
|
|
135
235
|
};
|
|
136
236
|
}
|
|
137
237
|
}
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
238
|
+
// Multi-valued IFC properties (IfcPropertyEnumeratedValue,
|
|
239
|
+
// IfcPropertyListValue) pass if ANY individual value satisfies the
|
|
240
|
+
// constraint, per upstream ifctester semantics.
|
|
241
|
+
const candidateValues = prop.values && prop.values.length > 0 ? prop.values : [propValue];
|
|
242
|
+
const anyMatch = candidateValues.some((v) => matchConstraint(facet.value, v));
|
|
243
|
+
if (!anyMatch) {
|
|
244
|
+
const failureType = facet.value.type === 'bounds'
|
|
245
|
+
? 'PROPERTY_OUT_OF_BOUNDS'
|
|
246
|
+
: 'PROPERTY_VALUE_MISMATCH';
|
|
247
|
+
const actualDisplay = prop.values && prop.values.length > 0
|
|
248
|
+
? prop.values.join(', ')
|
|
249
|
+
: String(propValue);
|
|
250
|
+
return {
|
|
251
|
+
passed: false,
|
|
252
|
+
actualValue: actualDisplay,
|
|
253
|
+
expectedValue: formatConstraint(facet.value),
|
|
254
|
+
failure: {
|
|
255
|
+
type: failureType,
|
|
256
|
+
field: `${pset.name}.${prop.name}`,
|
|
257
|
+
actual: actualDisplay,
|
|
258
|
+
expected: formatConstraint(facet.value),
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
146
262
|
}
|
|
147
|
-
//
|
|
263
|
+
// Property passed all checks
|
|
148
264
|
return {
|
|
149
|
-
passed:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
265
|
+
passed: true,
|
|
266
|
+
actualValue: `${pset.name}.${prop.name} = ${prop.value}`,
|
|
267
|
+
expectedValue: facet.value
|
|
268
|
+
? formatConstraint(facet.value)
|
|
269
|
+
: 'property exists',
|
|
154
270
|
};
|
|
155
271
|
}
|
|
156
272
|
//# sourceMappingURL=property-facet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-facet.js","sourceRoot":"","sources":["../../src/facets/property-facet.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"property-facet.js","sourceRoot":"","sources":["../../src/facets/property-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test helpers for facet tests
|
|
3
|
+
*/
|
|
4
|
+
import type { IFCDataAccessor } from '../types.js';
|
|
5
|
+
interface MockEntity {
|
|
6
|
+
expressId: number;
|
|
7
|
+
type: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
globalId?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
objectType?: string;
|
|
12
|
+
properties?: Array<{
|
|
13
|
+
psetName: string;
|
|
14
|
+
propName: string;
|
|
15
|
+
value: string | number | boolean | null;
|
|
16
|
+
dataType?: string;
|
|
17
|
+
}>;
|
|
18
|
+
classifications?: Array<{
|
|
19
|
+
system?: string;
|
|
20
|
+
value?: string;
|
|
21
|
+
}>;
|
|
22
|
+
materials?: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
category?: string;
|
|
25
|
+
}>;
|
|
26
|
+
parent?: {
|
|
27
|
+
expressId?: number;
|
|
28
|
+
type: string;
|
|
29
|
+
relation: string;
|
|
30
|
+
predefinedType?: string;
|
|
31
|
+
};
|
|
32
|
+
attributes?: Record<string, string | number | boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Optional per-attribute XSD-type metadata, mirroring the schema
|
|
35
|
+
* lookup the production accessor performs via `getAttributeXsdTypes`.
|
|
36
|
+
* Lets attribute-facet tests exercise the strict-cast gate.
|
|
37
|
+
*/
|
|
38
|
+
attributeXsdTypes?: Record<string, readonly string[]>;
|
|
39
|
+
}
|
|
40
|
+
export declare function createMockAccessor(entities: MockEntity[]): IFCDataAccessor;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../src/facets/test-helpers.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EAOhB,MAAM,aAAa,CAAC;AAErB,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACvD;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;CACvD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,CA6G1E"}
|