86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs');
|
|
const linter = require('./linter');
|
|
const prompt = require('./prompt');
|
|
const os = require('os')
|
|
|
|
const it_root_questions = [
|
|
{ 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) },
|
|
{ question: 'Namespace', name: 'namespace' },
|
|
{ question: 'Base URL', name: 'base_url'}
|
|
];
|
|
|
|
function userTemplatePath(name) {
|
|
let templatePath = path.join(os.homedir(), '.api', 'templates', name)
|
|
if(fs.existsSync(templatePath)) {
|
|
return templatePath;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function defaultTemplatePath() {
|
|
return userTemplatePath('default.json') || path.join(__dirname, '..', 'templates', 'default.json')
|
|
}
|
|
|
|
function defaultOutputPath(name) {
|
|
return path.join(process.cwd(), `${name}.json`)
|
|
}
|
|
|
|
|
|
function doInteractiveGeneration(args) {
|
|
prompt.start([
|
|
...it_root_questions
|
|
], results => {
|
|
generateTemplate(results);
|
|
});
|
|
|
|
}
|
|
|
|
function doSilentGeneration(args) {
|
|
let config = {};
|
|
config.template = args.template || defaultTemplatePath();
|
|
config.name = args.name;
|
|
config.description = args.description;
|
|
config.output = args.output || defaultOutputPath(args.name)
|
|
config.namespace = args.namespace || undefined
|
|
config.base_url = args.base_url || undefined
|
|
config.info = userTemplatePath('info.json') || undefined
|
|
|
|
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
|
|
template.namespace = config.namespace
|
|
template.base_url = config.base_url
|
|
|
|
if(config.info) {
|
|
template.info = require(config.info)
|
|
}
|
|
|
|
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);
|
|
|
|
} |