@ifc-lite/ids 1.14.11 → 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/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
|
@@ -0,0 +1,637 @@
|
|
|
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
|
+
* IFC schema cross-checks for an IDS document.
|
|
6
|
+
*
|
|
7
|
+
* Backed by the full per-IFC-version schema tables in `@ifc-lite/data`
|
|
8
|
+
* (generated from buildingSMART/IDS-Audit-tool's `SchemaInfo.*.g.cs`):
|
|
9
|
+
*
|
|
10
|
+
* - 771 entities for IFC2X3, 932 for IFC4, 1008 for IFC4X3
|
|
11
|
+
* - 1485 property sets covering 7624 properties total
|
|
12
|
+
* - 18 partOf relation rows (6 per version)
|
|
13
|
+
*
|
|
14
|
+
* Verifies that entity names, predefined types, property sets, properties,
|
|
15
|
+
* attributes and partOf relations referenced in facets actually exist in
|
|
16
|
+
* the IFC version declared on each specification.
|
|
17
|
+
*/
|
|
18
|
+
import { findAttribute, findDataType, findEntity, findPropertySet, getInheritanceChain, getPartOfRelations, isEntitySubtypeOf, RESERVED_PSET_PREFIXES, } from '@ifc-lite/data';
|
|
19
|
+
export async function runIfcSchemaAudit(doc, options) {
|
|
20
|
+
const issues = [];
|
|
21
|
+
for (let i = 0; i < doc.specifications.length; i++) {
|
|
22
|
+
const spec = doc.specifications[i];
|
|
23
|
+
const versions = pickVersions(spec, options.ifcVersion);
|
|
24
|
+
if (versions.length === 0)
|
|
25
|
+
continue; // XSD audit will already have flagged this
|
|
26
|
+
// IDS specs apply to *every* listed `@ifcVersion`. A constraint
|
|
27
|
+
// valid in IFC2X3 but not in IFC4 must surface even when IFC2X3
|
|
28
|
+
// appears first. Walk each version and dedupe issues that fire
|
|
29
|
+
// identically across them (same code + path) — only carry the
|
|
30
|
+
// first version's `detail` so reports stay readable.
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
for (const version of versions) {
|
|
33
|
+
const perVersion = [];
|
|
34
|
+
await auditSpec(spec, version, `specifications[${i}]`, perVersion);
|
|
35
|
+
for (const iss of perVersion) {
|
|
36
|
+
const key = `${iss.code}|${iss.path}|${iss.message}`;
|
|
37
|
+
if (seen.has(key))
|
|
38
|
+
continue;
|
|
39
|
+
seen.add(key);
|
|
40
|
+
issues.push(iss);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return issues;
|
|
45
|
+
}
|
|
46
|
+
function pickVersions(spec, override) {
|
|
47
|
+
if (override) {
|
|
48
|
+
const n = normaliseSchemaVersion(override);
|
|
49
|
+
return n ? [n] : [];
|
|
50
|
+
}
|
|
51
|
+
const out = [];
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
for (const v of spec.ifcVersions) {
|
|
54
|
+
const n = normaliseSchemaVersion(v);
|
|
55
|
+
if (n && !seen.has(n)) {
|
|
56
|
+
seen.add(n);
|
|
57
|
+
out.push(n);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function normaliseSchemaVersion(v) {
|
|
63
|
+
switch (v) {
|
|
64
|
+
case 'IFC2X3':
|
|
65
|
+
case 'IFC4':
|
|
66
|
+
case 'IFC4X3':
|
|
67
|
+
case 'IFC4X3_ADD2':
|
|
68
|
+
return v;
|
|
69
|
+
default:
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function auditSpec(spec, version, basePath, issues) {
|
|
74
|
+
// The applicability block can declare an entity facet that requirement
|
|
75
|
+
// facets (attribute / property) need to cross-check against.
|
|
76
|
+
const applicabilityEntity = spec.applicability.facets.find((f) => f.type === 'entity');
|
|
77
|
+
for (let fi = 0; fi < spec.applicability.facets.length; fi++) {
|
|
78
|
+
const facet = spec.applicability.facets[fi];
|
|
79
|
+
await auditFacet(facet, version, `${basePath}.applicability.facets[${fi}]`, applicabilityEntity, issues);
|
|
80
|
+
}
|
|
81
|
+
for (let ri = 0; ri < spec.requirements.length; ri++) {
|
|
82
|
+
const req = spec.requirements[ri];
|
|
83
|
+
await auditFacet(req.facet, version, `${basePath}.requirements[${ri}]`, applicabilityEntity, issues);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function auditFacet(facet, version, path, applicabilityEntity, issues) {
|
|
87
|
+
switch (facet.type) {
|
|
88
|
+
case 'entity':
|
|
89
|
+
await auditEntityFacet(facet, version, path, issues);
|
|
90
|
+
break;
|
|
91
|
+
case 'property':
|
|
92
|
+
await auditPropertyFacet(facet, version, path, applicabilityEntity, issues);
|
|
93
|
+
break;
|
|
94
|
+
case 'attribute':
|
|
95
|
+
await auditAttributeFacet(facet, version, path, applicabilityEntity, issues);
|
|
96
|
+
break;
|
|
97
|
+
case 'partOf':
|
|
98
|
+
await auditPartOfFacet(facet, version, path, applicabilityEntity, issues);
|
|
99
|
+
break;
|
|
100
|
+
case 'classification':
|
|
101
|
+
await auditClassificationFacet(version, applicabilityEntity, path, issues);
|
|
102
|
+
break;
|
|
103
|
+
case 'material':
|
|
104
|
+
await auditMaterialFacet(version, applicabilityEntity, path, issues);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Classification facets bind via `IfcRelAssociatesClassification`,
|
|
110
|
+
* which only accepts subtypes of `IfcObjectDefinition` (IFC4+) or
|
|
111
|
+
* `IfcRoot` (IFC2X3). Applicability entities outside that hierarchy —
|
|
112
|
+
* e.g. `IfcCurve`, `IfcGeometricRepresentationItem` — can never be
|
|
113
|
+
* classified. Mirrors upstream `schema.GetRelAsssignClassificationClasses`.
|
|
114
|
+
*/
|
|
115
|
+
async function auditClassificationFacet(version, applicabilityEntity, path, issues) {
|
|
116
|
+
if (!applicabilityEntity)
|
|
117
|
+
return;
|
|
118
|
+
if (applicabilityEntity.name.type !== 'simpleValue')
|
|
119
|
+
return;
|
|
120
|
+
const entityName = applicabilityEntity.name.value;
|
|
121
|
+
if (!entityName)
|
|
122
|
+
return;
|
|
123
|
+
// IFC4 / IFC4X3 use IfcObjectDefinition; IFC2X3 uses IfcRoot.
|
|
124
|
+
const expected = version === 'IFC2X3' ? 'IfcRoot' : 'IfcObjectDefinition';
|
|
125
|
+
const ok = await isEntitySubtypeOf(version, entityName, expected);
|
|
126
|
+
if (!ok) {
|
|
127
|
+
issues.push({
|
|
128
|
+
severity: 'error',
|
|
129
|
+
code: 'E_IFC_PARTOF_ENTITY',
|
|
130
|
+
message: `applicability entity "${entityName}" cannot be classified in ${version} (must be a subtype of ${expected})`,
|
|
131
|
+
path,
|
|
132
|
+
facetType: 'classification',
|
|
133
|
+
detail: { value: entityName, required: expected, version },
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function auditMaterialFacet(version, applicabilityEntity, path, issues) {
|
|
138
|
+
if (!applicabilityEntity)
|
|
139
|
+
return;
|
|
140
|
+
if (applicabilityEntity.name.type !== 'simpleValue')
|
|
141
|
+
return;
|
|
142
|
+
const entityName = applicabilityEntity.name.value;
|
|
143
|
+
if (!entityName)
|
|
144
|
+
return;
|
|
145
|
+
// Same rule as classification — material associations require a
|
|
146
|
+
// subtype of IfcObjectDefinition (IFC4+) / IfcRoot (IFC2X3).
|
|
147
|
+
const expected = version === 'IFC2X3' ? 'IfcRoot' : 'IfcObjectDefinition';
|
|
148
|
+
const ok = await isEntitySubtypeOf(version, entityName, expected);
|
|
149
|
+
if (!ok) {
|
|
150
|
+
issues.push({
|
|
151
|
+
severity: 'error',
|
|
152
|
+
code: 'E_IFC_PARTOF_ENTITY',
|
|
153
|
+
message: `applicability entity "${entityName}" cannot have a material in ${version} (must be a subtype of ${expected})`,
|
|
154
|
+
path,
|
|
155
|
+
facetType: 'material',
|
|
156
|
+
detail: { value: entityName, required: expected, version },
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function auditEntityFacet(facet, version, path, issues) {
|
|
161
|
+
if (facet.name.type !== 'simpleValue') {
|
|
162
|
+
// Pattern / enumeration / bounds: cross-check is impossible without
|
|
163
|
+
// resolving every match, so we skip — a regex like `IFC.*` is valid.
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const name = facet.name.value;
|
|
167
|
+
if (!name)
|
|
168
|
+
return;
|
|
169
|
+
const entity = await findEntity(version, name);
|
|
170
|
+
if (!entity) {
|
|
171
|
+
issues.push({
|
|
172
|
+
severity: 'error',
|
|
173
|
+
code: 'E_IFC_ENTITY_UNKNOWN',
|
|
174
|
+
message: `entity name "${name}" is not a known IFC entity for ${version}`,
|
|
175
|
+
path: `${path}.name`,
|
|
176
|
+
facetType: 'entity',
|
|
177
|
+
detail: { value: name, version },
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (facet.predefinedType && entity.predefinedTypes.length > 0) {
|
|
182
|
+
checkPredefinedType(facet.predefinedType, entity, version, `${path}.predefinedType`, issues);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function checkPredefinedType(c, entity, version, path, issues) {
|
|
186
|
+
const valid = (v) => entity.predefinedTypes.includes(v.toUpperCase());
|
|
187
|
+
switch (c.type) {
|
|
188
|
+
case 'simpleValue': {
|
|
189
|
+
const v = c.value;
|
|
190
|
+
if (v && !valid(v)) {
|
|
191
|
+
issues.push({
|
|
192
|
+
severity: 'error',
|
|
193
|
+
code: 'E_IFC_PREDEF_TYPE_INVALID',
|
|
194
|
+
message: `predefined type "${v}" is not valid for ${entity.name} (${version})`,
|
|
195
|
+
path,
|
|
196
|
+
facetType: 'entity',
|
|
197
|
+
detail: { value: v, entity: entity.name, version },
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case 'enumeration': {
|
|
203
|
+
for (const v of c.values) {
|
|
204
|
+
if (v && !valid(v)) {
|
|
205
|
+
issues.push({
|
|
206
|
+
severity: 'error',
|
|
207
|
+
code: 'E_IFC_PREDEF_TYPE_INVALID',
|
|
208
|
+
message: `predefined type enumeration value "${v}" is not valid for ${entity.name} (${version})`,
|
|
209
|
+
path,
|
|
210
|
+
facetType: 'entity',
|
|
211
|
+
detail: { value: v, entity: entity.name, version },
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case 'pattern': {
|
|
218
|
+
// If the pattern compiles, test each known predefined type to be
|
|
219
|
+
// sure at least one matches. Otherwise warn (pattern syntax check
|
|
220
|
+
// already produces W_REGEX_UNVERIFIED).
|
|
221
|
+
try {
|
|
222
|
+
const rx = new RegExp(`^${c.pattern}$`);
|
|
223
|
+
const anyMatch = entity.predefinedTypes.some((p) => rx.test(p));
|
|
224
|
+
if (!anyMatch) {
|
|
225
|
+
issues.push({
|
|
226
|
+
severity: 'error',
|
|
227
|
+
code: 'E_IFC_PREDEF_TYPE_INVALID',
|
|
228
|
+
message: `predefined type pattern "${c.pattern}" matches no value for ${entity.name} (${version})`,
|
|
229
|
+
path,
|
|
230
|
+
facetType: 'entity',
|
|
231
|
+
detail: { pattern: c.pattern, entity: entity.name, version },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
/* coherence pass already warned */
|
|
237
|
+
}
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
case 'bounds':
|
|
241
|
+
// Bounds make no sense on a predefined-type enum — XSD audit will
|
|
242
|
+
// already have flagged the structural mismatch indirectly.
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function auditPropertyFacet(facet, version, path, applicabilityEntity, issues) {
|
|
247
|
+
// Always cross-check the @dataType when present, even before pset
|
|
248
|
+
// existence — an invalid IFC dataType is its own error class.
|
|
249
|
+
if (facet.dataType && facet.dataType.type === 'simpleValue') {
|
|
250
|
+
const dt = facet.dataType.value;
|
|
251
|
+
if (dt) {
|
|
252
|
+
const found = await findDataType(version, dt);
|
|
253
|
+
if (!found) {
|
|
254
|
+
issues.push({
|
|
255
|
+
severity: 'error',
|
|
256
|
+
code: 'E_IFC_DATATYPE_UNKNOWN',
|
|
257
|
+
message: `dataType "${dt}" is not a known IFC measure/type for ${version}`,
|
|
258
|
+
path: `${path}.dataType`,
|
|
259
|
+
facetType: 'property',
|
|
260
|
+
detail: { value: dt, version },
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
else if (facet.value) {
|
|
264
|
+
// Restriction-base compatibility (upstream Report 303): when a
|
|
265
|
+
// <value> is set with an xs:restriction, its base must match the
|
|
266
|
+
// dataType's backing type.
|
|
267
|
+
checkRestrictionBase(facet.value, found.backingType, dt, `${path}.value`, issues);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (facet.propertySet.type !== 'simpleValue')
|
|
272
|
+
return;
|
|
273
|
+
const psetName = facet.propertySet.value;
|
|
274
|
+
if (!psetName)
|
|
275
|
+
return;
|
|
276
|
+
const pset = await findPropertySet(version, psetName);
|
|
277
|
+
// Reserved-prefix check: `Pset_*` and `Qto_*` are reserved for
|
|
278
|
+
// buildingSMART-published sets. Mirrors `IdsProperty.cs` upstream.
|
|
279
|
+
const isReserved = RESERVED_PSET_PREFIXES.some((p) => psetName.startsWith(p));
|
|
280
|
+
if (!pset) {
|
|
281
|
+
if (isReserved) {
|
|
282
|
+
issues.push({
|
|
283
|
+
severity: 'warning',
|
|
284
|
+
code: 'W_IFC_PSET_RESERVED_PREFIX',
|
|
285
|
+
message: `property set "${psetName}" uses a reserved buildingSMART prefix but is not a known standard ${psetName.startsWith('Qto_') ? 'quantity set' : 'pset'} for ${version}`,
|
|
286
|
+
path: `${path}.propertySet`,
|
|
287
|
+
facetType: 'property',
|
|
288
|
+
detail: { value: psetName, version },
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
// Applicability cross-check: warn when the spec restricts applicability
|
|
294
|
+
// to an entity that isn't on the pset's `applicableEntities` list (or
|
|
295
|
+
// a subtype of one). Works for simpleValue entity names and for
|
|
296
|
+
// pattern/enumeration constraints — in the latter case we resolve
|
|
297
|
+
// candidate entity names by matching the constraint against the
|
|
298
|
+
// schema's full entity list.
|
|
299
|
+
if (applicabilityEntity && pset.applicableEntities.length > 0) {
|
|
300
|
+
const candidates = await resolveEntityCandidates(applicabilityEntity, version);
|
|
301
|
+
if (candidates.length > 0) {
|
|
302
|
+
const anyMatches = (await Promise.all(candidates.map((c) => psetApplies(version, c, pset.applicableEntities)))).some(Boolean);
|
|
303
|
+
if (!anyMatches) {
|
|
304
|
+
const label = candidates.length === 1 ? candidates[0] : `{${candidates.join(', ')}}`;
|
|
305
|
+
issues.push({
|
|
306
|
+
severity: 'error',
|
|
307
|
+
code: 'E_IFC_PROP_NOT_IN_PSET',
|
|
308
|
+
message: `${pset.name} is not applicable to ${label} in ${version}`,
|
|
309
|
+
path: `${path}.propertySet`,
|
|
310
|
+
facetType: 'property',
|
|
311
|
+
detail: { pset: pset.name, entity: label, version },
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (facet.baseName.type === 'simpleValue') {
|
|
317
|
+
const propName = facet.baseName.value;
|
|
318
|
+
if (propName) {
|
|
319
|
+
const prop = pset.properties.find((p) => p.name === propName);
|
|
320
|
+
if (!prop) {
|
|
321
|
+
issues.push({
|
|
322
|
+
severity: 'error',
|
|
323
|
+
code: 'E_IFC_PROP_NOT_IN_PSET',
|
|
324
|
+
message: `property "${propName}" is not part of ${pset.name} (${version})`,
|
|
325
|
+
path: `${path}.baseName`,
|
|
326
|
+
facetType: 'property',
|
|
327
|
+
detail: { property: propName, pset: pset.name, version },
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
else if (facet.dataType &&
|
|
331
|
+
facet.dataType.type === 'simpleValue' &&
|
|
332
|
+
facet.dataType.value) {
|
|
333
|
+
checkDataTypeMatch(prop, facet.dataType.value, path, pset.name, propName, issues);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function checkDataTypeMatch(prop, declared, path, psetName, propName, issues) {
|
|
339
|
+
// `IDSPROPERTYSINGLEVALUE` etc. — the IDS spec uses the IFC pset
|
|
340
|
+
// template type name, not the IFC datatype. We allow both: if the
|
|
341
|
+
// declared value matches either the property's IFC datatype (e.g.
|
|
342
|
+
// `IfcLabel`) or the canonical IDS template form (`IFCPROPERTYSINGLEVALUE`
|
|
343
|
+
// for kind=`single`, `IFCPROPERTYENUMERATEDVALUE` for kind=`enumeration`,
|
|
344
|
+
// etc.), we don't warn.
|
|
345
|
+
const declaredUpper = declared.toUpperCase();
|
|
346
|
+
if (prop.dataType && prop.dataType.toUpperCase() === declaredUpper)
|
|
347
|
+
return;
|
|
348
|
+
const idsTemplate = idsTemplateForKind(prop.kind);
|
|
349
|
+
if (idsTemplate && declaredUpper === idsTemplate)
|
|
350
|
+
return;
|
|
351
|
+
// Upstream IDS-Audit-tool treats this as an error (Report 303 family)
|
|
352
|
+
// — declaring a different dataType than the standard pset specifies is
|
|
353
|
+
// an authoring mistake, not a stylistic warning.
|
|
354
|
+
issues.push({
|
|
355
|
+
severity: 'error',
|
|
356
|
+
code: 'W_IFC_DATATYPE_MISMATCH',
|
|
357
|
+
message: `${psetName}.${propName} is typed ${prop.dataType ?? prop.kind} in the standard, not ${declared}`,
|
|
358
|
+
path: `${path}.dataType`,
|
|
359
|
+
facetType: 'property',
|
|
360
|
+
detail: {
|
|
361
|
+
expected: prop.dataType ?? prop.kind,
|
|
362
|
+
actual: declared,
|
|
363
|
+
property: propName,
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Upstream IDS-Audit-tool's Report 303 — when a `<value>` carries an
|
|
369
|
+
* `xs:restriction`, its `@base` must be compatible with the dataType's
|
|
370
|
+
* backing XSD type. The parser preserves the raw `@base` attribute on
|
|
371
|
+
* pattern/enumeration/bounds constraints, so we use that directly when
|
|
372
|
+
* present and only fall back to inferring from the restriction shape
|
|
373
|
+
* when the source XML didn't carry a base.
|
|
374
|
+
*
|
|
375
|
+
* Inferring from shape alone is ambiguous: `<xs:enumeration value="1"/>`
|
|
376
|
+
* looks like a string enumeration unless we know the parent
|
|
377
|
+
* `<xs:restriction base="xs:integer">`.
|
|
378
|
+
*/
|
|
379
|
+
function checkRestrictionBase(c, backingType, dataType, path, issues) {
|
|
380
|
+
// Only restrictions can mismatch — simpleValue is always treated as
|
|
381
|
+
// string-compatible by the IDS XSD.
|
|
382
|
+
if (c.type === 'simpleValue')
|
|
383
|
+
return;
|
|
384
|
+
const declaredBase = c.type === 'pattern' || c.type === 'enumeration' || c.type === 'bounds'
|
|
385
|
+
? c.base
|
|
386
|
+
: undefined;
|
|
387
|
+
let inferred;
|
|
388
|
+
if (declaredBase) {
|
|
389
|
+
inferred = declaredBase;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
switch (c.type) {
|
|
393
|
+
case 'pattern':
|
|
394
|
+
case 'enumeration':
|
|
395
|
+
inferred = 'xs:string';
|
|
396
|
+
break;
|
|
397
|
+
case 'bounds':
|
|
398
|
+
if (typeof c.length === 'number' ||
|
|
399
|
+
typeof c.minLength === 'number' ||
|
|
400
|
+
typeof c.maxLength === 'number') {
|
|
401
|
+
inferred = 'xs:string';
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
inferred = 'xs:double';
|
|
405
|
+
}
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (!inferred)
|
|
410
|
+
return;
|
|
411
|
+
if (!isXsTypeCompatible(inferred, backingType)) {
|
|
412
|
+
issues.push({
|
|
413
|
+
severity: 'error',
|
|
414
|
+
code: 'E_RESTRICTION_BASE_MISMATCH',
|
|
415
|
+
message: `xs:restriction base (${inferred}) is not compatible with dataType "${dataType}" (backing ${backingType})`,
|
|
416
|
+
path,
|
|
417
|
+
facetType: 'property',
|
|
418
|
+
detail: { inferred, expected: backingType, dataType },
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* XSD type compatibility per upstream `IdsProperty.cs`: the restriction
|
|
424
|
+
* `@base` must equal the IFC dataType's backing XSD type exactly. The
|
|
425
|
+
* one wrinkle is the `xs:double` / `xs:decimal` / `xs:float` family —
|
|
426
|
+
* upstream's `XsTypes.IsValid` accepts any of them as
|
|
427
|
+
* floating-point — so those three are treated as equivalent.
|
|
428
|
+
*
|
|
429
|
+
* `xs:integer` is *not* promoted to floats: upstream rejects an
|
|
430
|
+
* `xs:integer` restriction on an `IFCREAL`-backing property since
|
|
431
|
+
* decimal values would be invalid against the integer pattern.
|
|
432
|
+
*/
|
|
433
|
+
function isXsTypeCompatible(inferred, expected) {
|
|
434
|
+
if (inferred === expected)
|
|
435
|
+
return true;
|
|
436
|
+
const floats = new Set(['xs:double', 'xs:decimal', 'xs:float']);
|
|
437
|
+
if (floats.has(inferred) && floats.has(expected))
|
|
438
|
+
return true;
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
function idsTemplateForKind(kind) {
|
|
442
|
+
switch (kind) {
|
|
443
|
+
case 'single':
|
|
444
|
+
return 'IFCPROPERTYSINGLEVALUE';
|
|
445
|
+
case 'enumeration':
|
|
446
|
+
return 'IFCPROPERTYENUMERATEDVALUE';
|
|
447
|
+
case 'list':
|
|
448
|
+
return 'IFCPROPERTYLISTVALUE';
|
|
449
|
+
case 'bounded':
|
|
450
|
+
return 'IFCPROPERTYBOUNDEDVALUE';
|
|
451
|
+
case 'reference':
|
|
452
|
+
return 'IFCPROPERTYREFERENCEVALUE';
|
|
453
|
+
default:
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
async function psetApplies(version, entityName, applicable) {
|
|
458
|
+
for (const candidate of applicable) {
|
|
459
|
+
if (await isEntitySubtypeOf(version, entityName, candidate))
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
return false;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Resolve the set of candidate entity names matched by an entity facet's
|
|
466
|
+
* `name` constraint. simpleValue → singleton list; enumeration → its
|
|
467
|
+
* values; pattern → entity names from the schema that match the regex.
|
|
468
|
+
* Returns an empty list when the constraint can't be resolved.
|
|
469
|
+
*/
|
|
470
|
+
async function resolveEntityCandidates(facet, version) {
|
|
471
|
+
switch (facet.name.type) {
|
|
472
|
+
case 'simpleValue':
|
|
473
|
+
return facet.name.value ? [facet.name.value] : [];
|
|
474
|
+
case 'enumeration':
|
|
475
|
+
return facet.name.values.filter((v) => !!v);
|
|
476
|
+
case 'pattern': {
|
|
477
|
+
try {
|
|
478
|
+
const rx = new RegExp(`^${facet.name.pattern}$`);
|
|
479
|
+
const { getEntities } = await import('@ifc-lite/data');
|
|
480
|
+
const list = await getEntities(version);
|
|
481
|
+
return list
|
|
482
|
+
.filter((e) => rx.test(e.name.toUpperCase()) || rx.test(e.name))
|
|
483
|
+
.map((e) => e.name);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
return [];
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
default:
|
|
490
|
+
return [];
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
async function auditAttributeFacet(facet, version, path, applicabilityEntity, issues) {
|
|
494
|
+
if (!applicabilityEntity)
|
|
495
|
+
return; // Can't cross-check without an entity.
|
|
496
|
+
if (applicabilityEntity.name.type !== 'simpleValue')
|
|
497
|
+
return;
|
|
498
|
+
if (facet.name.type !== 'simpleValue')
|
|
499
|
+
return;
|
|
500
|
+
const entityName = applicabilityEntity.name.value;
|
|
501
|
+
const attrName = facet.name.value;
|
|
502
|
+
if (!entityName || !attrName)
|
|
503
|
+
return;
|
|
504
|
+
const chain = await getInheritanceChain(version, entityName);
|
|
505
|
+
if (chain.length === 0)
|
|
506
|
+
return; // Unknown entity already flagged.
|
|
507
|
+
if (!chainHasAttribute(chain, attrName)) {
|
|
508
|
+
issues.push({
|
|
509
|
+
severity: 'error',
|
|
510
|
+
code: 'E_IFC_ATTR_UNKNOWN_FOR_ENTITY',
|
|
511
|
+
message: `attribute "${attrName}" is not defined on ${chain[0].name} (${version})`,
|
|
512
|
+
path: `${path}.name`,
|
|
513
|
+
facetType: 'attribute',
|
|
514
|
+
detail: { attribute: attrName, entity: chain[0].name, version },
|
|
515
|
+
});
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
// Upstream Report 102: when a `<value>` constraint is supplied on an
|
|
519
|
+
// attribute that doesn't admit a simple value (e.g. complex/entity-
|
|
520
|
+
// typed attributes like `IfcTask.TaskTime`), surface as an error.
|
|
521
|
+
if (facet.value === undefined)
|
|
522
|
+
return;
|
|
523
|
+
const meta = await findAttribute(version, attrName);
|
|
524
|
+
if (!meta)
|
|
525
|
+
return; // unknown to lookup → defer to schema fix
|
|
526
|
+
// The applicability entity must appear in `simpleValueEntities` for
|
|
527
|
+
// the value constraint to be meaningful.
|
|
528
|
+
const entityUpper = chain[0].name.toUpperCase();
|
|
529
|
+
const inheritedEntities = chain.map((e) => e.name.toUpperCase());
|
|
530
|
+
const allowsSimpleValue = inheritedEntities.some((e) => meta.simpleValueEntities.includes(e));
|
|
531
|
+
const isComplexHere = inheritedEntities.some((e) => meta.complexEntities.includes(e));
|
|
532
|
+
if (!allowsSimpleValue && isComplexHere) {
|
|
533
|
+
issues.push({
|
|
534
|
+
severity: 'error',
|
|
535
|
+
code: 'E_IFC_ATTR_UNKNOWN_FOR_ENTITY',
|
|
536
|
+
message: `attribute "${attrName}" on ${entityUpper} is a complex/entity-typed attribute and cannot carry a simple <value> constraint (${version})`,
|
|
537
|
+
path: `${path}.value`,
|
|
538
|
+
facetType: 'attribute',
|
|
539
|
+
detail: { attribute: attrName, entity: entityUpper, version },
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
function chainHasAttribute(chain, attrName) {
|
|
544
|
+
const lower = attrName.toLowerCase();
|
|
545
|
+
for (const entity of chain) {
|
|
546
|
+
for (const a of entity.attributes) {
|
|
547
|
+
if (a.toLowerCase() === lower)
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
async function auditPartOfFacet(facet, version, path, applicabilityEntity, issues) {
|
|
554
|
+
const relations = await getPartOfRelations(version);
|
|
555
|
+
// The parser normalises unrecognised relations to a fallback enum
|
|
556
|
+
// value; when it does, it preserves the original string in
|
|
557
|
+
// `rawRelation`. Prefer the raw value for cross-checking so we can
|
|
558
|
+
// flag bogus inputs.
|
|
559
|
+
const probe = facet.rawRelation ?? facet.relation;
|
|
560
|
+
const probeUpper = probe.toUpperCase();
|
|
561
|
+
const relation = relations.find((r) => r.relation === probeUpper);
|
|
562
|
+
if (!relation) {
|
|
563
|
+
issues.push({
|
|
564
|
+
severity: 'error',
|
|
565
|
+
code: 'E_IFC_PARTOF_RELATION',
|
|
566
|
+
message: `partOf relation "${probe}" is not valid for ${version}`,
|
|
567
|
+
path: `${path}.relation`,
|
|
568
|
+
facetType: 'partOf',
|
|
569
|
+
detail: { value: probe, version },
|
|
570
|
+
});
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
if (facet.entity &&
|
|
574
|
+
facet.entity.name.type === 'simpleValue' &&
|
|
575
|
+
facet.entity.name.value) {
|
|
576
|
+
const name = facet.entity.name.value;
|
|
577
|
+
const entity = await findEntity(version, name);
|
|
578
|
+
if (!entity) {
|
|
579
|
+
issues.push({
|
|
580
|
+
severity: 'error',
|
|
581
|
+
code: 'E_IFC_PARTOF_ENTITY',
|
|
582
|
+
message: `partOf entity "${name}" is not a known IFC entity for ${version}`,
|
|
583
|
+
path: `${path}.entity.name`,
|
|
584
|
+
facetType: 'partOf',
|
|
585
|
+
detail: { value: name, version },
|
|
586
|
+
});
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
// Upstream (`PartOfRelationInformation`) further constrains the
|
|
590
|
+
// partOf entity to be a subtype of the relation's `owner`. Apply
|
|
591
|
+
// that too — it's the most useful signal for catching e.g.
|
|
592
|
+
// "IFCRELCONTAINEDINSPATIALSTRUCTURE on an IfcWindow" mistakes.
|
|
593
|
+
const ownerName = relation.owner;
|
|
594
|
+
const ok = await isEntitySubtypeOf(version, entity.name, ownerName);
|
|
595
|
+
if (!ok) {
|
|
596
|
+
issues.push({
|
|
597
|
+
severity: 'error',
|
|
598
|
+
code: 'E_IFC_PARTOF_ENTITY',
|
|
599
|
+
message: `partOf @entity "${entity.name}" is not a subtype of "${ownerName}" required by ${facet.relation} (${version})`,
|
|
600
|
+
path: `${path}.entity.name`,
|
|
601
|
+
facetType: 'partOf',
|
|
602
|
+
detail: {
|
|
603
|
+
value: entity.name,
|
|
604
|
+
required: ownerName,
|
|
605
|
+
relation: facet.relation,
|
|
606
|
+
version,
|
|
607
|
+
},
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
// The applicability entity (the "thing we're filtering on") must be a
|
|
612
|
+
// subtype of the relation's `member` constraint, e.g. an
|
|
613
|
+
// `IfcRelNests` requirement only makes sense if the applicability
|
|
614
|
+
// entity is itself an `IfcObjectDefinition`.
|
|
615
|
+
if (applicabilityEntity &&
|
|
616
|
+
applicabilityEntity.name.type === 'simpleValue' &&
|
|
617
|
+
applicabilityEntity.name.value) {
|
|
618
|
+
const appName = applicabilityEntity.name.value;
|
|
619
|
+
const memberOk = await isEntitySubtypeOf(version, appName, relation.member);
|
|
620
|
+
if (!memberOk) {
|
|
621
|
+
issues.push({
|
|
622
|
+
severity: 'error',
|
|
623
|
+
code: 'E_IFC_PARTOF_ENTITY',
|
|
624
|
+
message: `applicability entity "${appName}" cannot be the member of ${facet.relation}; ${facet.relation} requires the member to be a subtype of "${relation.member}" (${version})`,
|
|
625
|
+
path: `${path}.relation`,
|
|
626
|
+
facetType: 'partOf',
|
|
627
|
+
detail: {
|
|
628
|
+
applicability: appName,
|
|
629
|
+
required: relation.member,
|
|
630
|
+
relation: facet.relation,
|
|
631
|
+
version,
|
|
632
|
+
},
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/audit/ifc-schema/index.ts"],"names":[],"mappings":"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"}
|