skyrocket-cli
Version:
Command line interface for rapid Skyrocket projects development.
91 lines (83 loc) • 2.57 kB
JavaScript
const Metalsmith = require("metalsmith");
const async = require("async");
const render = require("consolidate").handlebars.render;
const exec = require("child_process").exec;
const ask = require("./ask");
const utils = require("./utils");
module.exports = function generate(prompts, path) {
const metalsmith = new Metalsmith(path);
metalsmith
.metadata({
version: "0.0.1",
curFolder: path
})
.use(ask(prompts))
.clean(false)
.source(".")
.destination(path)
.use(renderTemplateFiles())
.build((err, files) => {
const data = metalsmith.metadata();
// if (err) {
// console.log(err)
// } else if (data.cli_installPackage) {
// const script = data.cli_installPackage === 'npm' ? 'npm install && npm run start' : 'yarn && yarn start'
// exec(script, (error, stdout, stderr) => {
// console.log(`stdout: ${stdout}`);
// console.log(`stderr: ${stderr}`);
// if (error !== null) {
// console.log(`exec error: ${error}`);
// }
// utils.success(data.cli_projectName + 'initialization finished!')
// })
// } else {
// utils.success(data.cli_projectName + 'initialization finished!')
// }
if (err) {
console.log(err);
} else {
utils.success(data.cli_projectName + "initialization finished!");
}
// console.log(data)
});
};
/**
* Template in place plugin.
*
* @param {Object} files
* @param {Metalsmith} metalsmith
* @param {Function} done
*/
const renderTemplateFiles = () => {
return (files, metalsmith, done) => {
const keys = Object.keys(files);
const metalsmithMetadata = metalsmith.metadata();
async.each(
keys,
(file, next) => {
// do not attempt to render files that has unrecognized text
if (
/^(.(.*\.otf$|.*\.woff$|.*\.woff2$|.*\.jpg$|.*\.svg$|.*\.png$|.*plugin))*$|(^.*\/plugins\/.*$)|addImage\.twig/g.test(
file
)
) {
return next();
}
const str = files[file].contents.toString();
// do not attempt to render files that do not have mustaches
if (!/{{([^{}]+)}}/g.test(str)) {
return next();
}
render(str, metalsmithMetadata, (err, res) => {
if (err) {
err.message = `[${file}] ${err.message}`;
return next(err);
}
files[file].contents = Buffer.from(res);
next();
});
},
done
);
};
};