@budibase/server 1.3.12-alpha.3 → 1.3.14
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.7886c551.css → index.a70e216a.css} +2 -2
- package/builder/assets/index.d8428ac8.js +876 -0
- 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 +335 -355
- 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 +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 +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 +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 +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 +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 +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 +604 -652
- package/dist/api/controllers/application.js +5 -10
- package/dist/api/controllers/backup.js +2 -1
- package/dist/api/controllers/component.js +1 -18
- 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/row/ExternalRequest.js +1 -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/api/routes/static.js +1 -1
- package/dist/app.js +0 -9
- 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 +1 -10
- package/dist/environment.js +0 -1
- 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 +296 -278
- package/dist/integrations/s3.js +64 -61
- package/dist/integrations/snowflake.js +86 -83
- package/dist/package.json +6 -8
- 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 +6 -71
- package/dist/utilities/index.js +8 -0
- package/dist/utilities/rowProcessor/utils.js +1 -1
- package/dist/utilities/usageQuota/rows.js +2 -1
- package/package.json +7 -9
- package/scripts/dev/manage.js +0 -1
- package/src/api/controllers/application.ts +2 -6
- package/src/api/controllers/backup.js +2 -1
- package/src/api/controllers/component.js +2 -25
- 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/row/ExternalRequest.ts +1 -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/static.ts +1 -1
- package/src/api/routes/tests/query.spec.js +28 -11
- package/src/api/routes/tests/static.spec.js +2 -2
- package/src/app.ts +0 -12
- 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 +0 -12
- package/src/definitions/datasource.ts +1 -0
- package/src/environment.js +0 -1
- 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 +330 -312
- 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} +49 -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/automation.ts +6 -0
- package/src/threads/query.ts +2 -2
- package/src/utilities/fileSystem/index.js +6 -75
- package/src/utilities/index.js +8 -0
- package/src/utilities/rowProcessor/utils.js +1 -1
- package/src/utilities/usageQuota/rows.js +2 -1
- package/builder/assets/index.e759397f.js +0 -994
- 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
|
@@ -16,16 +16,12 @@ const { doWithDB, dangerousGetDB, closeDB, } = require("@budibase/backend-core/d
|
|
|
16
16
|
const { ObjectStoreBuckets } = require("../../constants");
|
|
17
17
|
const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, deleteFiles, } = require("./utilities");
|
|
18
18
|
const { updateClientLibrary } = require("./clientLibrary");
|
|
19
|
-
const { checkSlashesInUrl } = require("../");
|
|
20
19
|
const env = require("../../environment");
|
|
21
20
|
const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, TABLE_ROW_PREFIX, } = require("../../db/utils");
|
|
22
21
|
const MemoryStream = require("memorystream");
|
|
23
22
|
const { getAppId } = require("@budibase/backend-core/context");
|
|
24
|
-
const tar = require("tar");
|
|
25
|
-
const fetch = require("node-fetch");
|
|
26
23
|
const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
|
|
27
24
|
const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules");
|
|
28
|
-
const DATASOURCE_PATH = join(budibaseTempDir(), "datasource");
|
|
29
25
|
/**
|
|
30
26
|
* The single stack system (Cloud and Builder) should not make use of the file system where possible,
|
|
31
27
|
* this file handles all of the file access for the system with the intention of limiting it all to one
|
|
@@ -91,12 +87,6 @@ exports.getTemplateStream = (template) => __awaiter(void 0, void 0, void 0, func
|
|
|
91
87
|
exports.loadHandlebarsFile = path => {
|
|
92
88
|
return fs.readFileSync(path, "utf8");
|
|
93
89
|
};
|
|
94
|
-
/**
|
|
95
|
-
* Same as above just with a different name.
|
|
96
|
-
*/
|
|
97
|
-
exports.loadJSFile = (directory, name) => {
|
|
98
|
-
return fs.readFileSync(join(directory, name), "utf8");
|
|
99
|
-
};
|
|
100
90
|
/**
|
|
101
91
|
* When return a file from the API need to write the file to the system temporarily so we
|
|
102
92
|
* can create a read stream to send.
|
|
@@ -120,11 +110,11 @@ exports.defineFilter = excludeRows => {
|
|
|
120
110
|
* data or user relationships.
|
|
121
111
|
* @param {string} appId The app to backup
|
|
122
112
|
* @param {object} config Config to send to export DB
|
|
123
|
-
* @param {boolean}
|
|
113
|
+
* @param {boolean} excludeRows Flag to state whether the export should include data.
|
|
124
114
|
* @returns {*} either a string or a stream of the backup
|
|
125
115
|
*/
|
|
126
|
-
const backupAppData = (appId, config,
|
|
127
|
-
return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: exports.defineFilter(
|
|
116
|
+
const backupAppData = (appId, config, excludeRows) => __awaiter(void 0, void 0, void 0, function* () {
|
|
117
|
+
return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: exports.defineFilter(excludeRows) }));
|
|
128
118
|
});
|
|
129
119
|
/**
|
|
130
120
|
* Takes a copy of the database state for an app to the object store.
|
|
@@ -138,11 +128,11 @@ exports.performBackup = (appId, backupName) => __awaiter(void 0, void 0, void 0,
|
|
|
138
128
|
/**
|
|
139
129
|
* Streams a backup of the database state for an app
|
|
140
130
|
* @param {string} appId The ID of the app which is to be backed up.
|
|
141
|
-
* @param {boolean}
|
|
131
|
+
* @param {boolean} excludeRows Flag to state whether the export should include data.
|
|
142
132
|
* @returns {*} a readable stream of the backup which is written in real time
|
|
143
133
|
*/
|
|
144
|
-
exports.streamBackup = (appId,
|
|
145
|
-
return yield backupAppData(appId, { stream: true },
|
|
134
|
+
exports.streamBackup = (appId, excludeRows) => __awaiter(void 0, void 0, void 0, function* () {
|
|
135
|
+
return yield backupAppData(appId, { stream: true }, excludeRows);
|
|
146
136
|
});
|
|
147
137
|
/**
|
|
148
138
|
* Exports a DB to either file or a variable (memory).
|
|
@@ -295,61 +285,6 @@ exports.cleanup = appIds => {
|
|
|
295
285
|
}
|
|
296
286
|
}
|
|
297
287
|
};
|
|
298
|
-
exports.extractPluginTarball = (file) => __awaiter(void 0, void 0, void 0, function* () {
|
|
299
|
-
if (!file.name.endsWith(".tar.gz")) {
|
|
300
|
-
throw new Error("Plugin must be compressed into a gzipped tarball.");
|
|
301
|
-
}
|
|
302
|
-
const path = join(budibaseTempDir(), file.name.split(".tar.gz")[0]);
|
|
303
|
-
// remove old tmp directories automatically - don't combine
|
|
304
|
-
if (fs.existsSync(path)) {
|
|
305
|
-
fs.rmSync(path, { recursive: true, force: true });
|
|
306
|
-
}
|
|
307
|
-
fs.mkdirSync(path);
|
|
308
|
-
yield tar.extract({
|
|
309
|
-
file: file.path,
|
|
310
|
-
C: path,
|
|
311
|
-
});
|
|
312
|
-
let metadata = {};
|
|
313
|
-
try {
|
|
314
|
-
const pkg = fs.readFileSync(join(path, "package.json"), "utf8");
|
|
315
|
-
const schema = fs.readFileSync(join(path, "schema.json"), "utf8");
|
|
316
|
-
metadata.schema = JSON.parse(schema);
|
|
317
|
-
metadata.package = JSON.parse(pkg);
|
|
318
|
-
}
|
|
319
|
-
catch (err) {
|
|
320
|
-
throw new Error("Unable to process schema.json/package.json in plugin.");
|
|
321
|
-
}
|
|
322
|
-
return { metadata, directory: path };
|
|
323
|
-
});
|
|
324
|
-
exports.getDatasourcePlugin = (name, url, hash) => __awaiter(void 0, void 0, void 0, function* () {
|
|
325
|
-
if (!fs.existsSync(DATASOURCE_PATH)) {
|
|
326
|
-
fs.mkdirSync(DATASOURCE_PATH);
|
|
327
|
-
}
|
|
328
|
-
const filename = join(DATASOURCE_PATH, name);
|
|
329
|
-
const metadataName = `${filename}.bbmetadata`;
|
|
330
|
-
if (fs.existsSync(filename)) {
|
|
331
|
-
const currentHash = fs.readFileSync(metadataName, "utf8");
|
|
332
|
-
// if hash is the same return the file, otherwise remove it and re-download
|
|
333
|
-
if (currentHash === hash) {
|
|
334
|
-
return require(filename);
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
console.log(`Updating plugin: ${name}`);
|
|
338
|
-
fs.unlinkSync(filename);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
const fullUrl = checkSlashesInUrl(`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`);
|
|
342
|
-
const response = yield fetch(fullUrl);
|
|
343
|
-
if (response.status === 200) {
|
|
344
|
-
const content = yield response.text();
|
|
345
|
-
fs.writeFileSync(filename, content);
|
|
346
|
-
fs.writeFileSync(metadataName, hash);
|
|
347
|
-
require(filename);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
throw new Error(`Unable to retrieve plugin - reason: ${yield response.text()}`);
|
|
351
|
-
}
|
|
352
|
-
});
|
|
353
288
|
/**
|
|
354
289
|
* Full function definition for below can be found in the utilities.
|
|
355
290
|
*/
|
package/dist/utilities/index.js
CHANGED
|
@@ -72,7 +72,8 @@ exports.getUniqueRows = (appIds) => __awaiter(void 0, void 0, void 0, function*
|
|
|
72
72
|
// ensure uniqueness on a per app pair basis
|
|
73
73
|
// this can't be done on all rows because app import results in
|
|
74
74
|
// duplicate row ids across apps
|
|
75
|
-
|
|
75
|
+
// the array pre-concat is important to avoid stack overflow
|
|
76
|
+
uniqueRows = uniqueRows.concat([...new Set(appRows)]);
|
|
76
77
|
}
|
|
77
78
|
return uniqueRows;
|
|
78
79
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.14",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"license": "GPL-3.0",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
80
|
-
"@budibase/backend-core": "1.3.
|
|
81
|
-
"@budibase/client": "1.3.
|
|
82
|
-
"@budibase/pro": "1.3.
|
|
83
|
-
"@budibase/string-templates": "1.3.
|
|
84
|
-
"@budibase/types": "1.3.
|
|
80
|
+
"@budibase/backend-core": "^1.3.14",
|
|
81
|
+
"@budibase/client": "^1.3.14",
|
|
82
|
+
"@budibase/pro": "1.3.13",
|
|
83
|
+
"@budibase/string-templates": "^1.3.14",
|
|
84
|
+
"@budibase/types": "^1.3.14",
|
|
85
85
|
"@bull-board/api": "3.7.0",
|
|
86
86
|
"@bull-board/koa": "3.9.4",
|
|
87
87
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -95,7 +95,6 @@
|
|
|
95
95
|
"bcryptjs": "2.4.3",
|
|
96
96
|
"bull": "4.8.5",
|
|
97
97
|
"chmodr": "1.2.0",
|
|
98
|
-
"chokidar": "^3.5.3",
|
|
99
98
|
"csvtojson": "2.0.10",
|
|
100
99
|
"curlconverter": "3.21.0",
|
|
101
100
|
"dotenv": "8.2.0",
|
|
@@ -141,7 +140,6 @@
|
|
|
141
140
|
"snowflake-promise": "^4.5.0",
|
|
142
141
|
"svelte": "3.49.0",
|
|
143
142
|
"swagger-parser": "10.0.3",
|
|
144
|
-
"tar": "^6.1.11",
|
|
145
143
|
"to-json-schema": "0.2.5",
|
|
146
144
|
"uuid": "3.3.2",
|
|
147
145
|
"validate.js": "0.13.1",
|
|
@@ -198,5 +196,5 @@
|
|
|
198
196
|
"optionalDependencies": {
|
|
199
197
|
"oracledb": "5.3.0"
|
|
200
198
|
},
|
|
201
|
-
"gitHead": "
|
|
199
|
+
"gitHead": "a38626cf662d66aa8c04fb1d42dc7bc353ce7c31"
|
|
202
200
|
}
|
package/scripts/dev/manage.js
CHANGED
|
@@ -553,11 +553,7 @@ export const sync = async (ctx: any, next: any) => {
|
|
|
553
553
|
})
|
|
554
554
|
let error
|
|
555
555
|
try {
|
|
556
|
-
await replication.replicate(
|
|
557
|
-
filter: function (doc: any) {
|
|
558
|
-
return doc._id !== DocumentType.APP_METADATA
|
|
559
|
-
},
|
|
560
|
-
})
|
|
556
|
+
await replication.replicate(replication.appReplicateOpts())
|
|
561
557
|
} catch (err) {
|
|
562
558
|
error = err
|
|
563
559
|
} finally {
|
|
@@ -576,7 +572,7 @@ export const sync = async (ctx: any, next: any) => {
|
|
|
576
572
|
}
|
|
577
573
|
}
|
|
578
574
|
|
|
579
|
-
|
|
575
|
+
const updateAppPackage = async (appPackage: any, appId: any) => {
|
|
580
576
|
return context.doInAppContext(appId, async () => {
|
|
581
577
|
const db = context.getAppDB()
|
|
582
578
|
const application = await db.get(DocumentType.APP_METADATA)
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
const { streamBackup } = require("../../utilities/fileSystem")
|
|
2
2
|
const { events, context } = require("@budibase/backend-core")
|
|
3
3
|
const { DocumentType } = require("../../db/utils")
|
|
4
|
+
const { isQsTrue } = require("../../utilities")
|
|
4
5
|
|
|
5
6
|
exports.exportAppDump = async function (ctx) {
|
|
6
7
|
let { appId, excludeRows } = ctx.query
|
|
7
8
|
const appName = decodeURI(ctx.query.appname)
|
|
8
|
-
excludeRows = excludeRows
|
|
9
|
+
excludeRows = isQsTrue(excludeRows)
|
|
9
10
|
const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
|
|
10
11
|
ctx.attachment(backupIdentifier)
|
|
11
12
|
ctx.body = await streamBackup(appId, excludeRows)
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
const { DocumentType
|
|
1
|
+
const { DocumentType } = require("../../db/utils")
|
|
2
2
|
const { getComponentLibraryManifest } = require("../../utilities/fileSystem")
|
|
3
3
|
const { getAppDB } = require("@budibase/backend-core/context")
|
|
4
|
-
const { getGlobalDB } = require("@budibase/backend-core/tenancy")
|
|
5
|
-
const env = require("../../environment")
|
|
6
4
|
|
|
7
5
|
exports.fetchAppComponentDefinitions = async function (ctx) {
|
|
8
6
|
try {
|
|
@@ -12,6 +10,7 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
|
|
|
12
10
|
let componentManifests = await Promise.all(
|
|
13
11
|
app.componentLibraries.map(async library => {
|
|
14
12
|
let manifest = await getComponentLibraryManifest(library)
|
|
13
|
+
|
|
15
14
|
return {
|
|
16
15
|
manifest,
|
|
17
16
|
library,
|
|
@@ -32,28 +31,6 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
|
|
|
32
31
|
}
|
|
33
32
|
}
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
// for now custom components only supported in self-host
|
|
37
|
-
if (env.SELF_HOSTED) {
|
|
38
|
-
// Add custom components
|
|
39
|
-
const globalDB = getGlobalDB()
|
|
40
|
-
const response = await globalDB.allDocs(
|
|
41
|
-
getPluginParams(null, {
|
|
42
|
-
include_docs: true,
|
|
43
|
-
})
|
|
44
|
-
)
|
|
45
|
-
response.rows
|
|
46
|
-
.map(row => row.doc)
|
|
47
|
-
.filter(plugin => plugin.schema.type === "component")
|
|
48
|
-
.forEach(plugin => {
|
|
49
|
-
const fullComponentName = `plugin/${plugin.name}`
|
|
50
|
-
definitions[fullComponentName] = {
|
|
51
|
-
component: fullComponentName,
|
|
52
|
-
...plugin.schema.schema,
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
|
-
|
|
57
34
|
ctx.body = definitions
|
|
58
35
|
} catch (err) {
|
|
59
36
|
console.error(`component-definitions=failed`, err)
|
|
@@ -7,7 +7,7 @@ const {
|
|
|
7
7
|
getTableParams,
|
|
8
8
|
} = require("../../db/utils")
|
|
9
9
|
const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
|
|
10
|
-
const {
|
|
10
|
+
const { integrations } = require("../../integrations")
|
|
11
11
|
const { getDatasourceAndQuery } = require("./row/utils")
|
|
12
12
|
const { invalidateDynamicVariables } = require("../../threads/utils")
|
|
13
13
|
const { getAppDB } = require("@budibase/backend-core/context")
|
|
@@ -114,7 +114,7 @@ exports.update = async function (ctx) {
|
|
|
114
114
|
|
|
115
115
|
// Drain connection pools when configuration is changed
|
|
116
116
|
if (datasource.source) {
|
|
117
|
-
const source =
|
|
117
|
+
const source = integrations[datasource.source]
|
|
118
118
|
if (source && source.pool) {
|
|
119
119
|
await source.pool.end()
|
|
120
120
|
}
|
|
@@ -149,7 +149,7 @@ exports.save = async function (ctx) {
|
|
|
149
149
|
|
|
150
150
|
// Drain connection pools when configuration is changed
|
|
151
151
|
if (datasource.source) {
|
|
152
|
-
const source =
|
|
152
|
+
const source = integrations[datasource.source]
|
|
153
153
|
if (source && source.pool) {
|
|
154
154
|
await source.pool.end()
|
|
155
155
|
}
|
|
@@ -218,7 +218,7 @@ function updateError(error, newError, tables) {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
const buildSchemaHelper = async datasource => {
|
|
221
|
-
const Connector =
|
|
221
|
+
const Connector = integrations[datasource.source]
|
|
222
222
|
|
|
223
223
|
// Connect to the DB and build the schema
|
|
224
224
|
const connector = new Connector(datasource.config)
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
getAppId,
|
|
16
16
|
getAppDB,
|
|
17
17
|
getProdAppDB,
|
|
18
|
+
getDevAppDB,
|
|
18
19
|
} from "@budibase/backend-core/context"
|
|
19
20
|
import { quotas } from "@budibase/pro"
|
|
20
21
|
import { events } from "@budibase/backend-core"
|
|
@@ -110,17 +111,29 @@ async function deployApp(deployment: any) {
|
|
|
110
111
|
target: productionAppId,
|
|
111
112
|
}
|
|
112
113
|
replication = new Replication(config)
|
|
113
|
-
|
|
114
|
+
const devDb = getDevAppDB()
|
|
115
|
+
console.log("Compacting development DB")
|
|
116
|
+
await devDb.compact()
|
|
114
117
|
console.log("Replication object created")
|
|
115
|
-
await replication.replicate()
|
|
118
|
+
await replication.replicate(replication.appReplicateOpts())
|
|
116
119
|
console.log("replication complete.. replacing app meta doc")
|
|
120
|
+
// app metadata is excluded as it is likely to be in conflict
|
|
121
|
+
// replicate the app metadata document manually
|
|
117
122
|
const db = getProdAppDB()
|
|
118
|
-
const appDoc = await
|
|
123
|
+
const appDoc = await devDb.get(DocumentType.APP_METADATA)
|
|
124
|
+
try {
|
|
125
|
+
const prodAppDoc = await db.get(DocumentType.APP_METADATA)
|
|
126
|
+
appDoc._rev = prodAppDoc._rev
|
|
127
|
+
} catch (err) {
|
|
128
|
+
delete appDoc._rev
|
|
129
|
+
}
|
|
119
130
|
|
|
131
|
+
// switch to production app ID
|
|
120
132
|
deployment.appUrl = appDoc.url
|
|
121
|
-
|
|
122
133
|
appDoc.appId = productionAppId
|
|
123
134
|
appDoc.instance._id = productionAppId
|
|
135
|
+
// remove automation errors if they exist
|
|
136
|
+
delete appDoc.automationErrors
|
|
124
137
|
await db.put(appDoc)
|
|
125
138
|
await appCache.invalidateAppMetadata(productionAppId)
|
|
126
139
|
console.log("New app doc written successfully.")
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const { cloneDeep } = require("lodash")
|
|
2
|
+
const { definitions } = require("../../integrations")
|
|
2
3
|
const { SourceName } = require("@budibase/types")
|
|
3
4
|
const googlesheets = require("../../integrations/googlesheets")
|
|
4
5
|
const { featureFlags } = require("@budibase/backend-core")
|
|
5
6
|
|
|
6
7
|
exports.fetch = async function (ctx) {
|
|
7
8
|
ctx.status = 200
|
|
8
|
-
const defs =
|
|
9
|
+
const defs = cloneDeep(definitions)
|
|
9
10
|
|
|
10
11
|
// for google sheets integration google verification
|
|
11
12
|
if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
|
|
@@ -16,7 +17,6 @@ exports.fetch = async function (ctx) {
|
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
exports.find = async function (ctx) {
|
|
19
|
-
const defs = await getDefinitions()
|
|
20
20
|
ctx.status = 200
|
|
21
|
-
ctx.body =
|
|
21
|
+
ctx.body = definitions[ctx.params.type]
|
|
22
22
|
}
|
|
@@ -534,7 +534,7 @@ module External {
|
|
|
534
534
|
})
|
|
535
535
|
// this is the response from knex if no rows found
|
|
536
536
|
const rows = !response[0].read ? response : []
|
|
537
|
-
const storeTo = isMany ? field.throughFrom || linkPrimaryKey :
|
|
537
|
+
const storeTo = isMany ? field.throughFrom || linkPrimaryKey : fieldName
|
|
538
538
|
related[storeTo] = { rows, isMany, tableId }
|
|
539
539
|
}
|
|
540
540
|
return related
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
const {
|
|
2
|
-
getScreenParams,
|
|
3
|
-
generateScreenID,
|
|
4
|
-
getPluginParams,
|
|
5
|
-
DocumentType,
|
|
6
|
-
} = require("../../db/utils")
|
|
1
|
+
const { getScreenParams, generateScreenID } = require("../../db/utils")
|
|
7
2
|
const { AccessController } = require("@budibase/backend-core/roles")
|
|
8
3
|
const { getAppDB } = require("@budibase/backend-core/context")
|
|
9
4
|
const { events } = require("@budibase/backend-core")
|
|
10
|
-
const { getGlobalDB } = require("@budibase/backend-core/tenancy")
|
|
11
|
-
const { updateAppPackage } = require("./application")
|
|
12
5
|
|
|
13
6
|
exports.fetch = async ctx => {
|
|
14
7
|
const db = getAppDB()
|
|
@@ -39,47 +32,6 @@ exports.save = async ctx => {
|
|
|
39
32
|
|
|
40
33
|
const response = await db.put(screen)
|
|
41
34
|
|
|
42
|
-
// Find any custom components being used
|
|
43
|
-
let pluginNames = []
|
|
44
|
-
let pluginAdded = false
|
|
45
|
-
findPlugins(screen.props, pluginNames)
|
|
46
|
-
if (pluginNames.length) {
|
|
47
|
-
const globalDB = getGlobalDB()
|
|
48
|
-
const pluginsResponse = await globalDB.allDocs(
|
|
49
|
-
getPluginParams(null, {
|
|
50
|
-
include_docs: true,
|
|
51
|
-
})
|
|
52
|
-
)
|
|
53
|
-
const requiredPlugins = pluginsResponse.rows
|
|
54
|
-
.map(row => row.doc)
|
|
55
|
-
.filter(plugin => {
|
|
56
|
-
return (
|
|
57
|
-
plugin.schema.type === "component" &&
|
|
58
|
-
pluginNames.includes(`plugin/${plugin.name}`)
|
|
59
|
-
)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
// Update the app metadata
|
|
63
|
-
const application = await db.get(DocumentType.APP_METADATA)
|
|
64
|
-
let usedPlugins = application.usedPlugins || []
|
|
65
|
-
|
|
66
|
-
requiredPlugins.forEach(plugin => {
|
|
67
|
-
if (!usedPlugins.find(x => x._id === plugin._id)) {
|
|
68
|
-
pluginAdded = true
|
|
69
|
-
usedPlugins.push({
|
|
70
|
-
_id: plugin._id,
|
|
71
|
-
name: plugin.name,
|
|
72
|
-
version: plugin.version,
|
|
73
|
-
jsUrl: plugin.jsUrl,
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
if (pluginAdded) {
|
|
79
|
-
await updateAppPackage({ usedPlugins }, ctx.appId)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
35
|
if (eventFn) {
|
|
84
36
|
await eventFn(screen)
|
|
85
37
|
}
|
|
@@ -88,7 +40,6 @@ exports.save = async ctx => {
|
|
|
88
40
|
...screen,
|
|
89
41
|
_id: response.id,
|
|
90
42
|
_rev: response.rev,
|
|
91
|
-
pluginAdded,
|
|
92
43
|
}
|
|
93
44
|
}
|
|
94
45
|
|
|
@@ -105,18 +56,3 @@ exports.destroy = async ctx => {
|
|
|
105
56
|
}
|
|
106
57
|
ctx.status = 200
|
|
107
58
|
}
|
|
108
|
-
|
|
109
|
-
const findPlugins = (component, foundPlugins) => {
|
|
110
|
-
if (!component) {
|
|
111
|
-
return
|
|
112
|
-
}
|
|
113
|
-
if (component._component.startsWith("plugin")) {
|
|
114
|
-
if (!foundPlugins.includes(component._component)) {
|
|
115
|
-
foundPlugins.push(component._component)
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (!component._children || !component._children.length) {
|
|
119
|
-
return
|
|
120
|
-
}
|
|
121
|
-
component._children.forEach(child => findPlugins(child, foundPlugins))
|
|
122
|
-
}
|
|
@@ -113,7 +113,6 @@ export const serveApp = async function (ctx: any) {
|
|
|
113
113
|
production: env.isProd(),
|
|
114
114
|
appId,
|
|
115
115
|
clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
|
|
116
|
-
usedPlugins: appInfo.usedPlugins,
|
|
117
116
|
})
|
|
118
117
|
|
|
119
118
|
const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`)
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
export let favicon = ""
|
|
4
4
|
|
|
5
5
|
export let clientLibPath
|
|
6
|
-
export let usedPlugins
|
|
7
6
|
</script>
|
|
8
7
|
|
|
9
8
|
<svelte:head>
|
|
@@ -84,15 +83,6 @@
|
|
|
84
83
|
</script>
|
|
85
84
|
<script type="application/javascript" src={clientLibPath}>
|
|
86
85
|
</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}
|
|
96
86
|
<script type="application/javascript">
|
|
97
87
|
if (window.loadBudibase) {
|
|
98
88
|
window.loadBudibase()
|
|
@@ -66,8 +66,7 @@
|
|
|
66
66
|
customTheme,
|
|
67
67
|
previewDevice,
|
|
68
68
|
navigation,
|
|
69
|
-
hiddenComponentIds
|
|
70
|
-
usedPlugins
|
|
69
|
+
hiddenComponentIds
|
|
71
70
|
} = parsed
|
|
72
71
|
|
|
73
72
|
// Set some flags so the app knows we're in the builder
|
|
@@ -82,7 +81,6 @@
|
|
|
82
81
|
window["##BUDIBASE_PREVIEW_DEVICE##"] = previewDevice
|
|
83
82
|
window["##BUDIBASE_PREVIEW_NAVIGATION##"] = navigation
|
|
84
83
|
window["##BUDIBASE_HIDDEN_COMPONENT_IDS##"] = hiddenComponentIds
|
|
85
|
-
window["##BUDIBASE_USED_PLUGINS##"] = usedPlugins
|
|
86
84
|
|
|
87
85
|
// Initialise app
|
|
88
86
|
try {
|
package/src/api/routes/index.ts
CHANGED
|
@@ -24,7 +24,6 @@ import metadataRoutes from "./metadata"
|
|
|
24
24
|
import devRoutes from "./dev"
|
|
25
25
|
import cloudRoutes from "./cloud"
|
|
26
26
|
import migrationRoutes from "./migrations"
|
|
27
|
-
import pluginRoutes from "./plugin"
|
|
28
27
|
|
|
29
28
|
export { default as staticRoutes } from "./static"
|
|
30
29
|
export { default as publicRoutes } from "./public"
|
|
@@ -58,5 +57,4 @@ export const mainRoutes = [
|
|
|
58
57
|
tableRoutes,
|
|
59
58
|
rowRoutes,
|
|
60
59
|
migrationRoutes,
|
|
61
|
-
pluginRoutes,
|
|
62
60
|
]
|
package/src/api/routes/static.ts
CHANGED
|
@@ -56,7 +56,7 @@ router
|
|
|
56
56
|
authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
|
|
57
57
|
controller.deleteObjects
|
|
58
58
|
)
|
|
59
|
-
.get("/preview", authorized(BUILDER), controller.serveBuilderPreview)
|
|
59
|
+
.get("/app/preview", authorized(BUILDER), controller.serveBuilderPreview)
|
|
60
60
|
.get("/:appId/:path*", controller.serveApp)
|
|
61
61
|
.get("/app/:appUrl/:path*", controller.serveApp)
|
|
62
62
|
.post(
|
|
@@ -231,6 +231,20 @@ describe("/queries", () => {
|
|
|
231
231
|
url: `/api/queries/preview`,
|
|
232
232
|
})
|
|
233
233
|
})
|
|
234
|
+
|
|
235
|
+
it("should fail with invalid integration type", async () => {
|
|
236
|
+
const { datasource } = await createInvalidIntegration()
|
|
237
|
+
await request
|
|
238
|
+
.post(`/api/queries/preview`)
|
|
239
|
+
.send({
|
|
240
|
+
datasourceId: datasource._id,
|
|
241
|
+
parameters: {},
|
|
242
|
+
fields: {},
|
|
243
|
+
queryVerb: "read",
|
|
244
|
+
})
|
|
245
|
+
.set(config.defaultHeaders())
|
|
246
|
+
.expect(400)
|
|
247
|
+
})
|
|
234
248
|
})
|
|
235
249
|
|
|
236
250
|
describe("execute", () => {
|
|
@@ -247,14 +261,17 @@ describe("/queries", () => {
|
|
|
247
261
|
})
|
|
248
262
|
|
|
249
263
|
it("should fail with invalid integration type", async () => {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
264
|
+
const { query, datasource } = await createInvalidIntegration()
|
|
265
|
+
await request
|
|
266
|
+
.post(`/api/queries/${query._id}`)
|
|
267
|
+
.send({
|
|
268
|
+
datasourceId: datasource._id,
|
|
269
|
+
parameters: {},
|
|
270
|
+
fields: {},
|
|
271
|
+
queryVerb: "read",
|
|
272
|
+
})
|
|
273
|
+
.set(config.defaultHeaders())
|
|
274
|
+
.expect(400)
|
|
258
275
|
})
|
|
259
276
|
})
|
|
260
277
|
|
|
@@ -294,7 +311,7 @@ describe("/queries", () => {
|
|
|
294
311
|
"url": "string",
|
|
295
312
|
"value": "string"
|
|
296
313
|
})
|
|
297
|
-
expect(res.body.rows[0].url).toContain("doctype
|
|
314
|
+
expect(res.body.rows[0].url).toContain("doctype%20html")
|
|
298
315
|
})
|
|
299
316
|
|
|
300
317
|
it("check that it automatically retries on fail with cached dynamics", async () => {
|
|
@@ -379,7 +396,7 @@ describe("/queries", () => {
|
|
|
379
396
|
"queryHdr": userDetails.firstName,
|
|
380
397
|
"secondHdr" : "1234"
|
|
381
398
|
})
|
|
382
|
-
expect(res.body.rows[0].url).toEqual("http://www.google.com?email=" + userDetails.email)
|
|
399
|
+
expect(res.body.rows[0].url).toEqual("http://www.google.com?email=" + userDetails.email.replace("@", "%40"))
|
|
383
400
|
})
|
|
384
401
|
|
|
385
402
|
it("should bind the current user to query parameters", async () => {
|
|
@@ -396,7 +413,7 @@ describe("/queries", () => {
|
|
|
396
413
|
"testParam" : "1234"
|
|
397
414
|
})
|
|
398
415
|
|
|
399
|
-
expect(res.body.rows[0].url).toEqual("http://www.google.com?test=" + userDetails.email +
|
|
416
|
+
expect(res.body.rows[0].url).toEqual("http://www.google.com?test=" + userDetails.email.replace("@", "%40") +
|
|
400
417
|
"&testName=" + userDetails.firstName + "&testParam=1234")
|
|
401
418
|
})
|
|
402
419
|
|
|
@@ -150,14 +150,14 @@ describe("/static", () => {
|
|
|
150
150
|
})
|
|
151
151
|
})
|
|
152
152
|
|
|
153
|
-
describe("/preview", () => {
|
|
153
|
+
describe("/app/preview", () => {
|
|
154
154
|
beforeEach(() => {
|
|
155
155
|
jest.clearAllMocks()
|
|
156
156
|
})
|
|
157
157
|
|
|
158
158
|
it("should serve the builder preview", async () => {
|
|
159
159
|
const headers = config.defaultHeaders()
|
|
160
|
-
const res = await request.get(`/preview`).set(headers).expect(200)
|
|
160
|
+
const res = await request.get(`/app/preview`).set(headers).expect(200)
|
|
161
161
|
|
|
162
162
|
expect(res.body.appId).toBe(config.appId)
|
|
163
163
|
expect(res.body.builderPreview).toBe(true)
|