Skip to content

Commit 5c1cba0

Browse files
mysteryvenantfu
andauthored
fix: not use negative indices for remove in empty string (#281)
Co-authored-by: Anthony Fu <github@antfu.me>
1 parent d6b2171 commit 5c1cba0

3 files changed

Lines changed: 35 additions & 12 deletions

File tree

benchmark/data.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -663,10 +663,12 @@ class MagicString {
663663
return this.intro + lineStr;
664664
}
665665
slice(start = 0, end = this.original.length) {
666-
while (start < 0)
667-
start += this.original.length;
668-
while (end < 0)
669-
end += this.original.length;
666+
if (this.original.length !== 0) {
667+
while (start < 0)
668+
start += this.original.length;
669+
while (end < 0)
670+
end += this.original.length;
671+
}
670672
let result = "";
671673
let chunk = this.firstChunk;
672674
while (chunk && (chunk.start > start || chunk.end <= start)) {

src/MagicString.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,10 @@ export default class MagicString {
360360
update(start, end, content, options) {
361361
if (typeof content !== 'string') throw new TypeError('replacement content must be a string');
362362

363-
while (start < 0) start += this.original.length;
364-
while (end < 0) end += this.original.length;
363+
if (this.original.length !== 0) {
364+
while (start < 0) start += this.original.length;
365+
while (end < 0) end += this.original.length;
366+
}
365367

366368
if (end > this.original.length) throw new Error('end is out of bounds');
367369
if (start === end)
@@ -469,8 +471,10 @@ export default class MagicString {
469471
}
470472

471473
remove(start, end) {
472-
while (start < 0) start += this.original.length;
473-
while (end < 0) end += this.original.length;
474+
if (this.original.length !== 0) {
475+
while (start < 0) start += this.original.length;
476+
while (end < 0) end += this.original.length;
477+
}
474478

475479
if (start === end) return this;
476480

@@ -497,8 +501,10 @@ export default class MagicString {
497501
}
498502

499503
reset(start, end) {
500-
while (start < 0) start += this.original.length;
501-
while (end < 0) end += this.original.length;
504+
if (this.original.length !== 0) {
505+
while (start < 0) start += this.original.length;
506+
while (end < 0) end += this.original.length;
507+
}
502508

503509
if (start === end) return this;
504510

@@ -564,8 +570,10 @@ export default class MagicString {
564570
}
565571

566572
slice(start = 0, end = this.original.length) {
567-
while (start < 0) start += this.original.length;
568-
while (end < 0) end += this.original.length;
573+
if (this.original.length !== 0) {
574+
while (start < 0) start += this.original.length;
575+
while (end < 0) end += this.original.length;
576+
}
569577

570578
let result = '';
571579

test/MagicString.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,19 @@ describe('MagicString', () => {
12341234

12351235
assert.equal(s.toString(), 'abchidejkl');
12361236
});
1237+
1238+
it('should accept negative indices', () => {
1239+
const s = new MagicString('abcde');
1240+
// "abcde"
1241+
// ^
1242+
s.remove(-2, -1);
1243+
assert.equal(s.toString(), 'abce');
1244+
});
1245+
1246+
it('should throw error when using negative indices with empty string', () => {
1247+
const s = new MagicString('');
1248+
assert.throws(() => s.remove(-2, -1), /Error: Character is out of bounds/);
1249+
});
12371250
});
12381251

12391252
describe('reset', () => {

0 commit comments

Comments
 (0)