@ifc-lite/mutations 1.18.1 → 1.20.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.
@@ -0,0 +1,66 @@
1
+ import type { ChangeSet, Mutation, PropertyValue } from './types.js';
2
+ /** Adapter over the store's id table, supplied by the caller at freeze time. */
3
+ export interface EntityIdentityResolver {
4
+ /** The entity's IFC `GlobalId`, when present and trusted. */
5
+ globalIdOf(expressId: number): string | undefined;
6
+ /** IFC type name, used by the content-derived fallback. */
7
+ ifcTypeOf?(expressId: number): string | undefined;
8
+ /** Stable spatial parent path (e.g. `/project/storey-EG`). */
9
+ spatialParentPathOf?(expressId: number): string | undefined;
10
+ /** Entity `Name`, used by the content-derived fallback. */
11
+ nameOf?(expressId: number): string | undefined;
12
+ }
13
+ /** Identity-map entry mirroring `ifclite::provenance.identity_map`. */
14
+ export interface DerivedIdentityEntry {
15
+ base: string;
16
+ here: string;
17
+ reason: string;
18
+ }
19
+ /**
20
+ * Component-granular semantic ops, in the shared componentKey vocabulary
21
+ * (`pset:<Name>`, `qset:<Name>`, `attr:core`). Values carry only what the
22
+ * change set knows; the publish path composes them onto the draft state.
23
+ */
24
+ export type ChangeSetOp = {
25
+ op: 'set-component';
26
+ entity: string;
27
+ componentKey: string;
28
+ /** Property/attribute values; `null` removes the member. */
29
+ values: Record<string, PropertyValue | null>;
30
+ } | {
31
+ op: 'tombstone-component';
32
+ entity: string;
33
+ componentKey: string;
34
+ } | {
35
+ op: 'add-entity';
36
+ entity: string;
37
+ ifcType?: string;
38
+ } | {
39
+ op: 'tombstone-entity';
40
+ entity: string;
41
+ };
42
+ export interface ChangeSetOpsResult {
43
+ ops: ChangeSetOp[];
44
+ /** Content-derived identities, for the manifest's identity_map. */
45
+ identityMap: DerivedIdentityEntry[];
46
+ /** expressIds for which no identity could be established at all. */
47
+ unresolved: number[];
48
+ /**
49
+ * Mutations with no component representation (unknown/future types).
50
+ * Reported so callers can warn instead of silently under-publishing.
51
+ */
52
+ skipped: Mutation[];
53
+ }
54
+ /** Content-derived fallback identity (04 §4.1(3)). */
55
+ export declare function deriveEntityIdentity(input: {
56
+ ifcType?: string;
57
+ spatialParentPath?: string;
58
+ name?: string;
59
+ }): string;
60
+ /**
61
+ * Map a change set's mutations onto component-granular ops keyed by
62
+ * stable entity identity. Mutations fold LWW per (entity, componentKey)
63
+ * in change-set order, matching layer composition semantics.
64
+ */
65
+ export declare function changeSetToOps(changeSet: ChangeSet, resolver: EntityIdentityResolver): ChangeSetOpsResult;
66
+ //# sourceMappingURL=change-set-to-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set-to-ops.d.ts","sourceRoot":"","sources":["../src/change-set-to-ops.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,gFAAgF;AAChF,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,2DAA2D;IAC3D,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,8DAA8D;IAC9D,mBAAmB,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5D,2DAA2D;IAC3D,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAChD;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACnB;IACE,EAAE,EAAE,eAAe,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC;CAC9C,GACD;IAAE,EAAE,EAAE,qBAAqB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,WAAW,EAAE,CAAC;IACnB,mEAAmE;IACnE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,oEAAoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;OAGG;IACH,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAID,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAOT;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,sBAAsB,GAC/B,kBAAkB,CAoEpB"}
@@ -0,0 +1,168 @@
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
+ * expressId → GlobalId bridge for layer publishing.
6
+ *
7
+ * `Mutation.entityId` is an expressId: model-scoped and unstable across
8
+ * exports. The publish path maps it to a stable identity at freeze time:
9
+ *
10
+ * 1. IFC GlobalId via the store's id table — primary identity
11
+ * 2. Content-derived fallback — blake3 over a stable subset
12
+ * (ifcType + spatial parent path + name) for entities with missing
13
+ * GlobalIds, always recorded into the identity map with
14
+ * `reason: "derived"` so a human can override
15
+ *
16
+ * There is no heuristic matcher: when identity cannot be established the
17
+ * entity is reported in `unresolved` rather than silently guessed.
18
+ *
19
+ * Spec: docs/architecture/layer-prs/04-identity.md §4.1, §4.3.
20
+ */
21
+ import { blake3 } from '@noble/hashes/blake3.js';
22
+ import { bytesToHex } from '@noble/hashes/utils.js';
23
+ const textEncoder = new TextEncoder();
24
+ /** Content-derived fallback identity (04 §4.1(3)). */
25
+ export function deriveEntityIdentity(input) {
26
+ const canonical = JSON.stringify({
27
+ ifcType: input.ifcType ?? '',
28
+ name: input.name ?? '',
29
+ spatialParentPath: input.spatialParentPath ?? '',
30
+ });
31
+ return `derived:${bytesToHex(blake3(textEncoder.encode(canonical)))}`;
32
+ }
33
+ /**
34
+ * Map a change set's mutations onto component-granular ops keyed by
35
+ * stable entity identity. Mutations fold LWW per (entity, componentKey)
36
+ * in change-set order, matching layer composition semantics.
37
+ */
38
+ export function changeSetToOps(changeSet, resolver) {
39
+ const identityCache = new Map();
40
+ const identityMap = [];
41
+ const unresolved = [];
42
+ const identityOf = (expressId) => {
43
+ if (identityCache.has(expressId))
44
+ return identityCache.get(expressId);
45
+ let identity = resolver.globalIdOf(expressId);
46
+ if (identity === undefined) {
47
+ const ifcType = resolver.ifcTypeOf?.(expressId);
48
+ const name = resolver.nameOf?.(expressId);
49
+ const spatialParentPath = resolver.spatialParentPathOf?.(expressId);
50
+ if (ifcType !== undefined || name !== undefined || spatialParentPath !== undefined) {
51
+ identity = deriveEntityIdentity({ ifcType, name, spatialParentPath });
52
+ identityMap.push({ base: identity, here: identity, reason: 'derived' });
53
+ }
54
+ else {
55
+ unresolved.push(expressId);
56
+ }
57
+ }
58
+ identityCache.set(expressId, identity);
59
+ return identity;
60
+ };
61
+ // Fold per (entity, componentKey); entity-level ops tracked separately.
62
+ const components = new Map();
63
+ const entityOps = new Map();
64
+ const componentFor = (entity, componentKey) => {
65
+ let perEntity = components.get(entity);
66
+ if (!perEntity) {
67
+ perEntity = new Map();
68
+ components.set(entity, perEntity);
69
+ }
70
+ return perEntity;
71
+ };
72
+ const setMember = (entity, componentKey, member, value) => {
73
+ const perEntity = componentFor(entity, componentKey);
74
+ const existing = perEntity.get(componentKey);
75
+ const values = existing === null || existing === undefined ? {} : existing;
76
+ values[member] = value;
77
+ perEntity.set(componentKey, values);
78
+ };
79
+ const skipped = [];
80
+ for (const mutation of changeSet.mutations) {
81
+ const entity = identityOf(mutation.entityId);
82
+ if (entity === undefined)
83
+ continue;
84
+ applyMutation(mutation, entity, setMember, componentFor, entityOps, resolver, skipped);
85
+ }
86
+ const ops = [...entityOps.values()];
87
+ for (const [entity, perEntity] of components) {
88
+ for (const [componentKey, values] of perEntity) {
89
+ if (values === null) {
90
+ ops.push({ op: 'tombstone-component', entity, componentKey });
91
+ }
92
+ else {
93
+ ops.push({ op: 'set-component', entity, componentKey, values });
94
+ }
95
+ }
96
+ }
97
+ return { ops, identityMap, unresolved, skipped };
98
+ }
99
+ function applyMutation(mutation, entity, setMember, componentFor, entityOps, resolver, skipped) {
100
+ switch (mutation.type) {
101
+ case 'CREATE_PROPERTY':
102
+ case 'UPDATE_PROPERTY':
103
+ if (mutation.psetName && mutation.propName) {
104
+ setMember(entity, `pset:${mutation.psetName}`, mutation.propName, mutation.newValue ?? null);
105
+ }
106
+ break;
107
+ case 'DELETE_PROPERTY':
108
+ if (mutation.psetName && mutation.propName) {
109
+ setMember(entity, `pset:${mutation.psetName}`, mutation.propName, null);
110
+ }
111
+ break;
112
+ case 'CREATE_QUANTITY':
113
+ case 'UPDATE_QUANTITY':
114
+ if (mutation.psetName && mutation.propName) {
115
+ setMember(entity, `qset:${mutation.psetName}`, mutation.propName, mutation.newValue ?? null);
116
+ }
117
+ break;
118
+ case 'DELETE_QUANTITY':
119
+ if (mutation.psetName && mutation.propName) {
120
+ setMember(entity, `qset:${mutation.psetName}`, mutation.propName, null);
121
+ }
122
+ break;
123
+ case 'CREATE_PROPERTY_SET':
124
+ if (mutation.psetName) {
125
+ // Materialize the (possibly empty) set; members follow.
126
+ componentFor(entity, `pset:${mutation.psetName}`).set(`pset:${mutation.psetName}`, {});
127
+ }
128
+ break;
129
+ case 'DELETE_PROPERTY_SET':
130
+ if (mutation.psetName) {
131
+ componentFor(entity, `pset:${mutation.psetName}`).set(`pset:${mutation.psetName}`, null);
132
+ }
133
+ break;
134
+ case 'UPDATE_ATTRIBUTE':
135
+ case 'UPDATE_POSITIONAL_ATTRIBUTE':
136
+ if (mutation.attributeName) {
137
+ setMember(entity, 'attr:core', mutation.attributeName, mutation.newValue ?? null);
138
+ }
139
+ break;
140
+ case 'CREATE_ENTITY':
141
+ entityOps.set(entity, {
142
+ op: 'add-entity',
143
+ entity,
144
+ ifcType: resolver.ifcTypeOf?.(mutation.entityId),
145
+ });
146
+ break;
147
+ case 'DELETE_ENTITY':
148
+ entityOps.set(entity, { op: 'tombstone-entity', entity });
149
+ break;
150
+ case 'UPDATE_ENTITY_TYPE':
151
+ // Retype = a class-component opinion; the wire layer serializes it
152
+ // as `bsi::ifc::class` (code only, like add-entity). PredefinedType
153
+ // rides the core-attribute channel; explicit null clears it.
154
+ if (mutation.entityType) {
155
+ setMember(entity, 'attr:class', 'code', mutation.entityType);
156
+ if (mutation.predefinedType !== undefined) {
157
+ setMember(entity, 'attr:core', 'PredefinedType', mutation.predefinedType);
158
+ }
159
+ }
160
+ break;
161
+ default:
162
+ // Runtime data may carry mutation types this build does not know
163
+ // (forward compat): report, never silently under-publish.
164
+ skipped.push(mutation);
165
+ break;
166
+ }
167
+ }
168
+ //# sourceMappingURL=change-set-to-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set-to-ops.js","sourceRoot":"","sources":["../src/change-set-to-ops.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,4 +7,5 @@ export { StoreEditor, OVERLAY_BYTE_OFFSET, setEntityTypeNormalizer, type EntityT
7
7
  export { ChangeSetManager } from './change-set.js';
8
8
  export { BulkQueryEngine, type SelectionCriteria, type BulkAction, type BulkQuery, type BulkQueryPreview, type BulkQueryResult, type PropertyFilter, type FilterOperator, } from './bulk-query-engine.js';
9
9
  export { CsvConnector, type CsvRow, type MatchStrategy, type PropertyMapping, type DataMapping, type MatchResult, type ImportStats, type ImportProgress, type CsvParseOptions, } from './csv-connector.js';
10
+ export { changeSetToOps, deriveEntityIdentity, type ChangeSetOp, type ChangeSetOpsResult, type DerivedIdentityEntry, type EntityIdentityResolver, } from './change-set-to-ops.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,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"}
package/dist/index.js CHANGED
@@ -10,4 +10,5 @@ export { StoreEditor, OVERLAY_BYTE_OFFSET, setEntityTypeNormalizer, } from './st
10
10
  export { ChangeSetManager } from './change-set.js';
11
11
  export { BulkQueryEngine, } from './bulk-query-engine.js';
12
12
  export { CsvConnector, } from './csv-connector.js';
13
+ export { changeSetToOps, deriveEntityIdentity, } from './change-set-to-ops.js';
13
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAkD,MAAM,4BAA4B,CAAC;AACjH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,eAAe,GAQhB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,GASb,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAkD,MAAM,4BAA4B,CAAC;AACjH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,eAAe,GAQhB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,GASb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,oBAAoB,GAKrB,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/mutations",
3
- "version": "1.18.1",
3
+ "version": "1.20.0",
4
4
  "description": "Mutation tracking and property editing for IFC-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -13,7 +13,8 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@ifc-lite/data": "^2.5.2"
16
+ "@noble/hashes": "^2.2.0",
17
+ "@ifc-lite/data": "^2.5.3"
17
18
  },
18
19
  "devDependencies": {
19
20
  "typescript": "^6.0.3",