@budibase/server 1.3.15-alpha.0 → 1.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/mongodb.ts +1 -1
- package/builder/assets/index.43e7aaa8.js +876 -0
- package/builder/assets/{index.f5c54dd2.css → index.a70e216a.css} +2 -2
- package/builder/assets/vendor.5e1fe644.css +1 -0
- package/builder/assets/vendor.67dbd8fa.js +248 -0
- package/builder/index.html +4 -2
- package/coverage/clover.xml +254 -296
- package/coverage/coverage-final.json +17 -17
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +13 -82
- package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +30 -30
- package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/screen.js.html +12 -204
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +12 -12
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/utils/index.html +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +18 -18
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- package/coverage/lcov-report/db/newid.js.html +2 -2
- package/coverage/lcov-report/db/utils.js.html +20 -56
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +28 -28
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +12 -12
- package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
- package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +16 -16
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +24 -24
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +2 -2
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +445 -533
- package/dist/api/controllers/application.js +4 -5
- package/dist/api/controllers/component.js +1 -18
- package/dist/api/controllers/datasource.js +4 -4
- package/dist/api/controllers/integration.js +4 -4
- package/dist/api/controllers/row/ExternalRequest.js +3 -1
- package/dist/api/controllers/screen.js +2 -51
- package/dist/api/controllers/static/index.js +0 -1
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -10
- package/dist/api/controllers/static/templates/preview.hbs +1 -3
- package/dist/api/routes/index.js +0 -2
- package/dist/app.js +0 -9
- package/dist/db/utils.js +1 -10
- package/dist/environment.js +2 -3
- package/dist/integrations/airtable.js +129 -126
- package/dist/integrations/arangodb.js +89 -86
- package/dist/integrations/base/query.js +2 -2
- package/dist/integrations/couchdb.js +83 -80
- package/dist/integrations/dynamodb.js +164 -161
- package/dist/integrations/elasticsearch.js +138 -135
- package/dist/integrations/firebase.js +157 -154
- package/dist/integrations/googlesheets.js +327 -323
- package/dist/integrations/index.js +51 -93
- package/dist/integrations/microsoftSqlServer.js +243 -240
- package/dist/integrations/mongodb.js +242 -239
- package/dist/integrations/mysql.js +219 -215
- package/dist/integrations/oracle.js +322 -318
- package/dist/integrations/postgres.js +265 -262
- package/dist/integrations/redis.js +139 -134
- package/dist/integrations/rest.js +292 -289
- package/dist/integrations/s3.js +64 -61
- package/dist/integrations/snowflake.js +86 -83
- package/dist/package.json +6 -8
- package/dist/threads/query.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +10 -66
- package/package.json +7 -9
- package/scripts/dev/manage.js +0 -1
- package/src/api/controllers/application.ts +1 -1
- package/src/api/controllers/component.js +2 -25
- package/src/api/controllers/datasource.js +4 -4
- package/src/api/controllers/integration.js +4 -4
- package/src/api/controllers/row/ExternalRequest.ts +4 -1
- package/src/api/controllers/screen.js +1 -65
- package/src/api/controllers/static/index.ts +0 -1
- package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
- package/src/api/controllers/static/templates/preview.hbs +1 -3
- package/src/api/routes/index.ts +0 -2
- package/src/api/routes/tests/query.spec.js +25 -8
- package/src/app.ts +0 -12
- package/src/db/utils.js +0 -12
- package/src/environment.js +2 -3
- package/src/integrations/airtable.ts +118 -116
- package/src/integrations/arangodb.ts +89 -87
- package/src/integrations/base/query.ts +2 -2
- package/src/integrations/couchdb.ts +89 -83
- package/src/integrations/dynamodb.ts +175 -173
- package/src/integrations/elasticsearch.ts +122 -120
- package/src/integrations/firebase.ts +159 -157
- package/src/integrations/googlesheets.ts +338 -328
- package/src/integrations/index.ts +21 -59
- package/src/integrations/microsoftSqlServer.ts +251 -249
- package/src/integrations/mongodb.ts +258 -261
- package/src/integrations/mysql.ts +234 -229
- package/src/integrations/oracle.ts +380 -373
- package/src/integrations/postgres.ts +268 -264
- package/src/integrations/redis.ts +132 -128
- package/src/integrations/rest.ts +329 -324
- package/src/integrations/s3.ts +71 -68
- package/src/integrations/snowflake.ts +82 -80
- package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
- package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
- package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
- package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
- package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
- package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
- package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
- package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
- package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
- package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
- package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
- package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
- package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +14 -22
- package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
- package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
- package/src/module.d.ts +0 -1
- package/src/threads/query.ts +2 -2
- package/src/utilities/fileSystem/index.js +9 -70
- package/builder/assets/index.b266d29f.js +0 -995
- package/dist/api/controllers/plugin.js +0 -119
- package/dist/api/routes/plugin.js +0 -38
- package/dist/watch.js +0 -77
- package/src/api/controllers/plugin.ts +0 -110
- package/src/api/routes/plugin.ts +0 -13
- package/src/watch.ts +0 -38
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.processPlugin = exports.destroy = exports.fetch = exports.upload = exports.getPlugins = void 0;
|
|
16
|
-
const constants_1 = require("../../constants");
|
|
17
|
-
const fileSystem_1 = require("../../utilities/fileSystem");
|
|
18
|
-
const tenancy_1 = require("@budibase/backend-core/tenancy");
|
|
19
|
-
const utils_1 = require("../../db/utils");
|
|
20
|
-
const objectStore_1 = require("@budibase/backend-core/objectStore");
|
|
21
|
-
const types_1 = require("@budibase/types");
|
|
22
|
-
const environment_1 = __importDefault(require("../../environment"));
|
|
23
|
-
function getPlugins(type) {
|
|
24
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
const db = (0, tenancy_1.getGlobalDB)();
|
|
26
|
-
const response = yield db.allDocs((0, utils_1.getPluginParams)(null, {
|
|
27
|
-
include_docs: true,
|
|
28
|
-
}));
|
|
29
|
-
const plugins = response.rows.map((row) => row.doc);
|
|
30
|
-
if (type) {
|
|
31
|
-
return plugins.filter((plugin) => { var _a; return ((_a = plugin.schema) === null || _a === void 0 ? void 0 : _a.type) === type; });
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
return plugins;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
exports.getPlugins = getPlugins;
|
|
39
|
-
function upload(ctx) {
|
|
40
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
-
const plugins = ctx.request.files.file.length > 1
|
|
42
|
-
? Array.from(ctx.request.files.file)
|
|
43
|
-
: [ctx.request.files.file];
|
|
44
|
-
try {
|
|
45
|
-
let docs = [];
|
|
46
|
-
// can do single or multiple plugins
|
|
47
|
-
for (let plugin of plugins) {
|
|
48
|
-
const doc = yield processPlugin(plugin);
|
|
49
|
-
docs.push(doc);
|
|
50
|
-
}
|
|
51
|
-
ctx.body = {
|
|
52
|
-
message: "Plugin(s) uploaded successfully",
|
|
53
|
-
plugins: docs,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
const errMsg = (err === null || err === void 0 ? void 0 : err.message) ? err === null || err === void 0 ? void 0 : err.message : err;
|
|
58
|
-
ctx.throw(400, `Failed to import plugin: ${errMsg}`);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
exports.upload = upload;
|
|
63
|
-
function fetch(ctx) {
|
|
64
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
ctx.body = yield getPlugins();
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
exports.fetch = fetch;
|
|
69
|
-
function destroy(ctx) {
|
|
70
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
71
|
-
}
|
|
72
|
-
exports.destroy = destroy;
|
|
73
|
-
function processPlugin(plugin) {
|
|
74
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
-
if (!environment_1.default.SELF_HOSTED) {
|
|
76
|
-
throw new Error("Plugins not supported outside of self-host.");
|
|
77
|
-
}
|
|
78
|
-
const db = (0, tenancy_1.getGlobalDB)();
|
|
79
|
-
const { metadata, directory } = yield (0, fileSystem_1.extractPluginTarball)(plugin);
|
|
80
|
-
const version = metadata.package.version, name = metadata.package.name, description = metadata.package.description;
|
|
81
|
-
// first open the tarball into tmp directory
|
|
82
|
-
const bucketPath = `${name}/`;
|
|
83
|
-
const files = yield (0, objectStore_1.uploadDirectory)(constants_1.ObjectStoreBuckets.PLUGINS, directory, bucketPath);
|
|
84
|
-
const jsFile = files.find((file) => file.name.endsWith(".js"));
|
|
85
|
-
if (!jsFile) {
|
|
86
|
-
throw new Error(`Plugin missing .js file.`);
|
|
87
|
-
}
|
|
88
|
-
// validate the JS for a datasource
|
|
89
|
-
if (metadata.schema.type === types_1.PluginType.DATASOURCE) {
|
|
90
|
-
const js = (0, fileSystem_1.loadJSFile)(directory, jsFile.name);
|
|
91
|
-
// TODO: this isn't safe - but we need full node environment
|
|
92
|
-
// in future we should do this in a thread for safety
|
|
93
|
-
try {
|
|
94
|
-
eval(js);
|
|
95
|
-
}
|
|
96
|
-
catch (err) {
|
|
97
|
-
const message = (err === null || err === void 0 ? void 0 : err.message) ? err.message : JSON.stringify(err);
|
|
98
|
-
throw new Error(`JS invalid: ${message}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
const jsFileName = jsFile.name;
|
|
102
|
-
const pluginId = (0, utils_1.generatePluginID)(name);
|
|
103
|
-
// overwrite existing docs entirely if they exist
|
|
104
|
-
let rev;
|
|
105
|
-
try {
|
|
106
|
-
const existing = yield db.get(pluginId);
|
|
107
|
-
rev = existing._rev;
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
rev = undefined;
|
|
111
|
-
}
|
|
112
|
-
const doc = Object.assign(Object.assign({ _id: pluginId, _rev: rev }, metadata), { name,
|
|
113
|
-
version,
|
|
114
|
-
description, jsUrl: `${bucketPath}${jsFileName}` });
|
|
115
|
-
const response = yield db.put(doc);
|
|
116
|
-
return Object.assign(Object.assign({}, doc), { _rev: response.rev });
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
exports.processPlugin = processPlugin;
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
const router_1 = __importDefault(require("@koa/router"));
|
|
30
|
-
const controller = __importStar(require("../controllers/plugin"));
|
|
31
|
-
const authorized_1 = __importDefault(require("../../middleware/authorized"));
|
|
32
|
-
const permissions_1 = require("@budibase/backend-core/permissions");
|
|
33
|
-
const router = new router_1.default();
|
|
34
|
-
router
|
|
35
|
-
.post("/api/plugin/upload", (0, authorized_1.default)(permissions_1.BUILDER), controller.upload)
|
|
36
|
-
.get("/api/plugin", (0, authorized_1.default)(permissions_1.BUILDER), controller.fetch)
|
|
37
|
-
.delete("/api/plugin/:pluginId", (0, authorized_1.default)(permissions_1.BUILDER), controller.destroy);
|
|
38
|
-
exports.default = router;
|
package/dist/watch.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
-
};
|
|
37
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.watch = void 0;
|
|
39
|
-
const path_1 = __importDefault(require("path"));
|
|
40
|
-
const env = __importStar(require("./environment"));
|
|
41
|
-
const chokidar_1 = __importDefault(require("chokidar"));
|
|
42
|
-
const fs_1 = __importDefault(require("fs"));
|
|
43
|
-
const backend_core_1 = require("@budibase/backend-core");
|
|
44
|
-
const constants_1 = require("@budibase/backend-core/constants");
|
|
45
|
-
const plugin_1 = require("./api/controllers/plugin");
|
|
46
|
-
function watch() {
|
|
47
|
-
const watchPath = path_1.default.join(env.PLUGINS_DIR, "./**/*.tar.gz");
|
|
48
|
-
chokidar_1.default
|
|
49
|
-
.watch(watchPath, {
|
|
50
|
-
ignored: "**/node_modules",
|
|
51
|
-
awaitWriteFinish: {
|
|
52
|
-
pollInterval: 100,
|
|
53
|
-
stabilityThreshold: 250,
|
|
54
|
-
},
|
|
55
|
-
usePolling: true,
|
|
56
|
-
interval: 250,
|
|
57
|
-
})
|
|
58
|
-
.on("all", (event, path) => __awaiter(this, void 0, void 0, function* () {
|
|
59
|
-
// Sanity checks
|
|
60
|
-
if (!(path === null || path === void 0 ? void 0 : path.endsWith(".tar.gz")) || !fs_1.default.existsSync(path)) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
yield backend_core_1.tenancy.doInTenant(constants_1.DEFAULT_TENANT_ID, () => __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
try {
|
|
65
|
-
const split = path.split("/");
|
|
66
|
-
const name = split[split.length - 1];
|
|
67
|
-
console.log("Importing plugin:", path);
|
|
68
|
-
yield (0, plugin_1.processPlugin)({ name, path });
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
const message = (err === null || err === void 0 ? void 0 : err.message) ? err === null || err === void 0 ? void 0 : err.message : err;
|
|
72
|
-
console.error("Failed to import plugin:", message);
|
|
73
|
-
}
|
|
74
|
-
}));
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
exports.watch = watch;
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { ObjectStoreBuckets } from "../../constants"
|
|
2
|
-
import { extractPluginTarball, loadJSFile } from "../../utilities/fileSystem"
|
|
3
|
-
import { getGlobalDB } from "@budibase/backend-core/tenancy"
|
|
4
|
-
import { generatePluginID, getPluginParams } from "../../db/utils"
|
|
5
|
-
import { uploadDirectory } from "@budibase/backend-core/objectStore"
|
|
6
|
-
import { PluginType, FileType } from "@budibase/types"
|
|
7
|
-
import env from "../../environment"
|
|
8
|
-
|
|
9
|
-
export async function getPlugins(type?: PluginType) {
|
|
10
|
-
const db = getGlobalDB()
|
|
11
|
-
const response = await db.allDocs(
|
|
12
|
-
getPluginParams(null, {
|
|
13
|
-
include_docs: true,
|
|
14
|
-
})
|
|
15
|
-
)
|
|
16
|
-
const plugins = response.rows.map((row: any) => row.doc)
|
|
17
|
-
if (type) {
|
|
18
|
-
return plugins.filter((plugin: any) => plugin.schema?.type === type)
|
|
19
|
-
} else {
|
|
20
|
-
return plugins
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export async function upload(ctx: any) {
|
|
25
|
-
const plugins: FileType[] =
|
|
26
|
-
ctx.request.files.file.length > 1
|
|
27
|
-
? Array.from(ctx.request.files.file)
|
|
28
|
-
: [ctx.request.files.file]
|
|
29
|
-
try {
|
|
30
|
-
let docs = []
|
|
31
|
-
// can do single or multiple plugins
|
|
32
|
-
for (let plugin of plugins) {
|
|
33
|
-
const doc = await processPlugin(plugin)
|
|
34
|
-
docs.push(doc)
|
|
35
|
-
}
|
|
36
|
-
ctx.body = {
|
|
37
|
-
message: "Plugin(s) uploaded successfully",
|
|
38
|
-
plugins: docs,
|
|
39
|
-
}
|
|
40
|
-
} catch (err: any) {
|
|
41
|
-
const errMsg = err?.message ? err?.message : err
|
|
42
|
-
ctx.throw(400, `Failed to import plugin: ${errMsg}`)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function fetch(ctx: any) {
|
|
47
|
-
ctx.body = await getPlugins()
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export async function destroy(ctx: any) {}
|
|
51
|
-
|
|
52
|
-
export async function processPlugin(plugin: FileType) {
|
|
53
|
-
if (!env.SELF_HOSTED) {
|
|
54
|
-
throw new Error("Plugins not supported outside of self-host.")
|
|
55
|
-
}
|
|
56
|
-
const db = getGlobalDB()
|
|
57
|
-
const { metadata, directory } = await extractPluginTarball(plugin)
|
|
58
|
-
const version = metadata.package.version,
|
|
59
|
-
name = metadata.package.name,
|
|
60
|
-
description = metadata.package.description
|
|
61
|
-
|
|
62
|
-
// first open the tarball into tmp directory
|
|
63
|
-
const bucketPath = `${name}/`
|
|
64
|
-
const files = await uploadDirectory(
|
|
65
|
-
ObjectStoreBuckets.PLUGINS,
|
|
66
|
-
directory,
|
|
67
|
-
bucketPath
|
|
68
|
-
)
|
|
69
|
-
const jsFile = files.find((file: any) => file.name.endsWith(".js"))
|
|
70
|
-
if (!jsFile) {
|
|
71
|
-
throw new Error(`Plugin missing .js file.`)
|
|
72
|
-
}
|
|
73
|
-
// validate the JS for a datasource
|
|
74
|
-
if (metadata.schema.type === PluginType.DATASOURCE) {
|
|
75
|
-
const js = loadJSFile(directory, jsFile.name)
|
|
76
|
-
// TODO: this isn't safe - but we need full node environment
|
|
77
|
-
// in future we should do this in a thread for safety
|
|
78
|
-
try {
|
|
79
|
-
eval(js)
|
|
80
|
-
} catch (err: any) {
|
|
81
|
-
const message = err?.message ? err.message : JSON.stringify(err)
|
|
82
|
-
throw new Error(`JS invalid: ${message}`)
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
const jsFileName = jsFile.name
|
|
86
|
-
const pluginId = generatePluginID(name)
|
|
87
|
-
|
|
88
|
-
// overwrite existing docs entirely if they exist
|
|
89
|
-
let rev
|
|
90
|
-
try {
|
|
91
|
-
const existing = await db.get(pluginId)
|
|
92
|
-
rev = existing._rev
|
|
93
|
-
} catch (err) {
|
|
94
|
-
rev = undefined
|
|
95
|
-
}
|
|
96
|
-
const doc = {
|
|
97
|
-
_id: pluginId,
|
|
98
|
-
_rev: rev,
|
|
99
|
-
...metadata,
|
|
100
|
-
name,
|
|
101
|
-
version,
|
|
102
|
-
description,
|
|
103
|
-
jsUrl: `${bucketPath}${jsFileName}`,
|
|
104
|
-
}
|
|
105
|
-
const response = await db.put(doc)
|
|
106
|
-
return {
|
|
107
|
-
...doc,
|
|
108
|
-
_rev: response.rev,
|
|
109
|
-
}
|
|
110
|
-
}
|
package/src/api/routes/plugin.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import Router from "@koa/router"
|
|
2
|
-
import * as controller from "../controllers/plugin"
|
|
3
|
-
import authorized from "../../middleware/authorized"
|
|
4
|
-
import { BUILDER } from "@budibase/backend-core/permissions"
|
|
5
|
-
|
|
6
|
-
const router = new Router()
|
|
7
|
-
|
|
8
|
-
router
|
|
9
|
-
.post("/api/plugin/upload", authorized(BUILDER), controller.upload)
|
|
10
|
-
.get("/api/plugin", authorized(BUILDER), controller.fetch)
|
|
11
|
-
.delete("/api/plugin/:pluginId", authorized(BUILDER), controller.destroy)
|
|
12
|
-
|
|
13
|
-
export default router
|
package/src/watch.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import * as env from "./environment"
|
|
3
|
-
import chokidar from "chokidar"
|
|
4
|
-
import fs from "fs"
|
|
5
|
-
import { tenancy } from "@budibase/backend-core"
|
|
6
|
-
import { DEFAULT_TENANT_ID } from "@budibase/backend-core/constants"
|
|
7
|
-
import { processPlugin } from "./api/controllers/plugin"
|
|
8
|
-
|
|
9
|
-
export function watch() {
|
|
10
|
-
const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz")
|
|
11
|
-
chokidar
|
|
12
|
-
.watch(watchPath, {
|
|
13
|
-
ignored: "**/node_modules",
|
|
14
|
-
awaitWriteFinish: {
|
|
15
|
-
pollInterval: 100,
|
|
16
|
-
stabilityThreshold: 250,
|
|
17
|
-
},
|
|
18
|
-
usePolling: true,
|
|
19
|
-
interval: 250,
|
|
20
|
-
})
|
|
21
|
-
.on("all", async (event: string, path: string) => {
|
|
22
|
-
// Sanity checks
|
|
23
|
-
if (!path?.endsWith(".tar.gz") || !fs.existsSync(path)) {
|
|
24
|
-
return
|
|
25
|
-
}
|
|
26
|
-
await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => {
|
|
27
|
-
try {
|
|
28
|
-
const split = path.split("/")
|
|
29
|
-
const name = split[split.length - 1]
|
|
30
|
-
console.log("Importing plugin:", path)
|
|
31
|
-
await processPlugin({ name, path })
|
|
32
|
-
} catch (err: any) {
|
|
33
|
-
const message = err?.message ? err?.message : err
|
|
34
|
-
console.error("Failed to import plugin:", message)
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
}
|