-
Notifications
You must be signed in to change notification settings - Fork 712
/
Copy pathmodule.ts
114 lines (95 loc) · 3.48 KB
/
module.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { defu } from 'defu'
import { createResolver, defineNuxtModule, addComponentsDir, addImportsDir, addVitePlugin, addPlugin, installModule, hasNuxtModule } from '@nuxt/kit'
import { addTemplates } from './templates'
import { defaultOptions, getDefaultUiConfig, resolveColors } from './defaults'
import { name, version } from '../package.json'
export type * from './runtime/types'
export interface ModuleOptions {
/**
* Prefix for components
* @defaultValue `U`
* @link https://ui.nuxt.com/getting-started/installation/nuxt#prefix
*/
prefix?: string
/**
* Enable or disable `@nuxt/fonts` module
* @defaultValue `true`
* @link https://ui.nuxt.com/getting-started/installation/nuxt#fonts
*/
fonts?: boolean
/**
* Enable or disable `@nuxtjs/color-mode` module
* @defaultValue `true`
* @link https://ui.nuxt.com/getting-started/installation/nuxt#colormode
*/
colorMode?: boolean
/**
* Customize how the theme is generated
* @link https://ui.nuxt.com/getting-started/theme
*/
theme?: {
/**
* Define the color aliases available for components
* @defaultValue `['primary', 'secondary', 'success', 'info', 'warning', 'error']`
* @link https://ui.nuxt.com/getting-started/installation/nuxt#themecolors
*/
colors?: string[]
/**
* Enable or disable transitions on components
* @defaultValue `true`
* @link https://ui.nuxt.com/getting-started/installation/nuxt#themetransitions
*/
transitions?: boolean
}
}
export default defineNuxtModule<ModuleOptions>({
meta: {
name,
version,
docs: 'https://ui.nuxt.com/getting-started/installation/nuxt',
configKey: 'ui',
compatibility: {
nuxt: '>=3.16.0'
}
},
defaults: defaultOptions,
async setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url)
options.theme = options.theme || {}
options.theme.colors = resolveColors(options.theme.colors)
nuxt.options.ui = options
nuxt.options.alias['#ui'] = resolve('./runtime')
nuxt.options.appConfig.ui = defu(nuxt.options.appConfig.ui || {}, getDefaultUiConfig(options.theme.colors))
// Isolate root node from portaled components
nuxt.options.app.rootAttrs = nuxt.options.app.rootAttrs || {}
nuxt.options.app.rootAttrs.class = [nuxt.options.app.rootAttrs.class, 'isolate'].filter(Boolean).join(' ')
if (nuxt.options.builder === '@nuxt/vite-builder') {
const plugin = await import('@tailwindcss/vite').then(r => r.default)
addVitePlugin(plugin())
} else {
nuxt.options.postcss.plugins['@tailwindcss/postcss'] = {}
}
async function registerModule(name: string, key: string, options: Record<string, any>) {
if (!hasNuxtModule(name)) {
await installModule(name, options)
} else {
(nuxt.options as any)[key] = defu((nuxt.options as any)[key], options)
}
}
await registerModule('@nuxt/icon', 'icon', { cssLayer: 'components' })
if (options.fonts) {
await registerModule('@nuxt/fonts', 'fonts', { experimental: { processCSSVariables: true } })
}
if (options.colorMode) {
await registerModule('@nuxtjs/color-mode', 'colorMode', { classSuffix: '', disableTransition: true })
}
addPlugin({ src: resolve('./runtime/plugins/colors') })
addComponentsDir({
path: resolve('./runtime/components'),
prefix: options.prefix,
pathPrefix: false
})
addImportsDir(resolve('./runtime/composables'))
addTemplates(options, nuxt, resolve)
}
})