Nuxt/lib/builder/webpack/postcss.js

92 lines
2.4 KiB
JavaScript
Raw Normal View History

2017-12-28 16:05:34 +00:00
const { existsSync } = require('fs')
2018-01-17 08:46:58 +00:00
const { resolve, join } = require('path')
2017-12-29 08:56:32 +00:00
const { cloneDeep } = require('lodash')
2017-12-28 16:05:34 +00:00
const { isPureObject } = require('../../common/utils')
2018-01-17 09:54:48 +00:00
const createResolver = require('postcss-import-resolver')
2017-12-28 16:05:34 +00:00
module.exports = function postcssConfig() {
let config = cloneDeep(this.options.build.postcss)
2017-12-29 08:43:24 +00:00
/* istanbul ignore if */
2017-12-28 16:05:34 +00:00
if (!config) {
return false
}
// Search for postCSS config file and use it if exists
// https://github.com/michael-ciniawsky/postcss-load-config
for (let dir of [this.options.srcDir, this.options.rootDir]) {
2018-01-13 05:22:11 +00:00
for (let file of [
'postcss.config.js',
'.postcssrc.js',
'.postcssrc',
'.postcssrc.json',
'.postcssrc.yaml'
]) {
2017-12-28 16:05:34 +00:00
if (existsSync(resolve(dir, file))) {
const postcssConfigPath = resolve(dir, file)
return {
sourceMap: this.options.build.cssSourceMap,
config: {
path: postcssConfigPath
}
}
}
}
}
// Normalize
if (Array.isArray(config)) {
config = { plugins: config }
}
// Apply default plugins
if (isPureObject(config)) {
2018-01-13 05:22:11 +00:00
config = Object.assign(
{
useConfigFile: false,
sourceMap: this.options.build.cssSourceMap,
plugins: {
// https://github.com/postcss/postcss-import
'postcss-import': {
2018-01-17 08:46:58 +00:00
resolve: createResolver({
alias: {
'~': join(this.options.srcDir),
'~~': join(this.options.rootDir),
'@': join(this.options.srcDir),
'@@': join(this.options.rootDir)
2018-01-17 08:46:58 +00:00
},
modules: [
this.options.srcDir,
this.options.rootDir,
...this.options.modulesDir
]
})
2018-01-13 05:22:11 +00:00
},
2017-12-28 16:05:34 +00:00
2018-01-13 05:22:11 +00:00
// https://github.com/postcss/postcss-url
'postcss-url': {},
2017-12-28 16:05:34 +00:00
2018-01-13 05:22:11 +00:00
// http://cssnext.io/postcss
'postcss-cssnext': {}
}
},
config
)
2017-12-28 16:05:34 +00:00
}
// Map postcss plugins into instances on object mode once
if (isPureObject(config) && isPureObject(config.plugins)) {
config.plugins = Object.keys(config.plugins)
.map(p => {
const plugin = require(this.nuxt.resolvePath(p))
const opts = config.plugins[p]
if (opts === false) return // Disabled
const instance = plugin(opts)
return instance
2018-01-13 05:22:11 +00:00
})
.filter(e => e)
2017-12-28 16:05:34 +00:00
}
return config
}