-
-
Notifications
You must be signed in to change notification settings - Fork 367
/
Copy pathoptions.ts
89 lines (73 loc) · 2.97 KB
/
options.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { join, resolve } from 'path'
import { slash, toArray } from '@antfu/utils'
import { getPackageInfoSync, isPackageExists } from 'local-pkg'
import type { ComponentResolver, ComponentResolverObject, Options, ResolvedOptions } from '../types'
import { detectTypeImports } from './type-imports/detect'
export const defaultOptions: Omit<Required<Options>, 'include' | 'exclude' | 'transformer' | 'globs' | 'directives' | 'types' | 'version'> = {
dirs: 'src/components',
extensions: 'vue',
deep: true,
dts: isPackageExists('typescript'),
directoryAsNamespace: false,
collapseSamePrefixes: false,
globalNamespaces: [],
resolvers: [],
importPathTransform: v => v,
allowOverrides: false,
}
function normalizeResolvers(resolvers: (ComponentResolver | ComponentResolver[])[]): ComponentResolverObject[] {
return toArray(resolvers).flat().map(r => typeof r === 'function' ? { resolve: r, type: 'component' } : r)
}
export function resolveOptions(options: Options, root: string): ResolvedOptions {
const resolved = Object.assign({}, defaultOptions, options) as ResolvedOptions
resolved.resolvers = normalizeResolvers(resolved.resolvers)
resolved.extensions = toArray(resolved.extensions)
if (resolved.globs) {
resolved.globs = toArray(resolved.globs).map((glob: string) => slash(resolve(root, glob)))
resolved.resolvedDirs = []
}
else {
const extsGlob = resolved.extensions.length === 1
? resolved.extensions
: `{${resolved.extensions.join(',')}}`
resolved.dirs = toArray(resolved.dirs)
resolved.resolvedDirs = resolved.dirs.map(i => slash(resolve(root, i)))
resolved.globs = resolved.resolvedDirs.map(i => resolved.deep
? slash(join(i, `**/*.${extsGlob}`))
: slash(join(i, `*.${extsGlob}`)),
)
if (!resolved.extensions.length)
throw new Error('[unplugin-vue-components] `extensions` option is required to search for components')
}
resolved.dts = !resolved.dts
? false
: resolve(
root,
typeof resolved.dts === 'string'
? resolved.dts
: 'components.d.ts',
)
if (!resolved.types && resolved.dts)
resolved.types = detectTypeImports()
resolved.types = resolved.types || []
resolved.root = root
resolved.version = resolved.version ?? getVueVersion(root)
if (resolved.version < 2 || resolved.version >= 4)
throw new Error(`[unplugin-vue-components] unsupported version: ${resolved.version}`)
resolved.transformer = options.transformer || `vue${Math.trunc(resolved.version) as 2 | 3}`
resolved.directives = (typeof options.directives === 'boolean')
? options.directives
: !resolved.resolvers.some(i => i.type === 'directive')
? false
: resolved.version >= 3
return resolved
}
function getVueVersion(root: string): 2 | 2.7 | 3 {
const raw = getPackageInfoSync('vue', { paths: [root] })?.version || '3'
const version = +(raw.split('.').slice(0, 2).join('.'))
if (version === 2.7)
return 2.7
else if (version < 2.7)
return 2
return 3
}