UNPKG

4.56 kBJavaScriptView Raw
1const { join, resolve, relative } = require('path')
2const { pathExists } = require('fs-extra')
3const defu = require('defu')
4const clearModule = require('clear-module')
5
6const logger = require('./logger')
7const defaultTailwindConfig = require('./files/tailwind.config.js')
8
9module.exports = async function (moduleOptions) {
10 const { nuxt } = this
11 const options = defu.arrayFn(moduleOptions, nuxt.options.tailwindcss, {
12 configPath: 'tailwind.config.js',
13 cssPath: join(nuxt.options.dir.assets, 'css', 'tailwind.css'),
14 exposeConfig: false,
15 config: defaultTailwindConfig(nuxt.options),
16 ui: nuxt.options.dev
17 })
18
19 const configPath = nuxt.resolver.resolveAlias(options.configPath)
20 const cssPath = nuxt.resolver.resolveAlias(options.cssPath)
21
22 // Include CSS file in project css
23 if (await pathExists(cssPath)) {
24 logger.info(`Using Tailwind CSS from ~/${relative(nuxt.options.srcDir, cssPath)}`)
25 nuxt.options.css.unshift(cssPath)
26 } else {
27 nuxt.options.css.unshift(resolve(__dirname, 'files', 'tailwind.css'))
28 }
29
30 // Get and extend the Tailwind config
31 let tailwindConfig = {}
32 if (await pathExists(configPath)) {
33 clearModule(configPath)
34 tailwindConfig = require(configPath)
35 logger.info(`Merging Tailwind config from ~/${relative(this.options.srcDir, configPath)}`)
36 }
37 // Merge with our default purgecss default
38 tailwindConfig = defu.arrayFn(tailwindConfig, options.config)
39
40 // Watch the Tailwind config file to restart the server
41 /* istanbul ignore if */
42 if (nuxt.options.dev) {
43 nuxt.options.watch.push(configPath)
44 }
45 // This hooks is called only for `nuxt dev` and `nuxt build` commands
46 nuxt.hook('build:before', async () => {
47 // Fix issue with postCSS that needs process.env.NODE_ENV
48 /* istanbul ignore if */
49 if (!nuxt.options.dev && !process.env.NODE_ENV) {
50 process.env.NODE_ENV = 'production'
51 }
52 /*
53 ** Set PostCSS config
54 */
55 const { postcss } = nuxt.options.build
56
57 postcss.preset.stage = 1 // see https://tailwindcss.com/docs/using-with-preprocessors#future-css-features
58 postcss.plugins = postcss.plugins || {}
59
60 // Let modules extend the tailwind config
61 await nuxt.callHook('tailwindcss:config', tailwindConfig)
62
63 /* istanbul ignore if */
64 if (Array.isArray(postcss.plugins)) {
65 logger.error('Array syntax for postcss plugins is not supported with v3. Please use the object syntax: https://nuxtjs.org/guides/configuration-glossary/configuration-build#postcss')
66 } else if (typeof postcss.plugins === 'object') {
67 postcss.plugins.tailwindcss = tailwindConfig
68 }
69
70 /*
71 ** Add /_tailwind UI
72 */
73 /* istanbul ignore if */
74 if (nuxt.options.dev) {
75 // add layout
76 const layout = resolve(__dirname, 'ui', 'layouts', 'tw.vue')
77 this.addLayout(layout, 'tw')
78 // add page
79 const page = resolve(__dirname, 'ui', 'pages', 'index.vue')
80
81 // register page
82 this.extendRoutes((routes) => {
83 routes.unshift({
84 name: '_tailwind',
85 path: '/_tailwind',
86 component: page
87 })
88 })
89 const url = nuxt.server.listeners && nuxt.server.listeners[0] ? nuxt.server.listeners[0].url : '/'
90 logger.info(`Tailwind Colors available on ${url}_tailwind`)
91 }
92 /*
93 ** Expose resolved tailwind config as an alias
94 ** https://tailwindcss.com/docs/configuration/#referencing-in-javascript
95 */
96 if (nuxt.options.dev || options.exposeConfig) {
97 // Resolve config
98 const resolveConfig = require('tailwindcss/resolveConfig')
99 const resolvedConfig = resolveConfig(tailwindConfig)
100
101 // Render as a json file in buildDir
102 /**
103 * nuxt ModuleContainer bind 'this' to addTemplate until v2.13.0,use this.addTemplate to compat with low version
104 * issue: https://github.com/nuxt-community/tailwindcss-module/issues/224
105 */
106 this.addTemplate({
107 src: resolve(__dirname, 'templates/tailwind.config.json'),
108 fileName: 'tailwind.config.json',
109 options: { config: resolvedConfig }
110 })
111
112 // Alias to ~tailwind.config
113 nuxt.options.alias['~tailwind.config'] =
114 resolve(nuxt.options.buildDir, 'tailwind.config.json')
115
116 // Force chunk creation for long term caching
117 const { cacheGroups } = nuxt.options.build.optimization.splitChunks
118 cacheGroups.tailwindConfig = {
119 test: /tailwind\.config/,
120 chunks: 'all',
121 priority: 10,
122 name: true
123 }
124 }
125 })
126}
127
128module.exports.meta = require('../package.json')