Skip to content

Commit 8c9b114

Browse files
authored
perf!: use estree-walker (#425)
1 parent 92ae1f6 commit 8c9b114

File tree

5 files changed

+25
-23
lines changed

5 files changed

+25
-23
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ Components({
339339
// auto import for directives
340340
// default: `true` for Vue 3, `false` for Vue 2
341341
// Babel is needed to do the transformation for Vue 2, it's disabled by default for performance concerns.
342-
// To install Babel, run: `npm install -D @babel/parser @babel/traverse`
342+
// To install Babel, run: `npm install -D @babel/parser`
343343
directives: true,
344344

345345
// Transform path before resolving

package.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,11 @@
7676
},
7777
"peerDependencies": {
7878
"@babel/parser": "^7.15.8",
79-
"@babel/traverse": "^7.15.4",
8079
"vue": "2 || 3"
8180
},
8281
"peerDependenciesMeta": {
8382
"@babel/parser": {
8483
"optional": true
85-
},
86-
"@babel/traverse": {
87-
"optional": true
8884
}
8985
},
9086
"dependencies": {
@@ -102,7 +98,6 @@
10298
"devDependencies": {
10399
"@antfu/eslint-config": "^0.25.1",
104100
"@babel/parser": "^7.18.5",
105-
"@babel/traverse": "^7.18.5",
106101
"@babel/types": "^7.18.4",
107102
"@types/debug": "^4.1.7",
108103
"@types/minimatch": "^3.0.5",
@@ -114,6 +109,7 @@
114109
"element-plus": "^2.2.5",
115110
"eslint": "^8.17.0",
116111
"esno": "^0.16.3",
112+
"estree-walker": "^3.0.1",
117113
"pathe": "^0.3.0",
118114
"rollup": "^2.75.6",
119115
"tsup": "^6.1.2",

pnpm-lock.yaml

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

src/core/transforms/directive/vue2.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {
2-
BlockStatement, CallExpression, File, FunctionExpression, ObjectProperty, VariableDeclaration,
2+
BlockStatement, CallExpression, File, FunctionExpression, Node, ObjectProperty, VariableDeclaration,
33
} from '@babel/types'
44
import type MagicString from 'magic-string'
55
import type { ParseResult } from '@babel/parser'
@@ -17,33 +17,35 @@ const getRenderFnStart = (ast: ParseResult<File>): number => {
1717
&& node.declarations[0].id.type === 'Identifier'
1818
&& node.declarations[0].id.name === 'render',
1919
)
20-
const start = (((renderFn?.declarations[0].init as FunctionExpression).body) as BlockStatement).start
21-
if (start === null)
20+
const start = (((renderFn?.declarations[0].init as FunctionExpression)?.body) as BlockStatement)?.start
21+
if (start === null || start === undefined)
2222
throw new Error('[unplugin-vue-components:directive] Cannot find render function position.')
2323
return start + 1
2424
}
2525

2626
export default async function resolveVue2(code: string, s: MagicString): Promise<ResolveResult[]> {
27-
if (!isPackageExists('@babel/parser') || !isPackageExists('@babel/traverse'))
28-
throw new Error('[unplugin-vue-components:directive] To use Vue 2 directive you will need to install Babel first: "npm install -D @babel/parser @babel/traverse"')
27+
if (!isPackageExists('@babel/parser'))
28+
throw new Error('[unplugin-vue-components:directive] To use Vue 2 directive you will need to install Babel first: "npm install -D @babel/parser"')
2929

30-
const { parse } = await importModule('@babel/parser') as typeof import('@babel/parser')
30+
const { parse } = await importModule<typeof import('@babel/parser')>('@babel/parser')
3131
const ast = parse(code, {
3232
sourceType: 'module',
3333
})
34+
3435
const nodes: CallExpression[] = []
35-
const { default: traverse } = await importModule('@babel/traverse') as typeof import('@babel/traverse')
36-
traverse(ast, {
37-
CallExpression(path) {
38-
nodes.push(path.node)
36+
const { walk } = await import('estree-walker')
37+
walk(ast.program as any, {
38+
enter(node: any) {
39+
if ((node as Node).type === 'CallExpression')
40+
nodes.push(node)
3941
},
4042
})
4143

4244
const results: ResolveResult[] = []
4345
for (const node of nodes) {
4446
const { callee, arguments: args } = node
4547
// _c(_, {})
46-
if (callee.type !== 'Identifier' || callee.name !== '_c' || args[1] == null || args[1].type !== 'ObjectExpression')
48+
if (callee.type !== 'Identifier' || callee.name !== '_c' || args[1]?.type !== 'ObjectExpression')
4749
continue
4850

4951
// { directives: [] }

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ export interface Options {
162162
* default: `true` for Vue 3, `false` for Vue 2
163163
*
164164
* Babel is needed to do the transformation for Vue 2, it's disabled by default for performance concerns.
165-
* To install Babel, run: `npm install -D @babel/parser @babel/traverse`
165+
* To install Babel, run: `npm install -D @babel/parser`
166166
* @default undefined
167167
*/
168168
directives?: boolean

0 commit comments

Comments
 (0)