api-cli/bin/cmd.generate.js

61 lines
2.0 KiB
JavaScript
Raw Normal View History

2021-07-07 12:58:24 +02:00
const path = require('path');
const fs = require('fs');
const linter = require('./linter');
2021-07-07 13:51:44 +02:00
const prompt = require('./prompt');
function defaultTemplatePath() {
return path.join(__dirname, '..', 'templates', 'default.json');
}
function defaultOutputPath(name) {
return path.join(process.cwd(), `${name}.json`)
}
2021-07-07 12:58:24 +02:00
function doInteractiveGeneration(args) {
2021-07-07 13:51:44 +02:00
prompt.start([
{ question: 'Service name', name: 'name', validator: linter.regex.NAME_REGEX, error: "Name must only contain lowercase letters, numbers or '-_'!" },
{ question: 'Service description', name: 'description', validator: linter.regex.DESCRIPTION_REGEX, error: "Description must be a descriptive sentence starting with a uppercase letter and ending with a '.'!" },
{ question: 'Template', name: 'template', default: defaultTemplatePath},
{ question: 'Output', name: 'output', default: results => defaultOutputPath(results.name) }
], results => {
generateTemplate(results);
});
2021-07-07 12:58:24 +02:00
}
function doSilentGeneration(args) {
let config = {};
2021-07-07 13:51:44 +02:00
config.template = args.template || defaultTemplatePath();
2021-07-07 12:58:24 +02:00
config.name = args.name;
config.description = args.description;
2021-07-07 13:51:44 +02:00
config.output = args.output || defaultOutputPath(args.name)
2021-07-07 12:58:24 +02:00
generateTemplate(config);
}
function generateTemplate(config) {
console.log(`Generate Service Spec for service '${config.name}' to ${config.output}`)
let template = require(config.template);
template.name = config.name
template.description = config.description
let messages = linter.lint(template);
if(messages.length) {
console.error("Failed to generate service spec:");
messages.forEach(message => console.log(`\t${message}`));
process.exit(-1)
}
let output = JSON.stringify(template, null, '\t');
fs.writeFileSync(config.output, output);
}
module.exports = function(args) {
if(args.silent) {
return doSilentGeneration(args);
}
return doInteractiveGeneration(args);
}