@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.
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +9 -2
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/bcf.js +1 -1
- package/dist/commands/bcf.js.map +1 -1
- package/dist/commands/diff-test-helpers.d.ts +7 -4
- package/dist/commands/diff-test-helpers.d.ts.map +1 -1
- package/dist/commands/diff-test-helpers.js +7 -4
- package/dist/commands/diff-test-helpers.js.map +1 -1
- package/dist/commands/export-rust-formats.d.ts +11 -0
- package/dist/commands/export-rust-formats.d.ts.map +1 -0
- package/dist/commands/export-rust-formats.js +185 -0
- package/dist/commands/export-rust-formats.js.map +1 -0
- package/dist/commands/export.d.ts +9 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +36 -148
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/extract-entities.d.ts +23 -18
- package/dist/commands/extract-entities.d.ts.map +1 -1
- package/dist/commands/extract-entities.js +86 -133
- package/dist/commands/extract-entities.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +56 -0
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/mutate-step-record.d.ts +33 -0
- package/dist/commands/mutate-step-record.d.ts.map +1 -0
- package/dist/commands/mutate-step-record.js +267 -0
- package/dist/commands/mutate-step-record.js.map +1 -0
- package/dist/commands/mutate.d.ts +2 -13
- package/dist/commands/mutate.d.ts.map +1 -1
- package/dist/commands/mutate.js +4 -105
- package/dist/commands/mutate.js.map +1 -1
- package/dist/commands/query-output.d.ts.map +1 -1
- package/dist/commands/query-output.js +33 -6
- package/dist/commands/query-output.js.map +1 -1
- package/dist/commands/spatial-ancestors.d.ts +26 -0
- package/dist/commands/spatial-ancestors.d.ts.map +1 -0
- package/dist/commands/spatial-ancestors.js +102 -0
- package/dist/commands/spatial-ancestors.js.map +1 -0
- package/dist/commands/step-args.d.ts +140 -0
- package/dist/commands/step-args.d.ts.map +1 -0
- package/dist/commands/step-args.js +333 -0
- package/dist/commands/step-args.js.map +1 -0
- package/dist/commands/storey-selection.d.ts +6 -0
- package/dist/commands/storey-selection.d.ts.map +1 -0
- package/dist/commands/storey-selection.js +90 -0
- package/dist/commands/storey-selection.js.map +1 -0
- package/dist/commands/subset-relations.d.ts +201 -0
- package/dist/commands/subset-relations.d.ts.map +1 -0
- package/dist/commands/subset-relations.js +277 -0
- package/dist/commands/subset-relations.js.map +1 -0
- package/dist/commands/where-filter.d.ts +1 -0
- package/dist/commands/where-filter.d.ts.map +1 -1
- package/dist/commands/where-filter.js +7 -3
- package/dist/commands/where-filter.js.map +1 -1
- package/dist/index.js +1 -1
- 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
|
|
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
|
-
|
|
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":"AAAA;;+DAE+D;AAE/D;;;;GAIG;AAEH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,GAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC
|
|
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
|
|
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.
|
|
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": "^
|
|
24
|
-
"@ifc-lite/clash": "^2.1.
|
|
25
|
-
"@ifc-lite/create": "^2.
|
|
26
|
-
"@ifc-lite/data": "^4.
|
|
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.
|
|
29
|
-
"@ifc-lite/geometry": "^
|
|
30
|
-
"@ifc-lite/
|
|
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/
|
|
33
|
-
"@ifc-lite/
|
|
34
|
-
"@ifc-lite/
|
|
35
|
-
"@ifc-lite/
|
|
36
|
-
"@ifc-lite/
|
|
37
|
-
"@ifc-lite/
|
|
38
|
-
"@ifc-lite/
|
|
39
|
-
"@ifc-lite/
|
|
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.
|
|
44
|
+
"@types/node": "^26.4.1",
|
|
45
45
|
"typescript": "^6.0.3",
|
|
46
46
|
"vitest": "^4.1.11"
|
|
47
47
|
},
|