@budibase/server 1.3.12 → 1.3.15-alpha.0
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.b266d29f.js +995 -0
- package/builder/assets/{index.e50bda9f.css → index.f5c54dd2.css} +2 -2
- package/builder/index.html +2 -4
- package/coverage/clover.xml +377 -313
- package/coverage/coverage-final.json +22 -22
- 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 +8 -5
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +82 -13
- 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 +32 -32
- 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 +204 -12
- 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 +24 -24
- package/coverage/lcov-report/automations/index.js.html +18 -9
- 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 +126 -24
- 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 +56 -20
- 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 +48 -48
- 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 +19 -19
- package/coverage/lcov-report/utilities/index.js.html +66 -42
- 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 +5 -5
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
- 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 +6 -3
- 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 +692 -564
- package/dist/api/controllers/application.js +6 -9
- package/dist/api/controllers/backup.js +2 -1
- package/dist/api/controllers/component.js +18 -1
- package/dist/api/controllers/datasource.js +4 -4
- package/dist/api/controllers/deploy/index.js +17 -2
- package/dist/api/controllers/integration.js +4 -4
- package/dist/api/controllers/plugin.js +119 -0
- package/dist/api/controllers/row/ExternalRequest.js +1 -1
- package/dist/api/controllers/screen.js +51 -2
- package/dist/api/controllers/static/index.js +1 -0
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
- package/dist/api/controllers/static/templates/preview.hbs +3 -1
- package/dist/api/routes/index.js +2 -0
- package/dist/api/routes/plugin.js +38 -0
- package/dist/app.js +9 -0
- package/dist/automations/index.js +10 -5
- package/dist/automations/triggers.js +39 -5
- package/dist/automations/utils.js +16 -7
- package/dist/db/utils.js +10 -1
- package/dist/environment.js +1 -0
- package/dist/integrations/airtable.js +126 -129
- package/dist/integrations/arangodb.js +86 -89
- package/dist/integrations/base/query.js +2 -2
- package/dist/integrations/couchdb.js +80 -83
- package/dist/integrations/dynamodb.js +161 -164
- package/dist/integrations/elasticsearch.js +135 -138
- package/dist/integrations/firebase.js +154 -157
- package/dist/integrations/googlesheets.js +323 -327
- package/dist/integrations/index.js +93 -51
- package/dist/integrations/microsoftSqlServer.js +240 -243
- package/dist/integrations/mongodb.js +239 -242
- package/dist/integrations/mysql.js +215 -219
- package/dist/integrations/oracle.js +318 -322
- package/dist/integrations/postgres.js +262 -265
- package/dist/integrations/redis.js +134 -139
- package/dist/integrations/rest.js +293 -281
- package/dist/integrations/s3.js +61 -64
- package/dist/integrations/snowflake.js +83 -86
- package/dist/package.json +8 -6
- package/dist/threads/automation.js +6 -0
- package/dist/threads/query.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +71 -6
- package/dist/utilities/index.js +8 -0
- package/dist/utilities/rowProcessor/utils.js +1 -1
- package/dist/utilities/usageQuota/rows.js +2 -1
- package/dist/watch.js +77 -0
- package/package.json +9 -7
- package/scripts/dev/manage.js +1 -0
- package/src/api/controllers/application.ts +2 -6
- package/src/api/controllers/backup.js +2 -1
- package/src/api/controllers/component.js +25 -2
- package/src/api/controllers/datasource.js +4 -4
- package/src/api/controllers/deploy/index.ts +17 -4
- package/src/api/controllers/integration.js +4 -4
- package/src/api/controllers/plugin.ts +110 -0
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/screen.js +65 -1
- package/src/api/controllers/static/index.ts +1 -0
- package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
- package/src/api/controllers/static/templates/preview.hbs +3 -1
- package/src/api/routes/index.ts +2 -0
- package/src/api/routes/plugin.ts +13 -0
- package/src/api/routes/tests/query.spec.js +11 -28
- package/src/app.ts +12 -0
- package/src/automations/index.js +6 -3
- package/src/automations/triggers.js +44 -10
- package/src/automations/utils.ts +21 -9
- package/src/db/utils.js +12 -0
- package/src/definitions/datasource.ts +1 -0
- package/src/environment.js +1 -0
- package/src/integrations/airtable.ts +116 -118
- package/src/integrations/arangodb.ts +87 -89
- package/src/integrations/base/query.ts +2 -2
- package/src/integrations/couchdb.ts +83 -89
- package/src/integrations/dynamodb.ts +173 -175
- package/src/integrations/elasticsearch.ts +120 -122
- package/src/integrations/firebase.ts +157 -159
- package/src/integrations/googlesheets.ts +328 -338
- package/src/integrations/index.ts +59 -21
- package/src/integrations/microsoftSqlServer.ts +249 -251
- package/src/integrations/mongodb.ts +261 -258
- package/src/integrations/mysql.ts +229 -234
- package/src/integrations/oracle.ts +373 -380
- package/src/integrations/postgres.ts +264 -268
- package/src/integrations/redis.ts +128 -132
- package/src/integrations/rest.ts +325 -317
- package/src/integrations/s3.ts +68 -71
- package/src/integrations/snowflake.ts +80 -82
- package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
- package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
- package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
- package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
- package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
- package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
- package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
- package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
- package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
- package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
- package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
- package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
- package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +57 -14
- package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
- package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
- package/src/module.d.ts +1 -0
- package/src/threads/automation.ts +6 -0
- package/src/threads/query.ts +2 -2
- package/src/utilities/fileSystem/index.js +75 -6
- package/src/utilities/index.js +8 -0
- package/src/utilities/rowProcessor/utils.js +1 -1
- package/src/utilities/usageQuota/rows.js +2 -1
- package/src/watch.ts +38 -0
- package/builder/assets/index.a4ba55ba.js +0 -875
- package/builder/assets/vendor.5e1fe644.css +0 -1
- package/builder/assets/vendor.67dbd8fa.js +0 -248
|
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.sync = exports.destroy = exports.revertClient = exports.updateClient = exports.update = exports.create = exports.fetchAppPackage = exports.fetchAppDefinition = exports.fetch = exports.getAppUrl = void 0;
|
|
15
|
+
exports.updateAppPackage = exports.sync = exports.destroy = exports.revertClient = exports.updateClient = exports.update = exports.create = exports.fetchAppPackage = exports.fetchAppDefinition = exports.fetch = exports.getAppUrl = void 0;
|
|
16
16
|
const environment_1 = __importDefault(require("../../environment"));
|
|
17
17
|
const package_json_1 = __importDefault(require("../../../package.json"));
|
|
18
18
|
const staticViews_1 = require("../../db/views/staticViews");
|
|
@@ -353,7 +353,7 @@ const update = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
353
353
|
checkAppUrl(ctx, apps, url, ctx.params.appId);
|
|
354
354
|
ctx.request.body.url = url;
|
|
355
355
|
}
|
|
356
|
-
const app = yield updateAppPackage(ctx.request.body, ctx.params.appId);
|
|
356
|
+
const app = yield (0, exports.updateAppPackage)(ctx.request.body, ctx.params.appId);
|
|
357
357
|
yield backend_core_2.events.app.updated(app);
|
|
358
358
|
ctx.status = 200;
|
|
359
359
|
ctx.body = app;
|
|
@@ -375,7 +375,7 @@ const updateClient = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
375
375
|
version: updatedToVersion,
|
|
376
376
|
revertableVersion: currentVersion,
|
|
377
377
|
};
|
|
378
|
-
const app = yield updateAppPackage(appPackageUpdates, ctx.params.appId);
|
|
378
|
+
const app = yield (0, exports.updateAppPackage)(appPackageUpdates, ctx.params.appId);
|
|
379
379
|
yield backend_core_2.events.app.versionUpdated(app, currentVersion, updatedToVersion);
|
|
380
380
|
ctx.status = 200;
|
|
381
381
|
ctx.body = app;
|
|
@@ -399,7 +399,7 @@ const revertClient = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
399
399
|
version: revertedToVersion,
|
|
400
400
|
revertableVersion: null,
|
|
401
401
|
};
|
|
402
|
-
const app = yield updateAppPackage(appPackageUpdates, ctx.params.appId);
|
|
402
|
+
const app = yield (0, exports.updateAppPackage)(appPackageUpdates, ctx.params.appId);
|
|
403
403
|
yield backend_core_2.events.app.versionReverted(app, currentVersion, revertedToVersion);
|
|
404
404
|
ctx.status = 200;
|
|
405
405
|
ctx.body = app;
|
|
@@ -490,11 +490,7 @@ const sync = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
490
490
|
});
|
|
491
491
|
let error;
|
|
492
492
|
try {
|
|
493
|
-
yield replication.replicate(
|
|
494
|
-
filter: function (doc) {
|
|
495
|
-
return doc._id !== utils_1.DocumentType.APP_METADATA;
|
|
496
|
-
},
|
|
497
|
-
});
|
|
493
|
+
yield replication.replicate(replication.appReplicateOpts());
|
|
498
494
|
}
|
|
499
495
|
catch (err) {
|
|
500
496
|
error = err;
|
|
@@ -531,6 +527,7 @@ const updateAppPackage = (appPackage, appId) => __awaiter(void 0, void 0, void 0
|
|
|
531
527
|
return newAppPackage;
|
|
532
528
|
}));
|
|
533
529
|
});
|
|
530
|
+
exports.updateAppPackage = updateAppPackage;
|
|
534
531
|
const migrateAppNavigation = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
535
532
|
const db = backend_core_1.context.getAppDB();
|
|
536
533
|
const existing = yield db.get(utils_1.DocumentType.APP_METADATA);
|
|
@@ -11,11 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
const { streamBackup } = require("../../utilities/fileSystem");
|
|
12
12
|
const { events, context } = require("@budibase/backend-core");
|
|
13
13
|
const { DocumentType } = require("../../db/utils");
|
|
14
|
+
const { isQsTrue } = require("../../utilities");
|
|
14
15
|
exports.exportAppDump = function (ctx) {
|
|
15
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
17
|
let { appId, excludeRows } = ctx.query;
|
|
17
18
|
const appName = decodeURI(ctx.query.appname);
|
|
18
|
-
excludeRows = excludeRows
|
|
19
|
+
excludeRows = isQsTrue(excludeRows);
|
|
19
20
|
const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`;
|
|
20
21
|
ctx.attachment(backupIdentifier);
|
|
21
22
|
ctx.body = yield streamBackup(appId, excludeRows);
|
|
@@ -8,9 +8,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const { DocumentType } = require("../../db/utils");
|
|
11
|
+
const { DocumentType, getPluginParams } = require("../../db/utils");
|
|
12
12
|
const { getComponentLibraryManifest } = require("../../utilities/fileSystem");
|
|
13
13
|
const { getAppDB } = require("@budibase/backend-core/context");
|
|
14
|
+
const { getGlobalDB } = require("@budibase/backend-core/tenancy");
|
|
15
|
+
const env = require("../../environment");
|
|
14
16
|
exports.fetchAppComponentDefinitions = function (ctx) {
|
|
15
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
18
|
try {
|
|
@@ -35,6 +37,21 @@ exports.fetchAppComponentDefinitions = function (ctx) {
|
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
}
|
|
40
|
+
// for now custom components only supported in self-host
|
|
41
|
+
if (env.SELF_HOSTED) {
|
|
42
|
+
// Add custom components
|
|
43
|
+
const globalDB = getGlobalDB();
|
|
44
|
+
const response = yield globalDB.allDocs(getPluginParams(null, {
|
|
45
|
+
include_docs: true,
|
|
46
|
+
}));
|
|
47
|
+
response.rows
|
|
48
|
+
.map(row => row.doc)
|
|
49
|
+
.filter(plugin => plugin.schema.type === "component")
|
|
50
|
+
.forEach(plugin => {
|
|
51
|
+
const fullComponentName = `plugin/${plugin.name}`;
|
|
52
|
+
definitions[fullComponentName] = Object.assign({ component: fullComponentName }, plugin.schema.schema);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
38
55
|
ctx.body = definitions;
|
|
39
56
|
}
|
|
40
57
|
catch (err) {
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
const { generateDatasourceID, getDatasourceParams, getQueryParams, DocumentType, BudibaseInternalDB, getTableParams, } = require("../../db/utils");
|
|
12
12
|
const { BuildSchemaErrors, InvalidColumns } = require("../../constants");
|
|
13
|
-
const {
|
|
13
|
+
const { getIntegration } = require("../../integrations");
|
|
14
14
|
const { getDatasourceAndQuery } = require("./row/utils");
|
|
15
15
|
const { invalidateDynamicVariables } = require("../../threads/utils");
|
|
16
16
|
const { getAppDB } = require("@budibase/backend-core/context");
|
|
@@ -96,7 +96,7 @@ exports.update = function (ctx) {
|
|
|
96
96
|
datasource._rev = response.rev;
|
|
97
97
|
// Drain connection pools when configuration is changed
|
|
98
98
|
if (datasource.source) {
|
|
99
|
-
const source =
|
|
99
|
+
const source = yield getIntegration(datasource.source);
|
|
100
100
|
if (source && source.pool) {
|
|
101
101
|
yield source.pool.end();
|
|
102
102
|
}
|
|
@@ -123,7 +123,7 @@ exports.save = function (ctx) {
|
|
|
123
123
|
datasource._rev = dbResp.rev;
|
|
124
124
|
// Drain connection pools when configuration is changed
|
|
125
125
|
if (datasource.source) {
|
|
126
|
-
const source =
|
|
126
|
+
const source = yield getIntegration(datasource.source);
|
|
127
127
|
if (source && source.pool) {
|
|
128
128
|
yield source.pool.end();
|
|
129
129
|
}
|
|
@@ -188,7 +188,7 @@ function updateError(error, newError, tables) {
|
|
|
188
188
|
return error;
|
|
189
189
|
}
|
|
190
190
|
const buildSchemaHelper = (datasource) => __awaiter(void 0, void 0, void 0, function* () {
|
|
191
|
-
const Connector =
|
|
191
|
+
const Connector = yield getIntegration(datasource.source);
|
|
192
192
|
// Connect to the DB and build the schema
|
|
193
193
|
const connector = new Connector(datasource.config);
|
|
194
194
|
yield connector.buildSchema(datasource._id, datasource.entities);
|
|
@@ -100,14 +100,29 @@ function deployApp(deployment) {
|
|
|
100
100
|
target: productionAppId,
|
|
101
101
|
};
|
|
102
102
|
replication = new db_1.Replication(config);
|
|
103
|
+
const devDb = (0, context_1.getDevAppDB)();
|
|
104
|
+
console.log("Compacting development DB");
|
|
105
|
+
yield devDb.compact();
|
|
103
106
|
console.log("Replication object created");
|
|
104
|
-
yield replication.replicate();
|
|
107
|
+
yield replication.replicate(replication.appReplicateOpts());
|
|
105
108
|
console.log("replication complete.. replacing app meta doc");
|
|
109
|
+
// app metadata is excluded as it is likely to be in conflict
|
|
110
|
+
// replicate the app metadata document manually
|
|
106
111
|
const db = (0, context_1.getProdAppDB)();
|
|
107
|
-
const appDoc = yield
|
|
112
|
+
const appDoc = yield devDb.get(utils_1.DocumentType.APP_METADATA);
|
|
113
|
+
try {
|
|
114
|
+
const prodAppDoc = yield db.get(utils_1.DocumentType.APP_METADATA);
|
|
115
|
+
appDoc._rev = prodAppDoc._rev;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
delete appDoc._rev;
|
|
119
|
+
}
|
|
120
|
+
// switch to production app ID
|
|
108
121
|
deployment.appUrl = appDoc.url;
|
|
109
122
|
appDoc.appId = productionAppId;
|
|
110
123
|
appDoc.instance._id = productionAppId;
|
|
124
|
+
// remove automation errors if they exist
|
|
125
|
+
delete appDoc.automationErrors;
|
|
111
126
|
yield db.put(appDoc);
|
|
112
127
|
yield cache_1.app.invalidateAppMetadata(productionAppId);
|
|
113
128
|
console.log("New app doc written successfully.");
|
|
@@ -8,15 +8,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const {
|
|
12
|
-
const { definitions } = require("../../integrations");
|
|
11
|
+
const { getDefinitions } = require("../../integrations");
|
|
13
12
|
const { SourceName } = require("@budibase/types");
|
|
14
13
|
const googlesheets = require("../../integrations/googlesheets");
|
|
15
14
|
const { featureFlags } = require("@budibase/backend-core");
|
|
16
15
|
exports.fetch = function (ctx) {
|
|
17
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
17
|
ctx.status = 200;
|
|
19
|
-
const defs =
|
|
18
|
+
const defs = yield getDefinitions();
|
|
20
19
|
// for google sheets integration google verification
|
|
21
20
|
if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
|
|
22
21
|
defs[SourceName.GOOGLE_SHEETS] = googlesheets.schema;
|
|
@@ -26,7 +25,8 @@ exports.fetch = function (ctx) {
|
|
|
26
25
|
};
|
|
27
26
|
exports.find = function (ctx) {
|
|
28
27
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
const defs = yield getDefinitions();
|
|
29
29
|
ctx.status = 200;
|
|
30
|
-
ctx.body =
|
|
30
|
+
ctx.body = defs[ctx.params.type];
|
|
31
31
|
});
|
|
32
32
|
};
|
|
@@ -0,0 +1,119 @@
|
|
|
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;
|
|
@@ -446,7 +446,7 @@ var External;
|
|
|
446
446
|
});
|
|
447
447
|
// this is the response from knex if no rows found
|
|
448
448
|
const rows = !response[0].read ? response : [];
|
|
449
|
-
const storeTo = isMany ? field.throughFrom || linkPrimaryKey :
|
|
449
|
+
const storeTo = isMany ? field.throughFrom || linkPrimaryKey : fieldName;
|
|
450
450
|
related[storeTo] = { rows, isMany, tableId };
|
|
451
451
|
}
|
|
452
452
|
return related;
|
|
@@ -8,10 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
const { getScreenParams, generateScreenID } = require("../../db/utils");
|
|
11
|
+
const { getScreenParams, generateScreenID, getPluginParams, DocumentType, } = require("../../db/utils");
|
|
12
12
|
const { AccessController } = require("@budibase/backend-core/roles");
|
|
13
13
|
const { getAppDB } = require("@budibase/backend-core/context");
|
|
14
14
|
const { events } = require("@budibase/backend-core");
|
|
15
|
+
const { getGlobalDB } = require("@budibase/backend-core/tenancy");
|
|
16
|
+
const { updateAppPackage } = require("./application");
|
|
15
17
|
exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
18
|
const db = getAppDB();
|
|
17
19
|
const screens = (yield db.allDocs(getScreenParams(null, {
|
|
@@ -28,11 +30,44 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
28
30
|
eventFn = events.screen.created;
|
|
29
31
|
}
|
|
30
32
|
const response = yield db.put(screen);
|
|
33
|
+
// Find any custom components being used
|
|
34
|
+
let pluginNames = [];
|
|
35
|
+
let pluginAdded = false;
|
|
36
|
+
findPlugins(screen.props, pluginNames);
|
|
37
|
+
if (pluginNames.length) {
|
|
38
|
+
const globalDB = getGlobalDB();
|
|
39
|
+
const pluginsResponse = yield globalDB.allDocs(getPluginParams(null, {
|
|
40
|
+
include_docs: true,
|
|
41
|
+
}));
|
|
42
|
+
const requiredPlugins = pluginsResponse.rows
|
|
43
|
+
.map(row => row.doc)
|
|
44
|
+
.filter(plugin => {
|
|
45
|
+
return (plugin.schema.type === "component" &&
|
|
46
|
+
pluginNames.includes(`plugin/${plugin.name}`));
|
|
47
|
+
});
|
|
48
|
+
// Update the app metadata
|
|
49
|
+
const application = yield db.get(DocumentType.APP_METADATA);
|
|
50
|
+
let usedPlugins = application.usedPlugins || [];
|
|
51
|
+
requiredPlugins.forEach(plugin => {
|
|
52
|
+
if (!usedPlugins.find(x => x._id === plugin._id)) {
|
|
53
|
+
pluginAdded = true;
|
|
54
|
+
usedPlugins.push({
|
|
55
|
+
_id: plugin._id,
|
|
56
|
+
name: plugin.name,
|
|
57
|
+
version: plugin.version,
|
|
58
|
+
jsUrl: plugin.jsUrl,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
if (pluginAdded) {
|
|
63
|
+
yield updateAppPackage({ usedPlugins }, ctx.appId);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
31
66
|
if (eventFn) {
|
|
32
67
|
yield eventFn(screen);
|
|
33
68
|
}
|
|
34
69
|
ctx.message = `Screen ${screen.name} saved.`;
|
|
35
|
-
ctx.body = Object.assign(Object.assign({}, screen), { _id: response.id, _rev: response.rev });
|
|
70
|
+
ctx.body = Object.assign(Object.assign({}, screen), { _id: response.id, _rev: response.rev, pluginAdded });
|
|
36
71
|
});
|
|
37
72
|
exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
73
|
const db = getAppDB();
|
|
@@ -45,3 +80,17 @@ exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
45
80
|
};
|
|
46
81
|
ctx.status = 200;
|
|
47
82
|
});
|
|
83
|
+
const findPlugins = (component, foundPlugins) => {
|
|
84
|
+
if (!component) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (component._component.startsWith("plugin")) {
|
|
88
|
+
if (!foundPlugins.includes(component._component)) {
|
|
89
|
+
foundPlugins.push(component._component);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!component._children || !component._children.length) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
component._children.forEach(child => findPlugins(child, foundPlugins));
|
|
96
|
+
};
|
|
@@ -113,6 +113,7 @@ const serveApp = function (ctx) {
|
|
|
113
113
|
production: env.isProd(),
|
|
114
114
|
appId,
|
|
115
115
|
clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
|
|
116
|
+
usedPlugins: appInfo.usedPlugins,
|
|
116
117
|
});
|
|
117
118
|
const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`);
|
|
118
119
|
ctx.body = yield processString(appHbs, {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
export let favicon = ""
|
|
4
4
|
|
|
5
5
|
export let clientLibPath
|
|
6
|
+
export let usedPlugins
|
|
6
7
|
</script>
|
|
7
8
|
|
|
8
9
|
<svelte:head>
|
|
@@ -83,6 +84,15 @@
|
|
|
83
84
|
</script>
|
|
84
85
|
<script type="application/javascript" src={clientLibPath}>
|
|
85
86
|
</script>
|
|
87
|
+
<!-- Custom components need inserted after the core client library -->
|
|
88
|
+
<!-- But before loadBudibase is called -->
|
|
89
|
+
{#if usedPlugins?.length}
|
|
90
|
+
{#each usedPlugins as plugin}
|
|
91
|
+
<script
|
|
92
|
+
type="application/javascript"
|
|
93
|
+
src={`/plugins/${plugin.jsUrl}`}></script>
|
|
94
|
+
{/each}
|
|
95
|
+
{/if}
|
|
86
96
|
<script type="application/javascript">
|
|
87
97
|
if (window.loadBudibase) {
|
|
88
98
|
window.loadBudibase()
|
|
@@ -66,7 +66,8 @@
|
|
|
66
66
|
customTheme,
|
|
67
67
|
previewDevice,
|
|
68
68
|
navigation,
|
|
69
|
-
hiddenComponentIds
|
|
69
|
+
hiddenComponentIds,
|
|
70
|
+
usedPlugins
|
|
70
71
|
} = parsed
|
|
71
72
|
|
|
72
73
|
// Set some flags so the app knows we're in the builder
|
|
@@ -81,6 +82,7 @@
|
|
|
81
82
|
window["##BUDIBASE_PREVIEW_DEVICE##"] = previewDevice
|
|
82
83
|
window["##BUDIBASE_PREVIEW_NAVIGATION##"] = navigation
|
|
83
84
|
window["##BUDIBASE_HIDDEN_COMPONENT_IDS##"] = hiddenComponentIds
|
|
85
|
+
window["##BUDIBASE_USED_PLUGINS##"] = usedPlugins
|
|
84
86
|
|
|
85
87
|
// Initialise app
|
|
86
88
|
try {
|
package/dist/api/routes/index.js
CHANGED
|
@@ -30,6 +30,7 @@ const metadata_1 = __importDefault(require("./metadata"));
|
|
|
30
30
|
const dev_1 = __importDefault(require("./dev"));
|
|
31
31
|
const cloud_1 = __importDefault(require("./cloud"));
|
|
32
32
|
const migrations_1 = __importDefault(require("./migrations"));
|
|
33
|
+
const plugin_1 = __importDefault(require("./plugin"));
|
|
33
34
|
var static_1 = require("./static");
|
|
34
35
|
Object.defineProperty(exports, "staticRoutes", { enumerable: true, get: function () { return __importDefault(static_1).default; } });
|
|
35
36
|
var public_1 = require("./public");
|
|
@@ -63,4 +64,5 @@ exports.mainRoutes = [
|
|
|
63
64
|
table_1.default,
|
|
64
65
|
row_1.default,
|
|
65
66
|
migrations_1.default,
|
|
67
|
+
plugin_1.default,
|
|
66
68
|
];
|
|
@@ -0,0 +1,38 @@
|
|
|
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/app.js
CHANGED
|
@@ -60,10 +60,12 @@ const bullboard = require("./automations/bullboard");
|
|
|
60
60
|
const { logAlert } = require("@budibase/backend-core/logging");
|
|
61
61
|
const { pinoSettings } = require("@budibase/backend-core");
|
|
62
62
|
const { Thread } = require("./threads");
|
|
63
|
+
const fs = require("fs");
|
|
63
64
|
const redis_1 = __importDefault(require("./utilities/redis"));
|
|
64
65
|
const migrations = __importStar(require("./migrations"));
|
|
65
66
|
const backend_core_1 = require("@budibase/backend-core");
|
|
66
67
|
const workerRequests_1 = require("./utilities/workerRequests");
|
|
68
|
+
const watch_1 = require("./watch");
|
|
67
69
|
const app = new Koa();
|
|
68
70
|
// set up top level koa middleware
|
|
69
71
|
app.use(koaBody({
|
|
@@ -150,6 +152,13 @@ module.exports = server.listen(env.PORT || 0, () => __awaiter(void 0, void 0, vo
|
|
|
150
152
|
}
|
|
151
153
|
}
|
|
152
154
|
}
|
|
155
|
+
// monitor plugin directory if required
|
|
156
|
+
if (env.SELF_HOSTED &&
|
|
157
|
+
!env.MULTI_TENANCY &&
|
|
158
|
+
env.PLUGINS_DIR &&
|
|
159
|
+
fs.existsSync(env.PLUGINS_DIR)) {
|
|
160
|
+
(0, watch_1.watch)();
|
|
161
|
+
}
|
|
153
162
|
// check for version updates
|
|
154
163
|
yield backend_core_1.installation.checkInstallVersion();
|
|
155
164
|
// done last - this will never complete
|
|
@@ -10,16 +10,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
const { processEvent } = require("./utils");
|
|
12
12
|
const { queue, shutdown } = require("./bullboard");
|
|
13
|
-
const { TRIGGER_DEFINITIONS } = require("./triggers");
|
|
13
|
+
const { TRIGGER_DEFINITIONS, rebootTrigger } = require("./triggers");
|
|
14
14
|
const { ACTION_DEFINITIONS } = require("./actions");
|
|
15
15
|
/**
|
|
16
16
|
* This module is built purely to kick off the worker farm and manage the inputs/outputs
|
|
17
17
|
*/
|
|
18
18
|
exports.init = function () {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
// this promise will not complete
|
|
21
|
+
const promise = queue.process((job) => __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
yield processEvent(job);
|
|
23
|
+
}));
|
|
24
|
+
// on init we need to trigger any reboot automations
|
|
25
|
+
yield rebootTrigger();
|
|
26
|
+
return promise;
|
|
27
|
+
});
|
|
23
28
|
};
|
|
24
29
|
exports.getQueues = () => {
|
|
25
30
|
return [queue];
|
|
@@ -19,23 +19,28 @@ const { checkTestFlag } = require("../utilities/redis");
|
|
|
19
19
|
const utils = require("./utils");
|
|
20
20
|
const env = require("../environment");
|
|
21
21
|
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
|
|
22
|
+
const { getAllApps } = require("@budibase/backend-core/db");
|
|
22
23
|
const TRIGGER_DEFINITIONS = definitions;
|
|
23
24
|
const JOB_OPTS = {
|
|
24
25
|
removeOnComplete: true,
|
|
25
26
|
removeOnFail: true,
|
|
26
27
|
};
|
|
28
|
+
function getAllAutomations() {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
const db = getAppDB();
|
|
31
|
+
let automations = yield db.allDocs(getAutomationParams(null, { include_docs: true }));
|
|
32
|
+
return automations.rows.map(row => row.doc);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
27
35
|
function queueRelevantRowAutomations(event, eventType) {
|
|
28
36
|
return __awaiter(this, void 0, void 0, function* () {
|
|
29
37
|
if (event.appId == null) {
|
|
30
38
|
throw `No appId specified for ${eventType} - check event emitters.`;
|
|
31
39
|
}
|
|
32
40
|
doInAppContext(event.appId, () => __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
|
|
34
|
-
let automations = yield db.allDocs(getAutomationParams(null, { include_docs: true }));
|
|
41
|
+
let automations = yield getAllAutomations();
|
|
35
42
|
// filter down to the correct event type
|
|
36
|
-
automations = automations.
|
|
37
|
-
.map(automation => automation.doc)
|
|
38
|
-
.filter(automation => {
|
|
43
|
+
automations = automations.filter(automation => {
|
|
39
44
|
const trigger = automation.definition.trigger;
|
|
40
45
|
return trigger && trigger.event === eventType;
|
|
41
46
|
});
|
|
@@ -109,4 +114,33 @@ exports.externalTrigger = function (automation, params, { getResponses } = {}) {
|
|
|
109
114
|
}
|
|
110
115
|
});
|
|
111
116
|
};
|
|
117
|
+
exports.rebootTrigger = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
118
|
+
// reboot cron option is only available on the main thread at
|
|
119
|
+
// startup and only usable in self host
|
|
120
|
+
if (env.isInThread() || !env.SELF_HOSTED) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// iterate through all production apps, find the reboot crons
|
|
124
|
+
// and trigger events for them
|
|
125
|
+
const appIds = yield getAllApps({ dev: false, idsOnly: true });
|
|
126
|
+
for (let prodAppId of appIds) {
|
|
127
|
+
yield doInAppContext(prodAppId, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
128
|
+
let automations = yield getAllAutomations();
|
|
129
|
+
let rebootEvents = [];
|
|
130
|
+
for (let automation of automations) {
|
|
131
|
+
if (utils.isRebootTrigger(automation)) {
|
|
132
|
+
const job = {
|
|
133
|
+
automation,
|
|
134
|
+
event: {
|
|
135
|
+
appId: prodAppId,
|
|
136
|
+
timestamp: Date.now(),
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
rebootEvents.push(queue.add(job, JOB_OPTS));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
yield Promise.all(rebootEvents);
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
});
|
|
112
146
|
exports.TRIGGER_DEFINITIONS = TRIGGER_DEFINITIONS;
|