From 44657621a1e8f9676b4821d38bf596edba579a41 Mon Sep 17 00:00:00 2001 From: Sarath Francis Date: Sat, 6 Jun 2026 12:54:34 -0400 Subject: [PATCH] Fix crash when moving a zero-length range move(start, end, index) threw a TypeError ('Cannot read properties of undefined') when start === end, because byEnd[end] is undefined for an empty range so reading last.next failed. remove() already treats a zero-length range as a no-op; do the same in move(). --- src/MagicString.js | 2 ++ test/MagicString.test.js | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/src/MagicString.js b/src/MagicString.js index f9ac740..abd4dce 100644 --- a/src/MagicString.js +++ b/src/MagicString.js @@ -325,6 +325,8 @@ export default class MagicString { end = end + this.offset; index = index + this.offset; + if (start === end) return this; + if (index >= start && index <= end) throw new Error('Cannot move a selection inside itself'); if (DEBUG) this.stats.time('move'); diff --git a/test/MagicString.test.js b/test/MagicString.test.js index cd0d6e6..46a044c 100644 --- a/test/MagicString.test.js +++ b/test/MagicString.test.js @@ -874,6 +874,15 @@ describe('MagicString', () => { assert.throws(() => s.move(3, 6, 6), /Cannot move a selection inside itself/); }); + it('does nothing when moving a zero-length range', () => { + const s = new MagicString('abcdefghijkl'); + + assert.doesNotThrow(() => s.move(0, 0, 6)); + assert.doesNotThrow(() => s.move(5, 5, 0)); + + assert.equal(s.toString(), 'abcdefghijkl'); + }); + it('allows edits of moved content', () => { const s1 = new MagicString('abcdefghijkl');