diff --git a/packages/lexical-markdown/src/MarkdownTransformers.ts b/packages/lexical-markdown/src/MarkdownTransformers.ts index 144f2bf1480..0270e4e2bba 100644 --- a/packages/lexical-markdown/src/MarkdownTransformers.ts +++ b/packages/lexical-markdown/src/MarkdownTransformers.ts @@ -101,10 +101,23 @@ const LIST_INDENT_SIZE = 4; const listReplace = (listType: ListType): ElementTransformer['replace'] => { return (parentNode, children, match) => { const previousNode = parentNode.getPreviousSibling(); + const nextNode = parentNode.getNextSibling(); const listItem = $createListItemNode( listType === 'check' ? match[3] === 'x' : undefined, ); - if ($isListNode(previousNode) && previousNode.getListType() === listType) { + if ($isListNode(nextNode) && nextNode.getListType() === listType) { + const firstChild = nextNode.getFirstChild(); + if (firstChild !== null) { + firstChild.insertBefore(listItem); + } else { + // should never happen, but let's handle gracefully, just in case. + nextNode.append(listItem); + } + parentNode.remove(); + } else if ( + $isListNode(previousNode) && + previousNode.getListType() === listType + ) { previousNode.append(listItem); parentNode.remove(); } else { diff --git a/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs b/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs new file mode 100644 index 00000000000..728a6c0883d --- /dev/null +++ b/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs @@ -0,0 +1,49 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +import { + assertHTML, + focusEditor, + html, + initialize, + test, +} from '../utils/index.mjs'; + +test.describe('Regression test #3433', () => { + test.beforeEach(({isCollab, page}) => initialize({isCollab, page})); + test('can merge markdown lists created immediately before existing lists', async ({ + page, + isPlainText, + }) => { + test.skip(isPlainText); + await focusEditor(page); + await page.keyboard.press('Enter'); + await page.keyboard.type('- one'); + await page.keyboard.press('ArrowUp'); + await page.keyboard.type('- two'); + await assertHTML( + page, + html` + + `, + ); + }); +});