@@ -4,7 +4,7 @@ import { slash, toArray } from '@antfu/utils'
44import { getPackageInfoSync , isPackageExists } from 'local-pkg'
55import { detectTypeImports } from './type-imports/detect'
66
7- export const defaultOptions :Omit < Required < Options > , 'include' | 'exclude' | 'excludeNames' | 'transformer' | 'globs' | 'directives' | 'types' | 'version' > = {
7+ export const defaultOptions :Omit < Required < Options > , 'include' | 'exclude' | 'excludeNames' | 'transformer' | 'globs' | 'globsExclude' | ' directives'| 'types' | 'version' > = {
88dirs :'src/components' ,
99extensions :'vue' ,
1010deep :true ,
@@ -17,7 +17,6 @@ export const defaultOptions: Omit<Required<Options>, 'include' | 'exclude' | 'ex
1717transformerUserResolveFunctions :true ,
1818
1919resolvers :[ ] ,
20- globsExclude :[ ] ,
2120
2221importPathTransform :v => v ,
2322
@@ -30,7 +29,7 @@ function normalizeResolvers(resolvers: (ComponentResolver | ComponentResolver[])
3029
3130function resolveGlobsExclude ( root :string , glob :string ) {
3231const excludeReg = / ^ ! /
33- return `${ excludeReg . test ( glob ) ?'!' :'' } ${ resolve ( root , glob . replace ( excludeReg , '' ) ) } `
32+ return slash ( `${ excludeReg . test ( glob ) ?'!' :'' } ${ resolve ( root , glob . replace ( excludeReg , '' ) ) } ` )
3433}
3534
3635export function resolveOptions ( options :Options , root :string ) :ResolvedOptions {
@@ -39,7 +38,8 @@ export function resolveOptions(options: Options, root: string): ResolvedOptions
3938resolved . extensions = toArray ( resolved . extensions )
4039
4140if ( resolved . globs ) {
42- resolved . globs = toArray ( resolved . globs ) . map ( ( glob :string ) => slash ( resolveGlobsExclude ( root , glob ) ) )
41+ resolved . globs = toArray ( resolved . globs )
42+ . map ( glob => resolveGlobsExclude ( root , glob ) )
4343resolved . resolvedDirs = [ ]
4444}
4545else {
@@ -48,17 +48,38 @@ export function resolveOptions(options: Options, root: string): ResolvedOptions
4848 :`{${ resolved . extensions . join ( ',' ) } }`
4949
5050resolved . dirs = toArray ( resolved . dirs )
51- resolved . resolvedDirs = resolved . dirs . map ( i => slash ( resolveGlobsExclude ( root , i ) ) )
5251
53- resolved . globs = resolved . resolvedDirs . map ( i => resolved . deep
54- ?slash ( join ( i , `**/*.${ extsGlob } ` ) )
55- :slash ( join ( i , `*.${ extsGlob } ` ) ) ,
56- )
52+ const globs = resolved . dirs . map ( i => resolveGlobsExclude ( root , i ) )
53+
54+ resolved . resolvedDirs = globs . filter ( i => ! i . startsWith ( '!' ) )
55+ resolved . globs = globs . map ( ( i ) => {
56+ let prefix = ''
57+ if ( i . startsWith ( '!' ) ) {
58+ prefix = '!'
59+ i = i . slice ( 1 )
60+ }
61+ return resolved . deep
62+ ?prefix + slash ( join ( i , `**/*.${ extsGlob } ` ) )
63+ :prefix + slash ( join ( i , `*.${ extsGlob } ` ) )
64+ } )
5765
5866if ( ! resolved . extensions . length )
5967throw new Error ( '[unplugin-vue-components] `extensions` option is required to search for components' )
6068}
6169
70+ if ( ! resolved . globsExclude )
71+ resolved . globsExclude = [ `**/node_modules/**` ]
72+ resolved . globsExclude = toArray ( resolved . globsExclude || [ ] )
73+ . map ( i => resolveGlobsExclude ( root , i ) )
74+
75+ // Move negated globs to globsExclude
76+ resolved . globs = resolved . globs . filter ( ( i ) => {
77+ if ( ! i . startsWith ( '!' ) )
78+ return true
79+ resolved . globsExclude . push ( i . slice ( 1 ) )
80+ return false
81+ } )
82+
6283resolved . dts = ! resolved . dts
6384 ?false
6485 :resolve (