@ifc-lite/mutations 2.0.0 → 2.2.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/apply-mutations.d.ts +47 -0
- package/dist/apply-mutations.d.ts.map +1 -0
- package/dist/apply-mutations.js +182 -0
- package/dist/apply-mutations.js.map +1 -0
- package/dist/bulk-query-engine.d.ts +2 -4
- package/dist/bulk-query-engine.d.ts.map +1 -1
- package/dist/bulk-query-engine.js +2 -1
- package/dist/bulk-query-engine.js.map +1 -1
- package/dist/cooperative-clone.d.ts +4 -0
- package/dist/cooperative-clone.d.ts.map +1 -0
- package/dist/cooperative-clone.js +93 -0
- package/dist/cooperative-clone.js.map +1 -0
- package/dist/cooperative-control.d.ts +17 -0
- package/dist/cooperative-control.d.ts.map +1 -0
- package/dist/cooperative-control.js +67 -0
- package/dist/cooperative-control.js.map +1 -0
- package/dist/cooperative-operation-types.d.ts +53 -0
- package/dist/cooperative-operation-types.d.ts.map +1 -0
- package/dist/cooperative-operation-types.js +2 -0
- package/dist/cooperative-operation-types.js.map +1 -0
- package/dist/cooperative-overlay-access.d.ts +14 -0
- package/dist/cooperative-overlay-access.d.ts.map +1 -0
- package/dist/cooperative-overlay-access.js +12 -0
- package/dist/cooperative-overlay-access.js.map +1 -0
- package/dist/execute-entity-operation.d.ts +6 -0
- package/dist/execute-entity-operation.d.ts.map +1 -0
- package/dist/execute-entity-operation.js +39 -0
- package/dist/execute-entity-operation.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/mutable-overlay-state.d.ts +143 -0
- package/dist/mutable-overlay-state.d.ts.map +1 -0
- package/dist/mutable-overlay-state.js +115 -0
- package/dist/mutable-overlay-state.js.map +1 -0
- package/dist/mutable-property-view.d.ts +62 -86
- package/dist/mutable-property-view.d.ts.map +1 -1
- package/dist/mutable-property-view.js +131 -238
- package/dist/mutable-property-view.js.map +1 -1
- package/dist/overlay-value-equality.d.ts +3 -0
- package/dist/overlay-value-equality.d.ts.map +1 -0
- package/dist/overlay-value-equality.js +52 -0
- package/dist/overlay-value-equality.js.map +1 -0
- package/dist/prepare-entity-operations.d.ts +7 -0
- package/dist/prepare-entity-operations.d.ts.map +1 -0
- package/dist/prepare-entity-operations.js +117 -0
- package/dist/prepare-entity-operations.js.map +1 -0
- package/dist/store-editor.d.ts +12 -14
- package/dist/store-editor.d.ts.map +1 -1
- package/dist/store-editor.js +42 -0
- package/dist/store-editor.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MutablePropertyView } from './mutable-property-view.js';
|
|
2
|
+
import type { MutableOverlayState } from './mutable-overlay-state.js';
|
|
3
|
+
export type OverlaySnapshot = ReturnType<MutableOverlayState['copyOverlayState']>;
|
|
4
|
+
interface OverlayAccess {
|
|
5
|
+
capture(): OverlaySnapshot;
|
|
6
|
+
matches(snapshot: OverlaySnapshot): boolean;
|
|
7
|
+
draft(snapshot: OverlaySnapshot): MutablePropertyView;
|
|
8
|
+
publish(snapshot: OverlaySnapshot): void;
|
|
9
|
+
}
|
|
10
|
+
/** Package-private capability; no mutable graph is exposed by the public handle. */
|
|
11
|
+
export declare function registerCooperativeOverlay(view: MutablePropertyView, capabilities: OverlayAccess): void;
|
|
12
|
+
export declare function cooperativeOverlay(view: MutablePropertyView): OverlayAccess;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=cooperative-overlay-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cooperative-overlay-access.d.ts","sourceRoot":"","sources":["../src/cooperative-overlay-access.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAClF,UAAU,aAAa;IACrB,OAAO,IAAI,eAAe,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC;IAC5C,KAAK,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAAC;IACtD,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAEvG;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,aAAa,CAI3E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const access = new WeakMap();
|
|
2
|
+
/** Package-private capability; no mutable graph is exposed by the public handle. */
|
|
3
|
+
export function registerCooperativeOverlay(view, capabilities) {
|
|
4
|
+
access.set(view, capabilities);
|
|
5
|
+
}
|
|
6
|
+
export function cooperativeOverlay(view) {
|
|
7
|
+
const result = access.get(view);
|
|
8
|
+
if (!result)
|
|
9
|
+
throw new Error('Unregistered mutation view.');
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=cooperative-overlay-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cooperative-overlay-access.js","sourceRoot":"","sources":["../src/cooperative-overlay-access.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAsC,CAAC;AACjE,oFAAoF;AACpF,MAAM,UAAU,0BAA0B,CAAC,IAAyB,EAAE,YAA2B;IAC/F,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { StoreEditor } from './store-editor.js';
|
|
2
|
+
import type { MutablePropertyView } from './mutable-property-view.js';
|
|
3
|
+
import type { EntityOperation, EntityOperationEffect } from './cooperative-operation-types.js';
|
|
4
|
+
/** Reuse the canonical editor, including type normalization, allocation and removal rules. */
|
|
5
|
+
export declare function executeEntityOperation(editor: StoreEditor, view: MutablePropertyView, operation: EntityOperation): EntityOperationEffect;
|
|
6
|
+
//# sourceMappingURL=execute-entity-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-entity-operation.d.ts","sourceRoot":"","sources":["../src/execute-entity-operation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE/F,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,GAAG,qBAAqB,CAgCxI"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Reuse the canonical editor, including type normalization, allocation and removal rules. */
|
|
2
|
+
export function executeEntityOperation(editor, view, operation) {
|
|
3
|
+
if (!operation || !Number.isSafeInteger(operation.expressId) || operation.expressId <= 0) {
|
|
4
|
+
throw new TypeError('Entity operations require a positive integral expressId.');
|
|
5
|
+
}
|
|
6
|
+
switch (operation.kind) {
|
|
7
|
+
case 'create': {
|
|
8
|
+
if (operation.expressId !== view.peekNextExpressId() || !Array.isArray(operation.attributes)) {
|
|
9
|
+
throw new Error('Entity operation allocation changed or attributes are invalid.');
|
|
10
|
+
}
|
|
11
|
+
const entity = editor.addEntity(operation.type, operation.attributes);
|
|
12
|
+
if (entity.expressId !== operation.expressId)
|
|
13
|
+
throw new Error('Entity operation allocation changed.');
|
|
14
|
+
return { kind: 'create', entity: editor.getNewEntity(entity.expressId) };
|
|
15
|
+
}
|
|
16
|
+
case 'setPositionalAttribute': {
|
|
17
|
+
if (!editor.hasEntity(operation.expressId) || !Number.isSafeInteger(operation.index) || operation.index < 0) {
|
|
18
|
+
throw new Error('Invalid positional entity operation target.');
|
|
19
|
+
}
|
|
20
|
+
const attributes = view.getPositionalMutationsForEntity(operation.expressId);
|
|
21
|
+
const effect = { kind: operation.kind, expressId: operation.expressId,
|
|
22
|
+
index: operation.index, present: attributes?.has(operation.index) ?? false, value: attributes?.get(operation.index) };
|
|
23
|
+
// The view owns skip-history semantics; StoreEditor owns ordinary writes.
|
|
24
|
+
if (operation.skipHistory)
|
|
25
|
+
view.setPositionalAttribute(operation.expressId, operation.index, operation.value, true);
|
|
26
|
+
else
|
|
27
|
+
editor.setPositionalAttribute(operation.expressId, operation.index, operation.value);
|
|
28
|
+
return effect;
|
|
29
|
+
}
|
|
30
|
+
case 'remove': {
|
|
31
|
+
const entity = editor.getNewEntity(operation.expressId);
|
|
32
|
+
if (!editor.removeEntity(operation.expressId))
|
|
33
|
+
throw new Error(`Cannot remove missing IFC entity #${operation.expressId}.`);
|
|
34
|
+
return { kind: operation.kind, expressId: operation.expressId, entity };
|
|
35
|
+
}
|
|
36
|
+
default: throw new TypeError('Unsupported entity operation.');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=execute-entity-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-entity-operation.js","sourceRoot":"","sources":["../src/execute-entity-operation.ts"],"names":[],"mappings":"AAOA,8FAA8F;AAC9F,MAAM,UAAU,sBAAsB,CAAC,MAAmB,EAAE,IAAyB,EAAE,SAA0B;IAC/G,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;IAClF,CAAC;IACD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7F,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAE,EAAE,CAAC;QAC5E,CAAC;QACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC5G,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7E,MAAM,MAAM,GAA0B,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC1F,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACxH,0EAA0E;YAC1E,IAAI,SAAS,CAAC,WAAW;gBAAE,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;;gBAC/G,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1F,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;YAC5H,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,4 +9,5 @@ export { MutationGuardError, type MutationGuard } from './mutation-guard.js';
|
|
|
9
9
|
export { BulkQueryEngine, type SelectionCriteria, type BulkAction, type BulkQuery, type BulkQueryPreview, type BulkQueryResult, type PropertyFilter, type FilterOperator, } from './bulk-query-engine.js';
|
|
10
10
|
export { CsvConnector, type CsvRow, type MatchStrategy, type PropertyMapping, type DataMapping, type MatchResult, type ImportStats, type ImportProgress, type CsvParseOptions, } from './csv-connector.js';
|
|
11
11
|
export { changeSetToOps, deriveEntityIdentity, type ChangeSetOp, type ChangeSetOpsResult, type DerivedIdentityEntry, type EntityIdentityResolver, } from './change-set-to-ops.js';
|
|
12
|
+
export type { EntityOperation, EntityOperationEffect, EntityPreparationOptions, PreparedEntityOperations } from './cooperative-operation-types.js';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { PropertySet, QuantitySet } from '@ifc-lite/data';
|
|
2
|
+
import type { IfcAttributeValue, PropertyMutation, QuantityMutation, AttributeMutation, EntityTypeMutation, Mutation, NewEntity } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Everything `deleteEntity` purges out of the live overlay maps for a
|
|
5
|
+
* forgotten-created entity, captured so `restoreNewEntity` can put it all
|
|
6
|
+
* back. See the field doc on `MutablePropertyView.forgottenEntityOverlay`.
|
|
7
|
+
*/
|
|
8
|
+
export interface ForgottenEntityOverlay {
|
|
9
|
+
propertyEntries: Array<[key: string, mutation: PropertyMutation]>;
|
|
10
|
+
quantityEntries: Array<[key: string, mutation: QuantityMutation]>;
|
|
11
|
+
attributeEntries: Array<[key: string, mutation: AttributeMutation]>;
|
|
12
|
+
positionalAttrs: Map<number, IfcAttributeValue> | null;
|
|
13
|
+
typeMutation: EntityTypeMutation | null;
|
|
14
|
+
newPsets: Map<string, PropertySet> | null;
|
|
15
|
+
newQsets: Map<string, QuantitySet> | null;
|
|
16
|
+
deletedPsetKeys: string[];
|
|
17
|
+
deletedQsetKeys: string[];
|
|
18
|
+
/** This entity's own records, removed from the append-only `mutationHistory`. */
|
|
19
|
+
historyEntries: Mutation[];
|
|
20
|
+
}
|
|
21
|
+
/** Internal mutable overlay state; source tables and extractors are never copied. */
|
|
22
|
+
export declare class MutableOverlayState {
|
|
23
|
+
protected propertyMutations: Map<string, PropertyMutation>;
|
|
24
|
+
protected quantityMutations: Map<string, QuantityMutation>;
|
|
25
|
+
/**
|
|
26
|
+
* Secondary indices: entityId → mutation keys for that entity.
|
|
27
|
+
*
|
|
28
|
+
* `getForEntity` previously iterated the entire `propertyMutations` /
|
|
29
|
+
* `quantityMutations` map per pset to find newly-added properties — O(M·P)
|
|
30
|
+
* per call. These indices keep that step O(M_entity) instead.
|
|
31
|
+
*/
|
|
32
|
+
protected propertyKeysByEntity: Map<number, Set<string>>;
|
|
33
|
+
protected quantityKeysByEntity: Map<number, Set<string>>;
|
|
34
|
+
protected attributeKeysByEntity: Map<number, Set<string>>;
|
|
35
|
+
protected deletedPsets: Set<string>;
|
|
36
|
+
protected deletedQsets: Set<string>;
|
|
37
|
+
protected newPsets: Map<number, Map<string, PropertySet>>;
|
|
38
|
+
protected newQsets: Map<number, Map<string, QuantitySet>>;
|
|
39
|
+
protected attributeMutations: Map<string, AttributeMutation>;
|
|
40
|
+
protected positionalAttrMutations: Map<number, Map<number, IfcAttributeValue>>;
|
|
41
|
+
protected typeMutations: Map<number, EntityTypeMutation>;
|
|
42
|
+
protected newEntities: Map<number, NewEntity>;
|
|
43
|
+
protected tombstones: Set<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Ids `createEntity` allocated and `deleteEntity` then forgot (removed from
|
|
46
|
+
* `newEntities`, per that method's "existing entities are tombstoned; new
|
|
47
|
+
* entities are simply forgotten" contract). Tracked separately so
|
|
48
|
+
* `getEffectiveChanges()` / `collectEffectiveChanges` can tell "overlay-created
|
|
49
|
+
* then forgotten" apart from "an ordinary source-buffer entity" — both are
|
|
50
|
+
* otherwise indistinguishable, being simply absent from `newEntities`.
|
|
51
|
+
* `restoreNewEntity` (the undo-of-delete counterpart) clears the id back out.
|
|
52
|
+
*/
|
|
53
|
+
protected forgottenCreatedEntities: Set<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Snapshot of a forgotten-created entity's overlay rows, stashed by
|
|
56
|
+
* `deleteEntity` and restored by `restoreNewEntity`.
|
|
57
|
+
*
|
|
58
|
+
* `deleteEntity` on an overlay-created entity does more than drop it from
|
|
59
|
+
* `newEntities` — it also PURGES every other overlay entry the entity left
|
|
60
|
+
* behind (property/quantity/attribute/positional/type mutations, its
|
|
61
|
+
* `newPsets`/`newQsets` entries, and its own `mutationHistory` records).
|
|
62
|
+
* Without that purge, an entity that was created, edited, then deleted
|
|
63
|
+
* before export left a dangling reference: `StepExporter` derives its
|
|
64
|
+
* property/quantity work list from `getMutations()` (the append-only
|
|
65
|
+
* history) and reads `getForEntity()` / `getQuantitiesForEntity()` straight
|
|
66
|
+
* off `newPsets` / `newQsets` — neither of which the review-side
|
|
67
|
+
* `forgottenCreatedEntities` filter in `effective-changes.ts` touches. The
|
|
68
|
+
* review dialog looked clean while the exported file still contained an
|
|
69
|
+
* `IFCPROPERTYSET` + `IFCRELDEFINESBYPROPERTIES` pointing at an expressId
|
|
70
|
+
* that was never actually created (maintainer finding on #1967).
|
|
71
|
+
*
|
|
72
|
+
* The purged data is captured here, not discarded, because `restoreNewEntity`
|
|
73
|
+
* (undo of the delete) must bring it all back — rows AND count AND what the
|
|
74
|
+
* exporter would see — not just re-add the bare `NewEntity` record.
|
|
75
|
+
*/
|
|
76
|
+
protected forgottenEntityOverlay: Map<number, ForgottenEntityOverlay>;
|
|
77
|
+
/**
|
|
78
|
+
* Overlay-entity → source-entity aliases for property/quantity reads.
|
|
79
|
+
*
|
|
80
|
+
* When the viewer duplicates an existing entity, the new entity has
|
|
81
|
+
* no row in the parsed property table — `getBasePropertiesForEntity`
|
|
82
|
+
* would return `[]` and the property panel would show "No property
|
|
83
|
+
* sets". Aliasing redirects the BASE read to the source entity so
|
|
84
|
+
* the duplicate inherits its psets / qsets visually, while overlay
|
|
85
|
+
* mutations (overrides, creates, deletes) stay scoped to the
|
|
86
|
+
* overlay-entity's own id — so editing a property on the duplicate
|
|
87
|
+
* doesn't bleed into the source.
|
|
88
|
+
*
|
|
89
|
+
* Aliases follow at most one hop (no chains). They never affect
|
|
90
|
+
* STEP export — the export overlay emits the duplicate exactly as
|
|
91
|
+
* the StoreEditor recorded it, with whatever new IfcRel*ByProperties
|
|
92
|
+
* the caller chose to add.
|
|
93
|
+
*/
|
|
94
|
+
protected entityAliases: Map<number, number>;
|
|
95
|
+
protected nextAllocatedId: number;
|
|
96
|
+
protected mutationHistory: Mutation[];
|
|
97
|
+
/** Borrowed only for synchronous comparison; never returned to callers. */
|
|
98
|
+
protected overlayState(): {
|
|
99
|
+
propertyMutations: Map<string, PropertyMutation>;
|
|
100
|
+
quantityMutations: Map<string, QuantityMutation>;
|
|
101
|
+
propertyKeysByEntity: Map<number, Set<string>>;
|
|
102
|
+
quantityKeysByEntity: Map<number, Set<string>>;
|
|
103
|
+
attributeKeysByEntity: Map<number, Set<string>>;
|
|
104
|
+
deletedPsets: Set<string>;
|
|
105
|
+
deletedQsets: Set<string>;
|
|
106
|
+
newPsets: Map<number, Map<string, PropertySet>>;
|
|
107
|
+
newQsets: Map<number, Map<string, QuantitySet>>;
|
|
108
|
+
attributeMutations: Map<string, AttributeMutation>;
|
|
109
|
+
positionalAttrMutations: Map<number, Map<number, IfcAttributeValue>>;
|
|
110
|
+
typeMutations: Map<number, EntityTypeMutation>;
|
|
111
|
+
newEntities: Map<number, NewEntity>;
|
|
112
|
+
tombstones: Set<number>;
|
|
113
|
+
forgottenCreatedEntities: Set<number>;
|
|
114
|
+
forgottenEntityOverlay: Map<number, ForgottenEntityOverlay>;
|
|
115
|
+
entityAliases: Map<number, number>;
|
|
116
|
+
nextAllocatedId: number;
|
|
117
|
+
mutationHistory: Mutation[];
|
|
118
|
+
};
|
|
119
|
+
protected copyOverlayState(): {
|
|
120
|
+
propertyMutations: Map<string, PropertyMutation>;
|
|
121
|
+
quantityMutations: Map<string, QuantityMutation>;
|
|
122
|
+
propertyKeysByEntity: Map<number, Set<string>>;
|
|
123
|
+
quantityKeysByEntity: Map<number, Set<string>>;
|
|
124
|
+
attributeKeysByEntity: Map<number, Set<string>>;
|
|
125
|
+
deletedPsets: Set<string>;
|
|
126
|
+
deletedQsets: Set<string>;
|
|
127
|
+
newPsets: Map<number, Map<string, PropertySet>>;
|
|
128
|
+
newQsets: Map<number, Map<string, QuantitySet>>;
|
|
129
|
+
attributeMutations: Map<string, AttributeMutation>;
|
|
130
|
+
positionalAttrMutations: Map<number, Map<number, IfcAttributeValue>>;
|
|
131
|
+
typeMutations: Map<number, EntityTypeMutation>;
|
|
132
|
+
newEntities: Map<number, NewEntity>;
|
|
133
|
+
tombstones: Set<number>;
|
|
134
|
+
forgottenCreatedEntities: Set<number>;
|
|
135
|
+
forgottenEntityOverlay: Map<number, ForgottenEntityOverlay>;
|
|
136
|
+
entityAliases: Map<number, number>;
|
|
137
|
+
nextAllocatedId: number;
|
|
138
|
+
mutationHistory: Mutation[];
|
|
139
|
+
};
|
|
140
|
+
protected restoreOverlayState(state: ReturnType<MutableOverlayState['copyOverlayState']>): void;
|
|
141
|
+
protected matchesOverlayState(state: ReturnType<MutableOverlayState['copyOverlayState']>): boolean;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=mutable-overlay-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutable-overlay-state.d.ts","sourceRoot":"","sources":["../src/mutable-overlay-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EACpF,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG9D;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAClE,eAAe,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAClE,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpE,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACvD,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAC1C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iFAAiF;IACjF,cAAc,EAAE,QAAQ,EAAE,CAAC;CAC5B;AAED,qFAAqF;AACrF,qBAAa,mBAAmB;IAC9B,SAAS,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAa;IACvE,SAAS,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAa;IACvE;;;;;;OAMG;IACH,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IACrE,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IACrE,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IACtE,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAChD,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAChD,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAa;IACtE,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAa;IACtE,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAa;IACzE,SAAS,CAAC,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAa;IAC3F,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAa;IACrE,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IAC1D,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAC9C;;;;;;;;OAQG;IACH,SAAS,CAAC,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAC5D;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAAC,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAa;IAClF;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACzD,SAAS,CAAC,eAAe,EAAE,MAAM,CAAK;IACtC,SAAS,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAM;IAE3C,2EAA2E;IAC3E,SAAS,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;IAwBtB,SAAS,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;IAI1B,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI;IAI/F,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,GAAG,OAAO;CAGnG"}
|
|
@@ -0,0 +1,115 @@
|
|
|
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 { sameOverlayValue } from './overlay-value-equality.js';
|
|
5
|
+
/** Internal mutable overlay state; source tables and extractors are never copied. */
|
|
6
|
+
export class MutableOverlayState {
|
|
7
|
+
propertyMutations = new Map();
|
|
8
|
+
quantityMutations = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Secondary indices: entityId → mutation keys for that entity.
|
|
11
|
+
*
|
|
12
|
+
* `getForEntity` previously iterated the entire `propertyMutations` /
|
|
13
|
+
* `quantityMutations` map per pset to find newly-added properties — O(M·P)
|
|
14
|
+
* per call. These indices keep that step O(M_entity) instead.
|
|
15
|
+
*/
|
|
16
|
+
propertyKeysByEntity = new Map();
|
|
17
|
+
quantityKeysByEntity = new Map();
|
|
18
|
+
attributeKeysByEntity = new Map();
|
|
19
|
+
deletedPsets = new Set(); // `${entityId}:${psetName}`
|
|
20
|
+
deletedQsets = new Set(); // `${entityId}:${qsetName}`
|
|
21
|
+
newPsets = new Map(); // entityId -> psetName -> PropertySet
|
|
22
|
+
newQsets = new Map(); // entityId -> qsetName -> QuantitySet
|
|
23
|
+
attributeMutations = new Map(); // `${entityId}:attr:${attrName}`
|
|
24
|
+
positionalAttrMutations = new Map(); // entityId -> argIndex -> value
|
|
25
|
+
typeMutations = new Map(); // entityId -> retype intent
|
|
26
|
+
newEntities = new Map();
|
|
27
|
+
tombstones = new Set();
|
|
28
|
+
/**
|
|
29
|
+
* Ids `createEntity` allocated and `deleteEntity` then forgot (removed from
|
|
30
|
+
* `newEntities`, per that method's "existing entities are tombstoned; new
|
|
31
|
+
* entities are simply forgotten" contract). Tracked separately so
|
|
32
|
+
* `getEffectiveChanges()` / `collectEffectiveChanges` can tell "overlay-created
|
|
33
|
+
* then forgotten" apart from "an ordinary source-buffer entity" — both are
|
|
34
|
+
* otherwise indistinguishable, being simply absent from `newEntities`.
|
|
35
|
+
* `restoreNewEntity` (the undo-of-delete counterpart) clears the id back out.
|
|
36
|
+
*/
|
|
37
|
+
forgottenCreatedEntities = new Set();
|
|
38
|
+
/**
|
|
39
|
+
* Snapshot of a forgotten-created entity's overlay rows, stashed by
|
|
40
|
+
* `deleteEntity` and restored by `restoreNewEntity`.
|
|
41
|
+
*
|
|
42
|
+
* `deleteEntity` on an overlay-created entity does more than drop it from
|
|
43
|
+
* `newEntities` — it also PURGES every other overlay entry the entity left
|
|
44
|
+
* behind (property/quantity/attribute/positional/type mutations, its
|
|
45
|
+
* `newPsets`/`newQsets` entries, and its own `mutationHistory` records).
|
|
46
|
+
* Without that purge, an entity that was created, edited, then deleted
|
|
47
|
+
* before export left a dangling reference: `StepExporter` derives its
|
|
48
|
+
* property/quantity work list from `getMutations()` (the append-only
|
|
49
|
+
* history) and reads `getForEntity()` / `getQuantitiesForEntity()` straight
|
|
50
|
+
* off `newPsets` / `newQsets` — neither of which the review-side
|
|
51
|
+
* `forgottenCreatedEntities` filter in `effective-changes.ts` touches. The
|
|
52
|
+
* review dialog looked clean while the exported file still contained an
|
|
53
|
+
* `IFCPROPERTYSET` + `IFCRELDEFINESBYPROPERTIES` pointing at an expressId
|
|
54
|
+
* that was never actually created (maintainer finding on #1967).
|
|
55
|
+
*
|
|
56
|
+
* The purged data is captured here, not discarded, because `restoreNewEntity`
|
|
57
|
+
* (undo of the delete) must bring it all back — rows AND count AND what the
|
|
58
|
+
* exporter would see — not just re-add the bare `NewEntity` record.
|
|
59
|
+
*/
|
|
60
|
+
forgottenEntityOverlay = new Map();
|
|
61
|
+
/**
|
|
62
|
+
* Overlay-entity → source-entity aliases for property/quantity reads.
|
|
63
|
+
*
|
|
64
|
+
* When the viewer duplicates an existing entity, the new entity has
|
|
65
|
+
* no row in the parsed property table — `getBasePropertiesForEntity`
|
|
66
|
+
* would return `[]` and the property panel would show "No property
|
|
67
|
+
* sets". Aliasing redirects the BASE read to the source entity so
|
|
68
|
+
* the duplicate inherits its psets / qsets visually, while overlay
|
|
69
|
+
* mutations (overrides, creates, deletes) stay scoped to the
|
|
70
|
+
* overlay-entity's own id — so editing a property on the duplicate
|
|
71
|
+
* doesn't bleed into the source.
|
|
72
|
+
*
|
|
73
|
+
* Aliases follow at most one hop (no chains). They never affect
|
|
74
|
+
* STEP export — the export overlay emits the duplicate exactly as
|
|
75
|
+
* the StoreEditor recorded it, with whatever new IfcRel*ByProperties
|
|
76
|
+
* the caller chose to add.
|
|
77
|
+
*/
|
|
78
|
+
entityAliases = new Map();
|
|
79
|
+
nextAllocatedId = 0;
|
|
80
|
+
mutationHistory = [];
|
|
81
|
+
/** Borrowed only for synchronous comparison; never returned to callers. */
|
|
82
|
+
overlayState() {
|
|
83
|
+
return {
|
|
84
|
+
propertyMutations: this.propertyMutations,
|
|
85
|
+
quantityMutations: this.quantityMutations,
|
|
86
|
+
propertyKeysByEntity: this.propertyKeysByEntity,
|
|
87
|
+
quantityKeysByEntity: this.quantityKeysByEntity,
|
|
88
|
+
attributeKeysByEntity: this.attributeKeysByEntity,
|
|
89
|
+
deletedPsets: this.deletedPsets,
|
|
90
|
+
deletedQsets: this.deletedQsets,
|
|
91
|
+
newPsets: this.newPsets,
|
|
92
|
+
newQsets: this.newQsets,
|
|
93
|
+
attributeMutations: this.attributeMutations,
|
|
94
|
+
positionalAttrMutations: this.positionalAttrMutations,
|
|
95
|
+
typeMutations: this.typeMutations,
|
|
96
|
+
newEntities: this.newEntities,
|
|
97
|
+
tombstones: this.tombstones,
|
|
98
|
+
forgottenCreatedEntities: this.forgottenCreatedEntities,
|
|
99
|
+
forgottenEntityOverlay: this.forgottenEntityOverlay,
|
|
100
|
+
entityAliases: this.entityAliases,
|
|
101
|
+
nextAllocatedId: this.nextAllocatedId,
|
|
102
|
+
mutationHistory: this.mutationHistory,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
copyOverlayState() {
|
|
106
|
+
return structuredClone(this.overlayState());
|
|
107
|
+
}
|
|
108
|
+
restoreOverlayState(state) {
|
|
109
|
+
Object.assign(this, state);
|
|
110
|
+
}
|
|
111
|
+
matchesOverlayState(state) {
|
|
112
|
+
return sameOverlayValue(this.overlayState(), state);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=mutable-overlay-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutable-overlay-state.js","sourceRoot":"","sources":["../src/mutable-overlay-state.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAyB/D,qFAAqF;AACrF,MAAM,OAAO,mBAAmB;IACpB,iBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;IAC7D,iBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;IACvE;;;;;;OAMG;IACO,oBAAoB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC3D,oBAAoB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC3D,qBAAqB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC5D,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;IACnE,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;IACnE,QAAQ,GAA0C,IAAI,GAAG,EAAE,CAAC,CAAC,sCAAsC;IACnG,QAAQ,GAA0C,IAAI,GAAG,EAAE,CAAC,CAAC,sCAAsC;IACnG,kBAAkB,GAAmC,IAAI,GAAG,EAAE,CAAC,CAAC,iCAAiC;IACjG,uBAAuB,GAAgD,IAAI,GAAG,EAAE,CAAC,CAAC,gCAAgC;IAClH,aAAa,GAAoC,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;IACxF,WAAW,GAA2B,IAAI,GAAG,EAAE,CAAC;IAChD,UAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC9C;;;;;;;;OAQG;IACO,wBAAwB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC5D;;;;;;;;;;;;;;;;;;;;;OAqBG;IACO,sBAAsB,GAAwC,IAAI,GAAG,EAAE,CAAC;IAClF;;;;;;;;;;;;;;;;OAgBG;IACO,aAAa,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC/C,eAAe,GAAW,CAAC,CAAC;IAC5B,eAAe,GAAe,EAAE,CAAC;IAE3C,2EAA2E;IACjE,YAAY;QACpB,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;YACvD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC;IACJ,CAAC;IAES,gBAAgB;QACxB,OAAO,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9C,CAAC;IAES,mBAAmB,CAAC,KAA0D;QACtF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAES,mBAAmB,CAAC,KAA0D;QACtF,OAAO,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mutable property view - overlay pattern for property mutations
|
|
3
|
-
*
|
|
4
|
-
* This class provides a mutable view over an immutable PropertyTable.
|
|
5
|
-
* Changes are tracked separately and applied on-the-fly during reads.
|
|
6
|
-
*
|
|
7
|
-
* Supports both pre-built property tables and on-demand property extraction
|
|
8
|
-
* for optimal performance with large models.
|
|
9
|
-
*/
|
|
10
1
|
import type { PropertyTable, PropertySet, QuantitySet } from '@ifc-lite/data';
|
|
11
2
|
import { PropertyValueType, QuantityType } from '@ifc-lite/data';
|
|
12
|
-
import type { IfcAttributeValue, PropertyValue, EntityTypeMutation, Mutation, NewEntity, EffectiveChange } from './types.js';
|
|
3
|
+
import type { IfcAttributeValue, PropertyValue, PropertyMutation, EntityTypeMutation, Mutation, NewEntity, EffectiveChange } from './types.js';
|
|
13
4
|
import { type AttributeExtractor } from './effective-changes.js';
|
|
5
|
+
import { MutableOverlayState } from './mutable-overlay-state.js';
|
|
14
6
|
export type { AttributeExtractor } from './effective-changes.js';
|
|
15
7
|
/**
|
|
16
8
|
* Function type for on-demand property extraction
|
|
@@ -30,87 +22,33 @@ export type PropertyExtractor = (entityId: number) => Array<{
|
|
|
30
22
|
* Function type for on-demand quantity extraction
|
|
31
23
|
*/
|
|
32
24
|
export type QuantityExtractor = (entityId: number) => QuantitySet[];
|
|
33
|
-
export declare class MutablePropertyView {
|
|
25
|
+
export declare class MutablePropertyView extends MutableOverlayState {
|
|
34
26
|
private baseTable;
|
|
35
27
|
private onDemandExtractor;
|
|
36
28
|
private quantityExtractor;
|
|
37
29
|
private attributeExtractor;
|
|
38
|
-
private
|
|
39
|
-
|
|
30
|
+
private modelId;
|
|
31
|
+
constructor(baseTable: PropertyTable | null, modelId: string);
|
|
40
32
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*/
|
|
47
|
-
private propertyKeysByEntity;
|
|
48
|
-
private quantityKeysByEntity;
|
|
49
|
-
private attributeKeysByEntity;
|
|
50
|
-
private deletedPsets;
|
|
51
|
-
private deletedQsets;
|
|
52
|
-
private newPsets;
|
|
53
|
-
private newQsets;
|
|
54
|
-
private attributeMutations;
|
|
55
|
-
private positionalAttrMutations;
|
|
56
|
-
private typeMutations;
|
|
57
|
-
private newEntities;
|
|
58
|
-
private tombstones;
|
|
59
|
-
/**
|
|
60
|
-
* Ids `createEntity` allocated and `deleteEntity` then forgot (removed from
|
|
61
|
-
* `newEntities`, per that method's "existing entities are tombstoned; new
|
|
62
|
-
* entities are simply forgotten" contract). Tracked separately so
|
|
63
|
-
* `getEffectiveChanges()` / `collectEffectiveChanges` can tell "overlay-created
|
|
64
|
-
* then forgotten" apart from "an ordinary source-buffer entity" — both are
|
|
65
|
-
* otherwise indistinguishable, being simply absent from `newEntities`.
|
|
66
|
-
* `restoreNewEntity` (the undo-of-delete counterpart) clears the id back out.
|
|
67
|
-
*/
|
|
68
|
-
private forgottenCreatedEntities;
|
|
69
|
-
/**
|
|
70
|
-
* Snapshot of a forgotten-created entity's overlay rows, stashed by
|
|
71
|
-
* `deleteEntity` and restored by `restoreNewEntity`.
|
|
72
|
-
*
|
|
73
|
-
* `deleteEntity` on an overlay-created entity does more than drop it from
|
|
74
|
-
* `newEntities` — it also PURGES every other overlay entry the entity left
|
|
75
|
-
* behind (property/quantity/attribute/positional/type mutations, its
|
|
76
|
-
* `newPsets`/`newQsets` entries, and its own `mutationHistory` records).
|
|
77
|
-
* Without that purge, an entity that was created, edited, then deleted
|
|
78
|
-
* before export left a dangling reference: `StepExporter` derives its
|
|
79
|
-
* property/quantity work list from `getMutations()` (the append-only
|
|
80
|
-
* history) and reads `getForEntity()` / `getQuantitiesForEntity()` straight
|
|
81
|
-
* off `newPsets` / `newQsets` — neither of which the review-side
|
|
82
|
-
* `forgottenCreatedEntities` filter in `effective-changes.ts` touches. The
|
|
83
|
-
* review dialog looked clean while the exported file still contained an
|
|
84
|
-
* `IFCPROPERTYSET` + `IFCRELDEFINESBYPROPERTIES` pointing at an expressId
|
|
85
|
-
* that was never actually created (maintainer finding on #1967).
|
|
86
|
-
*
|
|
87
|
-
* The purged data is captured here, not discarded, because `restoreNewEntity`
|
|
88
|
-
* (undo of the delete) must bring it all back — rows AND count AND what the
|
|
89
|
-
* exporter would see — not just re-add the bare `NewEntity` record.
|
|
33
|
+
* Stage synchronous overlay edits and publish them together (#4243).
|
|
34
|
+
* Throws leave the original overlay, history and allocator untouched.
|
|
35
|
+
* Source tables/extractors are shared read-only; mutable state is detached
|
|
36
|
+
* both before editing and on commit, so an escaped draft cannot edit this view.
|
|
37
|
+
* External effects (files, renderer or network) belong outside this callback.
|
|
90
38
|
*/
|
|
91
|
-
|
|
39
|
+
runAtomic<T>(edit: (draft: MutablePropertyView) => T): T;
|
|
92
40
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
* Aliases follow at most one hop (no chains). They never affect
|
|
105
|
-
* STEP export — the export overlay emits the duplicate exactly as
|
|
106
|
-
* the StoreEditor recorded it, with whatever new IfcRel*ByProperties
|
|
107
|
-
* the caller chose to add.
|
|
108
|
-
*/
|
|
109
|
-
private entityAliases;
|
|
110
|
-
private nextAllocatedId;
|
|
111
|
-
private mutationHistory;
|
|
112
|
-
private modelId;
|
|
113
|
-
constructor(baseTable: PropertyTable | null, modelId: string);
|
|
41
|
+
* Prepare an overlay publication without changing live IFC state (#4243).
|
|
42
|
+
* Use for commands that must validate other synchronous resources first.
|
|
43
|
+
* `validate` and `commit` reject intervening edits, including skip-history
|
|
44
|
+
* edits. Commit is idempotent; the prepared draft is never published by reference.
|
|
45
|
+
*/
|
|
46
|
+
prepareAtomic<T>(edit: (draft: MutablePropertyView) => T): {
|
|
47
|
+
result: T;
|
|
48
|
+
validate(): void;
|
|
49
|
+
commit(): void;
|
|
50
|
+
rollback(): void;
|
|
51
|
+
};
|
|
114
52
|
/**
|
|
115
53
|
* Seed the express-ID allocator. Should be called once after parsing with
|
|
116
54
|
* the highest existing expressId in the store; subsequent `createEntity`
|
|
@@ -180,8 +118,13 @@ export declare class MutablePropertyView {
|
|
|
180
118
|
* Set a property value
|
|
181
119
|
* If the property set doesn't exist, creates it automatically
|
|
182
120
|
* @param skipHistory - If true, don't add to mutation history (used for undo/redo)
|
|
121
|
+
* @param dataType - IFC measure dataType this value was scaled against at
|
|
122
|
+
* write time (e.g. an IDS correction, #3929/#3943), stored on the
|
|
123
|
+
* `PropertyMutation` for a read-side overlay that needs to convert it
|
|
124
|
+
* between unit frames. New, additive, optional — every existing caller
|
|
125
|
+
* is unaffected.
|
|
183
126
|
*/
|
|
184
|
-
setProperty(entityId: number, psetName: string, propName: string, value: PropertyValue, valueType?: PropertyValueType, unit?: string, skipHistory?: boolean): Mutation;
|
|
127
|
+
setProperty(entityId: number, psetName: string, propName: string, value: PropertyValue, valueType?: PropertyValueType, unit?: string, skipHistory?: boolean, dataType?: string): Mutation;
|
|
185
128
|
/**
|
|
186
129
|
* Delete a property
|
|
187
130
|
* @param skipHistory - If true, don't add to mutation history (used for undo/redo)
|
|
@@ -423,6 +366,36 @@ export declare class MutablePropertyView {
|
|
|
423
366
|
* Get mutations for a specific entity
|
|
424
367
|
*/
|
|
425
368
|
getMutationsForEntity(entityId: number): Mutation[];
|
|
369
|
+
/**
|
|
370
|
+
* The live overlay's CURRENT property mutation for one entity's specific
|
|
371
|
+
* pset+prop, or `undefined` when that exact key carries no override right
|
|
372
|
+
* now.
|
|
373
|
+
*
|
|
374
|
+
* Reads `propertyMutations` directly (the same map `getPropertyValue` and
|
|
375
|
+
* `hasChanges` consult) — never `mutationHistory` (see `getMutationsForEntity`
|
|
376
|
+
* above), which is append-only and does not shrink on undo. Undo re-applies
|
|
377
|
+
* the inverse mutation with `skipHistory=true` (`mutationSlice.ts`, "to
|
|
378
|
+
* avoid polluting mutation history"): that inverse call still writes
|
|
379
|
+
* through `setProperty`/`deleteProperty`, so `propertyMutations` — and thus
|
|
380
|
+
* this method — reflects the reverted (or, after redo, re-applied) value
|
|
381
|
+
* immediately, while `getMutationsForEntity` keeps returning the stale
|
|
382
|
+
* pre-undo entry.
|
|
383
|
+
*
|
|
384
|
+
* Unlike `getPropertyValue` (which collapses "no override", "override
|
|
385
|
+
* value is null", and "override is a DELETE marker" all down to a bare
|
|
386
|
+
* `null`), this returns the raw `PropertyMutation` so a caller projecting
|
|
387
|
+
* the overlay onto an EXTERNAL base it doesn't otherwise share with this
|
|
388
|
+
* view (e.g. the IDS bridge's `PropertyOverlayResolver`, #3929) can tell
|
|
389
|
+
* "nothing to apply here" apart from "apply a DELETE" apart from "apply a
|
|
390
|
+
* SET to null". Unlike `getEffectiveChanges()`, this does not require the
|
|
391
|
+
* view's own `getBasePropertiesForEntity` to already know the pset —
|
|
392
|
+
* `setProperty` always writes `propertyMutations` regardless of whether the
|
|
393
|
+
* pset is new-in-session or pre-existing (see its "Always store in
|
|
394
|
+
* propertyMutations for tracking" comment), so this stays correct for a
|
|
395
|
+
* view with no base wired at all (a `MutablePropertyView` overlay used
|
|
396
|
+
* purely as a delta against someone else's separate base).
|
|
397
|
+
*/
|
|
398
|
+
getPropertyMutation(entityId: number, psetName: string, propName: string): Readonly<PropertyMutation> | undefined;
|
|
426
399
|
/**
|
|
427
400
|
* Check if an entity currently carries an overlay change.
|
|
428
401
|
*
|
|
@@ -504,7 +477,10 @@ export declare class MutablePropertyView {
|
|
|
504
477
|
*/
|
|
505
478
|
clear(): void;
|
|
506
479
|
/**
|
|
507
|
-
* Apply a batch of mutations (e.g., from imported change set)
|
|
480
|
+
* Apply a batch of mutations (e.g., from imported change set). The
|
|
481
|
+
* dispatcher itself lives in `applyMutationsBatch` (./apply-mutations.js)
|
|
482
|
+
* — this method just supplies the two bits of private state it needs
|
|
483
|
+
* without exposing them publicly.
|
|
508
484
|
*/
|
|
509
485
|
applyMutations(mutations: Mutation[]): void;
|
|
510
486
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutable-property-view.d.ts","sourceRoot":"","sources":["../src/mutable-property-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mutable-property-view.d.ts","sourceRoot":"","sources":["../src/mutable-property-view.ts"],"names":[],"mappings":"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"}
|