fin
Version:
Developer CLI for Fin. Fin is the easiest way to launch your own SaaS.
68 lines (50 loc) • 1.97 kB
JavaScript
const Ajv = require('ajv')
const fs = require('fs-extra')
const isDirectory = require('is-directory')
const path = require('path')
const { validators } = require('fin-utils')
const configSchema = require('./schemas/config.schema')
const ajv = new Ajv({ useDefaults: true })
const validateConfig = ajv.compile(configSchema)
module.exports = (program) => {
const base = path.resolve(program.config || '')
if (!fs.pathExistsSync(base)) {
throw new Error(`Unable to find config file "${program.config}"`)
}
const configFilePath = isDirectory.sync(base) ? path.join(base, 'fin.json') : base
if (!fs.pathExistsSync(configFilePath)) {
throw new Error(`Unable to find config file "${configFilePath}"`)
}
console.log(`parsing config ${path.relative(process.cwd(), configFilePath)}`)
const config = fs.readJsonSync(configFilePath)
validateConfig(config)
if (validateConfig.errors) {
throw new Error(`Invalid config: ${ajv.errorsText(validateConfig.errors)}`)
}
config.root = path.dirname(configFilePath)
// ensure the config has a valid project name
if (program.project) {
config.name = program.project
} else if (!config.name) {
config.name = path.basename(config.root)
}
if (!config.name) {
throw new Error(`Missing config name`)
}
if (!validators.projectName(config.name)) {
throw new Error(`Invalid config name [${config.name}] (regex ${validators.projectNameRe})`)
}
if (config.version !== 1) {
throw new Error(`Invalid config version "${config.version}"`)
}
if (!config.services || !config.services.length) {
throw new Error(`Invalid config, must contain at least one service`)
}
for (const service of config.services) {
if (service.name && !validators.service(service.name)) {
throw new Error(`Invalid config service "name" [${service.name}] (must be a valid JavaScript identifier regex ${validators.serviceRe})`)
}
}
return config
}