Skip to content

Commit b8efe21

Browse files
committed
feat: base offset
1 parent ea234aa commit b8efe21

File tree

2 files changed

+39
-20
lines changed

2 files changed

+39
-20
lines changed

src/index.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,78 @@
11
import MagicStringBase from 'magic-string'
2-
import type { OverwriteOptions } from 'magic-string'
2+
import type { MagicStringOptions, OverwriteOptions } from 'magic-string'
33
import type { Node } from '@babel/types'
44

55
export * from 'magic-string'
66
export { MagicStringBase }
77

88
export class MagicString extends MagicStringBase {
9-
removeNode(node: Node | Node[], { offset = 0 }: { offset?: number } = {}) {
9+
offset: number
10+
11+
constructor(
12+
str: string,
13+
options?: MagicStringOptions & {
14+
/** offset of node */
15+
offset?: number
16+
}
17+
) {
18+
super(str, options)
19+
this.offset = options?.offset ?? 0
20+
}
21+
22+
private getNodePos(
23+
nodes: Node | Node[],
24+
offset?: number
25+
): [start: number, end: number] {
26+
const _offset = offset ?? this.offset
27+
if (Array.isArray(nodes))
28+
return [_offset + nodes[0].start!, _offset + nodes.slice(-1)[0].end!]
29+
else return [_offset + nodes.start!, _offset + nodes.end!]
30+
}
31+
32+
removeNode(node: Node | Node[], { offset }: { offset?: number } = {}) {
1033
if (isEmptyNodes(node)) return this
11-
super.remove(...getNodePos(node, offset))
34+
super.remove(...this.getNodePos(node, offset))
1235
return this
1336
}
1437

1538
moveNode(
1639
node: Node | Node[],
1740
index: number,
18-
{ offset = 0 }: { offset?: number } = {}
41+
{ offset }: { offset?: number } = {}
1942
) {
2043
if (isEmptyNodes(node)) return this
21-
super.move(...getNodePos(node, offset), index)
44+
super.move(...this.getNodePos(node, offset), index)
2245
return this
2346
}
2447

25-
sliceNode(node: Node | Node[], { offset = 0 }: { offset?: number } = {}) {
48+
sliceNode(node: Node | Node[], { offset }: { offset?: number } = {}) {
2649
if (isEmptyNodes(node)) return ''
27-
return super.slice(...getNodePos(node, offset))
50+
return super.slice(...this.getNodePos(node, offset))
2851
}
2952

3053
overwriteNode(
3154
node: Node | Node[],
3255
content: string | Node | Node[],
33-
{ offset = 0, ...options }: OverwriteOptions & { offset?: number } = {}
56+
{ offset, ...options }: OverwriteOptions & { offset?: number } = {}
3457
) {
3558
if (isEmptyNodes(node)) return this
3659

3760
const _content =
3861
typeof content === 'string' ? content : this.sliceNode(content)
39-
super.overwrite(...getNodePos(node, offset), _content, options)
62+
super.overwrite(...this.getNodePos(node, offset), _content, options)
4063
return this
4164
}
4265

43-
snipNode(node: Node | Node[], { offset = 0 }: { offset?: number } = {}) {
66+
snipNode(node: Node | Node[], { offset }: { offset?: number } = {}) {
4467
if (isEmptyNodes(node))
4568
return new MagicStringBase('', {
4669
// @ts-expect-error
4770
filename: super.filename,
4871
})
49-
return super.snip(...getNodePos(node, offset))
72+
return super.snip(...this.getNodePos(node, offset))
5073
}
5174
}
5275

53-
function getNodePos(
54-
nodes: Node | Node[],
55-
offset: number
56-
): [start: number, end: number] {
57-
if (Array.isArray(nodes))
58-
return [offset + nodes[0].start!, offset + nodes.slice(-1)[0].end!]
59-
else return [offset + nodes.start!, offset + nodes.end!]
60-
}
61-
6276
function isEmptyNodes(nodes: Node | Node[]) {
6377
return Array.isArray(nodes) && nodes.length === 0
6478
}

tests/index.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ test('basic', () => {
66
expect(s.toString()).toBe('foo')
77
})
88

9+
test('offset', () => {
10+
const s = new MagicString('hello world', { offset: 6 })
11+
expect(s.sliceNode({ start: 0, end: 5 } as any)).toBe('world')
12+
})
13+
914
test('empty array', () => {
1015
const ORIGINAL = 'foo'
1116
const s = new MagicString(ORIGINAL)

0 commit comments

Comments
 (0)