mirror of
https://github.com/wassname/generator-react-webpack.git
synced 2026-09-11 12:10:36 +08:00
Merge pull request #168 from stylesuxx/feature/postcss
Add basic support for PostCSS (provided by @stylesuxx)
This commit is contained in:
@@ -46,11 +46,15 @@ module.exports = generator.Base.extend({
|
||||
// Set needed global vars for yo
|
||||
this.appName = props.appName;
|
||||
this.style = props.style;
|
||||
this.postcss = props.postcss
|
||||
|
||||
// Set needed keys into config
|
||||
this.config.set('appName', this.appName);
|
||||
this.config.set('appPath', this.appPath);
|
||||
this.config.set('style', this.style);
|
||||
this.config.set('postcss', this.postcss);
|
||||
|
||||
this.config.save();
|
||||
|
||||
done();
|
||||
}.bind(this));
|
||||
@@ -83,6 +87,15 @@ module.exports = generator.Base.extend({
|
||||
}
|
||||
}
|
||||
|
||||
// Add postcss module if enabled
|
||||
let postcssConfig = utils.config.getChoiceByKey('postcss', 'postcss');
|
||||
if(this.postcss && postcssConfig && postcssConfig.packages) {
|
||||
|
||||
for(let dependency of postcssConfig.packages) {
|
||||
packageSettings.dependencies[dependency.name] = dependency.version;
|
||||
}
|
||||
}
|
||||
|
||||
this.fs.writeJSON(this.destinationPath('package.json'), packageSettings);
|
||||
},
|
||||
|
||||
@@ -123,6 +136,11 @@ module.exports = generator.Base.extend({
|
||||
},
|
||||
|
||||
install: function() {
|
||||
if(this.postcss) {
|
||||
let postcss = require('./postcss');
|
||||
postcss.write(path.join(this.destinationRoot(), 'cfg/base.js'));
|
||||
}
|
||||
|
||||
if(!this.options['skip-install']) {
|
||||
this.installDependencies({ bower: false });
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
'use strict';
|
||||
let fs = require('fs');
|
||||
let esprima = require('esprima');
|
||||
let walk = require('esprima-walk');
|
||||
let escodegen = require('escodegen');
|
||||
|
||||
module.exports = {
|
||||
write: function(path) {
|
||||
let baseConfigPath = path;
|
||||
let cssDialects = ['/\\.css$/', '/\\.sass/', '/\\.scss/', '/\\.less/', '/\\.styl/'];
|
||||
|
||||
let postcss = 'var postcss = { postcss: function() { return []; } }';
|
||||
postcss = esprima.parse(postcss);
|
||||
postcss = postcss.body[0].declarations[0].init.properties[0];
|
||||
|
||||
let data = fs.readFileSync(baseConfigPath, 'utf8');
|
||||
let parsed = esprima.parse(data);
|
||||
|
||||
walk.walkAddParent(parsed, function(node) {
|
||||
if(node.type === 'AssignmentExpression' && node.left.object.name === 'module') {
|
||||
node.right.properties.push(postcss);
|
||||
}
|
||||
|
||||
if(node.type === 'Property' && node.key.name === 'test') {
|
||||
if(cssDialects.indexOf(node.value.raw) > -1) {
|
||||
let current = node.parent.properties[1].value.value;
|
||||
let position = current.split('!', 2).join('!').length;
|
||||
current = [current.slice(0, position), '!postcss-loader', current.slice(position)].join('');
|
||||
|
||||
node.parent.properties[1].value.value = current;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
let options = { format: { indent: { style: ' ' } } };
|
||||
let code = escodegen.generate(parsed, options);
|
||||
fs.writeFileSync(baseConfigPath, code, 'utf8');
|
||||
}
|
||||
}
|
||||
@@ -14,5 +14,11 @@ module.exports = [
|
||||
message: 'Which styles language you want to use?',
|
||||
choices: utils.config.getChoices('style'),
|
||||
default: utils.config.getDefaultChoice('style')
|
||||
},
|
||||
{
|
||||
type: 'confirm',
|
||||
name: 'postcss',
|
||||
message: 'Enable postcss?',
|
||||
default: false
|
||||
}
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user