88 lines
2.5 KiB
JavaScript
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)
|
|
}
|