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); }