@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.
Files changed (124) hide show
  1. package/README.md +53 -44
  2. package/dist/audit/coherence/index.d.ts +12 -0
  3. package/dist/audit/coherence/index.d.ts.map +1 -0
  4. package/dist/audit/coherence/index.js +392 -0
  5. package/dist/audit/coherence/index.js.map +1 -0
  6. package/dist/audit/coherence/regex.d.ts +57 -0
  7. package/dist/audit/coherence/regex.d.ts.map +1 -0
  8. package/dist/audit/coherence/regex.js +111 -0
  9. package/dist/audit/coherence/regex.js.map +1 -0
  10. package/dist/audit/ifc-schema/index.d.ts +4 -0
  11. package/dist/audit/ifc-schema/index.d.ts.map +1 -0
  12. package/dist/audit/ifc-schema/index.js +637 -0
  13. package/dist/audit/ifc-schema/index.js.map +1 -0
  14. package/dist/audit/index.d.ts +37 -0
  15. package/dist/audit/index.d.ts.map +1 -0
  16. package/dist/audit/index.js +60 -0
  17. package/dist/audit/index.js.map +1 -0
  18. package/dist/audit/parser-shim.d.ts +13 -0
  19. package/dist/audit/parser-shim.d.ts.map +1 -0
  20. package/dist/audit/parser-shim.js +66 -0
  21. package/dist/audit/parser-shim.js.map +1 -0
  22. package/dist/audit/structural/index.d.ts +22 -0
  23. package/dist/audit/structural/index.d.ts.map +1 -0
  24. package/dist/audit/structural/index.js +441 -0
  25. package/dist/audit/structural/index.js.map +1 -0
  26. package/dist/audit/types.d.ts +91 -0
  27. package/dist/audit/types.d.ts.map +1 -0
  28. package/dist/audit/types.js +5 -0
  29. package/dist/audit/types.js.map +1 -0
  30. package/dist/audit/xsd/index.d.ts +13 -0
  31. package/dist/audit/xsd/index.d.ts.map +1 -0
  32. package/dist/audit/xsd/index.js +203 -0
  33. package/dist/audit/xsd/index.js.map +1 -0
  34. package/dist/bridge/classifications.d.ts +15 -0
  35. package/dist/bridge/classifications.d.ts.map +1 -0
  36. package/dist/bridge/classifications.js +114 -0
  37. package/dist/bridge/classifications.js.map +1 -0
  38. package/dist/bridge/data-accessor.d.ts +16 -0
  39. package/dist/bridge/data-accessor.d.ts.map +1 -0
  40. package/dist/bridge/data-accessor.js +205 -0
  41. package/dist/bridge/data-accessor.js.map +1 -0
  42. package/dist/bridge/data-types.d.ts +11 -0
  43. package/dist/bridge/data-types.d.ts.map +1 -0
  44. package/dist/bridge/data-types.js +47 -0
  45. package/dist/bridge/data-types.js.map +1 -0
  46. package/dist/bridge/index.d.ts +17 -0
  47. package/dist/bridge/index.d.ts.map +1 -0
  48. package/dist/bridge/index.js +20 -0
  49. package/dist/bridge/index.js.map +1 -0
  50. package/dist/bridge/materials.d.ts +11 -0
  51. package/dist/bridge/materials.d.ts.map +1 -0
  52. package/dist/bridge/materials.js +68 -0
  53. package/dist/bridge/materials.js.map +1 -0
  54. package/dist/bridge/predefined-types.d.ts +19 -0
  55. package/dist/bridge/predefined-types.d.ts.map +1 -0
  56. package/dist/bridge/predefined-types.js +84 -0
  57. package/dist/bridge/predefined-types.js.map +1 -0
  58. package/dist/bridge/properties.d.ts +20 -0
  59. package/dist/bridge/properties.d.ts.map +1 -0
  60. package/dist/bridge/properties.js +168 -0
  61. package/dist/bridge/properties.js.map +1 -0
  62. package/dist/bridge/schema-version.d.ts +10 -0
  63. package/dist/bridge/schema-version.d.ts.map +1 -0
  64. package/dist/bridge/schema-version.js +25 -0
  65. package/dist/bridge/schema-version.js.map +1 -0
  66. package/dist/bridge/units.d.ts +18 -0
  67. package/dist/bridge/units.d.ts.map +1 -0
  68. package/dist/bridge/units.js +55 -0
  69. package/dist/bridge/units.js.map +1 -0
  70. package/dist/constraints/comparators.d.ts +32 -0
  71. package/dist/constraints/comparators.d.ts.map +1 -0
  72. package/dist/constraints/comparators.js +94 -0
  73. package/dist/constraints/comparators.js.map +1 -0
  74. package/dist/constraints/index.d.ts +11 -1
  75. package/dist/constraints/index.d.ts.map +1 -1
  76. package/dist/constraints/index.js +74 -58
  77. package/dist/constraints/index.js.map +1 -1
  78. package/dist/constraints/xsd-cast.d.ts +20 -0
  79. package/dist/constraints/xsd-cast.d.ts.map +1 -0
  80. package/dist/constraints/xsd-cast.js +89 -0
  81. package/dist/constraints/xsd-cast.js.map +1 -0
  82. package/dist/facets/attribute-facet.d.ts.map +1 -1
  83. package/dist/facets/attribute-facet.js +80 -12
  84. package/dist/facets/attribute-facet.js.map +1 -1
  85. package/dist/facets/classification-facet.d.ts.map +1 -1
  86. package/dist/facets/classification-facet.js +21 -2
  87. package/dist/facets/classification-facet.js.map +1 -1
  88. package/dist/facets/entity-facet.d.ts.map +1 -1
  89. package/dist/facets/entity-facet.js +59 -7
  90. package/dist/facets/entity-facet.js.map +1 -1
  91. package/dist/facets/partof-facet.d.ts.map +1 -1
  92. package/dist/facets/partof-facet.js +40 -8
  93. package/dist/facets/partof-facet.js.map +1 -1
  94. package/dist/facets/property-facet.d.ts.map +1 -1
  95. package/dist/facets/property-facet.js +171 -55
  96. package/dist/facets/property-facet.js.map +1 -1
  97. package/dist/facets/test-helpers.d.ts +42 -0
  98. package/dist/facets/test-helpers.d.ts.map +1 -0
  99. package/dist/facets/test-helpers.js +106 -0
  100. package/dist/facets/test-helpers.js.map +1 -0
  101. package/dist/index.d.ts +2 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +4 -0
  104. package/dist/index.js.map +1 -1
  105. package/dist/parser/xml-parser.d.ts.map +1 -1
  106. package/dist/parser/xml-parser.js +198 -68
  107. package/dist/parser/xml-parser.js.map +1 -1
  108. package/dist/translation/locales/de.d.ts +1 -0
  109. package/dist/translation/locales/de.d.ts.map +1 -1
  110. package/dist/translation/locales/de.js +1 -0
  111. package/dist/translation/locales/de.js.map +1 -1
  112. package/dist/translation/locales/en.d.ts +1 -0
  113. package/dist/translation/locales/en.d.ts.map +1 -1
  114. package/dist/translation/locales/en.js +1 -0
  115. package/dist/translation/locales/en.js.map +1 -1
  116. package/dist/translation/locales/fr.d.ts +1 -0
  117. package/dist/translation/locales/fr.d.ts.map +1 -1
  118. package/dist/translation/locales/fr.js +1 -0
  119. package/dist/translation/locales/fr.js.map +1 -1
  120. package/dist/types.d.ts +116 -7
  121. package/dist/types.d.ts.map +1 -1
  122. package/dist/validation/validator.js +49 -3
  123. package/dist/validation/validator.js.map +1 -1
  124. package/package.json +10 -3
@@ -0,0 +1,205 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { extractAllEntityAttributes, extractMaterialsOnDemand, } from '@ifc-lite/parser';
5
+ import { RelationshipType, getAttributeXsdTypes } from '@ifc-lite/data';
6
+ import { flattenMaterials } from './materials.js';
7
+ import { resolveClassifications } from './classifications.js';
8
+ import { collectAllPropertySets } from './properties.js';
9
+ import { resolveObjectType, resolveRawPredefinedType, } from './predefined-types.js';
10
+ import { narrowSchemaVersion } from './schema-version.js';
11
+ // Map IDS PartOf relations to the numeric RelationshipType enum the
12
+ // graph keys on. Passing strings here was a long-standing silent bug:
13
+ // `getRelated` matched nothing → every partOf check looked like
14
+ // "no parent" → fail-when-required, pass-when-prohibited.
15
+ const PARTOF_REL_MAP = {
16
+ IfcRelAggregates: RelationshipType.Aggregates,
17
+ IfcRelAssignsToGroup: RelationshipType.AssignsToGroup,
18
+ IfcRelContainedInSpatialStructure: RelationshipType.ContainsElements,
19
+ IfcRelNests: RelationshipType.Aggregates,
20
+ IfcRelVoidsElement: RelationshipType.VoidsElement,
21
+ IfcRelFillsElement: RelationshipType.FillsElement,
22
+ };
23
+ /**
24
+ * Bridge an `IfcDataStore` (produced by `@ifc-lite/parser`) into the
25
+ * abstract `IFCDataAccessor` the IDS validator consumes. The single
26
+ * canonical translation — viewer, MCP server, and the corpus-parity
27
+ * harness all use this rather than re-implementing the projection.
28
+ *
29
+ * Mirrors upstream `IfcOpenShell/ifctester` semantics: classification
30
+ * sub-reference walking, IfcExternalReferenceRelationship for
31
+ * non-rooted resources, length unit conversion, predefined property-set
32
+ * unwrapping, schema-driven attribute XSD types, USERDEFINED predicate
33
+ * substitution, partOf transitivity, etc.
34
+ */
35
+ export function createDataAccessor(store) {
36
+ function findAttributeValue(expressId, attributeName) {
37
+ const lower = attributeName.toLowerCase();
38
+ const all = extractAllEntityAttributes(store, expressId);
39
+ for (const a of all) {
40
+ if (a.name.toLowerCase() === lower)
41
+ return a.value;
42
+ }
43
+ return undefined;
44
+ }
45
+ const accessor = {
46
+ getEntityType(expressId) {
47
+ // The columnar entity table only summarises "interesting"
48
+ // entities (spatial, building elements, etc.); resource-level
49
+ // types resolve to `'Unknown'` there. Fall back to the raw
50
+ // type name from `entityIndex.byId` so applicability checks
51
+ // for those types still match.
52
+ const entityType = store.entities?.getTypeName?.(expressId);
53
+ if (entityType && entityType !== 'Unknown')
54
+ return entityType;
55
+ const byId = store.entityIndex?.byId;
56
+ if (!byId)
57
+ return undefined;
58
+ const entry = byId.get(expressId);
59
+ if (!entry)
60
+ return undefined;
61
+ return typeof entry === 'object' && 'type' in entry
62
+ ? String(entry.type)
63
+ : undefined;
64
+ },
65
+ getEntityName(expressId) {
66
+ // Distinguish "slot truly absent" (`undefined`) from "slot
67
+ // explicitly empty" (`''`) — the IDS optional-attribute fixtures
68
+ // hinge on it. The columnar `entities.getName` shim returns `''`
69
+ // for either case, so we round-trip through the attribute
70
+ // extractor first to preserve the explicit empty string.
71
+ const fromAttr = findAttributeValue(expressId, 'Name');
72
+ if (fromAttr !== undefined && typeof fromAttr === 'string')
73
+ return fromAttr;
74
+ const n = store.entities?.getName?.(expressId);
75
+ return n || undefined;
76
+ },
77
+ getGlobalId(expressId) {
78
+ const fromAttr = findAttributeValue(expressId, 'GlobalId');
79
+ if (fromAttr !== undefined && typeof fromAttr === 'string')
80
+ return fromAttr;
81
+ const g = store.entities?.getGlobalId?.(expressId);
82
+ return g || undefined;
83
+ },
84
+ getDescription(expressId) {
85
+ const fromAttr = findAttributeValue(expressId, 'Description');
86
+ if (fromAttr !== undefined && typeof fromAttr === 'string')
87
+ return fromAttr;
88
+ const d = store.entities?.getDescription?.(expressId);
89
+ return d || undefined;
90
+ },
91
+ getAttributeNames(expressId) {
92
+ return extractAllEntityAttributes(store, expressId).map((a) => a.name);
93
+ },
94
+ getAttributeXsdTypes(expressId, attrName) {
95
+ // Resolve the entity's IFC type so the schema lookup scopes to
96
+ // the correct slot — the same attribute can carry different XSD
97
+ // types on different entities.
98
+ const entityType = accessor.getEntityType(expressId);
99
+ if (!entityType)
100
+ return undefined;
101
+ return getAttributeXsdTypes(narrowSchemaVersion(store.schemaVersion), entityType, attrName);
102
+ },
103
+ getPredefinedTypeRaw(expressId) {
104
+ return resolveRawPredefinedType(store, expressId);
105
+ },
106
+ getObjectType(expressId) {
107
+ return resolveObjectType(store, expressId, () => store.entities?.getObjectType?.(expressId));
108
+ },
109
+ getEntitiesByType(typeName) {
110
+ const ids = store.entityIndex?.byType?.get(typeName.toUpperCase());
111
+ return ids ? Array.from(ids) : [];
112
+ },
113
+ getAllEntityIds() {
114
+ const byId = store.entityIndex?.byId;
115
+ return byId ? Array.from(byId.keys()) : [];
116
+ },
117
+ getPropertyValue(expressId, propertySetName, propertyName) {
118
+ const psetLower = propertySetName.toLowerCase();
119
+ const propLower = propertyName.toLowerCase();
120
+ const all = collectAllPropertySets(store, expressId);
121
+ for (const pset of all) {
122
+ if (pset.name.toLowerCase() !== psetLower)
123
+ continue;
124
+ for (const prop of pset.properties || []) {
125
+ if (prop.name.toLowerCase() !== propLower)
126
+ continue;
127
+ return {
128
+ value: prop.value,
129
+ dataType: prop.dataType,
130
+ propertySetName: pset.name,
131
+ propertyName: prop.name,
132
+ };
133
+ }
134
+ }
135
+ return undefined;
136
+ },
137
+ getPropertySets(expressId) {
138
+ return collectAllPropertySets(store, expressId);
139
+ },
140
+ getClassifications(expressId) {
141
+ return resolveClassifications(store, expressId);
142
+ },
143
+ getMaterials(expressId) {
144
+ return flattenMaterials(extractMaterialsOnDemand(store, expressId));
145
+ },
146
+ getParent(expressId, relationType) {
147
+ const all = accessor.getAncestors(expressId, relationType);
148
+ return all.length > 0 ? all[0] : undefined;
149
+ },
150
+ getAncestors(expressId, relationType) {
151
+ const relationships = store.relationships;
152
+ if (!relationships?.getRelated)
153
+ return [];
154
+ const relType = PARTOF_REL_MAP[relationType];
155
+ if (relType === undefined)
156
+ return [];
157
+ // BFS up the graph — IDS partOf is transitive, so any reachable
158
+ // ancestor counts.
159
+ const out = [];
160
+ const seen = new Set([expressId]);
161
+ const queue = [expressId];
162
+ while (queue.length > 0) {
163
+ const id = queue.shift();
164
+ const parents = relationships.getRelated(id, relType, 'inverse');
165
+ for (const parentId of parents || []) {
166
+ if (seen.has(parentId))
167
+ continue;
168
+ seen.add(parentId);
169
+ out.push({
170
+ expressId: parentId,
171
+ entityType: accessor.getEntityType(parentId) || 'Unknown',
172
+ predefinedType: accessor.getObjectType(parentId),
173
+ });
174
+ queue.push(parentId);
175
+ }
176
+ }
177
+ return out;
178
+ },
179
+ getAttribute(expressId, attributeName) {
180
+ const lowerName = attributeName.toLowerCase();
181
+ switch (lowerName) {
182
+ case 'name':
183
+ return accessor.getEntityName(expressId);
184
+ case 'description':
185
+ return accessor.getDescription(expressId);
186
+ case 'globalid':
187
+ return accessor.getGlobalId(expressId);
188
+ case 'objecttype':
189
+ case 'predefinedtype':
190
+ return accessor.getObjectType(expressId);
191
+ default: {
192
+ const fromExtract = findAttributeValue(expressId, attributeName);
193
+ if (fromExtract !== undefined)
194
+ return fromExtract;
195
+ const entities = store.entities;
196
+ return entities?.getAttribute
197
+ ? entities.getAttribute(expressId, attributeName)
198
+ : undefined;
199
+ }
200
+ }
201
+ },
202
+ };
203
+ return accessor;
204
+ }
205
+ //# sourceMappingURL=data-accessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-accessor.js","sourceRoot":"","sources":["../../src/bridge/data-accessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Map the parser's `PropertyValueType` enum (or string-tagged variant)
3
+ * to the IDS-side `IFC*` data-type token consumers compare against.
4
+ * IDS expects names like `IFCLABEL` / `IFCREAL` / `IFCBOOLEAN`; the
5
+ * parser surfaces shape-only enum values plus the underlying IFC
6
+ * measure name on the property record.
7
+ */
8
+ export declare function idsDataTypeForProperty(type: number | string | undefined): string;
9
+ /** QuantityType enum → IDS measure name. */
10
+ export declare function idsDataTypeForQuantity(type: number): string;
11
+ //# sourceMappingURL=data-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-types.d.ts","sourceRoot":"","sources":["../../src/bridge/data-types.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAsBhF;AAED,4CAA4C;AAC5C,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3D"}
@@ -0,0 +1,47 @@
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
+ * Map the parser's `PropertyValueType` enum (or string-tagged variant)
6
+ * to the IDS-side `IFC*` data-type token consumers compare against.
7
+ * IDS expects names like `IFCLABEL` / `IFCREAL` / `IFCBOOLEAN`; the
8
+ * parser surfaces shape-only enum values plus the underlying IFC
9
+ * measure name on the property record.
10
+ */
11
+ export function idsDataTypeForProperty(type) {
12
+ if (typeof type === 'string') {
13
+ if (type.startsWith('IFC') || type.startsWith('Ifc'))
14
+ return type.toUpperCase();
15
+ return 'IFCLABEL';
16
+ }
17
+ // PropertyValueType enum from @ifc-lite/data:
18
+ // 0 String, 1 Real, 2 Integer, 3 Boolean, 4 Logical,
19
+ // 5 Label, 6 Identifier, 7 Text, 8 Enum, 9 Reference, 10 List.
20
+ switch (type) {
21
+ case 0: return 'IFCLABEL';
22
+ case 1: return 'IFCREAL';
23
+ case 2: return 'IFCINTEGER';
24
+ case 3: return 'IFCBOOLEAN';
25
+ case 4: return 'IFCLOGICAL';
26
+ case 5: return 'IFCLABEL';
27
+ case 6: return 'IFCIDENTIFIER';
28
+ case 7: return 'IFCTEXT';
29
+ case 8: return 'IFCLABEL';
30
+ case 9: return 'IFCIDENTIFIER';
31
+ case 10: return 'IFCLABEL';
32
+ default: return 'IFCLABEL';
33
+ }
34
+ }
35
+ /** QuantityType enum → IDS measure name. */
36
+ export function idsDataTypeForQuantity(type) {
37
+ switch (type) {
38
+ case 0: return 'IFCLENGTHMEASURE';
39
+ case 1: return 'IFCAREAMEASURE';
40
+ case 2: return 'IFCVOLUMEMEASURE';
41
+ case 3: return 'IFCCOUNTMEASURE';
42
+ case 4: return 'IFCMASSMEASURE';
43
+ case 5: return 'IFCTIMEMEASURE';
44
+ default: return 'IFCLABEL';
45
+ }
46
+ }
47
+ //# sourceMappingURL=data-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-types.js","sourceRoot":"","sources":["../../src/bridge/data-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAiC;IACtE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAChF,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,8CAA8C;IAC9C,uDAAuD;IACvD,iEAAiE;IACjE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC;QACzB,KAAK,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC;QAC5B,KAAK,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC;QAC5B,KAAK,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC;QAC5B,KAAK,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,OAAO,eAAe,CAAC;QAC/B,KAAK,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC;QACzB,KAAK,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,OAAO,eAAe,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,OAAO,UAAU,CAAC;QAC3B,OAAO,CAAC,CAAC,OAAO,UAAU,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,CAAC,CAAC,CAAC,OAAO,kBAAkB,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,OAAO,gBAAgB,CAAC;QAChC,KAAK,CAAC,CAAC,CAAC,OAAO,kBAAkB,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,OAAO,iBAAiB,CAAC;QACjC,KAAK,CAAC,CAAC,CAAC,OAAO,gBAAgB,CAAC;QAChC,KAAK,CAAC,CAAC,CAAC,OAAO,gBAAgB,CAAC;QAChC,OAAO,CAAC,CAAC,OAAO,UAAU,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * IDS data-store bridge.
3
+ *
4
+ * Builds an `IFCDataAccessor` (the abstract interface the IDS validator
5
+ * consumes) from an `IfcDataStore` produced by `@ifc-lite/parser`. This
6
+ * is the single canonical translation — viewer, MCP server, and the
7
+ * corpus-parity harness all consume it instead of re-implementing the
8
+ * same projection.
9
+ *
10
+ * Mirrors upstream `IfcOpenShell/ifctester` semantics: classification
11
+ * sub-reference walking, IfcExternalReferenceRelationship for
12
+ * non-rooted resources, length unit conversion, predefined property-set
13
+ * unwrapping, schema-driven attribute XSD types, etc.
14
+ */
15
+ export { createDataAccessor } from './data-accessor.js';
16
+ export { narrowSchemaVersion } from './schema-version.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
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
+ * IDS data-store bridge.
6
+ *
7
+ * Builds an `IFCDataAccessor` (the abstract interface the IDS validator
8
+ * consumes) from an `IfcDataStore` produced by `@ifc-lite/parser`. This
9
+ * is the single canonical translation — viewer, MCP server, and the
10
+ * corpus-parity harness all consume it instead of re-implementing the
11
+ * same projection.
12
+ *
13
+ * Mirrors upstream `IfcOpenShell/ifctester` semantics: classification
14
+ * sub-reference walking, IfcExternalReferenceRelationship for
15
+ * non-rooted resources, length unit conversion, predefined property-set
16
+ * unwrapping, schema-driven attribute XSD types, etc.
17
+ */
18
+ export { createDataAccessor } from './data-accessor.js';
19
+ export { narrowSchemaVersion } from './schema-version.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { extractMaterialsOnDemand } from '@ifc-lite/parser';
2
+ import type { MaterialInfo } from '../types.js';
3
+ /**
4
+ * Flatten the parser's hierarchical material graph into the flat
5
+ * `{name, category}[]` array the IDS validator consumes. Surfaces
6
+ * every name AND category as a candidate match — IDS material
7
+ * `<value>` fixtures pass when ANY surface matches the constraint, so
8
+ * we proactively duplicate categories under their own entries.
9
+ */
10
+ export declare function flattenMaterials(matInfo: ReturnType<typeof extractMaterialsOnDemand>): MaterialInfo[];
11
+ //# sourceMappingURL=materials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../src/bridge/materials.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,GACnD,YAAY,EAAE,CAwDhB"}
@@ -0,0 +1,68 @@
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
+ * Flatten the parser's hierarchical material graph into the flat
6
+ * `{name, category}[]` array the IDS validator consumes. Surfaces
7
+ * every name AND category as a candidate match — IDS material
8
+ * `<value>` fixtures pass when ANY surface matches the constraint, so
9
+ * we proactively duplicate categories under their own entries.
10
+ */
11
+ export function flattenMaterials(matInfo) {
12
+ if (!matInfo)
13
+ return [];
14
+ const out = [];
15
+ const push = (name, category) => {
16
+ if (!name)
17
+ return;
18
+ out.push({ name, category });
19
+ };
20
+ switch (matInfo.type) {
21
+ case 'Material':
22
+ push(matInfo.name, matInfo.category);
23
+ if (matInfo.category)
24
+ push(matInfo.category, matInfo.category);
25
+ break;
26
+ case 'MaterialList':
27
+ for (const m of matInfo.materials || []) {
28
+ if (typeof m === 'string') {
29
+ push(m);
30
+ }
31
+ else if (m && typeof m === 'object') {
32
+ push(m.name, m.category);
33
+ if (m.category)
34
+ push(m.category, m.category);
35
+ }
36
+ }
37
+ break;
38
+ case 'MaterialLayerSet':
39
+ push(matInfo.name);
40
+ for (const layer of matInfo.layers || []) {
41
+ push(layer.materialName, layer.category);
42
+ push(layer.name, layer.category);
43
+ if (layer.materialCategory)
44
+ push(layer.materialCategory, layer.materialCategory);
45
+ }
46
+ break;
47
+ case 'MaterialConstituentSet':
48
+ push(matInfo.name);
49
+ for (const c of matInfo.constituents || []) {
50
+ push(c.materialName, c.category);
51
+ push(c.name, c.category);
52
+ if (c.materialCategory)
53
+ push(c.materialCategory, c.materialCategory);
54
+ }
55
+ break;
56
+ case 'MaterialProfileSet':
57
+ push(matInfo.name);
58
+ for (const p of matInfo.profiles || []) {
59
+ push(p.materialName, p.category);
60
+ push(p.name, p.category);
61
+ if (p.materialCategory)
62
+ push(p.materialCategory, p.materialCategory);
63
+ }
64
+ break;
65
+ }
66
+ return out;
67
+ }
68
+ //# sourceMappingURL=materials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materials.js","sourceRoot":"","sources":["../../src/bridge/materials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type IfcDataStore } from '@ifc-lite/parser';
2
+ /**
3
+ * Resolve the raw `PredefinedType` enum token (e.g. `USERDEFINED`,
4
+ * `NOTDEFINED`, `BEAM`) for an entity, walking through
5
+ * `IfcRelDefinesByType` if the instance has none of its own.
6
+ *
7
+ * Returns `undefined` when neither the instance nor its defining type
8
+ * carry a predefined-type slot.
9
+ */
10
+ export declare function resolveRawPredefinedType(store: IfcDataStore, expressId: number): string | undefined;
11
+ /**
12
+ * Resolve the IDS-side "object type" — either the predefined enum
13
+ * value, or (when `USERDEFINED`) the user-defined name from the
14
+ * adjacent `ElementType` / `ObjectType` / `ProcessType` /
15
+ * `ResourceType` slot. Walks `IfcRelDefinesByType` if the instance
16
+ * carries neither.
17
+ */
18
+ export declare function resolveObjectType(store: IfcDataStore, expressId: number, fallbackObjectType: () => string | undefined): string | undefined;
19
+ //# sourceMappingURL=predefined-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predefined-types.d.ts","sourceRoot":"","sources":["../../src/bridge/predefined-types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAA8B,MAAM,kBAAkB,CAAC;AAGjF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAwBpB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,MAAM,GAAG,SAAS,GAC3C,MAAM,GAAG,SAAS,CA2DpB"}
@@ -0,0 +1,84 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { extractAllEntityAttributes } from '@ifc-lite/parser';
5
+ import { RelationshipType } from '@ifc-lite/data';
6
+ /**
7
+ * Resolve the raw `PredefinedType` enum token (e.g. `USERDEFINED`,
8
+ * `NOTDEFINED`, `BEAM`) for an entity, walking through
9
+ * `IfcRelDefinesByType` if the instance has none of its own.
10
+ *
11
+ * Returns `undefined` when neither the instance nor its defining type
12
+ * carry a predefined-type slot.
13
+ */
14
+ export function resolveRawPredefinedType(store, expressId) {
15
+ const allAttrs = extractAllEntityAttributes(store, expressId);
16
+ const pdt = allAttrs.find((a) => a.name === 'PredefinedType');
17
+ const pdtValue = typeof pdt?.value === 'string' && pdt.value ? pdt.value : undefined;
18
+ if (pdtValue && pdtValue !== 'NOTDEFINED')
19
+ return pdtValue;
20
+ // Inherit from the defining type (IfcRelDefinesByType).
21
+ const typeIds = store.relationships?.getRelated?.(expressId, RelationshipType.DefinesByType, 'inverse') || [];
22
+ for (const typeId of typeIds) {
23
+ const typeAttrs = extractAllEntityAttributes(store, typeId);
24
+ const typePdt = typeAttrs.find((a) => a.name === 'PredefinedType');
25
+ const typeVal = typeof typePdt?.value === 'string' && typePdt.value
26
+ ? typePdt.value
27
+ : undefined;
28
+ if (typeVal && typeVal !== 'NOTDEFINED')
29
+ return typeVal;
30
+ }
31
+ return pdtValue;
32
+ }
33
+ /**
34
+ * Resolve the IDS-side "object type" — either the predefined enum
35
+ * value, or (when `USERDEFINED`) the user-defined name from the
36
+ * adjacent `ElementType` / `ObjectType` / `ProcessType` /
37
+ * `ResourceType` slot. Walks `IfcRelDefinesByType` if the instance
38
+ * carries neither.
39
+ */
40
+ export function resolveObjectType(store, expressId, fallbackObjectType) {
41
+ const allAttrs = extractAllEntityAttributes(store, expressId);
42
+ const pdt = allAttrs.find((a) => a.name === 'PredefinedType');
43
+ const pdtValue = pdt?.value;
44
+ if (typeof pdtValue === 'string' &&
45
+ pdtValue &&
46
+ pdtValue !== 'NOTDEFINED' &&
47
+ pdtValue !== 'USERDEFINED') {
48
+ return pdtValue;
49
+ }
50
+ const userSlot = allAttrs.find((a) => a.name === 'ElementType') ||
51
+ allAttrs.find((a) => a.name === 'ObjectType') ||
52
+ allAttrs.find((a) => a.name === 'ProcessType') ||
53
+ allAttrs.find((a) => a.name === 'ResourceType');
54
+ if (userSlot && typeof userSlot.value === 'string' && userSlot.value) {
55
+ return userSlot.value;
56
+ }
57
+ // Inherit from defining type when the instance has neither.
58
+ const typeIds = store.relationships?.getRelated?.(expressId, RelationshipType.DefinesByType, 'inverse') || [];
59
+ for (const typeId of typeIds) {
60
+ const typeAttrs = extractAllEntityAttributes(store, typeId);
61
+ const typePdt = typeAttrs.find((a) => a.name === 'PredefinedType');
62
+ const typePdtValue = typePdt?.value;
63
+ if (typeof typePdtValue === 'string' &&
64
+ typePdtValue &&
65
+ typePdtValue !== 'NOTDEFINED' &&
66
+ typePdtValue !== 'USERDEFINED') {
67
+ return typePdtValue;
68
+ }
69
+ const typeUserSlot = typeAttrs.find((a) => a.name === 'ElementType') ||
70
+ typeAttrs.find((a) => a.name === 'ObjectType') ||
71
+ typeAttrs.find((a) => a.name === 'ProcessType') ||
72
+ typeAttrs.find((a) => a.name === 'ResourceType');
73
+ if (typeUserSlot &&
74
+ typeof typeUserSlot.value === 'string' &&
75
+ typeUserSlot.value) {
76
+ return typeUserSlot.value;
77
+ }
78
+ }
79
+ const fallback = fallbackObjectType();
80
+ if (fallback)
81
+ return fallback;
82
+ return typeof pdtValue === 'string' && pdtValue ? pdtValue : undefined;
83
+ }
84
+ //# sourceMappingURL=predefined-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predefined-types.js","sourceRoot":"","sources":["../../src/bridge/predefined-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type IfcDataStore } from '@ifc-lite/parser';
2
+ import type { PropertySetInfo } from '../types.js';
3
+ /**
4
+ * IDS treats `IfcElementQuantity` (Qto_*) and `IfcPropertySet` (Pset_*)
5
+ * uniformly — both surface as "property sets" with named values. The
6
+ * parser stores them in separate columnar tables, so we merge here.
7
+ *
8
+ * Surfaces three sources:
9
+ * 1. The instance's own property sets (IfcPropertySet via
10
+ * IfcRelDefinesByProperties).
11
+ * 2. Predefined property sets (IfcDoorPanelProperties etc.) where
12
+ * the entity's schema-defined attributes act as property names.
13
+ * 3. Inherited property sets from `IfcRelDefinesByType`.
14
+ *
15
+ * Length-typed properties are converted to base SI units per the
16
+ * project's `lengthUnitScale` so IDS literals (always in metres)
17
+ * compare correctly.
18
+ */
19
+ export declare function collectAllPropertySets(store: IfcDataStore, expressId: number): PropertySetInfo[];
20
+ //# sourceMappingURL=properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../src/bridge/properties.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,YAAY,EAMlB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAYnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB,eAAe,EAAE,CAanB"}