budibase/packages/cli/src/commands/new/newHandler.js

88 lines
2.5 KiB
JavaScript

const { xPlatHomeDir } = require("../../common")
const dotenv = require("dotenv")
const { copy, readJSON, writeJSON, exists } = require("fs-extra")
const { resolve, join } = require("path")
const chalk = require("chalk")
const { exec } = require("child_process")
module.exports = opts => {
run(opts)
}
const run = async opts => {
try {
setup(opts)
await createAppInstance(opts)
await createEmptyAppPackage(opts)
exec(`cd ${join(opts.dir, opts.applicationId)} && npm install`)
console.log(chalk.green(`Budibase app ${opts.name} created!`))
} catch (error) {
console.error(chalk.red("Error creating new app", error))
}
}
const setup = opts => {
opts.dir = xPlatHomeDir(opts.dir)
process.env.BUDIBASE_DIR = opts.dir
const bbconfig = dotenv.config({ path: resolve(opts.dir, ".env") })
console.log(JSON.stringify(bbconfig))
}
const createAppInstance = async opts => {
const createAppCtx = {
params: { clientId: process.env.CLIENT_ID },
request: {
body: { name: opts.name },
},
body: {},
}
// this cannot be a top level require as it will cause
// the environment module to be loaded prematurely
const appController = require("@budibase/server/src/api/controllers/application")
await appController.create(createAppCtx)
opts.applicationId = createAppCtx.body._id
console.log(chalk.green(`Application Created: ${createAppCtx.body._id}`))
// this cannot be a top level require as it will cause
// the environment module to be loaded prematurely
const instanceController = require("@budibase/server/src/api/controllers/instance")
const createInstCtx = {
params: {
clientId: process.env.CLIENT_ID,
},
user: {
appId: opts.applicationId,
},
request: {
body: { name: `dev-${process.env.CLIENT_ID}` },
},
}
await instanceController.create(createInstCtx)
console.log(chalk.green(`Default Instance Created`))
console.log(JSON.stringify(createInstCtx.body))
}
const createEmptyAppPackage = async opts => {
const templateFolder = resolve(__dirname, "appDirectoryTemplate")
const appsFolder = opts.dir
const newAppFolder = resolve(appsFolder, opts.applicationId)
if (await exists(newAppFolder)) {
console.log(chalk.red(`App ${opts.name} already exists.`))
return
}
await copy(templateFolder, newAppFolder)
const packageJsonPath = join(appsFolder, opts.applicationId, "package.json")
const packageJson = await readJSON(packageJsonPath)
packageJson.name = opts.name
await writeJSON(packageJsonPath, packageJson)
}