FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

feat!: prefer to use rolldown native `magic-string` · unplugin/unplugin-ast@c844bd0 · GitHub

Commit c844bd0

Browse files
committed
feat!: prefer to use rolldown native magic-string
1 parent 90deed9 commit c844bd0

12 files changed

Lines changed: 139 additions & 39 deletions

‎package.json‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"dependencies": {
5757
"@yuku-toolchain/types": "^0.8.3",
5858
"magic-string-ast": "^2.1.1",
59+
"rolldown-string": "^0.3.1",
5960
"unplugin": "^3.3.0",
6061
"yuku-ast": "^0.8.3",
6162
"yuku-codegen": "^0.8.3",
@@ -68,6 +69,7 @@
6869
"@antfu/utils": "^9.3.0",
6970
"@sxzz/eslint-config": "^8.4.0",
7071
"@sxzz/prettier-config": "^2.3.2",
72+
"@sxzz/test-utils": "^0.5.18",
7173
"@types/node": "^26.1.2",
7274
"@typescript/native-preview": "7.0.0-dev.20260707.2",
7375
"bumpp": "^12.1.1",

‎pnpm-lock.yaml‎

Lines changed: 68 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎src/core/options.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ export function resolveOptions(options: Options): OptionsResolved {
2929
exclude: options.exclude || undefined,
3030
enforce: options.enforce || undefined,
3131
parserOptions: options.parserOptions || {},
32-
transformer: options.transformer ? toArray(options.transformer) : [],
32+
transformer: toArray(options.transformer),
3333
}
3434
}

‎src/core/transform.ts‎

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import {
2-
generateTransform,
3-
MagicStringAST,
4-
type CodeTransform,
5-
} from 'magic-string-ast'
1+
import { MagicString, MagicStringAST } from 'magic-string-ast'
62
import { walkAsync } from 'yuku-ast'
73
import {
84
langFromPath,
@@ -15,6 +11,7 @@ import {
1511
import { useNodeRef } from './utils.ts'
1612
import type { OptionsResolved } from './options.ts'
1713
import type { Transformer, TransformerParsed } from './types.ts'
14+
import type { RolldownString } from 'rolldown-string'
1815

1916
function parseProgram(code: string, id: string, parserOptions: ParseOptions) {
2017
const path = id.replace(/[?#].*$/, '')
@@ -66,17 +63,17 @@ async function getTransformersByFile(transformer: Transformer[], id: string) {
6663
}
6764

6865
export async function transform(
69-
code: string,
66+
source: string | RolldownString,
7067
id: string,
7168
options: Pick<OptionsResolved, 'parserOptions' | 'transformer'>,
72-
): Promise<CodeTransform | undefined> {
73-
const { getNodeRef } = useNodeRef()
74-
69+
): Promise<RolldownString | undefined> {
7570
const transformers = await getTransformersByFile(options.transformer, id)
7671
if (!transformers.length) return
7772

73+
const code = source.toString()
7874
const program = parseProgram(code, id, options.parserOptions)
7975

76+
const getNodeRef = useNodeRef()
8077
await walkAsync(program, {
8178
async enter(node, context) {
8279
for (const { transformer, nodes } of transformers) {
@@ -93,7 +90,11 @@ export async function transform(
9390
},
9491
})
9592

96-
const s = new MagicStringAST(code)
93+
const s =
94+
typeof source === 'string'
95+
? new MagicString(source, { filename: id })
96+
: source
97+
const msa = new MagicStringAST(s as MagicString)
9798
for (const { transformer, nodes } of transformers) {
9899
for (const node of nodes) {
99100
const value = node.value
@@ -103,7 +104,7 @@ export async function transform(
103104
if (result) {
104105
let newAST: Node
105106
if (typeof result === 'string') {
106-
s.overwriteNode(value, result)
107+
msa.overwriteNode(value, result)
107108
newAST = parseReplacement(result, id, options.parserOptions)
108109
if (newAST.type === 'ExpressionStatement') {
109110
newAST = newAST.expression
@@ -115,7 +116,7 @@ export async function transform(
115116
const generated = generate(result as Program)
116117
let code = generated.code
117118
if (result.type.endsWith('Expression')) code = `(${code})`
118-
s.overwriteNode(value, code)
119+
msa.overwriteNode(value, code)
119120
newAST = {
120121
...result,
121122
start: value.start,
@@ -127,14 +128,14 @@ export async function transform(
127128
} else if (result === false) {
128129
// removes node
129130
node.set(undefined)
130-
s.removeNode(value)
131+
msa.removeNode(value)
131132
}
132133
}
133134
}
134135

135136
for (const { transformer } of transformers) {
136-
await transformer.finalize?.(s)
137+
await transformer.finalize?.(msa)
137138
}
138139

139-
return generateTransform(s, id)
140+
return s
140141
}

‎src/core/utils.ts‎

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import type { NodeRef } from './types.ts'
22
import type { Node } from 'yuku-parser'
33

4-
export function useNodeRef(): {
5-
nodeRefs: Map<Node, NodeRef<Node | undefined>>
6-
getNodeRef: (node: Node) => NodeRef<Node | undefined>
7-
} {
4+
export function useNodeRef(): (node: Node) => NodeRef<Node | undefined> {
85
const nodeRefs: Map<Node, NodeRef<Node | undefined>> = new Map()
96

107
function getNodeRef(node: Node): NodeRef<Node | undefined> {
@@ -19,8 +16,5 @@ export function useNodeRef(): {
1916
return ref
2017
}
2118

22-
return {
23-
nodeRefs,
24-
getNodeRef,
25-
}
19+
return getNodeRef
2620
}

‎src/index.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { withMagicString } from 'rolldown-string'
12
import { createUnplugin, type UnpluginInstance } from 'unplugin'
23
import { resolveOptions, type Options } from './core/options.ts'
34
import { transform } from './core/transform.ts'
@@ -13,7 +14,7 @@ export const AST: UnpluginInstance<Options | undefined, false> = createUnplugin(
1314
enforce,
1415
transform: {
1516
filter: { id: { include, exclude } },
16-
handler: (code, id) => transform(code, id, options),
17+
handler: withMagicString((code, id) => transform(code, id, options)),
1718
},
1819
}
1920
},
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`rolldown build 1`] = `
4+
"// basic.js
5+
const config = { test: {} };
6+
//#endregion
7+
export { config as default };
8+
"
9+
`;

‎tests/basic.test.ts‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { MagicString } from 'magic-string-ast'
12
import { expect, test } from 'vitest'
23
import { transform } from '../src/core/transform.ts'
34
import { RemoveWrapperFunction } from '../src/transformers.ts'
@@ -55,25 +56,25 @@ test('basic', async () => {
5556
transformer: [],
5657
parserOptions: {},
5758
}
58-
let code = (await transform(source, 'foo.js', options))?.code
59+
let code = (await transform(source, 'foo.js', options))?.toString()
5960
expect(code).toMatchInlineSnapshot('undefined')
6061

6162
options.transformer = [changeString]
62-
code = (await transform(source, 'foo.js', options))?.code
63+
code = (await transform(source, 'foo.js', options))?.toString()
6364
expect(code).toMatchInlineSnapshot(`
6465
"const foo = 'Hello'
6566
let i = 10"
6667
`)
6768

6869
options.transformer = [changeVarName]
69-
code = (await transform(source, 'foo.js', options))?.code
70+
code = (await transform(source, 'foo.js', options))?.toString()
7071
expect(code).toMatchInlineSnapshot(`
7172
"const newName = 'string'
7273
let i = 10"
7374
`)
7475

7576
options.transformer = [changeString, changeVarName]
76-
code = (await transform(source, 'foo.js', options))?.code
77+
code = (await transform(source, 'foo.js', options))?.toString()
7778
expect(code).toMatchInlineSnapshot(`
7879
"const newName = 'Hello'
7980
let i = 10"
@@ -87,14 +88,14 @@ test('change twice', async () => {
8788
parserOptions: {},
8889
}
8990
options.transformer = [changeString, changeVarName, overwriteVarName]
90-
let code = (await transform(source, 'foo.js', options))?.code
91+
let code = (await transform(source, 'foo.js', options))?.toString()
9192
expect(code).toMatchInlineSnapshot(`
9293
"const overwrite_newName = 'Hello'
9394
let overwrite_i = 10"
9495
`)
9596

9697
options.transformer = [timesTen, timesTen, timesTen]
97-
code = (await transform(source, 'foo.js', options))?.code
98+
code = (await transform(source, 'foo.js', options))?.toString()
9899
expect(code).toMatchInlineSnapshot(`
99100
"const foo = 'string'
100101
let i = 10000"
@@ -108,7 +109,7 @@ test('remove node', async () => {
108109
parserOptions: {},
109110
}
110111
options.transformer = [removeFirstStatement]
111-
const code = (await transform(source, 'foo.js', options))?.code
112+
const code = (await transform(source, 'foo.js', options))?.toString()
112113
expect(code).toMatchInlineSnapshot(`
113114
"
114115
let i = 10;{}"
@@ -147,7 +148,7 @@ test('transform with Yuku AST', async () => {
147148
],
148149
parserOptions: {},
149150
}
150-
const code = (await transform(source, 'foo.js', options))?.code
151+
const code = (await transform(source, 'foo.js', options))?.toString()
151152
expect(code).toBe('const overwrite_renamed = 1')
152153
})
153154

@@ -157,7 +158,7 @@ test('handles Unicode offsets', async () => {
157158
transformer: [changeVarName],
158159
parserOptions: {},
159160
}
160-
const code = (await transform(source, 'foo.js', options))?.code
161+
const code = (await transform(source, 'foo.js', options))?.toString()
161162
expect(code).toBe(`const 文 = '值'\nconst newName = 'string'`)
162163
})
163164

@@ -168,7 +169,7 @@ test('detects language through query parameters', async () => {
168169
parserOptions: {},
169170
}
170171
for (const id of ['foo.ts?raw', 'foo.vue?vue&type=script&lang.ts']) {
171-
const code = (await transform(source, id, options))?.code
172+
const code = (await transform(source, id, options))?.toString()
172173
expect(code).toBe(`const foo: string = 'Hello'`)
173174
}
174175
})
@@ -190,7 +191,7 @@ test.fails('overwrite part', async () => {
190191
parserOptions: {},
191192
}
192193
expect(
193-
(await transform(source, 'foo.js', options))?.code,
194+
(await transform(source, 'foo.js', options))?.toString(),
194195
).toMatchInlineSnapshot('undefined')
195196
})
196197

@@ -209,7 +210,7 @@ test('rewrite statement', async () => {
209210
},
210211
},
211212
]
212-
const code = (await transform(source, 'foo.js', options))?.code
213+
const code = (await transform(source, 'foo.js', options))?.toString()
213214
expect(code).toMatchInlineSnapshot(`
214215
"const foo = 'bar'; const bar = 'foo'
215216
let i = 10;{i++}"

‎tests/fixtures/basic.ts‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function defineConfig(config: any) {
2+
return config
3+
}
4+
5+
const config: any = defineConfig({
6+
test: {},
7+
})
8+
9+
export default config

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL