@ifc-lite/export 4.9.0 → 4.12.0
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/affected-set.d.ts +9 -0
- package/dist/affected-set.d.ts.map +1 -0
- package/dist/affected-set.js +72 -0
- package/dist/affected-set.js.map +1 -0
- package/dist/anonymize-placement.d.ts +0 -34
- package/dist/anonymize-placement.d.ts.map +1 -1
- package/dist/anonymize-placement.js +58 -27
- package/dist/anonymize-placement.js.map +1 -1
- package/dist/declared-property-type.d.ts +7 -0
- package/dist/declared-property-type.d.ts.map +1 -1
- package/dist/declared-property-type.js +29 -2
- package/dist/declared-property-type.js.map +1 -1
- package/dist/edit-ownership.d.ts +7 -0
- package/dist/edit-ownership.d.ts.map +1 -0
- package/dist/edit-ownership.js +95 -0
- package/dist/edit-ownership.js.map +1 -0
- package/dist/effective-index.d.ts.map +1 -1
- package/dist/effective-index.js +12 -5
- package/dist/effective-index.js.map +1 -1
- package/dist/entity-subgraph.d.ts +11 -3
- package/dist/entity-subgraph.d.ts.map +1 -1
- package/dist/entity-subgraph.js +54 -11
- package/dist/entity-subgraph.js.map +1 -1
- package/dist/grid-placement-dependents.d.ts +4 -0
- package/dist/grid-placement-dependents.d.ts.map +1 -0
- package/dist/grid-placement-dependents.js +71 -0
- package/dist/grid-placement-dependents.js.map +1 -0
- package/dist/grid-reference-context.d.ts +6 -0
- package/dist/grid-reference-context.d.ts.map +1 -0
- package/dist/grid-reference-context.js +68 -0
- package/dist/grid-reference-context.js.map +1 -0
- package/dist/ifc5-exporter.d.ts.map +1 -1
- package/dist/ifc5-exporter.js +5 -4
- package/dist/ifc5-exporter.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/lod-geometry-types.d.ts +5 -0
- package/dist/lod-geometry-types.d.ts.map +1 -1
- package/dist/lod0-generator.d.ts.map +1 -1
- package/dist/lod0-generator.js +52 -18
- package/dist/lod0-generator.js.map +1 -1
- package/dist/lod1-generator.d.ts.map +1 -1
- package/dist/lod1-generator.js +4 -1
- package/dist/lod1-generator.js.map +1 -1
- package/dist/merged-empty-containers-refs.d.ts.map +1 -1
- package/dist/merged-empty-containers-refs.js +5 -3
- package/dist/merged-empty-containers-refs.js.map +1 -1
- package/dist/merged-exporter.d.ts.map +1 -1
- package/dist/merged-exporter.js +31 -31
- package/dist/merged-exporter.js.map +1 -1
- package/dist/merged-remap.d.ts +0 -8
- package/dist/merged-remap.d.ts.map +1 -1
- package/dist/merged-remap.js +7 -17
- package/dist/merged-remap.js.map +1 -1
- package/dist/obj.d.ts +8 -8
- package/dist/obj.js +8 -8
- package/dist/parquet-exporter.d.ts.map +1 -1
- package/dist/parquet-exporter.js +14 -2
- package/dist/parquet-exporter.js.map +1 -1
- package/dist/property-value-serialization.d.ts.map +1 -1
- package/dist/property-value-serialization.js +7 -3
- package/dist/property-value-serialization.js.map +1 -1
- package/dist/reference-collector.d.ts.map +1 -1
- package/dist/reference-collector.js +17 -16
- package/dist/reference-collector.js.map +1 -1
- package/dist/retype.d.ts.map +1 -1
- package/dist/retype.js +12 -11
- package/dist/retype.js.map +1 -1
- package/dist/schema-conversion-loss-report.d.ts +2 -1
- package/dist/schema-conversion-loss-report.d.ts.map +1 -1
- package/dist/schema-conversion-loss-report.js +20 -11
- package/dist/schema-conversion-loss-report.js.map +1 -1
- package/dist/schema-converter-mep.d.ts +2 -0
- package/dist/schema-converter-mep.d.ts.map +1 -0
- package/dist/schema-converter-mep.js +9 -0
- package/dist/schema-converter-mep.js.map +1 -0
- package/dist/schema-converter-mep.json +96 -0
- package/dist/schema-converter-product-proxy.d.ts +25 -0
- package/dist/schema-converter-product-proxy.d.ts.map +1 -0
- package/dist/schema-converter-product-proxy.js +33 -0
- package/dist/schema-converter-product-proxy.js.map +1 -0
- package/dist/schema-converter-renames.d.ts +32 -0
- package/dist/schema-converter-renames.d.ts.map +1 -0
- package/dist/schema-converter-renames.js +60 -0
- package/dist/schema-converter-renames.js.map +1 -0
- package/dist/schema-converter.d.ts +8 -16
- package/dist/schema-converter.d.ts.map +1 -1
- package/dist/schema-converter.js +44 -71
- package/dist/schema-converter.js.map +1 -1
- package/dist/schema-style-flatten.d.ts +82 -0
- package/dist/schema-style-flatten.d.ts.map +1 -0
- package/dist/schema-style-flatten.js +245 -0
- package/dist/schema-style-flatten.js.map +1 -0
- package/dist/step-argument-parser.d.ts +7 -2
- package/dist/step-argument-parser.d.ts.map +1 -1
- package/dist/step-argument-parser.js +69 -62
- package/dist/step-argument-parser.js.map +1 -1
- package/dist/step-attribute-mutations.d.ts.map +1 -1
- package/dist/step-attribute-mutations.js +21 -22
- package/dist/step-attribute-mutations.js.map +1 -1
- package/dist/step-coordinate-options.d.ts +8 -0
- package/dist/step-coordinate-options.d.ts.map +1 -1
- package/dist/step-export-contexts.d.ts +1 -1
- package/dist/step-export-contexts.d.ts.map +1 -1
- package/dist/step-export-contexts.js +4 -1
- package/dist/step-export-contexts.js.map +1 -1
- package/dist/step-export-types.d.ts +6 -0
- package/dist/step-export-types.d.ts.map +1 -1
- package/dist/step-export-types.js.map +1 -1
- package/dist/step-exporter.d.ts.map +1 -1
- package/dist/step-exporter.js +19 -19
- package/dist/step-exporter.js.map +1 -1
- package/dist/step-map-unit-normalization.d.ts +3 -5
- package/dist/step-map-unit-normalization.d.ts.map +1 -1
- package/dist/step-map-unit-normalization.js +12 -8
- package/dist/step-map-unit-normalization.js.map +1 -1
- package/dist/step-map-unit.d.ts +3 -78
- package/dist/step-map-unit.d.ts.map +1 -1
- package/dist/step-map-unit.js +33 -195
- package/dist/step-map-unit.js.map +1 -1
- package/dist/step-native-set-record.d.ts +6 -0
- package/dist/step-native-set-record.d.ts.map +1 -0
- package/dist/step-native-set-record.js +30 -0
- package/dist/step-native-set-record.js.map +1 -0
- package/dist/step-outer-args.d.ts +10 -0
- package/dist/step-outer-args.d.ts.map +1 -1
- package/dist/step-outer-args.js +29 -12
- package/dist/step-outer-args.js.map +1 -1
- package/dist/step-overlay-entities.d.ts +2 -0
- package/dist/step-overlay-entities.d.ts.map +1 -1
- package/dist/step-overlay-entities.js +43 -11
- package/dist/step-overlay-entities.js.map +1 -1
- package/dist/step-pass-builder.d.ts.map +1 -1
- package/dist/step-pass-builder.js +4 -0
- package/dist/step-pass-builder.js.map +1 -1
- package/dist/step-property-set-collection.d.ts.map +1 -1
- package/dist/step-property-set-collection.js +24 -8
- package/dist/step-property-set-collection.js.map +1 -1
- package/dist/step-property-set-generators.d.ts +8 -2
- package/dist/step-property-set-generators.d.ts.map +1 -1
- package/dist/step-property-set-generators.js +26 -10
- package/dist/step-property-set-generators.js.map +1 -1
- package/dist/step-property-set-index.d.ts.map +1 -1
- package/dist/step-property-set-index.js +8 -3
- package/dist/step-property-set-index.js.map +1 -1
- package/dist/step-property-set-readers.d.ts +6 -0
- package/dist/step-property-set-readers.d.ts.map +1 -1
- package/dist/step-property-set-readers.js +68 -14
- package/dist/step-property-set-readers.js.map +1 -1
- package/dist/step-property-sets.d.ts +17 -4
- package/dist/step-property-sets.d.ts.map +1 -1
- package/dist/step-property-sets.js +79 -20
- package/dist/step-property-sets.js.map +1 -1
- package/dist/step-record-frame.d.ts +69 -0
- package/dist/step-record-frame.d.ts.map +1 -0
- package/dist/step-record-frame.js +136 -0
- package/dist/step-record-frame.js.map +1 -0
- package/dist/step-ref-scan.d.ts +8 -0
- package/dist/step-ref-scan.d.ts.map +1 -1
- package/dist/step-ref-scan.js +29 -8
- package/dist/step-ref-scan.js.map +1 -1
- package/dist/step-serialization.d.ts +16 -4
- package/dist/step-serialization.d.ts.map +1 -1
- package/dist/step-serialization.js +39 -13
- package/dist/step-serialization.js.map +1 -1
- package/dist/step-slot-grammar.d.ts +21 -18
- package/dist/step-slot-grammar.d.ts.map +1 -1
- package/dist/step-slot-grammar.js +210 -177
- package/dist/step-slot-grammar.js.map +1 -1
- package/dist/step-source-iteration.d.ts +1 -1
- package/dist/step-source-iteration.d.ts.map +1 -1
- package/dist/step-source-iteration.js +27 -3
- package/dist/step-source-iteration.js.map +1 -1
- package/dist/step-type-owned-quantities.d.ts +34 -0
- package/dist/step-type-owned-quantities.d.ts.map +1 -0
- package/dist/step-type-owned-quantities.js +222 -0
- package/dist/step-type-owned-quantities.js.map +1 -0
- package/dist/step-vertical-datum-normalization.d.ts +17 -0
- package/dist/step-vertical-datum-normalization.d.ts.map +1 -0
- package/dist/step-vertical-datum-normalization.js +52 -0
- package/dist/step-vertical-datum-normalization.js.map +1 -0
- package/dist/unit-normalize.d.ts.map +1 -1
- package/dist/unit-normalize.js +13 -20
- package/dist/unit-normalize.js.map +1 -1
- package/dist/zero-content.d.ts +21 -3
- package/dist/zero-content.d.ts.map +1 -1
- package/dist/zero-content.js +35 -3
- package/dist/zero-content.js.map +1 -1
- package/package.json +11 -11
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
3
|
+
export type RemeshCause = 'shape' | 'created' | 'hostsChanged';
|
|
4
|
+
/**
|
|
5
|
+
* The live model-local express ids to re-mesh for an edit of `expressIds`.
|
|
6
|
+
* Always includes the live targets themselves.
|
|
7
|
+
*/
|
|
8
|
+
export declare function expandAffectedSet(store: IfcDataStore, view: MutablePropertyView | null, expressIds: Iterable<number>, cause: RemeshCause): Set<number>;
|
|
9
|
+
//# sourceMappingURL=affected-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"affected-set.d.ts","sourceRoot":"","sources":["../src/affected-set.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,CAAC;AAe/D;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAChC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC5B,KAAK,EAAE,WAAW,GACjB,GAAG,CAAC,MAAM,CAAC,CAuBb"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
* Which elements an edit forces the mesher to rebuild (#6232 WP1).
|
|
6
|
+
*
|
|
7
|
+
* Openings and fillings are placed RELATIVE to their host, and an opening's
|
|
8
|
+
* void is cut out of its host's mesh, so an element's mesh is not a function
|
|
9
|
+
* of its own record alone:
|
|
10
|
+
*
|
|
11
|
+
* - a changed OPENING re-cuts its host;
|
|
12
|
+
* - a host whose placement or body changed moves its openings and the
|
|
13
|
+
* fillings in them ('hostsChanged', and 'created', where the host is new);
|
|
14
|
+
* - a 'shape' edit (the element's own body, same placement) re-cuts nothing
|
|
15
|
+
* but itself and, for an opening, its host (its fillings are re-meshed
|
|
16
|
+
* too: the relationships found do not say which side is which, and one
|
|
17
|
+
* extra element costs less than a second lookup).
|
|
18
|
+
*
|
|
19
|
+
* The inverse relationships are the ones `remeshContextRoots` already finds,
|
|
20
|
+
* including relationships the session created, so this reads them from there
|
|
21
|
+
* rather than walking the graph a second way. Tombstoned ids are dropped.
|
|
22
|
+
*/
|
|
23
|
+
import { IfcTypeEnum, IfcTypeEnumFromString } from '@ifc-lite/data';
|
|
24
|
+
import { gridPlacementDependents, remeshContextRoots } from './entity-subgraph.js';
|
|
25
|
+
/** The effective IFC class (UPPERCASE), retypes and overlay creations included. */
|
|
26
|
+
function typeOf(store, view, id) {
|
|
27
|
+
const created = view?.getNewEntity(id);
|
|
28
|
+
const type = view?.getEntityTypeMutation(id)?.newType ?? created?.type ?? store.entities.getTypeName(id);
|
|
29
|
+
return type ? type.toUpperCase() : undefined;
|
|
30
|
+
}
|
|
31
|
+
function isLive(store, view, id) {
|
|
32
|
+
if (view?.getTombstones().has(id))
|
|
33
|
+
return false;
|
|
34
|
+
// @raw-entity-enumeration-ok point lookup of one id; tombstones and overlay creations are answered from the view on the lines around it
|
|
35
|
+
return Boolean(view?.getNewEntity(id)) || store.entityIndex.byId.has(id);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The live model-local express ids to re-mesh for an edit of `expressIds`.
|
|
39
|
+
* Always includes the live targets themselves.
|
|
40
|
+
*/
|
|
41
|
+
export function expandAffectedSet(store, view, expressIds, cause) {
|
|
42
|
+
const targets = new Set();
|
|
43
|
+
for (const id of expressIds)
|
|
44
|
+
if (isLive(store, view, id))
|
|
45
|
+
targets.add(id);
|
|
46
|
+
if (targets.size === 0)
|
|
47
|
+
return targets;
|
|
48
|
+
const out = new Set(targets);
|
|
49
|
+
if ([...targets].some((id) => typeOf(store, view, id) === 'IFCGRID')) {
|
|
50
|
+
for (const id of gridPlacementDependents(store, view, targets))
|
|
51
|
+
out.add(id);
|
|
52
|
+
}
|
|
53
|
+
const context = remeshContextRoots(store, view, targets);
|
|
54
|
+
const openingTargets = [...targets].some((id) => IfcTypeEnumFromString(typeOf(store, view, id) ?? '') === IfcTypeEnum.IfcOpeningElement);
|
|
55
|
+
for (const id of context) {
|
|
56
|
+
const type = typeOf(store, view, id);
|
|
57
|
+
if (!type || type === 'IFCPROJECT' || type.startsWith('IFCREL'))
|
|
58
|
+
continue;
|
|
59
|
+
if (cause !== 'shape') {
|
|
60
|
+
out.add(id);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// A reshaped opening re-cuts its host; nothing else moves.
|
|
64
|
+
if (openingTargets && IfcTypeEnumFromString(type) !== IfcTypeEnum.IfcOpeningElement)
|
|
65
|
+
out.add(id);
|
|
66
|
+
}
|
|
67
|
+
for (const id of out)
|
|
68
|
+
if (!isLive(store, view, id))
|
|
69
|
+
out.delete(id);
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=affected-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"affected-set.js","sourceRoot":"","sources":["../src/affected-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Root-placement zeroing and georeferencing/address blanking for the
|
|
3
|
-
* "anonymized isolated export" feature (#2934, plan section A4).
|
|
4
|
-
*
|
|
5
|
-
* Coordinates are the strongest identifying signal a reproduction carries —
|
|
6
|
-
* an absolute site position pins the model to a real address — but the
|
|
7
|
-
* ROTATION in the placement chain and any non-orthogonal cuts are exactly
|
|
8
|
-
* what a parsing bug reproduction needs to keep. So this module zeroes only
|
|
9
|
-
* the TRANSLATION of each root `IfcLocalPlacement` (`PlacementRelTo = $`),
|
|
10
|
-
* leaving `Axis`/`RefDirection` and every child placement untouched.
|
|
11
|
-
*
|
|
12
|
-
* **Clone, never rewrite.** `IfcCartesianPoint` and `IfcAxis2Placement3D` /
|
|
13
|
-
* `2D` records are routinely SHARED — two storeys placed at the same origin,
|
|
14
|
-
* or a template point reused across a model — so rewriting one in place would
|
|
15
|
-
* silently move every other placement that happens to reference the same
|
|
16
|
-
* point. Each zeroed root gets its own freshly-cloned point and axis via
|
|
17
|
-
* `StoreEditor.addEntity`, and only the root's `RelativePlacement` slot is
|
|
18
|
-
* repointed (`setPositionalAttribute`) to the clone. Nothing else in the
|
|
19
|
-
* model ever sees the edit.
|
|
20
|
-
*
|
|
21
|
-
* The same clone-and-repoint mechanism handles
|
|
22
|
-
* `IfcGeometricRepresentationContext.WorldCoordinateSystem` (a second, less
|
|
23
|
-
* obvious place a survey offset can live — #2934's plan A4 step 4) and is
|
|
24
|
-
* shared between both call sites as {@link zeroAxisPlacementSlot}.
|
|
25
|
-
*
|
|
26
|
-
* `IfcGridPlacement` / `IfcLinearPlacement` roots have no `RelativePlacement`
|
|
27
|
-
* → `IfcCartesianPoint` chain to clone against, so they are left untouched
|
|
28
|
-
* and reported as a warning rather than silently ignored or corrupted.
|
|
29
|
-
*
|
|
30
|
-
* Reads go through {@link readEntityArgs} / {@link attrIndex}
|
|
31
|
-
* (`subset-entity-reader.ts`) so a positional slot is always resolved BY
|
|
32
|
-
* EXPRESS NAME against the schema registry, never a hand-counted index that
|
|
33
|
-
* would silently drift the day an entity's attribute layout changes.
|
|
34
|
-
*/
|
|
35
1
|
import type { IfcSourceBytes } from '@ifc-lite/parser';
|
|
36
2
|
import type { MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
37
3
|
import type { EffectiveEntityIndex } from './effective-index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonymize-placement.d.ts","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anonymize-placement.d.ts","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,+DAA+D;AAC/D,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,gBAAgB,EAChB,mBAAmB,GAAG,sBAAsB,CAC7C,CAAC;AAEF;2EAC2E;AAC3E,MAAM,WAAW,4BAA4B;IAC3C;6CACyC;IACzC,gBAAgB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACjE;;;iDAG6C;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,EAC1C,KAAK,EAAE,oBAAoB,EAC3B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,mBAAmB,EACzB,IAAI,CAAC,EAAE,6BAA6B,GACnC,4BAA4B,CAc9B"}
|
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Root-placement zeroing and georeferencing/address blanking for the
|
|
6
|
+
* "anonymized isolated export" feature (#2934, plan section A4).
|
|
7
|
+
*
|
|
8
|
+
* Coordinates are the strongest identifying signal a reproduction carries —
|
|
9
|
+
* an absolute site position pins the model to a real address — but the
|
|
10
|
+
* ROTATION in the placement chain and any non-orthogonal cuts are exactly
|
|
11
|
+
* what a parsing bug reproduction needs to keep. So this module zeroes only
|
|
12
|
+
* the TRANSLATION of each root `IfcLocalPlacement` (`PlacementRelTo = $`),
|
|
13
|
+
* leaving `Axis`/`RefDirection` and every child placement untouched.
|
|
14
|
+
*
|
|
15
|
+
* **Clone, never rewrite.** `IfcCartesianPoint` and `IfcAxis2Placement3D` /
|
|
16
|
+
* `2D` records are routinely SHARED — two storeys placed at the same origin,
|
|
17
|
+
* or a template point reused across a model — so rewriting one in place would
|
|
18
|
+
* silently move every other placement that happens to reference the same
|
|
19
|
+
* point. Each zeroed root gets its own freshly-cloned point and axis via
|
|
20
|
+
* `StoreEditor.addEntity`, and only the root's `RelativePlacement` slot is
|
|
21
|
+
* repointed (`setPositionalAttribute`) to the clone. Nothing else in the
|
|
22
|
+
* model ever sees the edit.
|
|
23
|
+
*
|
|
24
|
+
* The same clone-and-repoint mechanism handles
|
|
25
|
+
* `IfcGeometricRepresentationContext.WorldCoordinateSystem` (a second, less
|
|
26
|
+
* obvious place a survey offset can live — #2934's plan A4 step 4) and is
|
|
27
|
+
* shared between both call sites as {@link zeroAxisPlacementSlot}.
|
|
28
|
+
*
|
|
29
|
+
* `IfcGridPlacement` / `IfcLinearPlacement` roots have no `RelativePlacement`
|
|
30
|
+
* → `IfcCartesianPoint` chain to clone against, so they are left untouched
|
|
31
|
+
* and reported as a warning rather than silently ignored or corrupted.
|
|
32
|
+
*
|
|
33
|
+
* Reads go through {@link readEntityArgs} / {@link attrIndex}
|
|
34
|
+
* (`subset-entity-reader.ts`) so a positional slot is always resolved BY
|
|
35
|
+
* EXPRESS NAME against the schema registry, never a hand-counted index that
|
|
36
|
+
* would silently drift the day an entity's attribute layout changes.
|
|
37
|
+
*/
|
|
38
|
+
import { walkPlacementChain } from '@ifc-lite/data';
|
|
4
39
|
import { attrIndex, readEntityArgs } from './subset-entity-reader.js';
|
|
5
40
|
import { splitTopLevelListItems } from './step-argument-parser.js';
|
|
6
41
|
import { entityRef, stepReal } from './step-serialization.js';
|
|
@@ -84,40 +119,36 @@ function zeroRootPlacements(store, index, includedIds, editor, warnings, zeroedP
|
|
|
84
119
|
* `IfcLocalPlacement` with `PlacementRelTo = $` (a zeroable root) or a
|
|
85
120
|
* non-`IfcLocalPlacement` record the chain cannot continue past (an
|
|
86
121
|
* `IfcGridPlacement` / `IfcLinearPlacement`, reported by the caller). `null`
|
|
87
|
-
* when the chain could not be safely walked at all — a cycle
|
|
88
|
-
*
|
|
89
|
-
*
|
|
122
|
+
* when the chain could not be safely walked at all — a cycle or a link that
|
|
123
|
+
* does not resolve to a readable record — each case appending its own warning
|
|
124
|
+
* before returning. The walk is the shared `walkPlacementChain` (#7791): a
|
|
125
|
+
* visited set and no hop cap, so a long legal chain is followed in full.
|
|
90
126
|
*/
|
|
91
127
|
function findRootPlacement(store, index, startPlacementId, warnings) {
|
|
92
|
-
const
|
|
93
|
-
let
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (visited.has(currentId)) {
|
|
97
|
-
warnings.push(`Placement chain from #${startPlacementId} revisits #${currentId} (PlacementRelTo cycle); left untouched.`);
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
visited.add(currentId);
|
|
101
|
-
hops++;
|
|
102
|
-
if (hops > 256) {
|
|
103
|
-
warnings.push(`Placement chain from #${startPlacementId} exceeds 256 hops; left untouched rather than followed indefinitely.`);
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
const rec = readEntityArgs(store, index, currentId);
|
|
128
|
+
const types = new Map();
|
|
129
|
+
let unreadableId = null;
|
|
130
|
+
const walked = walkPlacementChain(startPlacementId, (id) => {
|
|
131
|
+
const rec = readEntityArgs(store, index, id);
|
|
107
132
|
if (!rec) {
|
|
108
|
-
|
|
133
|
+
unreadableId = id;
|
|
109
134
|
return null;
|
|
110
135
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
136
|
+
types.set(id, rec.type);
|
|
137
|
+
if (rec.type !== 'IFCLOCALPLACEMENT')
|
|
138
|
+
return null;
|
|
114
139
|
const relToIdx = attrIndex(rec.type, 'PlacementRelTo'); // `rec.type` is always IFCLOCALPLACEMENT here — order verified identical across all 3 schemas (#3309)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
140
|
+
return relToIdx >= 0 && relToIdx < rec.args.length ? parseRef(rec.args[relToIdx]) : null;
|
|
141
|
+
});
|
|
142
|
+
if (walked.end === 'cycle') {
|
|
143
|
+
warnings.push(`Placement chain from #${startPlacementId} revisits #${walked.revisited} (PlacementRelTo cycle); left untouched.`);
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
if (unreadableId !== null) {
|
|
147
|
+
warnings.push(`Placement #${unreadableId} in the chain from #${startPlacementId} could not be read; left untouched.`);
|
|
148
|
+
return null;
|
|
120
149
|
}
|
|
150
|
+
const rootId = walked.ids[walked.ids.length - 1];
|
|
151
|
+
return { rootId, rootType: types.get(rootId) };
|
|
121
152
|
}
|
|
122
153
|
// ---------------------------------------------------------------------------
|
|
123
154
|
// IfcGeometricRepresentationContext.WorldCoordinateSystem
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonymize-placement.js","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"anonymize-placement.js","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"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"}
|
|
@@ -130,4 +130,11 @@ export declare function declaredNominalValueType(value: unknown, type: PropertyV
|
|
|
130
130
|
* from the property's shape alone.
|
|
131
131
|
*/
|
|
132
132
|
export declare function serializeNominalValue(value: unknown, type: PropertyValueType, dataType: string | undefined): string;
|
|
133
|
+
/** Validate an explicitly authored IfcValue declaration before a mutation can be written.
|
|
134
|
+
* Unlike regeneration's loss-tolerant fallback, an authored declaration must be exact and representable.
|
|
135
|
+
*/
|
|
136
|
+
export declare function validatePropertyDataType(value: string | number | boolean | null, dataType: string): {
|
|
137
|
+
valueType: PropertyValueType;
|
|
138
|
+
dataType: string;
|
|
139
|
+
};
|
|
133
140
|
//# sourceMappingURL=declared-property-type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-property-type.d.ts","sourceRoot":"","sources":["../src/declared-property-type.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"declared-property-type.d.ts","sourceRoot":"","sources":["../src/declared-property-type.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA2HnD;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAAoC,CAAC;AAqBhG;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,IAAI,CAqBf;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgBtJ"}
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
import { PropertyValueType } from '@ifc-lite/data';
|
|
115
115
|
import { SCHEMA_REGISTRY } from '@ifc-lite/parser';
|
|
116
116
|
import { getSelectDefinedLeaves } from './select-qualification.js';
|
|
117
|
-
import { serializeTypedMarker } from './step-serialization.js';
|
|
117
|
+
import { serializeTypedMarker, toStepInteger } from './step-serialization.js';
|
|
118
118
|
import { serializePropertyValue } from './property-value-serialization.js';
|
|
119
119
|
/** The SELECT `IfcPropertySingleValue.NominalValue` is declared as. */
|
|
120
120
|
const NOMINAL_VALUE_SELECT = 'IfcValue';
|
|
@@ -186,7 +186,8 @@ function valueFitsBase(value, base) {
|
|
|
186
186
|
case 'NUMBER':
|
|
187
187
|
return typeof value === 'number' && Number.isFinite(value);
|
|
188
188
|
case 'INTEGER':
|
|
189
|
-
|
|
189
|
+
// Below 1e21: `String(1e21)` is `1e+21`, no STEP INTEGER (#7679).
|
|
190
|
+
return typeof value === 'number' && Number.isInteger(value) && toStepInteger(value) !== null;
|
|
190
191
|
case 'BOOLEAN':
|
|
191
192
|
case 'LOGICAL':
|
|
192
193
|
// Not a truthiness test: `serializeTypedMarker` reads `'.F.'` and
|
|
@@ -298,4 +299,30 @@ export function serializeNominalValue(value, type, dataType) {
|
|
|
298
299
|
return serializePropertyValue(value, type);
|
|
299
300
|
return serializeTypedMarker(declared, value);
|
|
300
301
|
}
|
|
302
|
+
/** Validate an explicitly authored IfcValue declaration before a mutation can be written.
|
|
303
|
+
* Unlike regeneration's loss-tolerant fallback, an authored declaration must be exact and representable.
|
|
304
|
+
*/
|
|
305
|
+
export function validatePropertyDataType(value, dataType) {
|
|
306
|
+
const leaf = lookupNominalValueLeaf(dataType.toUpperCase());
|
|
307
|
+
if (!leaf)
|
|
308
|
+
throw new Error('Property dataType must name a defined member of IfcValue');
|
|
309
|
+
const [name, base] = leaf;
|
|
310
|
+
if (!['STRING', 'REAL', 'NUMBER', 'INTEGER', 'BOOLEAN', 'LOGICAL'].includes(base))
|
|
311
|
+
throw new Error('Property declaration requires a scalar IfcValue member');
|
|
312
|
+
if (value !== null && !valueFitsBase(value, base))
|
|
313
|
+
throw new Error(`Property value does not fit ${name}`);
|
|
314
|
+
const constraint = CONSTRAINED_MEMBERS.get(name);
|
|
315
|
+
if (value !== null && constraint && !constraint(value))
|
|
316
|
+
throw new Error(`Property value violates the domain of ${name}`);
|
|
317
|
+
const width = SCHEMA_REGISTRY.types[name]?.match(/^STRING\((\d+)\)/i);
|
|
318
|
+
if (width && typeof value === 'string') {
|
|
319
|
+
let count = 0;
|
|
320
|
+
for (const _character of value)
|
|
321
|
+
if (++count > Number(width[1]))
|
|
322
|
+
throw new Error(`Property value exceeds the string width of ${name}`);
|
|
323
|
+
}
|
|
324
|
+
const valueType = base === 'STRING' ? PropertyValueType.String : base === 'INTEGER' ? PropertyValueType.Integer
|
|
325
|
+
: base === 'BOOLEAN' ? PropertyValueType.Boolean : base === 'LOGICAL' ? PropertyValueType.Logical : PropertyValueType.Real;
|
|
326
|
+
return { valueType, dataType: name };
|
|
327
|
+
}
|
|
301
328
|
//# sourceMappingURL=declared-property-type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-property-type.js","sourceRoot":"","sources":["../src/declared-property-type.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"declared-property-type.js","sourceRoot":"","sources":["../src/declared-property-type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import { type MutablePropertyView } from '@ifc-lite/mutations';
|
|
3
|
+
/** In-place writes may only affect the requested products. A shared geometry
|
|
4
|
+
* or placement leaf is refused before writing rather than moving/resizing a
|
|
5
|
+
* second occurrence. Reverse walks stop at products and are iterative. */
|
|
6
|
+
export declare function editOwnershipRefusal(store: IfcDataStore, view: MutablePropertyView, writtenIds: readonly number[], allowedProducts: ReadonlySet<number>): string | null;
|
|
7
|
+
//# sourceMappingURL=edit-ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-ownership.d.ts","sourceRoot":"","sources":["../src/edit-ownership.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAgC/D;;0EAE0E;AAC1E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAClH,MAAM,GAAG,IAAI,CA6Cf"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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 { getInheritanceChainAcrossSchemas } from '@ifc-lite/parser';
|
|
5
|
+
import { collectRefsInByteRange } from './reference-collector.js';
|
|
6
|
+
import { getCompleteEntityIndex } from './entity-iteration.js';
|
|
7
|
+
import { effectiveCreatedRecord, effectiveSourceRecord } from './effective-source-record.js';
|
|
8
|
+
/** The parsed source/index are immutable. Build their reverse references once
|
|
9
|
+
* per loaded model; only the live overlay is rescanned for each edit. */
|
|
10
|
+
const sourceReferences = new WeakMap();
|
|
11
|
+
function sourceInverse(store) {
|
|
12
|
+
const cached = sourceReferences.get(store);
|
|
13
|
+
// @raw-entity-enumeration-ok identity comparison only; enumeration below uses the complete index
|
|
14
|
+
if (cached?.source === store.source && cached.primary === store.entityIndex.byId
|
|
15
|
+
&& cached.deferred === store.deferredEntityIndex)
|
|
16
|
+
return cached.inverse;
|
|
17
|
+
const inverse = new Map();
|
|
18
|
+
for (const [id, record] of getCompleteEntityIndex(store)) {
|
|
19
|
+
for (const ref of new Set(collectRefsInByteRange(store.source, record.byteOffset, record.byteLength))) {
|
|
20
|
+
if (ref === id)
|
|
21
|
+
continue;
|
|
22
|
+
const parents = inverse.get(ref) ?? [];
|
|
23
|
+
parents.push(id);
|
|
24
|
+
inverse.set(ref, parents);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// @raw-entity-enumeration-ok retain immutable index identity only for inverse-cache invalidation
|
|
28
|
+
sourceReferences.set(store, { source: store.source, primary: store.entityIndex.byId, deferred: store.deferredEntityIndex, inverse });
|
|
29
|
+
return inverse;
|
|
30
|
+
}
|
|
31
|
+
/** In-place writes may only affect the requested products. A shared geometry
|
|
32
|
+
* or placement leaf is refused before writing rather than moving/resizing a
|
|
33
|
+
* second occurrence. Reverse walks stop at products and are iterative. */
|
|
34
|
+
export function editOwnershipRefusal(store, view, writtenIds, allowedProducts) {
|
|
35
|
+
if (writtenIds.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const baseline = sourceInverse(store), inverse = new Map();
|
|
38
|
+
const changed = new Set(view.getEffectiveChanges().map(change => change.entityId));
|
|
39
|
+
for (const entity of view.getNewEntities())
|
|
40
|
+
changed.add(entity.expressId);
|
|
41
|
+
const encoder = new TextEncoder(), decoder = new TextDecoder();
|
|
42
|
+
for (const expressId of changed) {
|
|
43
|
+
if (view.getTombstones().has(expressId))
|
|
44
|
+
continue;
|
|
45
|
+
const created = effectiveCreatedRecord(view, expressId, store.schemaVersion);
|
|
46
|
+
// @raw-entity-enumeration-ok point lookup of an already changed record's source bytes; effectiveSourceRecord applies the overlay
|
|
47
|
+
const source = created ? undefined : store.entityIndex.byId.get(expressId);
|
|
48
|
+
let refs;
|
|
49
|
+
if (created) {
|
|
50
|
+
const bytes = encoder.encode(created.text);
|
|
51
|
+
refs = collectRefsInByteRange(bytes, 0, bytes.length);
|
|
52
|
+
}
|
|
53
|
+
else if (source) {
|
|
54
|
+
if (view.getPositionalMutationsForEntity(expressId)?.size || view.getAttributeMutationsForEntity(expressId).length || view.getEntityTypeMutation(expressId)) {
|
|
55
|
+
const text = decoder.decode(store.source.slice(source.byteOffset, source.byteOffset + source.byteLength));
|
|
56
|
+
const effective = effectiveSourceRecord(view, expressId, text, source.type, store.schemaVersion);
|
|
57
|
+
const bytes = encoder.encode(effective.text);
|
|
58
|
+
refs = collectRefsInByteRange(bytes, 0, bytes.length);
|
|
59
|
+
}
|
|
60
|
+
else
|
|
61
|
+
refs = collectRefsInByteRange(store.source, source.byteOffset, source.byteLength);
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
continue;
|
|
65
|
+
for (const ref of new Set(refs)) {
|
|
66
|
+
if (ref === expressId)
|
|
67
|
+
continue;
|
|
68
|
+
const parents = inverse.get(ref) ?? [];
|
|
69
|
+
parents.push(expressId);
|
|
70
|
+
inverse.set(ref, parents);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const queue = [...writtenIds], visited = new Set();
|
|
74
|
+
while (queue.length) {
|
|
75
|
+
const id = queue.pop();
|
|
76
|
+
if (visited.has(id))
|
|
77
|
+
continue;
|
|
78
|
+
visited.add(id);
|
|
79
|
+
if (view.getTombstones().has(id))
|
|
80
|
+
continue;
|
|
81
|
+
// @raw-entity-enumeration-ok point class fallback after tombstone, retype and created-record handling
|
|
82
|
+
const type = view.getEntityTypeMutation(id)?.newType ?? view.getNewEntity(id)?.type ?? store.entityIndex.byId.get(id)?.type;
|
|
83
|
+
if (type && getInheritanceChainAcrossSchemas(type).includes('IfcProduct')) {
|
|
84
|
+
if (!allowedProducts.has(id))
|
|
85
|
+
return `The edit shares placement or geometry with #${id}; shared occurrences cannot be edited in place`;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
for (const parent of baseline.get(id) ?? [])
|
|
89
|
+
if (!changed.has(parent))
|
|
90
|
+
queue.push(parent);
|
|
91
|
+
queue.push(...(inverse.get(id) ?? []));
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=edit-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-ownership.js","sourceRoot":"","sources":["../src/edit-ownership.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,gCAAgC,EAAqB,MAAM,kBAAkB,CAAC;AAEvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE7F;yEACyE;AACzE,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAKhC,CAAC;AAEL,SAAS,aAAa,CAAC,KAAmB;IACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3C,iGAAiG;IACjG,IAAI,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI;WAC3E,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,mBAAmB;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACtG,IAAI,GAAG,KAAK,EAAE;gBAAE,SAAS;YACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,iGAAiG;IACjG,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC;IACrI,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;0EAE0E;AAC1E,MAAM,UAAU,oBAAoB,CAClC,KAAmB,EAAE,IAAyB,EAAE,UAA6B,EAAE,eAAoC;IAEnH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,EAAE,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAC/D,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAClD,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7E,iIAAiI;QACjI,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3E,IAAI,IAAc,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5J,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1G,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;gBACjG,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACxD,CAAC;;gBAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3F,CAAC;;YAAM,SAAS;QAChB,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS;YAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3D,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACxB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC3C,sGAAsG;QACtG,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC5H,IAAI,IAAI,IAAI,gCAAgC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1E,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,+CAA+C,EAAE,gDAAgD,CAAC;YACvI,SAAS;QACX,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
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,CAkBtB;
|
|
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,CAkBtB;AAuSD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQ1F"}
|
package/dist/effective-index.js
CHANGED
|
@@ -318,10 +318,10 @@ class OverlayIndex {
|
|
|
318
318
|
get byType() {
|
|
319
319
|
if (this.cachedByType)
|
|
320
320
|
return this.cachedByType;
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
// store's own index is never mutated.
|
|
321
|
+
// Arrays stay SHARED with the store until a key changes; a changed key gets ONE fresh
|
|
322
|
+
// array (`owned`) that later appends grow: the store is never mutated, N appends are O(N).
|
|
324
323
|
const out = new Map(this.sourceByType);
|
|
324
|
+
const owned = new Set();
|
|
325
325
|
const removeByType = new Map();
|
|
326
326
|
const markRemoved = (id) => {
|
|
327
327
|
const sourceType = this.base.get(id)?.type.toUpperCase();
|
|
@@ -342,12 +342,19 @@ class OverlayIndex {
|
|
|
342
342
|
}
|
|
343
343
|
for (const [type, ids] of removeByType) {
|
|
344
344
|
const arr = out.get(type);
|
|
345
|
-
if (arr)
|
|
345
|
+
if (arr) {
|
|
346
346
|
out.set(type, arr.filter((id) => !ids.has(id)));
|
|
347
|
+
owned.add(type);
|
|
348
|
+
}
|
|
347
349
|
}
|
|
348
350
|
const append = (type, id) => {
|
|
349
351
|
const arr = out.get(type);
|
|
350
|
-
|
|
352
|
+
if (arr && owned.has(type))
|
|
353
|
+
arr.push(id);
|
|
354
|
+
else {
|
|
355
|
+
out.set(type, arr ? [...arr, id] : [id]);
|
|
356
|
+
owned.add(type);
|
|
357
|
+
}
|
|
351
358
|
};
|
|
352
359
|
for (const id of this.created.keys()) {
|
|
353
360
|
const type = this.typeOf(id);
|