@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.
- package/LICENSE +373 -0
- package/dist/bulk-query-engine.d.ts +138 -0
- package/dist/bulk-query-engine.d.ts.map +1 -0
- package/dist/bulk-query-engine.js +281 -0
- package/dist/bulk-query-engine.js.map +1 -0
- package/dist/change-set.d.ts +73 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/change-set.js +178 -0
- package/dist/change-set.js.map +1 -0
- package/dist/csv-connector.d.ts +146 -0
- package/dist/csv-connector.d.ts.map +1 -0
- package/dist/csv-connector.js +305 -0
- package/dist/csv-connector.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/mutable-property-view.d.ts +110 -0
- package/dist/mutable-property-view.d.ts.map +1 -0
- package/dist/mutable-property-view.js +414 -0
- package/dist/mutable-property-view.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -0
- package/package.json +50 -0
|
@@ -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":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|