@excalidraw/element 0.18.0-7b8a5f54c → 0.18.0-880dbb25e

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
@@ -14651,10 +14651,10 @@ var Delta = class _Delta {
14651
14651
  /**
14652
14652
  * Merges two deltas into a new one.
14653
14653
  */
14654
- static merge(delta1, delta2) {
14654
+ static merge(delta1, delta2, delta3) {
14655
14655
  return _Delta.create(
14656
- { ...delta1.deleted, ...delta2.deleted },
14657
- { ...delta1.inserted, ...delta2.inserted }
14656
+ { ...delta1.deleted, ...delta2.deleted, ...delta3?.deleted ?? {} },
14657
+ { ...delta1.inserted, ...delta2.inserted, ...delta3?.inserted ?? {} }
14658
14658
  );
14659
14659
  }
14660
14660
  /**
@@ -14662,7 +14662,7 @@ var Delta = class _Delta {
14662
14662
  */
14663
14663
  static mergeObjects(prev, added, removed) {
14664
14664
  const cloned = { ...prev };
14665
- for (const key of Object.keys(removed)) {
14665
+ for (const key of Object.keys(removed ?? {})) {
14666
14666
  delete cloned[key];
14667
14667
  }
14668
14668
  return { ...cloned, ...added };
@@ -14906,7 +14906,33 @@ var AppStateDelta = class _AppStateDelta {
14906
14906
  return new _AppStateDelta(inversedDelta);
14907
14907
  }
14908
14908
  squash(delta) {
14909
- this.delta = Delta.merge(this.delta, delta.delta);
14909
+ const mergedDeletedSelectedElementIds = Delta.mergeObjects(
14910
+ this.delta.deleted.selectedElementIds ?? {},
14911
+ delta.delta.deleted.selectedElementIds ?? {}
14912
+ );
14913
+ const mergedInsertedSelectedElementIds = Delta.mergeObjects(
14914
+ this.delta.inserted.selectedElementIds ?? {},
14915
+ delta.delta.inserted.selectedElementIds ?? {}
14916
+ );
14917
+ const mergedInsertedSelectedGroupIds = Delta.mergeObjects(
14918
+ this.delta.inserted.selectedGroupIds ?? {},
14919
+ delta.delta.inserted.selectedGroupIds ?? {}
14920
+ );
14921
+ const mergedDeletedSelectedGroupIds = Delta.mergeObjects(
14922
+ this.delta.deleted.selectedGroupIds ?? {},
14923
+ delta.delta.deleted.selectedGroupIds ?? {}
14924
+ );
14925
+ const mergedDelta = Delta.create(
14926
+ {
14927
+ selectedElementIds: mergedDeletedSelectedElementIds,
14928
+ selectedGroupIds: mergedDeletedSelectedGroupIds
14929
+ },
14930
+ {
14931
+ selectedElementIds: mergedInsertedSelectedElementIds,
14932
+ selectedGroupIds: mergedInsertedSelectedGroupIds
14933
+ }
14934
+ );
14935
+ this.delta = Delta.merge(this.delta, delta.delta, mergedDelta);
14910
14936
  return this;
14911
14937
  }
14912
14938
  applyTo(appState, nextElements) {
@@ -15234,9 +15260,13 @@ var ElementsDelta = class _ElementsDelta {
15234
15260
  Number.isInteger(deleted.version) && Number.isInteger(inserted.version) && // versions should be positive, zero included
15235
15261
  deleted.version >= 0 && inserted.version >= 0 && // versions should never be the same
15236
15262
  deleted.version !== inserted.version);
15263
+ static satisfiesUniqueInvariants = (elementsDelta, id) => {
15264
+ const { added, removed, updated } = elementsDelta;
15265
+ return [added[id], removed[id], updated[id]].filter(Boolean).length === 1;
15266
+ };
15237
15267
  static validate(elementsDelta, type, satifiesSpecialInvariants) {
15238
15268
  for (const [id, delta] of Object.entries(elementsDelta[type])) {
15239
- if (!this.satisfiesCommmonInvariants(delta) || !satifiesSpecialInvariants(delta)) {
15269
+ if (!this.satisfiesCommmonInvariants(delta) || !this.satisfiesUniqueInvariants(elementsDelta, id) || !satifiesSpecialInvariants(delta)) {
15240
15270
  console.error(
15241
15271
  `Broken invariant for "${type}" delta, element "${id}", delta:`,
15242
15272
  delta
@@ -15478,30 +15508,71 @@ var ElementsDelta = class _ElementsDelta {
15478
15508
  }
15479
15509
  squash(delta) {
15480
15510
  const { added, removed, updated } = delta;
15511
+ const mergeBoundElements = (prevDelta, nextDelta) => {
15512
+ const mergedDeletedBoundElements = Delta.mergeArrays(
15513
+ prevDelta.deleted.boundElements ?? [],
15514
+ nextDelta.deleted.boundElements ?? [],
15515
+ void 0,
15516
+ (x) => x.id
15517
+ ) ?? [];
15518
+ const mergedInsertedBoundElements = Delta.mergeArrays(
15519
+ prevDelta.inserted.boundElements ?? [],
15520
+ nextDelta.inserted.boundElements ?? [],
15521
+ void 0,
15522
+ (x) => x.id
15523
+ ) ?? [];
15524
+ return Delta.create(
15525
+ {
15526
+ boundElements: mergedDeletedBoundElements
15527
+ },
15528
+ {
15529
+ boundElements: mergedInsertedBoundElements
15530
+ }
15531
+ );
15532
+ };
15481
15533
  for (const [id, nextDelta] of Object.entries(added)) {
15482
- const prevDelta = this.added[id];
15534
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15483
15535
  if (!prevDelta) {
15484
15536
  this.added[id] = nextDelta;
15485
15537
  } else {
15486
- this.added[id] = Delta.merge(prevDelta, nextDelta);
15538
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15539
+ delete this.removed[id];
15540
+ delete this.updated[id];
15541
+ this.added[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15487
15542
  }
15488
15543
  }
15489
15544
  for (const [id, nextDelta] of Object.entries(removed)) {
15490
- const prevDelta = this.removed[id];
15545
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15491
15546
  if (!prevDelta) {
15492
15547
  this.removed[id] = nextDelta;
15493
15548
  } else {
15494
- this.removed[id] = Delta.merge(prevDelta, nextDelta);
15549
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15550
+ delete this.added[id];
15551
+ delete this.updated[id];
15552
+ this.removed[id] = Delta.merge(prevDelta, nextDelta, mergedDelta);
15495
15553
  }
15496
15554
  }
15497
15555
  for (const [id, nextDelta] of Object.entries(updated)) {
15498
- const prevDelta = this.updated[id];
15556
+ const prevDelta = this.added[id] ?? this.removed[id] ?? this.updated[id];
15499
15557
  if (!prevDelta) {
15500
15558
  this.updated[id] = nextDelta;
15501
15559
  } else {
15502
- this.updated[id] = Delta.merge(prevDelta, nextDelta);
15560
+ const mergedDelta = mergeBoundElements(prevDelta, nextDelta);
15561
+ const updatedDelta = Delta.merge(prevDelta, nextDelta, mergedDelta);
15562
+ if (prevDelta === this.added[id]) {
15563
+ this.added[id] = updatedDelta;
15564
+ } else if (prevDelta === this.removed[id]) {
15565
+ this.removed[id] = updatedDelta;
15566
+ } else {
15567
+ this.updated[id] = updatedDelta;
15568
+ }
15503
15569
  }
15504
15570
  }
15571
+ if (isTestEnv8() || isDevEnv7()) {
15572
+ _ElementsDelta.validate(this, "added", _ElementsDelta.satisfiesAddition);
15573
+ _ElementsDelta.validate(this, "removed", _ElementsDelta.satisfiesRemoval);
15574
+ _ElementsDelta.validate(this, "updated", _ElementsDelta.satisfiesUpdate);
15575
+ }
15505
15576
  return this;
15506
15577
  }
15507
15578
  static createApplier = (prevElements, nextElements, snapshot, flags, options) => (deltas) => {
@@ -15618,6 +15689,7 @@ var ElementsDelta = class _ElementsDelta {
15618
15689
  return;
15619
15690
  }
15620
15691
  const prevElement = prevElements.get(element.id);
15692
+ const nextVersion = applyDirection === "forward" ? nextElement.version + 1 : nextElement.version - 1;
15621
15693
  const elementUpdates = updates;
15622
15694
  let affectedElement;
15623
15695
  if (prevElement === nextElement) {
@@ -15625,15 +15697,15 @@ var ElementsDelta = class _ElementsDelta {
15625
15697
  nextElement,
15626
15698
  {
15627
15699
  ...elementUpdates,
15628
- version: applyDirection === "forward" ? nextElement.version + 1 : nextElement.version - 1
15700
+ version: nextVersion
15629
15701
  },
15630
15702
  true
15631
15703
  );
15632
15704
  } else {
15633
15705
  affectedElement = mutateElement(nextElement, nextElements, {
15634
15706
  ...elementUpdates,
15635
- // don't modify the version further, as we've already updated it
15636
- version: nextElement.version
15707
+ // don't modify the version further, if it's already different
15708
+ version: prevElement?.version !== nextElement.version ? nextElement.version : nextVersion
15637
15709
  });
15638
15710
  }
15639
15711
  nextAffectedElements.set(affectedElement.id, affectedElement);