11import { Parser as HTMLParser } from 'htmlparser2'
22import { parse } from '@babel/parser'
3- import { PrivateName , Expression , Statement } from '@babel/types'
3+ import { PrivateName , Expression , Statement , SpreadElement } from '@babel/types'
44import { camelize , capitalize , isHTMLTag , isSVGTag , isVoidTag } from '@vue/shared'
55import { ParseResult , TagMeta } from './types'
66
@@ -34,6 +34,9 @@ export function parseVueSFC(code: string, id?: string): ParseResult {
3434
3535 const parser = new HTMLParser ( {
3636 onopentag ( name , attributes ) {
37+ if ( ! name )
38+ return
39+
3740 if ( name === 'template' )
3841 templateLevel += 1
3942
@@ -131,8 +134,25 @@ export function getIdentifiersDeclaration(nodes: Statement[], identifiers = new
131134 }
132135 else if ( node . type === 'VariableDeclaration' ) {
133136 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+ }
136156 }
137157 }
138158 else if ( node . type === 'FunctionDeclaration' ) {
@@ -146,7 +166,7 @@ export function getIdentifiersDeclaration(nodes: Statement[], identifiers = new
146166 return identifiers
147167}
148168
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 > ( ) ) {
150170 if ( ! node )
151171 return identifiers
152172
@@ -171,6 +191,9 @@ export function getIdentifiersUsage(node?: Expression | PrivateName | Statement,
171191 getIdentifiersUsage ( node . left , identifiers )
172192 getIdentifiersUsage ( node . right , identifiers )
173193 }
194+ else if ( node . type === 'UnaryExpression' ) {
195+ getIdentifiersUsage ( node . argument , identifiers )
196+ }
174197 else if ( node . type === 'ForOfStatement' || node . type === 'ForInStatement' ) {
175198 getIdentifiersUsage ( node . right , identifiers )
176199 }
@@ -181,10 +204,20 @@ export function getIdentifiersUsage(node?: Expression | PrivateName | Statement,
181204 }
182205 else if ( node . type === 'ObjectExpression' ) {
183206 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 )
186211 } )
187212 }
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+ }
188221 // else {
189222 // console.log(node)
190223 // }
0 commit comments