Skip to content

Commit abfe3b4

Browse files
authored
fix: get render start in vue 2 directive (unplugin#518)
1 parent 6fa8415 commit abfe3b4

File tree

1 file changed

+13
-8
lines changed
  • src/core/transforms/directive

1 file changed

+13
-8
lines changed

src/core/transforms/directive/vue2.ts

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import type {
2-
BlockStatement, CallExpression, File, FunctionExpression, Node, ObjectProperty, VariableDeclaration,
2+
BlockStatement, CallExpression, FunctionExpression, Node, ObjectProperty, Program, VariableDeclaration,
33
} from '@babel/types'
44
import type MagicString from 'magic-string'
5-
import type { ParseResult } from '@babel/parser'
65
import { importModule, isPackageExists } from 'local-pkg'
76
import type { ResolveResult } from '../../transformer'
87

@@ -11,8 +10,8 @@ import type { ResolveResult } from '../../transformer'
1110
* @param ast
1211
* @returns
1312
*/
14-
const getRenderFnStart = (ast: ParseResult<File>): number => {
15-
const renderFn = ast.program.body.find((node): node is VariableDeclaration =>
13+
const getRenderFnStart = (program: Program): number => {
14+
const renderFn = program.body.find((node): node is VariableDeclaration =>
1615
node.type === 'VariableDeclaration'
1716
&& node.declarations[0].id.type === 'Identifier'
1817
&& ['render', '_sfc_render'].includes(node.declarations[0].id.name),
@@ -28,13 +27,13 @@ export default async function resolveVue2(code: string, s: MagicString): Promise
2827
throw new Error('[unplugin-vue-components:directive] To use Vue 2 directive you will need to install Babel first: "npm install -D @babel/parser"')
2928

3029
const { parse } = await importModule<typeof import('@babel/parser')>('@babel/parser')
31-
const ast = parse(code, {
30+
const { program } = parse(code, {
3231
sourceType: 'module',
3332
})
3433

3534
const nodes: CallExpression[] = []
3635
const { walk } = await import('estree-walker')
37-
walk(ast.program as any, {
36+
walk(program as any, {
3837
enter(node: any) {
3938
if ((node as Node).type === 'CallExpression')
4039
nodes.push(node)
@@ -44,8 +43,14 @@ export default async function resolveVue2(code: string, s: MagicString): Promise
4443
if (nodes.length === 0)
4544
return []
4645

46+
let _renderStart: number | undefined
47+
const getRenderStart = () => {
48+
if (_renderStart !== undefined)
49+
return _renderStart
50+
return (_renderStart = getRenderFnStart(program))
51+
}
52+
4753
const results: ResolveResult[] = []
48-
const renderStart = getRenderFnStart(ast)
4954
for (const node of nodes) {
5055
const { callee, arguments: args } = node
5156
// _c(_, {})
@@ -80,7 +85,7 @@ export default async function resolveVue2(code: string, s: MagicString): Promise
8085
results.push({
8186
rawName: name,
8287
replace: (resolved) => {
83-
s.prependLeft(renderStart!, `\nthis.$options.directives["${name}"] = ${resolved};`)
88+
s.prependLeft(getRenderStart(), `\nthis.$options.directives["${name}"] = ${resolved};`)
8489
},
8590
})
8691
}

0 commit comments

Comments
 (0)