@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.
Files changed (119) hide show
  1. package/dist/audit/coherence/index.d.ts +12 -0
  2. package/dist/audit/coherence/index.d.ts.map +1 -0
  3. package/dist/audit/coherence/index.js +392 -0
  4. package/dist/audit/coherence/index.js.map +1 -0
  5. package/dist/audit/coherence/regex.d.ts +57 -0
  6. package/dist/audit/coherence/regex.d.ts.map +1 -0
  7. package/dist/audit/coherence/regex.js +111 -0
  8. package/dist/audit/coherence/regex.js.map +1 -0
  9. package/dist/audit/ifc-schema/index.d.ts +4 -0
  10. package/dist/audit/ifc-schema/index.d.ts.map +1 -0
  11. package/dist/audit/ifc-schema/index.js +637 -0
  12. package/dist/audit/ifc-schema/index.js.map +1 -0
  13. package/dist/audit/index.d.ts +37 -0
  14. package/dist/audit/index.d.ts.map +1 -0
  15. package/dist/audit/index.js +60 -0
  16. package/dist/audit/index.js.map +1 -0
  17. package/dist/audit/parser-shim.d.ts +13 -0
  18. package/dist/audit/parser-shim.d.ts.map +1 -0
  19. package/dist/audit/parser-shim.js +66 -0
  20. package/dist/audit/parser-shim.js.map +1 -0
  21. package/dist/audit/structural/index.d.ts +22 -0
  22. package/dist/audit/structural/index.d.ts.map +1 -0
  23. package/dist/audit/structural/index.js +441 -0
  24. package/dist/audit/structural/index.js.map +1 -0
  25. package/dist/audit/types.d.ts +91 -0
  26. package/dist/audit/types.d.ts.map +1 -0
  27. package/dist/audit/types.js +5 -0
  28. package/dist/audit/types.js.map +1 -0
  29. package/dist/audit/xsd/index.d.ts +13 -0
  30. package/dist/audit/xsd/index.d.ts.map +1 -0
  31. package/dist/audit/xsd/index.js +203 -0
  32. package/dist/audit/xsd/index.js.map +1 -0
  33. package/dist/bridge/classifications.d.ts +15 -0
  34. package/dist/bridge/classifications.d.ts.map +1 -0
  35. package/dist/bridge/classifications.js +114 -0
  36. package/dist/bridge/classifications.js.map +1 -0
  37. package/dist/bridge/data-accessor.d.ts +16 -0
  38. package/dist/bridge/data-accessor.d.ts.map +1 -0
  39. package/dist/bridge/data-accessor.js +205 -0
  40. package/dist/bridge/data-accessor.js.map +1 -0
  41. package/dist/bridge/data-types.d.ts +11 -0
  42. package/dist/bridge/data-types.d.ts.map +1 -0
  43. package/dist/bridge/data-types.js +47 -0
  44. package/dist/bridge/data-types.js.map +1 -0
  45. package/dist/bridge/index.d.ts +17 -0
  46. package/dist/bridge/index.d.ts.map +1 -0
  47. package/dist/bridge/index.js +20 -0
  48. package/dist/bridge/index.js.map +1 -0
  49. package/dist/bridge/materials.d.ts +11 -0
  50. package/dist/bridge/materials.d.ts.map +1 -0
  51. package/dist/bridge/materials.js +68 -0
  52. package/dist/bridge/materials.js.map +1 -0
  53. package/dist/bridge/predefined-types.d.ts +19 -0
  54. package/dist/bridge/predefined-types.d.ts.map +1 -0
  55. package/dist/bridge/predefined-types.js +84 -0
  56. package/dist/bridge/predefined-types.js.map +1 -0
  57. package/dist/bridge/properties.d.ts +20 -0
  58. package/dist/bridge/properties.d.ts.map +1 -0
  59. package/dist/bridge/properties.js +168 -0
  60. package/dist/bridge/properties.js.map +1 -0
  61. package/dist/bridge/schema-version.d.ts +10 -0
  62. package/dist/bridge/schema-version.d.ts.map +1 -0
  63. package/dist/bridge/schema-version.js +25 -0
  64. package/dist/bridge/schema-version.js.map +1 -0
  65. package/dist/bridge/units.d.ts +18 -0
  66. package/dist/bridge/units.d.ts.map +1 -0
  67. package/dist/bridge/units.js +55 -0
  68. package/dist/bridge/units.js.map +1 -0
  69. package/dist/constraints/comparators.d.ts +32 -0
  70. package/dist/constraints/comparators.d.ts.map +1 -0
  71. package/dist/constraints/comparators.js +94 -0
  72. package/dist/constraints/comparators.js.map +1 -0
  73. package/dist/constraints/index.d.ts.map +1 -1
  74. package/dist/constraints/index.js +68 -54
  75. package/dist/constraints/index.js.map +1 -1
  76. package/dist/constraints/xsd-cast.d.ts +20 -0
  77. package/dist/constraints/xsd-cast.d.ts.map +1 -0
  78. package/dist/constraints/xsd-cast.js +89 -0
  79. package/dist/constraints/xsd-cast.js.map +1 -0
  80. package/dist/facets/attribute-facet.d.ts.map +1 -1
  81. package/dist/facets/attribute-facet.js +51 -4
  82. package/dist/facets/attribute-facet.js.map +1 -1
  83. package/dist/facets/entity-facet.d.ts.map +1 -1
  84. package/dist/facets/entity-facet.js +55 -5
  85. package/dist/facets/entity-facet.js.map +1 -1
  86. package/dist/facets/partof-facet.d.ts.map +1 -1
  87. package/dist/facets/partof-facet.js +33 -3
  88. package/dist/facets/partof-facet.js.map +1 -1
  89. package/dist/facets/property-facet.d.ts.map +1 -1
  90. package/dist/facets/property-facet.js +119 -25
  91. package/dist/facets/property-facet.js.map +1 -1
  92. package/dist/facets/test-helpers.d.ts +7 -1
  93. package/dist/facets/test-helpers.d.ts.map +1 -1
  94. package/dist/facets/test-helpers.js +4 -0
  95. package/dist/facets/test-helpers.js.map +1 -1
  96. package/dist/index.d.ts +2 -0
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +4 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/parser/xml-parser.d.ts.map +1 -1
  101. package/dist/parser/xml-parser.js +166 -64
  102. package/dist/parser/xml-parser.js.map +1 -1
  103. package/dist/translation/locales/de.d.ts +1 -0
  104. package/dist/translation/locales/de.d.ts.map +1 -1
  105. package/dist/translation/locales/de.js +1 -0
  106. package/dist/translation/locales/de.js.map +1 -1
  107. package/dist/translation/locales/en.d.ts +1 -0
  108. package/dist/translation/locales/en.d.ts.map +1 -1
  109. package/dist/translation/locales/en.js +1 -0
  110. package/dist/translation/locales/en.js.map +1 -1
  111. package/dist/translation/locales/fr.d.ts +1 -0
  112. package/dist/translation/locales/fr.d.ts.map +1 -1
  113. package/dist/translation/locales/fr.js +1 -0
  114. package/dist/translation/locales/fr.js.map +1 -1
  115. package/dist/types.d.ts +115 -6
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/validation/validator.js +45 -3
  118. package/dist/validation/validator.js.map +1 -1
  119. 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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"}