@ifc-lite/mutations 1.4.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,414 @@
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 { PropertyValueType } from '@ifc-lite/data';
5
+ import { propertyKey, generateMutationId } from './types.js';
6
+ export class MutablePropertyView {
7
+ baseTable;
8
+ onDemandExtractor = null;
9
+ propertyMutations = new Map();
10
+ deletedPsets = new Set(); // `${entityId}:${psetName}`
11
+ newPsets = new Map(); // entityId -> psetName -> PropertySet
12
+ mutationHistory = [];
13
+ modelId;
14
+ constructor(baseTable, modelId) {
15
+ this.baseTable = baseTable;
16
+ this.modelId = modelId;
17
+ }
18
+ /**
19
+ * Set an on-demand property extractor function
20
+ * This is used when properties are extracted lazily from the source buffer
21
+ */
22
+ setOnDemandExtractor(extractor) {
23
+ this.onDemandExtractor = extractor;
24
+ }
25
+ /**
26
+ * Get base properties for an entity (before mutations)
27
+ * Uses on-demand extraction if available, otherwise falls back to base table
28
+ */
29
+ getBasePropertiesForEntity(entityId) {
30
+ // Prefer on-demand extraction if available (client-side WASM parsing)
31
+ if (this.onDemandExtractor) {
32
+ // Normalize the result to PropertySet[] (globalId defaults to empty string)
33
+ return this.onDemandExtractor(entityId).map(pset => ({
34
+ name: pset.name,
35
+ globalId: pset.globalId || '',
36
+ properties: pset.properties.map(prop => ({
37
+ name: prop.name,
38
+ type: prop.type,
39
+ value: prop.value,
40
+ })),
41
+ }));
42
+ }
43
+ // Fallback to pre-built property table
44
+ if (this.baseTable) {
45
+ return this.baseTable.getForEntity(entityId);
46
+ }
47
+ return [];
48
+ }
49
+ /**
50
+ * Get all property sets for an entity, with mutations applied
51
+ */
52
+ getForEntity(entityId) {
53
+ const result = [];
54
+ const seenPsets = new Set();
55
+ // First, add properties from base (on-demand or table) with mutations applied
56
+ const basePsets = this.getBasePropertiesForEntity(entityId);
57
+ for (const pset of basePsets) {
58
+ // Skip deleted property sets
59
+ if (this.deletedPsets.has(`${entityId}:${pset.name}`)) {
60
+ continue;
61
+ }
62
+ seenPsets.add(pset.name);
63
+ // Apply property mutations
64
+ const mutatedProperties = [];
65
+ for (const prop of pset.properties) {
66
+ const key = propertyKey(entityId, pset.name, prop.name);
67
+ const mutation = this.propertyMutations.get(key);
68
+ if (mutation) {
69
+ if (mutation.operation === 'DELETE') {
70
+ continue; // Skip deleted properties
71
+ }
72
+ // Apply SET mutation
73
+ mutatedProperties.push({
74
+ name: prop.name,
75
+ type: mutation.valueType ?? prop.type,
76
+ value: mutation.value ?? null,
77
+ unit: mutation.unit ?? prop.unit,
78
+ });
79
+ }
80
+ else {
81
+ mutatedProperties.push(prop);
82
+ }
83
+ }
84
+ // Check for new properties added to this pset
85
+ for (const [key, mutation] of this.propertyMutations) {
86
+ if (key.startsWith(`${entityId}:${pset.name}:`) && mutation.operation === 'SET') {
87
+ const propName = key.split(':')[2];
88
+ // Only add if not already in the list
89
+ if (!mutatedProperties.some(p => p.name === propName)) {
90
+ mutatedProperties.push({
91
+ name: propName,
92
+ type: mutation.valueType ?? PropertyValueType.String,
93
+ value: mutation.value ?? null,
94
+ unit: mutation.unit,
95
+ });
96
+ }
97
+ }
98
+ }
99
+ if (mutatedProperties.length > 0) {
100
+ result.push({
101
+ name: pset.name,
102
+ globalId: pset.globalId,
103
+ properties: mutatedProperties,
104
+ });
105
+ }
106
+ }
107
+ // Add new property sets that don't exist in base
108
+ const newPsetsForEntity = this.newPsets.get(entityId);
109
+ if (newPsetsForEntity) {
110
+ for (const [psetName, pset] of newPsetsForEntity) {
111
+ if (!seenPsets.has(psetName)) {
112
+ result.push(pset);
113
+ }
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ /**
119
+ * Get a specific property value with mutations applied
120
+ */
121
+ getPropertyValue(entityId, psetName, propName) {
122
+ const key = propertyKey(entityId, psetName, propName);
123
+ const mutation = this.propertyMutations.get(key);
124
+ if (mutation) {
125
+ if (mutation.operation === 'DELETE') {
126
+ return null;
127
+ }
128
+ return mutation.value ?? null;
129
+ }
130
+ // Check new property sets
131
+ const newPset = this.newPsets.get(entityId)?.get(psetName);
132
+ if (newPset) {
133
+ const prop = newPset.properties.find(p => p.name === propName);
134
+ if (prop) {
135
+ return prop.value;
136
+ }
137
+ }
138
+ // Fall back to on-demand extraction or base table
139
+ const basePsets = this.getBasePropertiesForEntity(entityId);
140
+ const pset = basePsets.find(p => p.name === psetName);
141
+ if (pset) {
142
+ const prop = pset.properties.find(p => p.name === propName);
143
+ if (prop) {
144
+ return prop.value;
145
+ }
146
+ }
147
+ return null;
148
+ }
149
+ /**
150
+ * Set a property value
151
+ * If the property set doesn't exist, creates it automatically
152
+ * @param skipHistory - If true, don't add to mutation history (used for undo/redo)
153
+ */
154
+ setProperty(entityId, psetName, propName, value, valueType = PropertyValueType.String, unit, skipHistory = false) {
155
+ const key = propertyKey(entityId, psetName, propName);
156
+ console.log('[MutablePropertyView.setProperty] entityId:', entityId, 'pset:', psetName, 'prop:', propName, 'value:', value, 'key:', key);
157
+ // Get old value for undo
158
+ const oldValue = this.getPropertyValue(entityId, psetName, propName);
159
+ console.log('[MutablePropertyView.setProperty] oldValue:', oldValue);
160
+ // Check if this pset exists in base
161
+ const basePsets = this.getBasePropertiesForEntity(entityId);
162
+ const psetExistsInBase = basePsets.some(p => p.name === psetName);
163
+ const psetExistsInNew = this.newPsets.get(entityId)?.has(psetName);
164
+ // If pset doesn't exist anywhere, create it in newPsets
165
+ if (!psetExistsInBase && !psetExistsInNew) {
166
+ let entityPsets = this.newPsets.get(entityId);
167
+ if (!entityPsets) {
168
+ entityPsets = new Map();
169
+ this.newPsets.set(entityId, entityPsets);
170
+ }
171
+ // Create new property set with this single property
172
+ const pset = {
173
+ name: psetName,
174
+ globalId: `new_${generateMutationId()}`,
175
+ properties: [{
176
+ name: propName,
177
+ type: valueType,
178
+ value: value,
179
+ unit: unit,
180
+ }],
181
+ };
182
+ entityPsets.set(psetName, pset);
183
+ }
184
+ else if (psetExistsInNew) {
185
+ // If pset exists in newPsets, add/update the property there
186
+ const entityPsets = this.newPsets.get(entityId);
187
+ const pset = entityPsets.get(psetName);
188
+ const existingPropIndex = pset.properties.findIndex(p => p.name === propName);
189
+ if (existingPropIndex >= 0) {
190
+ pset.properties[existingPropIndex] = {
191
+ name: propName,
192
+ type: valueType,
193
+ value: value,
194
+ unit: unit,
195
+ };
196
+ }
197
+ else {
198
+ pset.properties.push({
199
+ name: propName,
200
+ type: valueType,
201
+ value: value,
202
+ unit: unit,
203
+ });
204
+ }
205
+ }
206
+ // Always store in propertyMutations for tracking
207
+ this.propertyMutations.set(key, {
208
+ operation: 'SET',
209
+ value,
210
+ valueType,
211
+ unit,
212
+ });
213
+ const mutation = {
214
+ id: generateMutationId(),
215
+ type: oldValue === null ? 'CREATE_PROPERTY' : 'UPDATE_PROPERTY',
216
+ timestamp: Date.now(),
217
+ modelId: this.modelId,
218
+ entityId,
219
+ psetName,
220
+ propName,
221
+ oldValue,
222
+ newValue: value,
223
+ valueType,
224
+ };
225
+ if (!skipHistory) {
226
+ this.mutationHistory.push(mutation);
227
+ }
228
+ return mutation;
229
+ }
230
+ /**
231
+ * Delete a property
232
+ * @param skipHistory - If true, don't add to mutation history (used for undo/redo)
233
+ */
234
+ deleteProperty(entityId, psetName, propName, skipHistory = false) {
235
+ const key = propertyKey(entityId, psetName, propName);
236
+ const oldValue = this.getPropertyValue(entityId, psetName, propName);
237
+ if (oldValue === null) {
238
+ return null; // Property doesn't exist
239
+ }
240
+ this.propertyMutations.set(key, { operation: 'DELETE' });
241
+ const mutation = {
242
+ id: generateMutationId(),
243
+ type: 'DELETE_PROPERTY',
244
+ timestamp: Date.now(),
245
+ modelId: this.modelId,
246
+ entityId,
247
+ psetName,
248
+ propName,
249
+ oldValue,
250
+ newValue: null,
251
+ };
252
+ if (!skipHistory) {
253
+ this.mutationHistory.push(mutation);
254
+ }
255
+ return mutation;
256
+ }
257
+ /**
258
+ * Create a new property set
259
+ */
260
+ createPropertySet(entityId, psetName, properties) {
261
+ let entityPsets = this.newPsets.get(entityId);
262
+ if (!entityPsets) {
263
+ entityPsets = new Map();
264
+ this.newPsets.set(entityId, entityPsets);
265
+ }
266
+ const pset = {
267
+ name: psetName,
268
+ globalId: `new_${generateMutationId()}`,
269
+ properties: properties.map(p => ({
270
+ name: p.name,
271
+ type: p.type ?? PropertyValueType.String,
272
+ value: p.value,
273
+ unit: p.unit,
274
+ })),
275
+ };
276
+ entityPsets.set(psetName, pset);
277
+ // Also add individual property mutations for consistency
278
+ for (const prop of properties) {
279
+ const key = propertyKey(entityId, psetName, prop.name);
280
+ this.propertyMutations.set(key, {
281
+ operation: 'SET',
282
+ value: prop.value,
283
+ valueType: prop.type ?? PropertyValueType.String,
284
+ unit: prop.unit,
285
+ });
286
+ }
287
+ const mutation = {
288
+ id: generateMutationId(),
289
+ type: 'CREATE_PROPERTY_SET',
290
+ timestamp: Date.now(),
291
+ modelId: this.modelId,
292
+ entityId,
293
+ psetName,
294
+ newValue: properties,
295
+ };
296
+ this.mutationHistory.push(mutation);
297
+ return mutation;
298
+ }
299
+ /**
300
+ * Delete an entire property set
301
+ */
302
+ deletePropertySet(entityId, psetName) {
303
+ this.deletedPsets.add(`${entityId}:${psetName}`);
304
+ // Also remove from new psets if it was created in this session
305
+ const entityPsets = this.newPsets.get(entityId);
306
+ if (entityPsets) {
307
+ entityPsets.delete(psetName);
308
+ }
309
+ // Mark all properties as deleted
310
+ const existingPsets = this.getBasePropertiesForEntity(entityId);
311
+ const pset = existingPsets.find(p => p.name === psetName);
312
+ if (pset) {
313
+ for (const prop of pset.properties) {
314
+ const key = propertyKey(entityId, psetName, prop.name);
315
+ this.propertyMutations.set(key, { operation: 'DELETE' });
316
+ }
317
+ }
318
+ const mutation = {
319
+ id: generateMutationId(),
320
+ type: 'DELETE_PROPERTY_SET',
321
+ timestamp: Date.now(),
322
+ modelId: this.modelId,
323
+ entityId,
324
+ psetName,
325
+ };
326
+ this.mutationHistory.push(mutation);
327
+ return mutation;
328
+ }
329
+ /**
330
+ * Get all mutations applied to this view
331
+ */
332
+ getMutations() {
333
+ return [...this.mutationHistory];
334
+ }
335
+ /**
336
+ * Get mutations for a specific entity
337
+ */
338
+ getMutationsForEntity(entityId) {
339
+ return this.mutationHistory.filter(m => m.entityId === entityId);
340
+ }
341
+ /**
342
+ * Check if an entity has any mutations
343
+ */
344
+ hasChanges(entityId) {
345
+ if (entityId !== undefined) {
346
+ return this.mutationHistory.some(m => m.entityId === entityId);
347
+ }
348
+ return this.mutationHistory.length > 0;
349
+ }
350
+ /**
351
+ * Get count of modified entities
352
+ */
353
+ getModifiedEntityCount() {
354
+ const entities = new Set();
355
+ for (const mutation of this.mutationHistory) {
356
+ entities.add(mutation.entityId);
357
+ }
358
+ return entities.size;
359
+ }
360
+ /**
361
+ * Clear all mutations (reset to base state)
362
+ */
363
+ clear() {
364
+ this.propertyMutations.clear();
365
+ this.deletedPsets.clear();
366
+ this.newPsets.clear();
367
+ this.mutationHistory = [];
368
+ }
369
+ /**
370
+ * Apply a batch of mutations (e.g., from imported change set)
371
+ */
372
+ applyMutations(mutations) {
373
+ for (const mutation of mutations) {
374
+ switch (mutation.type) {
375
+ case 'CREATE_PROPERTY':
376
+ case 'UPDATE_PROPERTY':
377
+ if (mutation.psetName && mutation.propName && mutation.newValue !== undefined) {
378
+ this.setProperty(mutation.entityId, mutation.psetName, mutation.propName, mutation.newValue, mutation.valueType);
379
+ }
380
+ break;
381
+ case 'DELETE_PROPERTY':
382
+ if (mutation.psetName && mutation.propName) {
383
+ this.deleteProperty(mutation.entityId, mutation.psetName, mutation.propName);
384
+ }
385
+ break;
386
+ case 'DELETE_PROPERTY_SET':
387
+ if (mutation.psetName) {
388
+ this.deletePropertySet(mutation.entityId, mutation.psetName);
389
+ }
390
+ break;
391
+ }
392
+ }
393
+ }
394
+ /**
395
+ * Export mutations as JSON
396
+ */
397
+ exportMutations() {
398
+ return JSON.stringify({
399
+ modelId: this.modelId,
400
+ mutations: this.mutationHistory,
401
+ exportedAt: Date.now(),
402
+ }, null, 2);
403
+ }
404
+ /**
405
+ * Import mutations from JSON
406
+ */
407
+ importMutations(json) {
408
+ const data = JSON.parse(json);
409
+ if (data.mutations && Array.isArray(data.mutations)) {
410
+ this.applyMutations(data.mutations);
411
+ }
412
+ }
413
+ }
414
+ //# sourceMappingURL=mutable-property-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutable-property-view.js","sourceRoot":"","sources":["../src/mutable-property-view.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAa/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAY7D,MAAM,OAAO,mBAAmB;IACtB,SAAS,CAAuB;IAChC,iBAAiB,GAA6B,IAAI,CAAC;IACnD,iBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;IAC7D,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;IACnE,QAAQ,GAA0C,IAAI,GAAG,EAAE,CAAC,CAAC,sCAAsC;IACnG,eAAe,GAAe,EAAE,CAAC;IACjC,OAAO,CAAS;IAExB,YAAY,SAA+B,EAAE,OAAe;QAC1D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,SAA4B;QAC/C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACrC,CAAC;IAED;;;OAGG;IACK,0BAA0B,CAAC,QAAgB;QACjD,sEAAsE;QACtE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,4EAA4E;YAC5E,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAyB;oBACpC,KAAK,EAAE,IAAI,CAAC,KAAsB;iBACnC,CAAC,CAAC;aACJ,CAAC,CAAC,CAAC;QACN,CAAC;QACD,uCAAuC;QACvC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB;QAC3B,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,8EAA8E;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAE5D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,6BAA6B;YAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACtD,SAAS;YACX,CAAC;YAED,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzB,2BAA2B;YAC3B,MAAM,iBAAiB,GAAe,EAAE,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEjD,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;wBACpC,SAAS,CAAC,0BAA0B;oBACtC,CAAC;oBACD,qBAAqB;oBACrB,iBAAiB,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,IAAI,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI;wBACrC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;wBAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;qBACjC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;oBAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnC,sCAAsC;oBACtC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;wBACtD,iBAAiB,CAAC,IAAI,CAAC;4BACrB,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,QAAQ,CAAC,SAAS,IAAI,iBAAiB,CAAC,MAAM;4BACpD,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;4BAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,UAAU,EAAE,iBAAiB;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,iBAAiB,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,gBAAgB,CACd,QAAgB,EAChB,QAAgB,EAChB,QAAgB;QAEhB,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;QAChC,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC/D,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACtD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC5D,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,WAAW,CACT,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,KAAoB,EACpB,YAA+B,iBAAiB,CAAC,MAAM,EACvD,IAAa,EACb,cAAuB,KAAK;QAE5B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,6CAA6C,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAEzI,yBAAyB;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,6CAA6C,EAAE,QAAQ,CAAC,CAAC;QAErE,oCAAoC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEnE,wDAAwD;QACxD,IAAI,CAAC,gBAAgB,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,oDAAoD;YACpD,MAAM,IAAI,GAAgB;gBACxB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,OAAO,kBAAkB,EAAE,EAAE;gBACvC,UAAU,EAAE,CAAC;wBACX,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,KAAK;wBACZ,IAAI,EAAE,IAAI;qBACX,CAAC;aACH,CAAC;YACF,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,eAAe,EAAE,CAAC;YAC3B,4DAA4D;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACjD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9E,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG;oBACnC,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,IAAI;iBACX,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE;YAC9B,SAAS,EAAE,KAAK;YAChB,KAAK;YACL,SAAS;YACT,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,kBAAkB,EAAE;YACxB,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB;YAC/D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,KAAK;YACf,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,QAAgB,EAAE,QAAgB,EAAE,QAAgB,EAAE,cAAuB,KAAK;QAC/F,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAErE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,CAAC,yBAAyB;QACxC,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,kBAAkB,EAAE;YACxB,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,IAAI;SACf,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,QAAgB,EAChB,QAAgB,EAChB,UAAkG;QAElG,IAAI,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,GAAgB;YACxB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,OAAO,kBAAkB,EAAE,EAAE;YACvC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM;gBACxC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;SACJ,CAAC;QAEF,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhC,yDAAyD;QACzD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9B,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM;gBAChD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,kBAAkB,EAAE;YACxB,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,UAAsC;SACjD,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;QAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;QAEjD,+DAA+D;QAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAED,iCAAiC;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC1D,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,kBAAkB,EAAE;YACxB,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;YACR,QAAQ;SACT,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,QAAgB;QACpC,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAiB;QAC1B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAqB;QAClC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtB,KAAK,iBAAiB,CAAC;gBACvB,KAAK,iBAAiB;oBACpB,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAC9E,IAAI,CAAC,WAAW,CACd,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,SAAS,CACnB,CAAC;oBACJ,CAAC;oBACD,MAAM;gBAER,KAAK,iBAAiB;oBACpB,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;wBAC3C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC/E,CAAC;oBACD,MAAM;gBAER,KAAK,qBAAqB;oBACxB,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;wBACtB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC/D,CAAC;oBACD,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,eAAe;YAC/B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAY;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Types for IFC mutation tracking
3
+ */
4
+ import type { PropertyValueType } from '@ifc-lite/data';
5
+ /**
6
+ * Property value types supported by mutations
7
+ */
8
+ export type PropertyValue = string | number | boolean | null | PropertyValue[];
9
+ /**
10
+ * Types of mutations that can be applied to IFC data
11
+ */
12
+ export type MutationType = 'CREATE_PROPERTY' | 'UPDATE_PROPERTY' | 'DELETE_PROPERTY' | 'CREATE_PROPERTY_SET' | 'DELETE_PROPERTY_SET' | 'CREATE_QUANTITY' | 'UPDATE_QUANTITY' | 'DELETE_QUANTITY' | 'UPDATE_ATTRIBUTE';
13
+ /**
14
+ * A single mutation operation
15
+ */
16
+ export interface Mutation {
17
+ /** Unique identifier for this mutation */
18
+ id: string;
19
+ /** Type of mutation */
20
+ type: MutationType;
21
+ /** Timestamp when mutation was created */
22
+ timestamp: number;
23
+ /** Model ID this mutation applies to */
24
+ modelId: string;
25
+ /** Entity EXPRESS ID */
26
+ entityId: number;
27
+ /** Property set or quantity set name */
28
+ psetName?: string;
29
+ /** Property or quantity name */
30
+ propName?: string;
31
+ /** Previous value (for undo) */
32
+ oldValue?: PropertyValue;
33
+ /** New value */
34
+ newValue?: PropertyValue;
35
+ /** Value type */
36
+ valueType?: PropertyValueType;
37
+ /** Unit (for quantities) */
38
+ unit?: string;
39
+ /** Attribute name (name, description, objectType) */
40
+ attributeName?: 'name' | 'description' | 'objectType';
41
+ }
42
+ /**
43
+ * A collection of related mutations
44
+ */
45
+ export interface ChangeSet {
46
+ /** Unique identifier */
47
+ id: string;
48
+ /** User-provided name */
49
+ name: string;
50
+ /** Creation timestamp */
51
+ createdAt: number;
52
+ /** Mutations in this change set */
53
+ mutations: Mutation[];
54
+ /** Whether this change set has been applied */
55
+ applied: boolean;
56
+ }
57
+ /**
58
+ * Property mutation for overlay tracking
59
+ */
60
+ export interface PropertyMutation {
61
+ /** Operation type */
62
+ operation: 'SET' | 'DELETE';
63
+ /** New value (for SET operations) */
64
+ value?: PropertyValue;
65
+ /** Value type (for SET operations) */
66
+ valueType?: PropertyValueType;
67
+ /** Unit (optional) */
68
+ unit?: string;
69
+ }
70
+ /**
71
+ * Quantity mutation for overlay tracking
72
+ */
73
+ export interface QuantityMutation {
74
+ /** Operation type */
75
+ operation: 'SET' | 'DELETE';
76
+ /** New value (for SET operations) */
77
+ value?: number;
78
+ /** Quantity type (Length, Area, Volume, etc.) */
79
+ quantityType?: number;
80
+ /** Unit (optional) */
81
+ unit?: string;
82
+ }
83
+ /**
84
+ * Attribute mutation for overlay tracking
85
+ */
86
+ export interface AttributeMutation {
87
+ /** Attribute name */
88
+ attribute: 'name' | 'description' | 'objectType';
89
+ /** New value */
90
+ value: string;
91
+ /** Previous value (for undo) */
92
+ oldValue?: string;
93
+ }
94
+ /**
95
+ * Generate a unique ID for mutations
96
+ */
97
+ export declare function generateMutationId(): string;
98
+ /**
99
+ * Generate a unique ID for change sets
100
+ */
101
+ export declare function generateChangeSetId(): string;
102
+ /**
103
+ * Create a mutation key for property lookup
104
+ */
105
+ export declare function propertyKey(entityId: number, psetName: string, propName: string): string;
106
+ /**
107
+ * Create a mutation key for quantity lookup
108
+ */
109
+ export declare function quantityKey(entityId: number, qsetName: string, quantName: string): string;
110
+ /**
111
+ * Create a mutation key for attribute lookup
112
+ */
113
+ export declare function attributeKey(entityId: number, attributeName: string): string;
114
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,34 @@
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
+ * Generate a unique ID for mutations
6
+ */
7
+ export function generateMutationId() {
8
+ return `mut_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
9
+ }
10
+ /**
11
+ * Generate a unique ID for change sets
12
+ */
13
+ export function generateChangeSetId() {
14
+ return `cs_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
15
+ }
16
+ /**
17
+ * Create a mutation key for property lookup
18
+ */
19
+ export function propertyKey(entityId, psetName, propName) {
20
+ return `${entityId}:${psetName}:${propName}`;
21
+ }
22
+ /**
23
+ * Create a mutation key for quantity lookup
24
+ */
25
+ export function quantityKey(entityId, qsetName, quantName) {
26
+ return `${entityId}:${qsetName}:${quantName}`;
27
+ }
28
+ /**
29
+ * Create a mutation key for attribute lookup
30
+ */
31
+ export function attributeKey(entityId, attributeName) {
32
+ return `${entityId}:attr:${attributeName}`;
33
+ }
34
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAqH/D;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAgB,EAAE,QAAgB;IAC9E,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAgB,EAAE,SAAiB;IAC/E,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,aAAqB;IAClE,OAAO,GAAG,QAAQ,SAAS,aAAa,EAAE,CAAC;AAC7C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@ifc-lite/mutations",
3
+ "version": "1.4.0",
4
+ "description": "Mutation tracking and property editing for IFC-Lite",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@ifc-lite/data": "^1.3.0",
16
+ "@ifc-lite/parser": "^1.4.0"
17
+ },
18
+ "devDependencies": {
19
+ "typescript": "^5.3.0",
20
+ "vitest": "^1.6.0"
21
+ },
22
+ "license": "MPL-2.0",
23
+ "author": "Louis True",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/louistrue/ifc-lite.git",
27
+ "directory": "packages/mutations"
28
+ },
29
+ "homepage": "https://louistrue.github.io/ifc-lite/",
30
+ "bugs": "https://github.com/louistrue/ifc-lite/issues",
31
+ "keywords": [
32
+ "ifc",
33
+ "bim",
34
+ "mutations",
35
+ "properties",
36
+ "aec"
37
+ ],
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "README.md"
44
+ ],
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "dev": "tsc --watch",
48
+ "test": "vitest run --passWithNoTests"
49
+ }
50
+ }