diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 0ab10bea31..fb35285297 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -25,6 +25,7 @@ "@techpass/passport-openidconnect": "0.3.2", "aws-sdk": "2.1030.0", "bcrypt": "5.0.1", + "bcryptjs": "2.4.3", "dotenv": "16.0.1", "emitter-listener": "1.1.2", "ioredis": "4.28.0", diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index 04d09d2eb7..b979635fcc 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -19,6 +19,7 @@ if (!LOADED && isDev() && !isTest()) { const env = { isTest, isDev, + JS_BCRYPT: process.env.JS_BCRYPT, JWT_SECRET: process.env.JWT_SECRET, COUCH_DB_URL: process.env.COUCH_DB_URL || "http://localhost:4005", COUCH_DB_USERNAME: process.env.COUCH_DB_USER, diff --git a/packages/backend-core/src/hashing.js b/packages/backend-core/src/hashing.js index 45abe2f9bd..7524e66043 100644 --- a/packages/backend-core/src/hashing.js +++ b/packages/backend-core/src/hashing.js @@ -1,5 +1,5 @@ -const bcrypt = require("bcrypt") const env = require("./environment") +const bcrypt = env.JS_BCRYPT ? require("bcryptjs") : require("bcrypt") const { v4 } = require("uuid") const SALT_ROUNDS = env.SALT_ROUNDS || 10 diff --git a/packages/cli/src/environment.js b/packages/cli/src/environment.js index a42eceb07e..c8c8fe87e9 100644 --- a/packages/cli/src/environment.js +++ b/packages/cli/src/environment.js @@ -1 +1,2 @@ process.env.NO_JS = "1" +process.env.JS_BCRYPT = "1" diff --git a/packages/cli/src/plugins/index.js b/packages/cli/src/plugins/index.js index 714187df56..d184c6e70a 100644 --- a/packages/cli/src/plugins/index.js +++ b/packages/cli/src/plugins/index.js @@ -7,7 +7,7 @@ const { PLUGIN_TYPE_ARR } = require("@budibase/types") const { validate } = require("@budibase/backend-core/plugins") const { runPkgCommand } = require("../exec") const { join } = require("path") -const { success, error, info } = require("../utils") +const { success, error, info, moveDirectory } = require("../utils") function checkInPlugin() { if (!fs.existsSync("package.json")) { @@ -22,6 +22,24 @@ function checkInPlugin() { } } +async function askAboutTopLevel(name) { + const files = fs.readdirSync(process.cwd()) + // we are in an empty git repo, don't ask + if (files.find(file => file === ".git")) { + return false + } else { + console.log( + info(`By default the plugin will be created in the directory "${name}"`) + ) + console.log( + info( + "if you are already in an empty directory, such as a new Git repo, you can disable this functionality." + ) + ) + return questions.confirmation("Create top level directory?") + } +} + async function init(opts) { const type = opts["init"] || opts if (!type || !PLUGIN_TYPE_ARR.includes(type)) { @@ -45,13 +63,20 @@ async function init(opts) { `An amazing Budibase ${type}!` ) const version = await questions.string("Version", "1.0.0") + const topLevel = await askAboutTopLevel(name) // get the skeleton console.log(info("Retrieving project...")) await getSkeleton(type, name) await fleshOutSkeleton(type, name, desc, version) console.log(info("Installing dependencies...")) await runPkgCommand("install", join(process.cwd(), name)) - console.log(info(`Plugin created in directory "${name}"`)) + // if no parent directory desired move to cwd + if (!topLevel) { + moveDirectory(name, process.cwd()) + console.log(info(`Plugin created in current directory.`)) + } else { + console.log(info(`Plugin created in directory "${name}"`)) + } } async function verify() { diff --git a/packages/cli/src/prebuilds.js b/packages/cli/src/prebuilds.js index b582b090e7..0decdc6c63 100644 --- a/packages/cli/src/prebuilds.js +++ b/packages/cli/src/prebuilds.js @@ -27,7 +27,10 @@ function checkForBinaries() { } function cleanup(evt) { - if (evt && evt.errno) { + if (!isNaN(evt)) { + return + } + if (evt) { console.error( error( "Failed to run CLI command - please report with the following message:" diff --git a/packages/cli/src/utils.js b/packages/cli/src/utils.js index 818153ef02..91f3263cc1 100644 --- a/packages/cli/src/utils.js +++ b/packages/cli/src/utils.js @@ -3,6 +3,7 @@ const fs = require("fs") const axios = require("axios") const path = require("path") const progress = require("cli-progress") +const { join } = require("path") exports.downloadFile = async (url, filePath) => { filePath = path.resolve(filePath) @@ -67,3 +68,19 @@ exports.progressBar = total => { exports.checkSlashesInUrl = url => { return url.replace(/(https?:\/\/)|(\/)+/g, "$1$2") } + +exports.moveDirectory = (oldPath, newPath) => { + const files = fs.readdirSync(oldPath) + // check any file exists already + for (let file of files) { + if (fs.existsSync(join(newPath, file))) { + throw new Error( + "Unable to remove top level directory - some skeleton files already exist." + ) + } + } + for (let file of files) { + fs.renameSync(join(oldPath, file), join(newPath, file)) + } + fs.rmdirSync(oldPath) +}