From 9d22f83e4e2a3b3b4fe9c26d3a584ae1aab56bfb Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 18 Aug 2022 13:29:49 +0100 Subject: [PATCH] Adding check to make sure build/watch occurs inside a plugin directory. --- packages/cli/src/plugins/index.js | 15 +++++++++++++ packages/cli/src/plugins/validate.js | 4 ++++ packages/server/src/app.ts | 28 ++---------------------- packages/server/src/watch.ts | 32 ++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 packages/server/src/watch.ts diff --git a/packages/cli/src/plugins/index.js b/packages/cli/src/plugins/index.js index 3ee2463a31..ac931e0d22 100644 --- a/packages/cli/src/plugins/index.js +++ b/packages/cli/src/plugins/index.js @@ -9,6 +9,19 @@ const { runPkgCommand } = require("../exec") const { join } = require("path") const { success, error, info } = require("../utils") +function checkInPlugin() { + if (!fs.existsSync("package.json")) { + throw new Error( + "Please run in a plugin directory - must contain package.json" + ) + } + if (!fs.existsSync("schema.json")) { + throw new Error( + "Please run in a plugin directory - must contain schema.json" + ) + } +} + async function init(opts) { const type = opts["init"] || opts if (!type || !PLUGIN_TYPES_ARR.includes(type)) { @@ -42,6 +55,8 @@ async function init(opts) { } async function verify() { + // will throw errors if not acceptable + checkInPlugin() console.log(info("Verifying plugin...")) const schema = fs.readFileSync("schema.json", "utf8") const pkg = fs.readFileSync("package.json", "utf8") diff --git a/packages/cli/src/plugins/validate.js b/packages/cli/src/plugins/validate.js index 4c2fa6ba53..a6b4555cbd 100644 --- a/packages/cli/src/plugins/validate.js +++ b/packages/cli/src/plugins/validate.js @@ -22,6 +22,8 @@ function validateComponent(schema) { const validator = joi.object({ type: joi.string().allow("component").required(), metadata: joi.object().unknown(true).required(), + hash: joi.string().optional(), + version: joi.string().optional(), schema: joi .object({ name: joi.string().required(), @@ -53,6 +55,8 @@ function validateDatasource(schema) { const validator = joi.object({ type: joi.string().allow("datasource").required(), metadata: joi.object().unknown(true).required(), + hash: joi.string().optional(), + version: joi.string().optional(), schema: joi.object({ docs: joi.string(), friendlyName: joi.string().required(), diff --git a/packages/server/src/app.ts b/packages/server/src/app.ts index a830fd5518..8a4a412bc6 100644 --- a/packages/server/src/app.ts +++ b/packages/server/src/app.ts @@ -17,15 +17,12 @@ const bullboard = require("./automations/bullboard") const { logAlert } = require("@budibase/backend-core/logging") const { pinoSettings } = require("@budibase/backend-core") const { Thread } = require("./threads") -const chokidar = require("chokidar") const fs = require("fs") -const path = require("path") import redis from "./utilities/redis" import * as migrations from "./migrations" import { events, installation, tenancy } from "@budibase/backend-core" import { createAdminUser, getChecklist } from "./utilities/workerRequests" -import { processPlugin } from "./api/controllers/plugin" -import { DEFAULT_TENANT_ID } from "@budibase/backend-core/constants" +import { watch } from "./watch" const app = new Koa() @@ -144,28 +141,7 @@ module.exports = server.listen(env.PORT || 0, async () => { env.PLUGINS_DIR && fs.existsSync(env.PLUGINS_DIR) ) { - const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz") - chokidar - .watch(watchPath, { - ignored: "**/node_modules", - awaitWriteFinish: true, - }) - .on("all", async (event: string, path: string) => { - // Sanity checks - if (!path?.endsWith(".tar.gz") || !fs.existsSync(path)) { - return - } - await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => { - try { - const split = path.split("/") - const name = split[split.length - 1] - console.log("Importing plugin:", path) - await processPlugin({ name, path }) - } catch (err) { - console.log("Failed to import plugin:", err) - } - }) - }) + watch() } // check for version updates diff --git a/packages/server/src/watch.ts b/packages/server/src/watch.ts new file mode 100644 index 0000000000..3d3f4280da --- /dev/null +++ b/packages/server/src/watch.ts @@ -0,0 +1,32 @@ +import path from "path" +import * as env from "./environment" +import chokidar from "chokidar" +import fs from "fs" +import { tenancy } from "@budibase/backend-core" +import { DEFAULT_TENANT_ID } from "@budibase/backend-core/constants" +import { processPlugin } from "./api/controllers/plugin" + +export function watch() { + const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz") + chokidar + .watch(watchPath, { + ignored: "**/node_modules", + awaitWriteFinish: true, + }) + .on("all", async (event: string, path: string) => { + // Sanity checks + if (!path?.endsWith(".tar.gz") || !fs.existsSync(path)) { + return + } + await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => { + try { + const split = path.split("/") + const name = split[split.length - 1] + console.log("Importing plugin:", path) + await processPlugin({ name, path }) + } catch (err) { + console.log("Failed to import plugin:", err) + } + }) + }) +}