UNPKG

2.78 kBJavaScriptView Raw
1const { join, resolve } = require('path')
2const { ensureTemplateFile } = require('./utils')
3
4module.exports = async function (moduleOptions) {
5 const options = {
6 configPath: 'tailwind.config.js',
7 cssPath: join(this.options.dir.assets, 'css', 'tailwind.css'),
8 exposeConfig: false,
9 ...this.options.tailwindcss,
10 ...moduleOptions
11 }
12
13 const configPath = this.nuxt.resolver.resolveAlias(options.configPath)
14 const cssPath = this.nuxt.resolver.resolveAlias(options.cssPath)
15
16 /*
17 ** Generates if not exists:
18 ** - tailwind.config.js
19 ** - @/assets/css/tailwind.css
20 */
21 await ensureTemplateFile(this.options.srcDir, 'tailwind.config.js', configPath)
22 const tailwindCSSExists = await ensureTemplateFile(this.options.srcDir, 'tailwind.css', cssPath)
23
24 // Include CSS file in project css
25 if (tailwindCSSExists) {
26 this.options.css.unshift(cssPath)
27 }
28
29 // This hooks is called only for `nuxt dev` and `nuxt build` commands
30 this.nuxt.hook('build:before', () => {
31 // Fix issue with postCSS that needs process.env.NODE_ENV
32 /* istanbul ignore if */
33 if (!this.options.dev && !process.env.NODE_ENV) {
34 process.env.NODE_ENV = 'production'
35 }
36 /*
37 ** Set PostCSS config
38 */
39 const { postcss } = this.options.build
40
41 postcss.preset.stage = 1 // see https://tailwindcss.com/docs/using-with-preprocessors#future-css-features
42 postcss.plugins = postcss.plugins || {}
43
44 /* istanbul ignore if */
45 if (Array.isArray(postcss.plugins)) {
46 postcss.plugins.push(require('tailwindcss')(configPath))
47 } else if (typeof postcss.plugins === 'object') {
48 postcss.plugins.tailwindcss = postcss.plugins.tailwindcss || configPath
49 }
50
51 /*
52 ** Expose resolved tailwind config as an alias
53 ** https://tailwindcss.com/docs/configuration/#referencing-in-javascript
54 */
55 if (options.exposeConfig) {
56 // Resolve config
57 const tailwindConfig = require(configPath)
58 const resolveConfig = require('tailwindcss/resolveConfig')
59 const resolvedConfig = resolveConfig(tailwindConfig)
60
61 // Render as a json file in buildDir
62 this.addTemplate({
63 src: resolve(__dirname, 'templates/tailwind.config.json'),
64 fileName: 'tailwind.config.json',
65 options: { config: resolvedConfig }
66 })
67
68 // Alias to ~tailwind.config
69 this.options.alias['~tailwind.config'] =
70 resolve(this.options.buildDir, 'tailwind.config.json')
71
72 // Force chunk creation for long term caching
73 const { cacheGroups } = this.options.build.optimization.splitChunks
74 cacheGroups.tailwindConfig = {
75 test: /tailwind\.config/,
76 chunks: 'all',
77 priority: 10,
78 name: true
79 }
80 }
81 })
82}
83
84module.exports.meta = require('../package.json')