@ifc-lite/cli 0.28.0 → 0.29.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 (57) hide show
  1. package/dist/commands/analyze.d.ts.map +1 -1
  2. package/dist/commands/analyze.js +9 -2
  3. package/dist/commands/analyze.js.map +1 -1
  4. package/dist/commands/bcf.js +1 -1
  5. package/dist/commands/bcf.js.map +1 -1
  6. package/dist/commands/diff-test-helpers.d.ts +7 -4
  7. package/dist/commands/diff-test-helpers.d.ts.map +1 -1
  8. package/dist/commands/diff-test-helpers.js +7 -4
  9. package/dist/commands/diff-test-helpers.js.map +1 -1
  10. package/dist/commands/export-rust-formats.d.ts +11 -0
  11. package/dist/commands/export-rust-formats.d.ts.map +1 -0
  12. package/dist/commands/export-rust-formats.js +185 -0
  13. package/dist/commands/export-rust-formats.js.map +1 -0
  14. package/dist/commands/export.d.ts +9 -0
  15. package/dist/commands/export.d.ts.map +1 -1
  16. package/dist/commands/export.js +36 -148
  17. package/dist/commands/export.js.map +1 -1
  18. package/dist/commands/extract-entities.d.ts +23 -18
  19. package/dist/commands/extract-entities.d.ts.map +1 -1
  20. package/dist/commands/extract-entities.js +86 -133
  21. package/dist/commands/extract-entities.js.map +1 -1
  22. package/dist/commands/info.d.ts.map +1 -1
  23. package/dist/commands/info.js +56 -0
  24. package/dist/commands/info.js.map +1 -1
  25. package/dist/commands/mutate-step-record.d.ts +33 -0
  26. package/dist/commands/mutate-step-record.d.ts.map +1 -0
  27. package/dist/commands/mutate-step-record.js +267 -0
  28. package/dist/commands/mutate-step-record.js.map +1 -0
  29. package/dist/commands/mutate.d.ts +2 -13
  30. package/dist/commands/mutate.d.ts.map +1 -1
  31. package/dist/commands/mutate.js +4 -105
  32. package/dist/commands/mutate.js.map +1 -1
  33. package/dist/commands/query-output.d.ts.map +1 -1
  34. package/dist/commands/query-output.js +33 -6
  35. package/dist/commands/query-output.js.map +1 -1
  36. package/dist/commands/spatial-ancestors.d.ts +26 -0
  37. package/dist/commands/spatial-ancestors.d.ts.map +1 -0
  38. package/dist/commands/spatial-ancestors.js +102 -0
  39. package/dist/commands/spatial-ancestors.js.map +1 -0
  40. package/dist/commands/step-args.d.ts +140 -0
  41. package/dist/commands/step-args.d.ts.map +1 -0
  42. package/dist/commands/step-args.js +333 -0
  43. package/dist/commands/step-args.js.map +1 -0
  44. package/dist/commands/storey-selection.d.ts +6 -0
  45. package/dist/commands/storey-selection.d.ts.map +1 -0
  46. package/dist/commands/storey-selection.js +90 -0
  47. package/dist/commands/storey-selection.js.map +1 -0
  48. package/dist/commands/subset-relations.d.ts +201 -0
  49. package/dist/commands/subset-relations.d.ts.map +1 -0
  50. package/dist/commands/subset-relations.js +277 -0
  51. package/dist/commands/subset-relations.js.map +1 -0
  52. package/dist/commands/where-filter.d.ts +1 -0
  53. package/dist/commands/where-filter.d.ts.map +1 -1
  54. package/dist/commands/where-filter.js +7 -3
  55. package/dist/commands/where-filter.js.map +1 -1
  56. package/dist/index.js +1 -1
  57. package/package.json +19 -19
@@ -0,0 +1,277 @@
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
+ * Spatial-structure relations, as `[relatingAttributeIndex, relatedAttributeIndex]`.
6
+ * `IfcRelAggregates` names the whole (`RelatingObject`) first; the two containment
7
+ * relations name the parts (`RelatedElements`) first. Same table as `STRUCTURE_RELATIONS`
8
+ * in `@ifc-lite/export`'s `merged-empty-containers.ts`, which reads the same three
9
+ * records, copied rather than imported because that module is internal to
10
+ * `@ifc-lite/export` and exporting it would widen a published API surface for a
11
+ * three-line constant.
12
+ *
13
+ * `IfcRelReferencedInSpatialStructure` is here for the same reason the other two are:
14
+ * same shape (one relating parent, one related SET), same one-per-storey authoring,
15
+ * same claim in the command's own docs that the output "parses and renders on its
16
+ * own". It used to be missing entirely, so a referenced-but-not-contained product was
17
+ * always orphaned.
18
+ */
19
+ export const STRUCTURE_RELATIONS = {
20
+ IFCRELAGGREGATES: [4, 5],
21
+ IFCRELCONTAINEDINSPATIALSTRUCTURE: [5, 4],
22
+ IFCRELREFERENCEDINSPATIALSTRUCTURE: [5, 4],
23
+ };
24
+ /**
25
+ * All three are `GlobalId, OwnerHistory, Name, Description` plus the relating/related
26
+ * pair: exactly 6 attributes in every schema that defines them. A record that does not
27
+ * split into 6 was mis-scanned (or is not the entity the type name claims), so it falls
28
+ * back to keep-whole-or-drop-whole rather than having a slot index written into
29
+ * whatever it did split into.
30
+ *
31
+ * A relation type with a different attribute COUNT (`IfcRelAssignsToGroup` has 7)
32
+ * therefore cannot simply be added as a row above: it would fail this check on every
33
+ * record and fall silently back to keep-whole-or-drop-whole, which is the bug this
34
+ * module exists to fix. Such a type needs the count moved into the table value first,
35
+ * or the whole table derived from the schema registry, which returns 7 for that entity
36
+ * and would make row four safe rather than forbidden. Filed as #4123.
37
+ */
38
+ export const STRUCTURE_RELATION_ATTRS = 6;
39
+ /** A single `#id` and nothing else: an object reference in one slot. */
40
+ export const SINGLE_REF_RE = /^#(\d+)$/;
41
+ /**
42
+ * Decide every spatial-structure relation against a kept-id set.
43
+ *
44
+ * Pure in both arguments: adding relation ids to `keep` afterwards cannot
45
+ * change any verdict, because a relation of these types references products,
46
+ * spatial containers and an OwnerHistory, never another relation.
47
+ */
48
+ export function planSpatialRelations(instances, keep) {
49
+ const add = [];
50
+ const rewritten = new Map();
51
+ const blockedOn = [];
52
+ for (const inst of instances) {
53
+ const slots = STRUCTURE_RELATIONS[inst.type];
54
+ if (slots === undefined)
55
+ continue;
56
+ const line = relationLine(inst, slots, keep, blockedOn);
57
+ if (line === null)
58
+ continue;
59
+ add.push(inst.id);
60
+ if (line !== inst.full)
61
+ rewritten.set(inst.id, line);
62
+ }
63
+ return { add, rewritten, blockedOn };
64
+ }
65
+ /**
66
+ * The record text this relation contributes to the subset, or null to drop it.
67
+ * Returns `inst.full` unchanged when nothing was filtered out. Appends ONE entry
68
+ * to `blocked` when the ONLY thing standing in the way is unkept non-SET
69
+ * references; see {@link SpatialRelationPlan.blockedOn}.
70
+ */
71
+ function relationLine(inst, [relatingIdx, relatedIdx], keep, blocked) {
72
+ // A null is a REJECTED scan, not an empty list: its parts are wherever the
73
+ // scanner happened to be, so reading `args[relatingIdx]` or writing
74
+ // `args[relatedIdx]` by index would land on the wrong attribute (#2470).
75
+ const args = splitTopLevelArgs(inst.body);
76
+ if (args === null || args.length !== STRUCTURE_RELATION_ATTRS)
77
+ return keepWhole(inst, keep);
78
+ const setText = args[relatedIdx];
79
+ if (!setText.startsWith('(') || !setText.endsWith(')'))
80
+ return keepWhole(inst, keep);
81
+ const members = splitTopLevelArgs(setText.slice(1, -1));
82
+ if (members === null)
83
+ return keepWhole(inst, keep);
84
+ const memberIds = [];
85
+ for (const member of members) {
86
+ const ref = SINGLE_REF_RE.exec(member);
87
+ // A SET member that is not a plain object reference is not something this
88
+ // rewrite understands; fall back rather than guess at it.
89
+ if (ref === null)
90
+ return keepWhole(inst, keep);
91
+ memberIds.push(Number(ref[1]));
92
+ }
93
+ // The relating parent must be a real, kept reference. The `every reference
94
+ // outside the SET is kept` loop below would pass VACUOUSLY on a `$` here,
95
+ // emitting a containment with no parent.
96
+ const relating = SINGLE_REF_RE.exec(args[relatingIdx]);
97
+ if (relating === null || !keep.has(Number(relating[1])))
98
+ return null;
99
+ const kept = memberIds.filter((id) => keep.has(id));
100
+ if (kept.length === 0)
101
+ return null;
102
+ // Every other non-set reference (OwnerHistory) must be kept or the emitted
103
+ // record dangles. Ordered AFTER the intersection so `blocked` names only the
104
+ // references of a relation that would OTHERWISE survive; both checks drop the
105
+ // relation, so which one runs first changes no verdict.
106
+ const unkept = [];
107
+ for (let i = 0; i < args.length; i++) {
108
+ if (i === relatedIdx)
109
+ continue;
110
+ for (const id of refsOutsideStrings(args[i])) {
111
+ if (!keep.has(id))
112
+ unkept.push(id);
113
+ }
114
+ }
115
+ if (unkept.length > 0) {
116
+ blocked.push(unkept);
117
+ return null;
118
+ }
119
+ if (kept.length === memberIds.length)
120
+ return inst.full;
121
+ return spliceArgument(inst, args, relatedIdx, `(${kept.map((id) => `#${id}`).join(',')})`);
122
+ }
123
+ /**
124
+ * The `#id` object references in one argument, ignoring any that sit inside a
125
+ * STEP string literal.
126
+ *
127
+ * A relation's `Name` and `Description` are free TEXT, and free text contains
128
+ * `#`; `parseStep` tokenizes rather than regexes precisely because Revit
129
+ * writes names like that. Read raw, the `#99` in `'Level #99 contents'` looks
130
+ * like a reference to entity 99, and one unkept lookalike drops the WHOLE
131
+ * relation: the orphaned-storey bug this module exists to fix, re-created for
132
+ * any model that names a relation that way.
133
+ *
134
+ * Correct only on an argument whose split VALIDATED, so the quote boundaries
135
+ * are the record's own. {@link keepWhole} deliberately does NOT use this. It
136
+ * runs when the split FAILED, and also when it succeeded but the record is not
137
+ * the six-attribute shape this module rewrites, so its boundaries are not
138
+ * established in general. There, over-counting references (drop the record) is
139
+ * the safe error, while under-counting (emit a dangling `#id`) is not.
140
+ *
141
+ * Exported for `extract-entities.ts`'s `forwardClosure`, which has the same
142
+ * hazard scanning a whole record body for its reference closure: nothing here
143
+ * assumes `arg` is one split ARGUMENT rather than a whole body, since a comma
144
+ * or `)` outside a string does not affect the in-string/out-of-string state
145
+ * this walks.
146
+ */
147
+ export function refsOutsideStrings(arg) {
148
+ const ids = [];
149
+ let inString = false;
150
+ for (let i = 0; i < arg.length; i++) {
151
+ const char = arg[i];
152
+ if (inString) {
153
+ if (char === "'") {
154
+ if (arg[i + 1] === "'")
155
+ i++;
156
+ else
157
+ inString = false;
158
+ }
159
+ continue;
160
+ }
161
+ if (char === "'") {
162
+ inString = true;
163
+ }
164
+ else if (char === '#') {
165
+ let end = i + 1;
166
+ while (end < arg.length && arg[end] >= '0' && arg[end] <= '9')
167
+ end++;
168
+ if (end > i + 1)
169
+ ids.push(Number(arg.slice(i + 1, end)));
170
+ i = end - 1;
171
+ }
172
+ }
173
+ return ids;
174
+ }
175
+ /**
176
+ * Keep-whole-or-drop-whole, for a record this module could not scan, or could
177
+ * not read as its six attributes. Reads references straight off the raw body,
178
+ * so it needs no argument boundaries to be correct. Same no-dangling guarantee,
179
+ * no rewriting.
180
+ */
181
+ function keepWhole(inst, keep) {
182
+ const refs = [...inst.body.matchAll(/#(\d+)/g)].map((m) => Number(m[1]));
183
+ return refs.length > 0 && refs.every((r) => keep.has(r)) ? inst.full : null;
184
+ }
185
+ /**
186
+ * Re-emit the record with ONE top-level argument replaced. Rejoining the split
187
+ * arguments normalizes only the whitespace BETWEEN them (each argument's own
188
+ * text is untouched), and this runs only for a relation that actually lost a
189
+ * member, so an unfiltered subset stays byte-identical.
190
+ */
191
+ function spliceArgument(inst, args, index, replacement) {
192
+ const open = inst.full.indexOf('(');
193
+ // `body` is by construction the slice of `full` between its first `(` and the
194
+ // matching `)`: the id and type name that precede it hold no parenthesis. A
195
+ // mismatch would mean the parser and this module disagree about where the
196
+ // arguments are, and splicing on that offset corrupts the record, so drop it
197
+ // instead of emitting something malformed.
198
+ if (open < 0 || inst.full.slice(open + 1, open + 1 + inst.body.length) !== inst.body)
199
+ return null;
200
+ const next = [...args];
201
+ next[index] = replacement;
202
+ return inst.full.slice(0, open + 1) + next.join(',') + inst.full.slice(open + 1 + inst.body.length);
203
+ }
204
+ /**
205
+ * Skip a `/* ... *\/` comment atomically: index of `/` in, index past its
206
+ * close marker (or end-of-text when unterminated) out. Byte-identical copy of
207
+ * `@ifc-lite/export`'s `skipStepComment` (not imported, see the module
208
+ * header): #4227's third copy of the same missing logic.
209
+ */
210
+ function skipStepComment(text, i) {
211
+ const end = text.indexOf('*/', i + 2);
212
+ return end === -1 ? text.length : end + 2;
213
+ }
214
+ /**
215
+ * Split a STEP argument list on top-level commas, respecting nested parens,
216
+ * quoted strings, doubled-quote escapes, and `/* ... *\/` comments (#4227).
217
+ * Returns null on an unterminated string, an unbalanced paren depth, or a
218
+ * depth that ever goes negative -- {@link relationLine} writes a slot by
219
+ * index (#2470), so a mis-scanned list must not hand back parts that look
220
+ * like success. A comma/paren/quote inside a comment is skipped with it (see
221
+ * {@link skipStepComment}): unskipped, its comma shifts every later slot
222
+ * boundary and `relationLine` either mis-splices a member or falls back to
223
+ * {@link keepWhole}, dropping a relation that should have survived -- the
224
+ * orphaned-storey symptom (#4126) this module exists to fix, by a different
225
+ * route. An EMPTY INTERIOR slot (`a,,b`) is one part, not rejected.
226
+ *
227
+ * Near-twin of `@ifc-lite/export`'s `splitTopLevelStepArguments` (see the
228
+ * module header). Two differences: each part is `trim`med (because
229
+ * {@link SINGLE_REF_RE} is anchored), and a TRAILING empty slot (`a,b,`)
230
+ * yields 2 parts, not 3.
231
+ */
232
+ export function splitTopLevelArgs(text) {
233
+ const parts = [];
234
+ let start = 0;
235
+ let depth = 0;
236
+ let inString = false;
237
+ for (let i = 0; i < text.length; i++) {
238
+ const char = text[i];
239
+ if (inString) {
240
+ if (char === "'") {
241
+ // A doubled quote is an escaped quote, not the end of the string.
242
+ if (text[i + 1] === "'")
243
+ i++;
244
+ else
245
+ inString = false;
246
+ }
247
+ continue;
248
+ }
249
+ if (char === '/' && text[i + 1] === '*') {
250
+ // See skipStepComment's docstring: its content is skipped as one unit,
251
+ // not read as argument-list structure.
252
+ i = skipStepComment(text, i) - 1;
253
+ }
254
+ else if (char === "'") {
255
+ inString = true;
256
+ }
257
+ else if (char === '(') {
258
+ depth++;
259
+ }
260
+ else if (char === ')') {
261
+ depth--;
262
+ if (depth < 0)
263
+ return null;
264
+ }
265
+ else if (char === ',' && depth === 0) {
266
+ parts.push(text.slice(start, i).trim());
267
+ start = i + 1;
268
+ }
269
+ }
270
+ if (inString || depth !== 0)
271
+ return null;
272
+ const tail = text.slice(start).trim();
273
+ if (tail)
274
+ parts.push(tail);
275
+ return parts;
276
+ }
277
+ //# sourceMappingURL=subset-relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subset-relations.js","sourceRoot":"","sources":["../../src/commands/subset-relations.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ import { normalizeBooleanValue } from '@ifc-lite/query';
14
14
  * PsetName.PropName>=Value (greater or equal)
15
15
  * PsetName.PropName<=Value (less or equal)
16
16
  * PsetName.PropName~Value (contains)
17
+ * PsetName.PropName~=Pattern (regex match — see `matches` on FilterComparisonOp)
17
18
  * PsetName.PropName (exists)
18
19
  */
19
20
  export declare function parseWhereFilter(filter: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"where-filter.d.ts","sourceRoot":"","sources":["../../src/commands/where-filter.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,EAIL,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBzH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAoB9G;AAMD,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGlG;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"where-filter.d.ts","sourceRoot":"","sources":["../../src/commands/where-filter.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,EAIL,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBzH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAoB9G;AAMD,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGlG;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -18,6 +18,7 @@ import { fatal } from '../output.js';
18
18
  * PsetName.PropName>=Value (greater or equal)
19
19
  * PsetName.PropName<=Value (less or equal)
20
20
  * PsetName.PropName~Value (contains)
21
+ * PsetName.PropName~=Pattern (regex match — see `matches` on FilterComparisonOp)
21
22
  * PsetName.PropName (exists)
22
23
  */
23
24
  export function parseWhereFilter(filter) {
@@ -27,13 +28,16 @@ export function parseWhereFilter(filter) {
27
28
  }
28
29
  const psetName = filter.slice(0, dotIdx);
29
30
  const rest = filter.slice(dotIdx + 1);
30
- // Try multi-char operators first, then single-char
31
- for (const op of ['!=', '>=', '<=', '>', '<', '=', '~']) {
31
+ // Try multi-char operators first, then single-char. `~=` MUST be checked
32
+ // before both `=` and `~` either alone would split "Prop~=pattern" wrong
33
+ // (matching bare `=` mid-token, or bare `~` and leaving a stray `=` in the
34
+ // value).
35
+ for (const op of ['!=', '>=', '<=', '~=', '>', '<', '=', '~']) {
32
36
  const opIdx = rest.indexOf(op);
33
37
  if (opIdx > 0) {
34
38
  const propName = rest.slice(0, opIdx);
35
39
  const value = rest.slice(opIdx + op.length);
36
- const mappedOp = op === '~' ? 'contains' : op;
40
+ const mappedOp = op === '~' ? 'contains' : op === '~=' ? 'matches' : op;
37
41
  return { psetName, propName, operator: mappedOp, value };
38
42
  }
39
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"where-filter.js","sourceRoot":"","sources":["../../src/commands/where-filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"where-filter.js","sourceRoot":"","sources":["../../src/commands/where-filter.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -145,7 +145,7 @@ const HELP = `
145
145
  ifc-lite diagnose-geometry model.ifc --type IfcWall
146
146
  ifc-lite diagnose-geometry model.ifc --product 0YvCT2_$X3_xJG3rzD8L_8
147
147
  ifc-lite ids model.ifc requirements.ids --json
148
- ifc-lite bcf create --title "Missing door" --out issue.bcf
148
+ ifc-lite bcf create --title "Missing door" --out topic.bcf
149
149
  ifc-lite clash model.ifc --matrix --json
150
150
  ifc-lite clash model.ifc --a "IfcDuct*|IfcPipe*" --b "IfcWall*" --mode clearance --clearance 0.05
151
151
  ifc-lite clash model.ifc --matrix --bcf clashes.bcfzip
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/cli",
3
- "version": "0.28.0",
3
+ "version": "0.29.1",
4
4
  "description": "CLI toolkit for IFC files — query, validate, export, create, and script BIM data",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,28 +20,28 @@
20
20
  "README.md"
21
21
  ],
22
22
  "dependencies": {
23
- "@ifc-lite/bcf": "^3.0.0",
24
- "@ifc-lite/clash": "^2.1.0",
25
- "@ifc-lite/create": "^2.2.1",
26
- "@ifc-lite/data": "^4.0.0",
23
+ "@ifc-lite/bcf": "^4.0.0",
24
+ "@ifc-lite/clash": "^2.1.2",
25
+ "@ifc-lite/create": "^2.4.0",
26
+ "@ifc-lite/data": "^4.2.0",
27
27
  "@ifc-lite/diff": "^0.8.0",
28
- "@ifc-lite/export": "^4.0.0",
29
- "@ifc-lite/geometry": "^4.2.0",
30
- "@ifc-lite/ids": "^1.15.54",
28
+ "@ifc-lite/export": "^4.2.0",
29
+ "@ifc-lite/geometry": "^5.0.0",
30
+ "@ifc-lite/extensions": "^0.7.0",
31
+ "@ifc-lite/ids": "^1.16.2",
32
+ "@ifc-lite/ifcx": "^4.1.0",
31
33
  "@ifc-lite/merge": "^0.4.5",
32
- "@ifc-lite/extensions": "^0.6.0",
33
- "@ifc-lite/ifcx": "^4.0.0",
34
- "@ifc-lite/mcp": "^0.13.0",
35
- "@ifc-lite/mutations": "^2.0.0",
36
- "@ifc-lite/query": "^2.1.0",
37
- "@ifc-lite/sandbox": "^2.2.2",
38
- "@ifc-lite/parser": "^5.1.0",
39
- "@ifc-lite/sdk": "^4.0.1",
40
- "@ifc-lite/viewer-core": "^0.2.15",
41
- "@ifc-lite/wasm": "^6.3.0"
34
+ "@ifc-lite/mutations": "^2.2.0",
35
+ "@ifc-lite/parser": "^6.1.0",
36
+ "@ifc-lite/query": "^2.3.1",
37
+ "@ifc-lite/sdk": "^5.0.0",
38
+ "@ifc-lite/mcp": "^0.14.1",
39
+ "@ifc-lite/viewer-core": "^0.2.16",
40
+ "@ifc-lite/wasm": "^7.0.0",
41
+ "@ifc-lite/sandbox": "^2.2.4"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/node": "^26.4.0",
44
+ "@types/node": "^26.4.1",
45
45
  "typescript": "^6.0.3",
46
46
  "vitest": "^4.1.11"
47
47
  },