/
index.ts
106 lines (94 loc) · 2.8 KB
/
index.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
import { dirname, resolve } from 'path'
import { fileURLToPath } from 'url'
import { addComponentsDir, addPluginTemplate, defineNuxtModule, extendWebpackConfig, isNuxt2, isNuxt3 } from '@nuxt/kit'
import WebpackPlugin from '@unocss/webpack'
import VitePlugin from '@unocss/vite'
import type { NuxtPlugin } from '@nuxt/schema'
import { loadConfig } from '@unocss/config'
import type { UserConfig } from '@unocss/core'
import { resolveOptions } from './options'
import type { UnocssNuxtOptions } from './types'
export { UnocssNuxtOptions }
const dir = dirname(fileURLToPath(import.meta.url))
export default defineNuxtModule<UnocssNuxtOptions>({
meta: {
name: 'unocss',
configKey: 'unocss',
},
defaults: {
autoImport: true,
preflight: false,
components: true,
// presets
uno: true,
attributify: false,
webFonts: false,
icons: false,
wind: false,
},
async setup(options, nuxt) {
// preset shortcuts
resolveOptions(options)
if (options.autoImport) {
addPluginTemplate({
filename: 'unocss.mjs',
getContents: () => {
const lines = [
'import \'uno.css\'',
isNuxt2()
? 'export default () => {}'
: 'export default defineNuxtPlugin(() => {})',
]
if (options.preflight)
lines.unshift('import \'@unocss/reset/tailwind.css\'')
return lines.join('\n')
},
})
}
if (options.components) {
addComponentsDir({
path: resolve(dir, '../runtime'),
watch: false,
})
}
const { config: unoConfig } = await loadConfig<UserConfig>(process.cwd(), {}, [], options)
if (
isNuxt3()
&& nuxt.options.postcss.plugins.cssnano
&& unoConfig.transformers?.some(t => t.name === 'css-directive' && t.enforce !== 'pre')
) {
const preset = nuxt.options.postcss.plugins.cssnano.preset
nuxt.options.postcss.plugins.cssnano = {
preset: [preset?.[0] || 'default', Object.assign(
preset?.[1] || {}, { mergeRules: false },
)],
}
}
nuxt.hook('vite:extend', ({ config }) => {
config.plugins = config.plugins || []
config.plugins.unshift(...VitePlugin({}, unoConfig))
})
// Nuxt 2
if (isNuxt2()) {
nuxt.hook('app:resolve', (config) => {
const plugin: NuxtPlugin = { src: 'unocss.mjs', mode: 'client' }
if (config.plugins)
config.plugins.push(plugin)
else
config.plugins = [plugin]
})
}
extendWebpackConfig((config) => {
config.plugins = config.plugins || []
config.plugins.unshift(WebpackPlugin({}, unoConfig))
})
},
})
declare module '@nuxt/schema' {
interface NuxtConfig {
unocss?: UnocssNuxtOptions
}
interface NuxtOptions {
unocss?: UnocssNuxtOptions
}
}