wagtail/client/src/cli/component.js
Josh Barr 14f02a0b50 Tooling for modern front-end components: React JS, ES6, and BEM CSS
Thanks to @justinvdm for the help

Merges: #2275
2016-02-25 13:32:48 +00:00

83 lines
1.9 KiB
JavaScript

var path = require('path');
var fs = require('fs');
var Mustache = require('mustache');
var TEMPLATES = path.join(__dirname, '..', '..', 'template');
var files = [
{
name: 'index.js',
template: 'component.mst'
},
{
name: 'style.scss',
template: 'style.mst'
},
{
name: 'README.md',
template: 'README.mst'
}
];
// =============================================================================
// Helper methods
// =============================================================================
function slugify(text) {
return text.toString().split(/(?=[A-Z])/).join('-').toLowerCase().trim()
.replace(/\s+/g, '-') // Replace spaces with -
.replace(/&/g, '-and-') // Replace & with 'and'
.replace(/[^\w\-]+/g, '') // Remove all non-word chars
.replace(/\-\-+/g, '-'); // Replace multiple - with single -
}
function write(name, data) {
fs.writeFile(name, data, function(err) {
if (err) {
return console.log('[ error ] ' + err);
}
console.log('[ created ] ' + name);
});
}
// =============================================================================
// Write files!
// =============================================================================
function run(argv) {
var name = argv.name;
var slug = slugify(name);
var directory = path.join(argv.dir, slug);
if (!fs.existsSync(directory)) {
fs.mkdirSync(directory);
} else {
console.warn('[ error ] ' + directory + ' already exists');
return;
}
files.forEach(function(file) {
var template = fs.readFileSync(path.join(TEMPLATES, file.template), 'utf8');
var newPath = path.join(directory, file.name);
var context = {
name: name,
slug: slug
};
write(newPath, Mustache.render(template, context));
});
}
function build(cli) {
return cli
.option('dir', {
default: process.env.PWD
});
}
exports.handler = run;
exports.builder = build;