@excalidraw/element 0.18.0-de715913e → 0.18.0-f29e9df

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/dev/index.js CHANGED
@@ -13495,7 +13495,7 @@ var EphemeralIncrement = class extends StoreIncrement {
13495
13495
  this.change = change;
13496
13496
  }
13497
13497
  };
13498
- var StoreDelta = class {
13498
+ var StoreDelta = class _StoreDelta {
13499
13499
  constructor(id, elements, appState) {
13500
13500
  this.id = id;
13501
13501
  this.elements = elements;
@@ -13541,12 +13541,15 @@ var StoreDelta = class {
13541
13541
  return new this(id, elements, appState);
13542
13542
  }
13543
13543
  /**
13544
- * Squash the passed delta into the current instance.
13544
+ * Squash the passed deltas into the aggregated delta instance.
13545
13545
  */
13546
- squash(delta) {
13547
- this.elements.squash(delta.elements);
13548
- this.appState.squash(delta.appState);
13549
- return this;
13546
+ static squash(...deltas) {
13547
+ const aggregatedDelta = _StoreDelta.empty();
13548
+ for (const delta of deltas) {
13549
+ aggregatedDelta.elements.squash(delta.elements);
13550
+ aggregatedDelta.appState.squash(delta.appState);
13551
+ }
13552
+ return aggregatedDelta;
13550
13553
  }
13551
13554
  /**
13552
13555
  * Inverse store delta, creates new instance of `StoreDelta`.
@@ -13583,6 +13586,9 @@ var StoreDelta = class {
13583
13586
  }
13584
13587
  );
13585
13588
  }
13589
+ static empty() {
13590
+ return _StoreDelta.create(ElementsDelta.empty(), AppStateDelta.empty());
13591
+ }
13586
13592
  isEmpty() {
13587
13593
  return this.elements.isEmpty() && this.appState.isEmpty();
13588
13594
  }
@@ -14651,18 +14657,18 @@ var Delta = class _Delta {
14651
14657
  /**
14652
14658
  * Merges two deltas into a new one.
14653
14659
  */
14654
- static merge(delta1, delta2, delta3) {
14660
+ static merge(delta1, delta2, delta3 = _Delta.empty()) {
14655
14661
  return _Delta.create(
14656
- { ...delta1.deleted, ...delta2.deleted, ...delta3?.deleted ?? {} },
14657
- { ...delta1.inserted, ...delta2.inserted, ...delta3?.inserted ?? {} }
14662
+ { ...delta1.deleted, ...delta2.deleted, ...delta3.deleted },
14663
+ { ...delta1.inserted, ...delta2.inserted, ...delta3.inserted }
14658
14664
  );
14659
14665
  }
14660
14666
  /**
14661
14667
  * Merges deleted and inserted object partials.
14662
14668
  */
14663
- static mergeObjects(prev, added, removed) {
14669
+ static mergeObjects(prev, added, removed = {}) {
14664
14670
  const cloned = { ...prev };
14665
- for (const key of Object.keys(removed ?? {})) {
14671
+ for (const key of Object.keys(removed)) {
14666
14672
  delete cloned[key];
14667
14673
  }
14668
14674
  return { ...cloned, ...added };
@@ -14906,6 +14912,9 @@ var AppStateDelta = class _AppStateDelta {
14906
14912
  return new _AppStateDelta(inversedDelta);
14907
14913
  }
14908
14914
  squash(delta) {
14915
+ if (delta.isEmpty()) {
14916
+ return this;
14917
+ }
14909
14918
  const mergedDeletedSelectedElementIds = Delta.mergeObjects(
14910
14919
  this.delta.deleted.selectedElementIds ?? {},
14911
14920
  delta.delta.deleted.selectedElementIds ?? {}
@@ -14914,36 +14923,54 @@ var AppStateDelta = class _AppStateDelta {
14914
14923
  this.delta.inserted.selectedElementIds ?? {},
14915
14924
  delta.delta.inserted.selectedElementIds ?? {}
14916
14925
  );
14926
+ const mergedDeletedSelectedGroupIds = Delta.mergeObjects(
14927
+ this.delta.deleted.selectedGroupIds ?? {},
14928
+ delta.delta.deleted.selectedGroupIds ?? {}
14929
+ );
14917
14930
  const mergedInsertedSelectedGroupIds = Delta.mergeObjects(
14918
14931
  this.delta.inserted.selectedGroupIds ?? {},
14919
14932
  delta.delta.inserted.selectedGroupIds ?? {}
14920
14933
  );
14921
- const mergedDeletedSelectedGroupIds = Delta.mergeObjects(
14922
- this.delta.deleted.selectedGroupIds ?? {},
14923
- delta.delta.deleted.selectedGroupIds ?? {}
14934
+ const mergedDeletedLockedMultiSelections = Delta.mergeObjects(
14935
+ this.delta.deleted.lockedMultiSelections ?? {},
14936
+ delta.delta.deleted.lockedMultiSelections ?? {}
14924
14937
  );
14925
- const mergedDelta = Delta.create(
14926
- {
14927
- selectedElementIds: mergedDeletedSelectedElementIds,
14928
- selectedGroupIds: mergedDeletedSelectedGroupIds
14929
- },
14930
- {
14931
- selectedElementIds: mergedInsertedSelectedElementIds,
14932
- selectedGroupIds: mergedInsertedSelectedGroupIds
14933
- }
14938
+ const mergedInsertedLockedMultiSelections = Delta.mergeObjects(
14939
+ this.delta.inserted.lockedMultiSelections ?? {},
14940
+ delta.delta.inserted.lockedMultiSelections ?? {}
14941
+ );
14942
+ const mergedInserted = {};
14943
+ const mergedDeleted = {};
14944
+ if (Object.keys(mergedDeletedSelectedElementIds).length || Object.keys(mergedInsertedSelectedElementIds).length) {
14945
+ mergedDeleted.selectedElementIds = mergedDeletedSelectedElementIds;
14946
+ mergedInserted.selectedElementIds = mergedInsertedSelectedElementIds;
14947
+ }
14948
+ if (Object.keys(mergedDeletedSelectedGroupIds).length || Object.keys(mergedInsertedSelectedGroupIds).length) {
14949
+ mergedDeleted.selectedGroupIds = mergedDeletedSelectedGroupIds;
14950
+ mergedInserted.selectedGroupIds = mergedInsertedSelectedGroupIds;
14951
+ }
14952
+ if (Object.keys(mergedDeletedLockedMultiSelections).length || Object.keys(mergedInsertedLockedMultiSelections).length) {
14953
+ mergedDeleted.lockedMultiSelections = mergedDeletedLockedMultiSelections;
14954
+ mergedInserted.lockedMultiSelections = mergedInsertedLockedMultiSelections;
14955
+ }
14956
+ this.delta = Delta.merge(
14957
+ this.delta,
14958
+ delta.delta,
14959
+ Delta.create(mergedDeleted, mergedInserted)
14934
14960
  );
14935
- this.delta = Delta.merge(this.delta, delta.delta, mergedDelta);
14936
14961
  return this;
14937
14962
  }
14938
14963
  applyTo(appState, nextElements) {
14939
14964
  try {
14940
14965
  const {
14941
14966
  selectedElementIds: deletedSelectedElementIds = {},
14942
- selectedGroupIds: deletedSelectedGroupIds = {}
14967
+ selectedGroupIds: deletedSelectedGroupIds = {},
14968
+ lockedMultiSelections: deletedLockedMultiSelections = {}
14943
14969
  } = this.delta.deleted;
14944
14970
  const {
14945
14971
  selectedElementIds: insertedSelectedElementIds = {},
14946
14972
  selectedGroupIds: insertedSelectedGroupIds = {},
14973
+ lockedMultiSelections: insertedLockedMultiSelections = {},
14947
14974
  selectedLinearElement: insertedSelectedLinearElement,
14948
14975
  ...directlyApplicablePartial
14949
14976
  } = this.delta.inserted;
@@ -14957,6 +14984,11 @@ var AppStateDelta = class _AppStateDelta {
14957
14984
  insertedSelectedGroupIds,
14958
14985
  deletedSelectedGroupIds
14959
14986
  );
14987
+ const mergedLockedMultiSelections = Delta.mergeObjects(
14988
+ appState.lockedMultiSelections,
14989
+ insertedLockedMultiSelections,
14990
+ deletedLockedMultiSelections
14991
+ );
14960
14992
  const selectedLinearElement = insertedSelectedLinearElement && nextElements.has(insertedSelectedLinearElement.elementId) ? new LinearElementEditor(
14961
14993
  nextElements.get(
14962
14994
  insertedSelectedLinearElement.elementId
@@ -14969,6 +15001,7 @@ var AppStateDelta = class _AppStateDelta {
14969
15001
  ...directlyApplicablePartial,
14970
15002
  selectedElementIds: mergedSelectedElementIds,
14971
15003
  selectedGroupIds: mergedSelectedGroupIds,
15004
+ lockedMultiSelections: mergedLockedMultiSelections,
14972
15005
  selectedLinearElement: typeof insertedSelectedLinearElement !== "undefined" ? selectedLinearElement : appState.selectedLinearElement
14973
15006
  };
14974
15007
  const constainsVisibleChanges = this.filterInvisibleChanges(
@@ -15172,12 +15205,6 @@ var AppStateDelta = class _AppStateDelta {
15172
15205
  "lockedMultiSelections",
15173
15206
  (prevValue) => prevValue ?? {}
15174
15207
  );
15175
- Delta.diffObjects(
15176
- deleted,
15177
- inserted,
15178
- "activeLockedId",
15179
- (prevValue) => prevValue ?? null
15180
- );
15181
15208
  } catch (e) {
15182
15209
  console.error(`Couldn't postprocess appstate change deltas.`);
15183
15210
  if (isTestEnv8() || isDevEnv7()) {
@@ -15256,13 +15283,17 @@ var ElementsDelta = class _ElementsDelta {
15256
15283
  static satisfiesCommmonInvariants = ({
15257
15284
  deleted,
15258
15285
  inserted
15259
- }) => !!(deleted.version && inserted.version && // versions are required integers
15260
- Number.isInteger(deleted.version) && Number.isInteger(inserted.version) && // versions should be positive, zero included
15286
+ }) => !!// versions are required integers
15287
+ (Number.isInteger(deleted.version) && Number.isInteger(inserted.version) && // versions should be positive, zero included
15261
15288
  deleted.version >= 0 && inserted.version >= 0 && // versions should never be the same
15262
15289
  deleted.version !== inserted.version);
15290
+ static satisfiesUniqueInvariants = (elementsDelta, id) => {
15291
+ const { added, removed, updated } = elementsDelta;
15292
+ return [added[id], removed[id], updated[id]].filter(Boolean).length === 1;
15293
+ };
15263
15294
  static validate(elementsDelta, type, satifiesSpecialInvariants) {
15264
15295
  for (const [id, delta] of Object.entries(elementsDelta[type])) {
15265
- if (!this.satisfiesCommmonInvariants(delta) || !satifiesSpecialInvariants(delta)) {
15296
+ if (!this.satisfiesCommmonInvariants(delta) || !this.satisfiesUniqueInvariants(elementsDelta, id) || !satifiesSpecialInvariants(delta)) {
15266
15297
  console.error(
15267
15298
  `Broken invariant for "${type}" delta, element "${id}", delta:`,
15268
15299
  delta
@@ -15302,6 +15333,8 @@ var ElementsDelta = class _ElementsDelta {
15302
15333
  );
15303
15334
  if (!prevElement.isDeleted) {
15304
15335
  removed[prevElement.id] = delta;
15336
+ } else {
15337
+ updated[prevElement.id] = delta;
15305
15338
  }
15306
15339
  }
15307
15340
  }
@@ -15323,6 +15356,8 @@ var ElementsDelta = class _ElementsDelta {
15323
15356
  );
15324
15357
  if (!nextElement.isDeleted) {
15325
15358
  added[nextElement.id] = delta;
15359
+ } else {
15360
+ updated[nextElement.id] = delta;
15326
15361
  }
15327
15362
  continue;
15328
15363
  }
@@ -15344,13 +15379,7 @@ var ElementsDelta = class _ElementsDelta {
15344
15379
  }
15345
15380
  continue;
15346
15381
  }
15347
- const strippedDeleted = _ElementsDelta.stripVersionProps(delta.deleted);
15348
- const strippedInserted = _ElementsDelta.stripVersionProps(
15349
- delta.inserted
15350
- );
15351
- if (Delta.isInnerDifferent(strippedDeleted, strippedInserted, true)) {
15352
- updated[nextElement.id] = delta;
15353
- }
15382
+ updated[nextElement.id] = delta;
15354
15383
  }
15355
15384
  }
15356
15385
  return _ElementsDelta.create(added, removed, updated);
@@ -15426,13 +15455,7 @@ var ElementsDelta = class _ElementsDelta {
15426
15455
  } else {
15427
15456
  latestDelta = delta;
15428
15457
  }
15429
- const strippedDeleted = _ElementsDelta.stripVersionProps(
15430
- latestDelta.deleted
15431
- );
15432
- const strippedInserted = _ElementsDelta.stripVersionProps(
15433
- latestDelta.inserted
15434
- );
15435
- if (Delta.isInnerDifferent(strippedDeleted, strippedInserted)) {
15458
+ if (Delta.isInnerDifferent(latestDelta.deleted, latestDelta.inserted)) {
15436
15459
  modifiedDeltas[id] = latestDelta;
15437
15460
  }
15438
15461
  }
@@ -15503,8 +15526,11 @@ var ElementsDelta = class _ElementsDelta {
15503
15526
  }
15504
15527
  }
15505
15528
  squash(delta) {
15529
+ if (delta.isEmpty()) {
15530
+ return this;
15531
+ }
15506
15532
  const { added, removed, updated } = delta;
15507
- function mergeBoundElements(prevDelta, nextDelta) {
15533
+ const mergeBoundElements = (prevDelta, nextDelta) => {
15508
15534
  const mergedDeletedBoundElements = Delta.mergeArrays(
15509
15535
  prevDelta.deleted.boundElements ?? [],
15510
15536
  nextDelta.deleted.boundElements ?? [],
@@ -15517,6 +15543,9 @@ var ElementsDelta = class _ElementsDelta {
15517
15543
  void 0,
15518
15544
  (x) => x.id
15519
15545
  ) ?? [];
15546
+ if (!mergedDeletedBoundElements.length && !mergedInsertedBoundElements.length) {
15547
+ return;
15548
+ }
15520
15549
  return Delta.create(
15521
15550
  {
15522
15551
  boundElements: mergedDeletedBoundElements
@@ -15525,34 +15554,50 @@ var ElementsDelta = class _ElementsDelta {
15525
15554
  boundElements: mergedInsertedBoundElements
15526
15555
  }
15527
15556
  );
15528
- }
15557
+ };
15529
15558
  for (const [id, nextDelta] of Object.entries(added)) {
15530
- const prevDelta = this.added[id];
15559
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15531
15560
  if (!prevDelta) {
15532
15561
  this.added[id] = nextDelta;
15533
15562
  } else {
15534
15563
  const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15564
+ delete this.removed[id];
15565
+ delete this.updated[id];
15535
15566
  this.added[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15536
15567
  }
15537
15568
  }
15538
15569
  for (const [id, nextDelta] of Object.entries(removed)) {
15539
- const prevDelta = this.removed[id];
15570
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15540
15571
  if (!prevDelta) {
15541
15572
  this.removed[id] = nextDelta;
15542
15573
  } else {
15543
15574
  const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15575
+ delete this.added[id];
15576
+ delete this.updated[id];
15544
15577
  this.removed[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15545
15578
  }
15546
15579
  }
15547
15580
  for (const [id, nextDelta] of Object.entries(updated)) {
15548
- const prevDelta = this.updated[id];
15581
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15549
15582
  if (!prevDelta) {
15550
15583
  this.updated[id] = nextDelta;
15551
15584
  } else {
15552
15585
  const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15553
- this.updated[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15586
+ const updatedDelta = Delta.merge(prevDelta, nextDelta, mergedDelta);
15587
+ if (prevDelta === this.added[id]) {
15588
+ this.added[id] = updatedDelta;
15589
+ } else if (prevDelta === this.removed[id]) {
15590
+ this.removed[id] = updatedDelta;
15591
+ } else {
15592
+ this.updated[id] = updatedDelta;
15593
+ }
15554
15594
  }
15555
15595
  }
15596
+ if (isTestEnv8() || isDevEnv7()) {
15597
+ _ElementsDelta.validate(this, "added", _ElementsDelta.satisfiesAddition);
15598
+ _ElementsDelta.validate(this, "removed", _ElementsDelta.satisfiesRemoval);
15599
+ _ElementsDelta.validate(this, "updated", _ElementsDelta.satisfiesUpdate);
15600
+ }
15556
15601
  return this;
15557
15602
  }
15558
15603
  static createApplier = (prevElements, nextElements, snapshot, flags, options) => (deltas) => {
@@ -15851,10 +15896,6 @@ var ElementsDelta = class _ElementsDelta {
15851
15896
  const { id, updated, ...strippedPartial } = partial;
15852
15897
  return strippedPartial;
15853
15898
  }
15854
- static stripVersionProps(partial) {
15855
- const { version, versionNonce, ...strippedPartial } = partial;
15856
- return strippedPartial;
15857
- }
15858
15899
  };
15859
15900
 
15860
15901
  // src/distribute.ts