1
1
import { Parser as HTMLParser } from 'htmlparser2'
2
2
import { parse } from '@babel/parser'
3
- import { PrivateName , Expression , Statement } from '@babel/types'
3
+ import { PrivateName , Expression , Statement , SpreadElement } from '@babel/types'
4
4
import { camelize , capitalize , isHTMLTag , isSVGTag , isVoidTag } from '@vue/shared'
5
5
import { ParseResult , TagMeta } from './types'
6
6
@@ -34,6 +34,9 @@ export function parseVueSFC(code: string, id?: string): ParseResult {
34
34
35
35
const parser = new HTMLParser ( {
36
36
onopentag ( name , attributes ) {
37
+ if ( ! name )
38
+ return
39
+
37
40
if ( name === 'template' )
38
41
templateLevel += 1
39
42
@@ -131,8 +134,25 @@ export function getIdentifiersDeclaration(nodes: Statement[], identifiers = new
131
134
}
132
135
else if ( node . type === 'VariableDeclaration' ) {
133
136
for ( const declarator of node . declarations ) {
134
- // @ts -expect-error
135
- identifiers . add ( declarator . id . name )
137
+ if ( declarator . id . type === 'Identifier' ) {
138
+ identifiers . add ( declarator . id . name )
139
+ }
140
+ else if ( declarator . id . type === 'ObjectPattern' ) {
141
+ for ( const property of declarator . id . properties ) {
142
+ if ( property . type === 'ObjectProperty' && property . key . type === 'Identifier' )
143
+ identifiers . add ( property . key . name )
144
+ else if ( property . type === 'RestElement' && property . argument . type === 'Identifier' )
145
+ identifiers . add ( property . argument . name )
146
+ }
147
+ }
148
+ else if ( declarator . id . type === 'ArrayPattern' ) {
149
+ for ( const element of declarator . id . elements ) {
150
+ if ( element ?. type === 'Identifier' )
151
+ identifiers . add ( element . name )
152
+ else if ( element ?. type === 'RestElement' && element . argument . type === 'Identifier' )
153
+ identifiers . add ( element . argument . name )
154
+ }
155
+ }
136
156
}
137
157
}
138
158
else if ( node . type === 'FunctionDeclaration' ) {
@@ -146,7 +166,7 @@ export function getIdentifiersDeclaration(nodes: Statement[], identifiers = new
146
166
return identifiers
147
167
}
148
168
149
- export function getIdentifiersUsage ( node ?: Expression | PrivateName | Statement , identifiers = new Set < string > ( ) ) {
169
+ export function getIdentifiersUsage ( node ?: Expression | SpreadElement | PrivateName | Statement | null , identifiers = new Set < string > ( ) ) {
150
170
if ( ! node )
151
171
return identifiers
152
172
@@ -171,6 +191,9 @@ export function getIdentifiersUsage(node?: Expression | PrivateName | Statement,
171
191
getIdentifiersUsage ( node . left , identifiers )
172
192
getIdentifiersUsage ( node . right , identifiers )
173
193
}
194
+ else if ( node . type === 'UnaryExpression' ) {
195
+ getIdentifiersUsage ( node . argument , identifiers )
196
+ }
174
197
else if ( node . type === 'ForOfStatement' || node . type === 'ForInStatement' ) {
175
198
getIdentifiersUsage ( node . right , identifiers )
176
199
}
@@ -181,10 +204,20 @@ export function getIdentifiersUsage(node?: Expression | PrivateName | Statement,
181
204
}
182
205
else if ( node . type === 'ObjectExpression' ) {
183
206
node . properties . forEach ( ( prop ) => {
184
- // @ts -expect-error
185
- getIdentifiersUsage ( prop . value , identifiers )
207
+ if ( prop . type === 'ObjectProperty' )
208
+ getIdentifiersUsage ( prop . key , identifiers )
209
+ else if ( prop . type === 'SpreadElement' )
210
+ getIdentifiersUsage ( prop , identifiers )
186
211
} )
187
212
}
213
+ else if ( node . type === 'ArrayExpression' ) {
214
+ node . elements . forEach ( ( element ) => {
215
+ getIdentifiersUsage ( element , identifiers )
216
+ } )
217
+ }
218
+ else if ( node . type === 'SpreadElement' ) {
219
+ getIdentifiersUsage ( node . argument , identifiers )
220
+ }
188
221
// else {
189
222
// console.log(node)
190
223
// }
0 commit comments