Skip to content

Commit 9f5389f

Browse files
committed
[lexical] Bug Fix: Fix bug in transformer loop that would cause nodes not to get reconciled
1 parent 217a6e9 commit 9f5389f

File tree

4 files changed

+30
-36
lines changed

4 files changed

+30
-36
lines changed

packages/lexical-list/src/LexicalListNode.ts

+17-22
Original file line numberDiff line numberDiff line change
@@ -193,31 +193,26 @@ export class ListNode extends ElementNode {
193193
return false;
194194
}
195195

196-
append(...nodesToAppend: LexicalNode[]): this {
197-
for (let i = 0; i < nodesToAppend.length; i++) {
198-
const currentNode = nodesToAppend[i];
199-
200-
if ($isListItemNode(currentNode)) {
201-
super.append(currentNode);
202-
} else {
203-
const listItemNode = $createListItemNode();
204-
205-
if ($isListNode(currentNode)) {
206-
listItemNode.append(currentNode);
207-
} else if ($isElementNode(currentNode)) {
208-
if (currentNode.isInline()) {
209-
listItemNode.append(currentNode);
210-
} else {
211-
const textNode = $createTextNode(currentNode.getTextContent());
212-
listItemNode.append(textNode);
213-
}
214-
} else {
215-
listItemNode.append(currentNode);
196+
splice(
197+
start: number,
198+
deleteCount: number,
199+
nodesToInsert: LexicalNode[],
200+
): this {
201+
let listItemNodesToInsert = nodesToInsert;
202+
for (let i = 0; i < nodesToInsert.length; i++) {
203+
const node = nodesToInsert[i];
204+
if (!$isListItemNode(node)) {
205+
if (listItemNodesToInsert === nodesToInsert) {
206+
listItemNodesToInsert = [...nodesToInsert];
216207
}
217-
super.append(listItemNode);
208+
listItemNodesToInsert[i] = $createListItemNode().append(
209+
$isElementNode(node) && !($isListNode(node) || node.isInline())
210+
? $createTextNode(node.getTextContent())
211+
: node,
212+
);
218213
}
219214
}
220-
return this;
215+
return super.splice(start, deleteCount, listItemNodesToInsert);
221216
}
222217

223218
extractWithChild(child: LexicalNode): boolean {

packages/lexical/src/LexicalReconciler.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ function $reconcileNode(
617617
return dom;
618618
}
619619
// If the node key doesn't point to the same instance in both maps,
620-
// it means it were cloned. If they're also dirty, we mark them as mutated.
620+
// it was cloned. If it's also dirty, we mark it as mutated.
621621
if (prevNode !== nextNode && isDirty) {
622622
setMutatedNode(
623623
mutatedNodes,

packages/lexical/src/LexicalUpdates.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ function $applyAllTransforms(
308308
for (const currentUntransformedDirtyElement of untransformedDirtyElements) {
309309
const nodeKey = currentUntransformedDirtyElement[0];
310310
const intentionallyMarkedAsDirty = currentUntransformedDirtyElement[1];
311+
dirtyElements.set(nodeKey, intentionallyMarkedAsDirty);
311312
if (nodeKey !== 'root' && !intentionallyMarkedAsDirty) {
312313
continue;
313314
}
@@ -320,8 +321,6 @@ function $applyAllTransforms(
320321
) {
321322
$applyTransforms(editor, node, transformsCache);
322323
}
323-
324-
dirtyElements.set(nodeKey, intentionallyMarkedAsDirty);
325324
}
326325

327326
untransformedDirtyLeaves = editor._dirtyLeaves;

packages/lexical/src/nodes/LexicalRootNode.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,18 @@ export class RootNode extends ElementNode {
8282
}
8383

8484
// Mutate
85-
86-
append(...nodesToAppend: LexicalNode[]): this {
87-
for (let i = 0; i < nodesToAppend.length; i++) {
88-
const node = nodesToAppend[i];
89-
if (!$isElementNode(node) && !$isDecoratorNode(node)) {
90-
invariant(
91-
false,
92-
'rootNode.append: Only element or decorator nodes can be appended to the root node',
93-
);
94-
}
85+
splice(
86+
start: number,
87+
deleteCount: number,
88+
nodesToInsert: LexicalNode[],
89+
): this {
90+
for (const node of nodesToInsert) {
91+
invariant(
92+
$isElementNode(node) || $isDecoratorNode(node),
93+
'rootNode.splice: Only element or decorator nodes can be inserted to the root node',
94+
);
9595
}
96-
return super.append(...nodesToAppend);
96+
return super.splice(start, deleteCount, nodesToInsert);
9797
}
9898

9999
static importJSON(serializedNode: SerializedRootNode): RootNode {

0 commit comments

Comments
 (0)