@ifc-lite/export 2.9.1 → 2.9.3

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.
@@ -65,6 +65,57 @@ export interface EffectiveEntityIndex extends CompleteEntityIndex {
65
65
  /** Outgoing `#id` references of an OVERLAY-created record, or undefined when
66
66
  * the id has source bytes to scan instead. */
67
67
  refsOf(id: number): readonly number[] | undefined;
68
+ /**
69
+ * The same references as {@link refsOf}, GROUPED by authored attribute
70
+ * instead of flattened — a SET/LIST-valued attribute (`RelatedObjects`, …)
71
+ * as a nested array of ids, a single-valued attribute (`RelatingType`, …)
72
+ * as a bare id. `refsOf`'s flat list cannot tell those apart, and the
73
+ * closure walk needs to: it decides whether an overlay-created `IFCREL*`
74
+ * may bridge into what it references using the exact same list-vs-bare
75
+ * distinction `filterHiddenRefsFromRelationshipLine` makes for a
76
+ * source-backed relationship's OUTPUT line (see
77
+ * `relationshipRefsSurviveExclusion` in `reference-collector.ts`) — without
78
+ * this, the authored path could only ask "is EVERY id excluded", which
79
+ * wrongly permits bridging when a relationship's sole SUBJECT is hidden but
80
+ * its unrelated TARGET (a pset id, never itself excludable) survives (#2548).
81
+ * Optional: undefined for the id, or when the caller has no overlay.
82
+ *
83
+ * `sourceGroups` is the SAME grouped shape, already parsed from a
84
+ * SOURCE-backed entity's raw STEP line by the caller (`reference-collector.ts`
85
+ * has no other way to get one — this class has no bytes to read). When `id`
86
+ * is source-backed (not overlay-created) and carries a queued positional or
87
+ * named-attribute mutation, this splices that mutation's EFFECTIVE value in
88
+ * at the right group before returning — otherwise the caller's raw-text
89
+ * parse is stale where an edit retargeted a reference the source bytes
90
+ * never show (#2637 follow-up). Ignored (and safe to omit) for an
91
+ * overlay-created id, which always has its own authored payload to start
92
+ * from instead.
93
+ */
94
+ refGroupsOf?(id: number, sourceGroups?: ReadonlyArray<number | readonly number[] | undefined>): ReadonlyArray<number | readonly number[]> | undefined;
95
+ /**
96
+ * Cheap existence check — no decode, no parse — for "does this SOURCE-backed
97
+ * id carry ANY queued positional or named-attribute mutation at all". False
98
+ * for an overlay-created id (its refs come from {@link refsOf} instead) and
99
+ * for a tombstoned one.
100
+ *
101
+ * `collectReferencedEntityIds` in `reference-collector.ts` only pays for
102
+ * decoding a SOURCE-backed entity's STEP line and re-deriving mutation-aware
103
+ * groups (via {@link refGroupsOf}) on the `IFCREL*` bridge path, because
104
+ * that path already needs the parse for its own bridge decision regardless
105
+ * of whether a mutation exists. An ordinary PRODUCT never takes that path,
106
+ * so a plain `setPositionalAttribute`/`setAttribute` retargeting one of its
107
+ * references onto an id the source bytes never named was invisible to the
108
+ * closure — the byte scan of the original bytes has no way to see it — while
109
+ * emission (which does apply the mutation) still wrote the new id into the
110
+ * output line: a dangling ref with no `visibleOnly` involved (#2637
111
+ * follow-up, round 6: found via a retype-out-of-`IFCREL*` fused with a
112
+ * same-record retarget, but reproduces identically with NO retype at all —
113
+ * it is a general gap in the closure, not a retype-specific one). This
114
+ * method exists so the walk can gate the SAME per-entity decode/parse cost
115
+ * behind a cheap map lookup for every OTHER entity type too, instead of
116
+ * paying it unconditionally for every source-backed entity in the file.
117
+ */
118
+ hasSourceMutation?(id: number): boolean;
68
119
  /**
69
120
  * The effective `#id` value of ONE NAMED attribute of an OVERLAY-created
70
121
  * record, or undefined when the id was not created by this overlay, the
@@ -93,6 +144,18 @@ export interface EffectiveEntityIndex extends CompleteEntityIndex {
93
144
  * overlay that has queued nothing structural (no creates, no deletes, no
94
145
  * retypes) takes the same fast path: attribute and property edits do not change
95
146
  * which entities exist or what class they are.
147
+ *
148
+ * "Fast path" means `byType`/`size`/`get`/`has` stay pointer-identical to the
149
+ * source view's own — no id's existence or class can differ when nothing
150
+ * structural is queued, so there is nothing there for a wrapper to change.
151
+ * `refGroupsOf` is a different question: a source-backed `IFCREL*`'s
152
+ * reference can absolutely differ from its raw bytes when the ONLY thing
153
+ * queued is a positional/named-attribute edit retargeting it — the exact
154
+ * case with no create, delete or retype to trigger the `OverlayIndex` branch
155
+ * below. `sourceOnly` still answers that one from `view` when a view is
156
+ * available, so a `visibleOnly` closure walk sees it even on this fast path
157
+ * (#2637 follow-up: CodeRabbit found the closure could keep judging such an
158
+ * id by its stale, pre-edit reference).
96
159
  */
97
160
  export declare function getEffectiveEntityIndex(dataStore: IfcDataStore, mutationView: MutablePropertyView | null | undefined, applyMutations: boolean): EffectiveEntityIndex;
98
161
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"effective-index.d.ts","sourceRoot":"","sources":["../src/effective-index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D;qEACiE;IACjE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IACtD,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;mEAC+D;IAC/D,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B;mDAC+C;IAC/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAClD;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxE;oDACgD;IAChD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,YAAY,EACvB,YAAY,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EACpD,cAAc,EAAE,OAAO,GACtB,oBAAoB,CAiBtB;AAyMD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQ1F"}
1
+ {"version":3,"file":"effective-index.d.ts","sourceRoot":"","sources":["../src/effective-index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D;qEACiE;IACjE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IACtD,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;mEAC+D;IAC/D,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B;mDAC+C;IAC/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAClD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,WAAW,CAAC,CACV,EAAE,EAAE,MAAM,EACV,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,GACnE,aAAa,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IACzD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,iBAAiB,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxE;oDACgD;IAChD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACxC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,YAAY,EACvB,YAAY,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EACpD,cAAc,EAAE,OAAO,GACtB,oBAAoB,CAiBtB;AA0SD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQ1F"}
@@ -39,7 +39,7 @@
39
39
  * read from its authored attributes by {@link EffectiveEntityIndex.refsOf}
40
40
  * instead of scanned out of the source buffer.
41
41
  */
42
- import { getAllAttributesForEntity } from '@ifc-lite/parser';
42
+ import { getAttributeNamesAcrossSchemas } from '@ifc-lite/parser';
43
43
  import { OVERLAY_BYTE_OFFSET, } from '@ifc-lite/mutations';
44
44
  import { getCompleteEntityIndex, } from './entity-iteration.js';
45
45
  /**
@@ -51,6 +51,18 @@ import { getCompleteEntityIndex, } from './entity-iteration.js';
51
51
  * overlay that has queued nothing structural (no creates, no deletes, no
52
52
  * retypes) takes the same fast path: attribute and property edits do not change
53
53
  * which entities exist or what class they are.
54
+ *
55
+ * "Fast path" means `byType`/`size`/`get`/`has` stay pointer-identical to the
56
+ * source view's own — no id's existence or class can differ when nothing
57
+ * structural is queued, so there is nothing there for a wrapper to change.
58
+ * `refGroupsOf` is a different question: a source-backed `IFCREL*`'s
59
+ * reference can absolutely differ from its raw bytes when the ONLY thing
60
+ * queued is a positional/named-attribute edit retargeting it — the exact
61
+ * case with no create, delete or retype to trigger the `OverlayIndex` branch
62
+ * below. `sourceOnly` still answers that one from `view` when a view is
63
+ * available, so a `visibleOnly` closure walk sees it even on this fast path
64
+ * (#2637 follow-up: CodeRabbit found the closure could keep judging such an
65
+ * id by its stale, pre-edit reference).
54
66
  */
55
67
  export function getEffectiveEntityIndex(dataStore, mutationView, applyMutations) {
56
68
  const base = getCompleteEntityIndex(dataStore);
@@ -63,15 +75,34 @@ export function getEffectiveEntityIndex(dataStore, mutationView, applyMutations)
63
75
  const tombstones = view && typeof view.getTombstones === 'function' ? view.getTombstones() : EMPTY_IDS;
64
76
  const retypes = view && typeof view.getTypeMutations === 'function' ? view.getTypeMutations() : EMPTY_RETYPES;
65
77
  if (created.size === 0 && tombstones.size === 0 && retypes.size === 0) {
66
- return sourceOnly(base, dataStore.entityIndex.byType);
78
+ return sourceOnly(base, dataStore.entityIndex.byType, view);
67
79
  }
68
80
  return new OverlayIndex(base, dataStore.entityIndex.byType, view, created, tombstones, retypes);
69
81
  }
70
82
  const EMPTY_IDS = new Set();
71
83
  const EMPTY_RETYPES = new Map();
84
+ /** Shared by {@link sourceOnly} and {@link OverlayIndex}'s `hasSourceMutation` —
85
+ * see that method's doc on `EffectiveEntityIndex` for why this needs to stay
86
+ * a cheap map-lookup-only check with no decode or parse. */
87
+ function hasQueuedSourceMutation(view, id) {
88
+ const positional = typeof view.getPositionalMutationsForEntity === 'function'
89
+ ? view.getPositionalMutationsForEntity(id)
90
+ : null;
91
+ if (positional && positional.size > 0)
92
+ return true;
93
+ const attributeMutations = typeof view.getAttributeMutationsForEntity === 'function'
94
+ ? view.getAttributeMutationsForEntity(id)
95
+ : [];
96
+ return attributeMutations.length > 0;
97
+ }
72
98
  /** The no-overlay answer: the source view, with the extra questions answered
73
- * the only way the buffer can answer them. */
74
- function sourceOnly(base, byType) {
99
+ * the only way the buffer can answer them.
100
+ *
101
+ * `view` is still threaded through (not discarded, despite there being no
102
+ * create/delete/retype to react to) purely so `refGroupsOf` can resolve a
103
+ * source-backed id's positional/named-attribute mutations — see this
104
+ * function's own doc for why that is a real, reachable gap otherwise. */
105
+ function sourceOnly(base, byType, view) {
75
106
  return {
76
107
  get: (id) => base.get(id),
77
108
  has: (id) => base.has(id),
@@ -84,6 +115,10 @@ function sourceOnly(base, byType) {
84
115
  isOverlayCreated: () => false,
85
116
  isDeleted: () => false,
86
117
  refsOf: () => undefined,
118
+ refGroupsOf: view
119
+ ? (id, sourceGroups) => sourceBackedRefGroups(view, base, EMPTY_RETYPES, id, sourceGroups)
120
+ : undefined,
121
+ hasSourceMutation: view ? (id) => hasQueuedSourceMutation(view, id) : undefined,
87
122
  effectiveAttributeRef: () => undefined,
88
123
  byType,
89
124
  };
@@ -184,6 +219,71 @@ class OverlayIndex {
184
219
  this.cachedRefs.set(id, out);
185
220
  return out;
186
221
  }
222
+ /**
223
+ * See the interface doc: unlike {@link refsOf} (a deliberate UNION — see its
224
+ * own doc for why over-inclusion is harmless there), this is the EFFECTIVE
225
+ * groups: an override REPLACES its slot's group rather than adding a second
226
+ * one alongside it. `refsOf`'s union is safe only for a consumer that treats
227
+ * extra ids as harmless closure growth; `relationshipRefsSurviveExclusion`
228
+ * is a BLOCKING predicate, so a stale, since-superseded group (e.g. a
229
+ * `RelatedObjects` list retargeted away from a hidden entity by a later
230
+ * `setPositionalAttribute`) must not still be able to veto bridging on the
231
+ * value it was overridden away from.
232
+ *
233
+ * Resolved per authored attribute SLOT, same precedence
234
+ * {@link effectiveAttributeRef} uses for one named attribute: a
235
+ * `getAttributeMutationsForEntity` override (most specific — names the slot
236
+ * by schema attribute name) wins, else a `getPositionalMutationsForEntity`
237
+ * override at that index, else the creation payload's own value at that
238
+ * index. Not cached: only called for `IFCREL*` entities, and only when a
239
+ * `visibleOnly`/deletion filter is active, so the extra pass is rare.
240
+ */
241
+ refGroupsOf(id, sourceGroups) {
242
+ const entity = this.created.get(id);
243
+ if (entity) {
244
+ if (this.tombstones.has(id))
245
+ return undefined;
246
+ const effective = entity.attributes.slice();
247
+ if (typeof this.view.getPositionalMutationsForEntity === 'function') {
248
+ const positional = this.view.getPositionalMutationsForEntity(id);
249
+ if (positional)
250
+ for (const [index, value] of positional)
251
+ effective[index] = value;
252
+ }
253
+ if (typeof this.view.getAttributeMutationsForEntity === 'function') {
254
+ const effectiveType = this.retypes.get(id)?.newType ?? entity.type;
255
+ // Cross-schema, not the IFC4 pin — see `applyAttributeMutations` in
256
+ // `step-exporter.ts` for why: an IFC4X3-only class resolves no slots
257
+ // under the pin, so a named override on one was silently ignored
258
+ // here while emission (which already uses this resolver) applied it,
259
+ // leaving `refGroupsOf` answering from the STALE, pre-override value
260
+ // (#2637 follow-up).
261
+ const names = getAttributeNamesAcrossSchemas(effectiveType);
262
+ for (const { name, value } of this.view.getAttributeMutationsForEntity(id)) {
263
+ const index = names.indexOf(name);
264
+ if (index >= 0)
265
+ effective[index] = value;
266
+ }
267
+ }
268
+ return groupsFromAttributeValues(effective);
269
+ }
270
+ // Source-backed: this class has no parsed attribute list of its own —
271
+ // delegate to the shared resolver both this branch and `sourceOnly`'s
272
+ // wiring use, since a source-backed id's mutations answer identically
273
+ // either way (structural overlay activity elsewhere in the model has no
274
+ // bearing on THIS id's own positional/attribute edits).
275
+ if (this.tombstones.has(id))
276
+ return undefined;
277
+ return sourceBackedRefGroups(this.view, this.base, this.retypes, id, sourceGroups);
278
+ }
279
+ hasSourceMutation(id) {
280
+ // Overlay-created ids answer through `refsOf` instead — see that method's
281
+ // own doc for why its UNION is the right answer there. A tombstoned id
282
+ // has no line to walk into regardless of what it once carried.
283
+ if (this.created.has(id) || this.tombstones.has(id))
284
+ return false;
285
+ return hasQueuedSourceMutation(this.view, id);
286
+ }
187
287
  effectiveAttributeRef(id, attrName) {
188
288
  const entity = this.created.get(id);
189
289
  if (!entity || this.tombstones.has(id))
@@ -199,9 +299,10 @@ class OverlayIndex {
199
299
  }
200
300
  // No named override — fall back to the positional slot the schema says
201
301
  // this attribute lives at, so a positional mutation (or the untouched
202
- // creation payload) still answers correctly.
302
+ // creation payload) still answers correctly. Cross-schema resolver — see
303
+ // the identical note in `refGroupsOf` above.
203
304
  const effectiveType = this.retypes.get(id)?.newType ?? entity.type;
204
- const index = getAllAttributesForEntity(effectiveType).findIndex((attr) => attr.name === attrName);
305
+ const index = getAttributeNamesAcrossSchemas(effectiveType).indexOf(attrName);
205
306
  if (index < 0)
206
307
  return undefined;
207
308
  if (typeof this.view.getPositionalMutationsForEntity === 'function') {
@@ -283,4 +384,77 @@ export function authoredEntityRefs(value) {
283
384
  const id = Number.parseInt(digits, 10);
284
385
  return Number.isInteger(id) && id > 0 && String(id) === digits ? [id] : [];
285
386
  }
387
+ /** One authored attribute's contribution to `refGroupsOf`'s grouped shape: a
388
+ * bare id for a single-valued attribute, an array (even an empty one, once
389
+ * it's known to be list-valued) for a SET/LIST, or `undefined` when the
390
+ * value carries no reference at all — matching `relationshipRefsSurviveExclusion`'s
391
+ * own "no group == does not participate" reading. */
392
+ function groupFromAttributeValue(value) {
393
+ const ids = authoredEntityRefs(value);
394
+ if (ids.length === 0)
395
+ return undefined;
396
+ return Array.isArray(value) || ids.length > 1 ? ids : ids[0];
397
+ }
398
+ /** {@link groupFromAttributeValue}, applied over a whole authored attribute
399
+ * list — the shared tail of `refGroupsOf`'s overlay-created branch. */
400
+ function groupsFromAttributeValues(values) {
401
+ const groups = [];
402
+ for (const value of values) {
403
+ const group = groupFromAttributeValue(value);
404
+ if (group !== undefined)
405
+ groups.push(group);
406
+ }
407
+ return groups;
408
+ }
409
+ /**
410
+ * `refGroupsOf` for a SOURCE-backed id (one with no `NewEntity` creation
411
+ * payload) — shared by `OverlayIndex.refGroupsOf`'s source-backed branch and
412
+ * `sourceOnly`'s wiring, since neither has a parsed attribute list of its
413
+ * own to start from: `sourceGroups`, already parsed from the raw STEP line
414
+ * by the caller (`reference-collector.ts`), is the only starting point
415
+ * either has. Splices in a queued positional or named-attribute mutation at
416
+ * the position it names, same precedence as the overlay-created branch: a
417
+ * `getAttributeMutationsForEntity` override (resolved to a slot via
418
+ * {@link getAttributeNamesAcrossSchemas}, cross-schema for the identical
419
+ * reason `applyAttributeMutations` in `step-exporter.ts` is) wins, else a
420
+ * `getPositionalMutationsForEntity` override at that index, else the raw
421
+ * text's own group stands.
422
+ *
423
+ * Returns undefined — not `sourceGroups` verbatim — when `id` has no
424
+ * mutation at all (the overwhelmingly common case for an `IFCREL*` entity),
425
+ * so a caller with no override to apply keeps using its own
426
+ * already-computed answer instead of paying for a copy that changes nothing.
427
+ */
428
+ function sourceBackedRefGroups(view, base, retypes, id, sourceGroups) {
429
+ if (!sourceGroups)
430
+ return undefined;
431
+ const positional = typeof view.getPositionalMutationsForEntity === 'function'
432
+ ? view.getPositionalMutationsForEntity(id)
433
+ : null;
434
+ const attributeMutations = typeof view.getAttributeMutationsForEntity === 'function'
435
+ ? view.getAttributeMutationsForEntity(id)
436
+ : [];
437
+ if ((!positional || positional.size === 0) && attributeMutations.length === 0)
438
+ return undefined;
439
+ const record = base.get(id);
440
+ const effective = sourceGroups.slice();
441
+ if (positional) {
442
+ for (const [index, value] of positional)
443
+ effective[index] = groupFromAttributeValue(value);
444
+ }
445
+ if (attributeMutations.length > 0 && record) {
446
+ const effectiveType = retypes.get(id)?.newType ?? record.type;
447
+ const names = getAttributeNamesAcrossSchemas(effectiveType);
448
+ for (const { name, value } of attributeMutations) {
449
+ const index = names.indexOf(name);
450
+ if (index >= 0)
451
+ effective[index] = groupFromAttributeValue(value);
452
+ }
453
+ }
454
+ const out = [];
455
+ for (const group of effective)
456
+ if (group !== undefined)
457
+ out.push(group);
458
+ return out;
459
+ }
286
460
  //# sourceMappingURL=effective-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effective-index.js","sourceRoot":"","sources":["../src/effective-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"effective-index.js","sourceRoot":"","sources":["../src/effective-index.ts"],"names":[],"mappings":"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"}
@@ -331,6 +331,15 @@ export declare class MergedExporter {
331
331
  /**
332
332
  * Resolve the set of express ids to include for a model under visibility
333
333
  * filtering, or `null` when no filtering is requested (include everything).
334
+ *
335
+ * Also returns `hiddenProductIds` (`null` alongside a `null` `included`):
336
+ * `renderEntity` needs it to withhold-or-narrow a relationship's own OUTPUT
337
+ * line the same way `StepExporter` does (`isExcludedFromRelationshipRefs` /
338
+ * `step-exporter.ts:1181`,`:1486`) — `collectReferencedEntityIds` already
339
+ * refuses to WALK INTO a relationship whose sole subject is hidden (#2548),
340
+ * but that only keeps the closure from growing past it; a root's own bytes
341
+ * are still copied to the output verbatim unless something narrows them
342
+ * too, which is the #2398 dangling-`#N` shape.
334
343
  */
335
344
  private computeIncludedEntityIds;
336
345
  /**
@@ -353,7 +362,9 @@ export declare class MergedExporter {
353
362
  * Render one source entity into its final STEP line: apply id offset + shared
354
363
  * remaps, re-stamp a federated GlobalId if needed, apply schema conversion,
355
364
  * and register the emitted GlobalId so later models can reconcile against it.
356
- * Returns `null` when schema conversion drops the entity.
365
+ * Returns `null` when schema conversion drops the entity, OR when
366
+ * `hiddenProductIds` withholds a relationship whose every named subject was
367
+ * hidden (below).
357
368
  */
358
369
  private renderEntity;
359
370
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"merged-exporter.d.ts","sourceRoot":"","sources":["../src/merged-exporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merged-exporter.d.ts","sourceRoot":"","sources":["../src/merged-exporter.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { generateHeader, deterministicGlobalId, IfcParser, asSourceBytes } from '@ifc-lite/parser';
5
5
  import { decodeIfcString } from '@ifc-lite/encoding';
6
- import { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
6
+ import { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities, filterHiddenRefsFromRelationshipLine, } from './reference-collector.js';
7
7
  import { convertStepLine, needsConversion } from './schema-converter.js';
8
8
  import { assembleStepBytes, assembleStepBlob } from './step-file-assembly.js';
9
9
  import { getCompleteEntityIndex, getMaxExpressId } from './entity-iteration.js';
@@ -198,7 +198,7 @@ export class MergedExporter {
198
198
  // Complete view over byId + any deferred property atoms, so the closure
199
199
  // walk and the emit loop both reach every entity the source defines.
200
200
  const completeIndex = getCompleteEntityIndex(model.dataStore);
201
- const includedEntityIds = this.computeIncludedEntityIds(model, options, completeIndex, source);
201
+ const visibility = this.computeIncludedEntityIds(model, options, completeIndex, source);
202
202
  const mode = this.resolveModelMode(model, isFirstModel, setup);
203
203
  if (!isFirstModel && !mode.compatible)
204
204
  federatedModelCount++;
@@ -209,11 +209,11 @@ export class MergedExporter {
209
209
  const plan = this.planModel(model, completeIndex, isFirstModel, mode.compatible, mode.lengthFactor, setup, guidToFinalId);
210
210
  const sourceSchema = model.dataStore.schemaVersion || 'IFC4';
211
211
  for (const [expressId, entityRef] of completeIndex) {
212
- if (includedEntityIds !== null && !includedEntityIds.has(expressId))
212
+ if (visibility !== null && !visibility.included.has(expressId))
213
213
  continue;
214
214
  if (plan.skipEntityIds.has(expressId))
215
215
  continue;
216
- const line = this.renderEntity(expressId, entityRef, source, offset, plan, sourceSchema, schema, guidToFinalId, mode);
216
+ const line = this.renderEntity(expressId, entityRef, source, offset, plan, sourceSchema, schema, guidToFinalId, mode, visibility?.hiddenProductIds ?? null, completeIndex);
217
217
  if (line !== null)
218
218
  allEntityLines.push(line);
219
219
  }
@@ -315,7 +315,7 @@ export class MergedExporter {
315
315
  });
316
316
  }
317
317
  const completeIndex = getCompleteEntityIndex(model.dataStore);
318
- const includedEntityIds = this.computeIncludedEntityIds(model, options, completeIndex, source);
318
+ const visibility = this.computeIncludedEntityIds(model, options, completeIndex, source);
319
319
  const mode = this.resolveModelMode(model, isFirstModel, setup);
320
320
  if (!isFirstModel && !mode.compatible)
321
321
  federatedModelCount++;
@@ -327,11 +327,11 @@ export class MergedExporter {
327
327
  const sourceSchema = model.dataStore.schemaVersion || 'IFC4';
328
328
  let entityCount = 0;
329
329
  for (const [expressId, entityRef] of completeIndex) {
330
- if (includedEntityIds !== null && !includedEntityIds.has(expressId))
330
+ if (visibility !== null && !visibility.included.has(expressId))
331
331
  continue;
332
332
  if (plan.skipEntityIds.has(expressId))
333
333
  continue;
334
- const line = this.renderEntity(expressId, entityRef, source, offset, plan, sourceSchema, schema, guidToFinalId, mode);
334
+ const line = this.renderEntity(expressId, entityRef, source, offset, plan, sourceSchema, schema, guidToFinalId, mode, visibility?.hiddenProductIds ?? null, completeIndex);
335
335
  if (line !== null)
336
336
  allEntityLines.push(line);
337
337
  entityCount++;
@@ -614,6 +614,15 @@ export class MergedExporter {
614
614
  /**
615
615
  * Resolve the set of express ids to include for a model under visibility
616
616
  * filtering, or `null` when no filtering is requested (include everything).
617
+ *
618
+ * Also returns `hiddenProductIds` (`null` alongside a `null` `included`):
619
+ * `renderEntity` needs it to withhold-or-narrow a relationship's own OUTPUT
620
+ * line the same way `StepExporter` does (`isExcludedFromRelationshipRefs` /
621
+ * `step-exporter.ts:1181`,`:1486`) — `collectReferencedEntityIds` already
622
+ * refuses to WALK INTO a relationship whose sole subject is hidden (#2548),
623
+ * but that only keeps the closure from growing past it; a root's own bytes
624
+ * are still copied to the output verbatim unless something narrows them
625
+ * too, which is the #2398 dangling-`#N` shape.
617
626
  */
618
627
  computeIncludedEntityIds(model, options, completeIndex, source) {
619
628
  if (!options.visibleOnly)
@@ -627,7 +636,7 @@ export class MergedExporter {
627
636
  byId: completeIndex,
628
637
  byType: model.dataStore.entityIndex.byType,
629
638
  });
630
- return included;
639
+ return { included, hiddenProductIds };
631
640
  }
632
641
  /**
633
642
  * Plan how a model's entities are remapped, skipped, or re-stamped, given
@@ -717,10 +726,30 @@ export class MergedExporter {
717
726
  * Render one source entity into its final STEP line: apply id offset + shared
718
727
  * remaps, re-stamp a federated GlobalId if needed, apply schema conversion,
719
728
  * and register the emitted GlobalId so later models can reconcile against it.
720
- * Returns `null` when schema conversion drops the entity.
729
+ * Returns `null` when schema conversion drops the entity, OR when
730
+ * `hiddenProductIds` withholds a relationship whose every named subject was
731
+ * hidden (below).
721
732
  */
722
- renderEntity(localId, entityRef, source, offset, plan, sourceSchema, targetSchema, guidToFinalId, mode) {
723
- const entityText = decodeRange(source, entityRef.byteOffset, entityRef.byteOffset + entityRef.byteLength);
733
+ renderEntity(localId, entityRef, source, offset, plan, sourceSchema, targetSchema, guidToFinalId, mode, hiddenProductIds, completeIndex) {
734
+ let entityText = decodeRange(source, entityRef.byteOffset, entityRef.byteOffset + entityRef.byteLength);
735
+ // A `visibleOnly` export must narrow — or entirely withhold — a
736
+ // relationship's own OUTPUT line the same way `StepExporter` does
737
+ // (`isExcludedFromRelationshipRefs`, `step-exporter.ts:1181`/`:1486`).
738
+ // `collectReferencedEntityIds` already refuses to WALK INTO a relationship
739
+ // whose sole subject is hidden (#2548), but a root's own bytes are still
740
+ // copied to the output verbatim unless narrowed here too — without this,
741
+ // a hidden id survived as a dangling `#N` with no `#N=` line (the #2398
742
+ // shape), which is exactly what closing the #2548 closure leak would
743
+ // otherwise have traded it for. Runs in LOCAL id space, before the remap
744
+ // below, because `hiddenProductIds` and `completeIndex` are both local to
745
+ // this model.
746
+ if (hiddenProductIds !== null && isRelationshipType(entityRef.type.toUpperCase())) {
747
+ const isExcluded = (id) => hiddenProductIds.has(id) || !completeIndex.has(id);
748
+ const filtered = filterHiddenRefsFromRelationshipLine(entityText, isExcluded);
749
+ if (filtered === null)
750
+ return null;
751
+ entityText = filtered;
752
+ }
724
753
  // Remap ids. Fast path: the first model (offset 0, no remaps) is byte-identical.
725
754
  let finalText;
726
755
  if (offset === 0 && plan.sharedRemap.size === 0) {