@budibase/server 1.0.211 → 1.0.212-alpha.2
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/builder/assets/index.44dea5cc.js +1312 -0
- package/builder/assets/index.c6912819.css +6 -0
- package/builder/index.html +2 -2
- package/coverage/clover.xml +296 -263
- package/coverage/coverage-final.json +10 -10
- 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 +9 -6
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +111 -12
- package/coverage/lcov-report/api/controllers/index.html +21 -21
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- 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 +47 -17
- package/coverage/lcov-report/api/controllers/row/index.html +22 -22
- 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 +17 -8
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- 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 +1 -1
- 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 +5 -2
- 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 +57 -12
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +17 -17
- 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 +4 -4
- 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 +10 -10
- 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 +1 -1
- package/coverage/lcov-report/db/utils.js.html +9 -6
- 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 +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/threads/automation.js.html +2 -2
- package/coverage/lcov-report/threads/index.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +1 -1
- package/coverage/lcov-report/threads/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +1 -1
- package/coverage/lcov-report/utilities/index.html +15 -15
- package/coverage/lcov-report/utilities/index.js.html +27 -9
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- 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 +1 -1
- 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 +504 -449
- package/dist/api/controllers/application.js +1 -1
- package/dist/api/controllers/backup.js +3 -2
- package/dist/api/controllers/dev.js +25 -2
- package/dist/api/controllers/row/external.js +19 -7
- package/dist/api/controllers/row/utils.js +3 -0
- package/dist/api/controllers/static/index.js +31 -2
- package/dist/api/routes/dev.js +2 -1
- package/dist/api/routes/static.js +1 -0
- package/dist/automations/automationUtils.js +16 -4
- package/dist/automations/triggers.js +1 -1
- package/dist/db/utils.js +1 -0
- package/dist/definitions/datasource.js +1 -0
- package/dist/environment.js +1 -1
- package/dist/integrations/airtable.js +1 -0
- package/dist/integrations/arangodb.js +1 -0
- package/dist/integrations/base/sql.js +20 -3
- package/dist/integrations/couchdb.js +1 -0
- package/dist/integrations/dynamodb.js +1 -0
- package/dist/integrations/elasticsearch.js +1 -0
- package/dist/integrations/firebase.js +1 -0
- package/dist/integrations/googlesheets.js +1 -0
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/microsoftSqlServer.js +2 -1
- package/dist/integrations/mongodb.js +1 -0
- package/dist/integrations/mysql.js +2 -1
- package/dist/integrations/oracle.js +1 -0
- package/dist/integrations/postgres.js +2 -1
- package/dist/integrations/redis.js +1 -0
- package/dist/integrations/rest.js +1 -0
- package/dist/integrations/s3.js +1 -0
- package/dist/integrations/snowflake.js +102 -0
- package/dist/package.json +7 -6
- package/dist/threads/automation.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +16 -6
- package/dist/utilities/fileSystem/utilities.js +2 -1
- package/dist/utilities/index.js +5 -1
- package/package.json +8 -7
- package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
- package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +23 -0
- package/scripts/integrations/oracle/instantclient/linux/install.sh +10 -0
- package/src/api/controllers/application.ts +5 -1
- package/src/api/controllers/backup.js +3 -2
- package/src/api/controllers/dev.js +35 -2
- package/src/api/controllers/row/external.js +19 -9
- package/src/api/controllers/row/utils.js +3 -0
- package/src/api/controllers/static/index.js +41 -2
- package/src/api/routes/dev.js +1 -0
- package/src/api/routes/static.ts +1 -0
- package/src/automations/automationUtils.js +19 -4
- package/src/automations/triggers.js +1 -1
- package/src/db/utils.js +1 -0
- package/src/definitions/common.ts +1 -0
- package/src/definitions/datasource.ts +2 -0
- package/src/environment.js +2 -1
- package/src/integrations/airtable.ts +1 -0
- package/src/integrations/arangodb.ts +1 -0
- package/src/integrations/base/sql.ts +25 -11
- package/src/integrations/couchdb.ts +1 -0
- package/src/integrations/dynamodb.ts +1 -0
- package/src/integrations/elasticsearch.ts +1 -0
- package/src/integrations/firebase.ts +1 -0
- package/src/integrations/googlesheets.ts +1 -0
- package/src/integrations/index.ts +4 -0
- package/src/integrations/microsoftSqlServer.ts +2 -0
- package/src/integrations/mongodb.ts +1 -0
- package/src/integrations/mysql.ts +2 -0
- package/src/integrations/oracle.ts +1 -0
- package/src/integrations/postgres.ts +2 -0
- package/src/integrations/redis.ts +1 -0
- package/src/integrations/rest.ts +1 -0
- package/src/integrations/s3.ts +1 -0
- package/src/integrations/snowflake.ts +99 -0
- package/src/threads/automation.js +1 -1
- package/src/utilities/fileSystem/index.js +22 -8
- package/src/utilities/fileSystem/utilities.js +2 -0
- package/src/utilities/index.js +7 -1
- package/builder/assets/index.24307ca0.css +0 -6
- package/builder/assets/index.4c5e5a40.js +0 -1315
|
@@ -17,7 +17,7 @@ const { ObjectStoreBuckets } = require("../../constants");
|
|
|
17
17
|
const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, } = require("./utilities");
|
|
18
18
|
const { updateClientLibrary } = require("./clientLibrary");
|
|
19
19
|
const env = require("../../environment");
|
|
20
|
-
const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, } = require("../../db/utils");
|
|
20
|
+
const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, TABLE_ROW_PREFIX, } = require("../../db/utils");
|
|
21
21
|
const MemoryStream = require("memorystream");
|
|
22
22
|
const { getAppId } = require("@budibase/backend-core/context");
|
|
23
23
|
const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
|
|
@@ -98,6 +98,17 @@ exports.apiFileReturn = contents => {
|
|
|
98
98
|
fs.writeFileSync(path, contents);
|
|
99
99
|
return fs.createReadStream(path);
|
|
100
100
|
};
|
|
101
|
+
exports.defineFilter = excludeRows => {
|
|
102
|
+
if (excludeRows) {
|
|
103
|
+
return doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
|
|
104
|
+
doc._id.includes(LINK_USER_METADATA_PREFIX) ||
|
|
105
|
+
doc._id.includes(TABLE_ROW_PREFIX));
|
|
106
|
+
}
|
|
107
|
+
else if (!excludeRows) {
|
|
108
|
+
return doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
|
|
109
|
+
doc._id.includes(LINK_USER_METADATA_PREFIX));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
101
112
|
/**
|
|
102
113
|
* Local utility to back up the database state for an app, excluding global user
|
|
103
114
|
* data or user relationships.
|
|
@@ -105,9 +116,8 @@ exports.apiFileReturn = contents => {
|
|
|
105
116
|
* @param {object} config Config to send to export DB
|
|
106
117
|
* @returns {*} either a string or a stream of the backup
|
|
107
118
|
*/
|
|
108
|
-
const backupAppData = (appId, config) => __awaiter(void 0, void 0, void 0, function* () {
|
|
109
|
-
return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter:
|
|
110
|
-
doc._id.includes(LINK_USER_METADATA_PREFIX)) }));
|
|
119
|
+
const backupAppData = (appId, config, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
|
|
120
|
+
return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: exports.defineFilter(includeRows) }));
|
|
111
121
|
});
|
|
112
122
|
/**
|
|
113
123
|
* Takes a copy of the database state for an app to the object store.
|
|
@@ -123,8 +133,8 @@ exports.performBackup = (appId, backupName) => __awaiter(void 0, void 0, void 0,
|
|
|
123
133
|
* @param {string} appId The ID of the app which is to be backed up.
|
|
124
134
|
* @returns {*} a readable stream of the backup which is written in real time
|
|
125
135
|
*/
|
|
126
|
-
exports.streamBackup = (appId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
127
|
-
return yield backupAppData(appId, { stream: true });
|
|
136
|
+
exports.streamBackup = (appId, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
|
|
137
|
+
return yield backupAppData(appId, { stream: true }, includeRows);
|
|
128
138
|
});
|
|
129
139
|
/**
|
|
130
140
|
* Exports a DB to either file or a variable (memory).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const { ObjectStore, makeSureBucketExists, upload, deleteFiles, streamUpload, retrieve, retrieveToTmp, deleteFolder, uploadDirectory, downloadTarball, } = require("@budibase/backend-core/objectStore");
|
|
2
|
+
const { ObjectStore, makeSureBucketExists, upload, deleteFiles, streamUpload, retrieve, retrieveToTmp, deleteFolder, uploadDirectory, downloadTarball, downloadTarballDirect, } = require("@budibase/backend-core/objectStore");
|
|
3
3
|
/***********************************
|
|
4
4
|
* NOTE *
|
|
5
5
|
* This file purely exists so that *
|
|
@@ -17,4 +17,5 @@ exports.retrieveToTmp = retrieveToTmp;
|
|
|
17
17
|
exports.deleteFolder = deleteFolder;
|
|
18
18
|
exports.uploadDirectory = uploadDirectory;
|
|
19
19
|
exports.downloadTarball = downloadTarball;
|
|
20
|
+
exports.downloadTarballDirect = downloadTarballDirect;
|
|
20
21
|
exports.deleteFiles = deleteFiles;
|
package/dist/utilities/index.js
CHANGED
|
@@ -57,8 +57,12 @@ exports.objectStoreUrl = () => {
|
|
|
57
57
|
* @return {string} The URL to be inserted into appPackage response or server rendered
|
|
58
58
|
* app index file.
|
|
59
59
|
*/
|
|
60
|
-
exports.clientLibraryPath = (appId, version) => {
|
|
60
|
+
exports.clientLibraryPath = (appId, version, ctx) => {
|
|
61
61
|
if (env.isProd()) {
|
|
62
|
+
// TODO: remove - for beta testing UI
|
|
63
|
+
if (ctx && ctx.cookies.get("beta:design_ui")) {
|
|
64
|
+
return "https://cdn.budi.live/beta:design_ui/budibase-client.js";
|
|
65
|
+
}
|
|
62
66
|
let url = `${exports.objectStoreUrl()}/${sanitizeKey(appId)}/budibase-client.js`;
|
|
63
67
|
// append app version to bust the cache
|
|
64
68
|
if (version) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.212-alpha.2",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -77,10 +77,11 @@
|
|
|
77
77
|
"license": "GPL-3.0",
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@apidevtools/swagger-parser": "10.0.3",
|
|
80
|
-
"@budibase/backend-core": "^1.0.
|
|
81
|
-
"@budibase/client": "^1.0.
|
|
82
|
-
"@budibase/pro": "1.0.
|
|
83
|
-
"@budibase/string-templates": "^1.0.
|
|
80
|
+
"@budibase/backend-core": "^1.0.212-alpha.2",
|
|
81
|
+
"@budibase/client": "^1.0.212-alpha.2",
|
|
82
|
+
"@budibase/pro": "1.0.212-alpha.1",
|
|
83
|
+
"@budibase/string-templates": "^1.0.212-alpha.2",
|
|
84
|
+
"@budibase/types": "^1.0.212-alpha.2",
|
|
84
85
|
"@bull-board/api": "3.7.0",
|
|
85
86
|
"@bull-board/koa": "3.9.4",
|
|
86
87
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -135,6 +136,7 @@
|
|
|
135
136
|
"pouchdb-replication-stream": "1.2.9",
|
|
136
137
|
"redis": "4",
|
|
137
138
|
"server-destroy": "1.0.1",
|
|
139
|
+
"snowflake-promise": "^4.5.0",
|
|
138
140
|
"svelte": "3.44.1",
|
|
139
141
|
"swagger-parser": "10.0.3",
|
|
140
142
|
"to-json-schema": "0.2.5",
|
|
@@ -150,7 +152,6 @@
|
|
|
150
152
|
"@babel/core": "7.17.4",
|
|
151
153
|
"@babel/preset-env": "7.16.11",
|
|
152
154
|
"@budibase/standard-components": "^0.9.139",
|
|
153
|
-
"@budibase/types": "^1.0.211",
|
|
154
155
|
"@jest/test-sequencer": "24.9.0",
|
|
155
156
|
"@types/apidoc": "0.50.0",
|
|
156
157
|
"@types/bson": "4.2.0",
|
|
@@ -194,5 +195,5 @@
|
|
|
194
195
|
"optionalDependencies": {
|
|
195
196
|
"oracledb": "5.3.0"
|
|
196
197
|
},
|
|
197
|
-
"gitHead": "
|
|
198
|
+
"gitHead": "fd7ab042b5b5525160be8849102b661d8be4cf90"
|
|
198
199
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Must be root to continue
|
|
4
|
+
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
|
|
5
|
+
|
|
6
|
+
# Allow for re-runs
|
|
7
|
+
rm -rf /opt/oracle
|
|
8
|
+
|
|
9
|
+
echo "Installing oracle instant client"
|
|
10
|
+
|
|
11
|
+
# copy and unzip package
|
|
12
|
+
mkdir -p /opt/oracle
|
|
13
|
+
cp scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip /opt/oracle
|
|
14
|
+
cd /opt/oracle
|
|
15
|
+
unzip -qq basiclite-19.10.zip -d .
|
|
16
|
+
rm *.zip
|
|
17
|
+
mv instantclient* instantclient
|
|
18
|
+
|
|
19
|
+
# update runtime link path
|
|
20
|
+
sh -c "echo /opt/oracle/instantclient > /etc/ld.so.conf.d/oracle-instantclient.conf"
|
|
21
|
+
ldconfig /etc/ld.so.conf.d
|
|
22
|
+
|
|
23
|
+
echo "Installation complete"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"
|
|
3
|
+
if [[ $TARGETARCH == arm* ]] ;
|
|
4
|
+
then
|
|
5
|
+
echo "Installing ARM Oracle instant client..."
|
|
6
|
+
$SCRIPT_DIR/arm64/install.sh
|
|
7
|
+
else
|
|
8
|
+
echo "Installing x86-64 Oracle instant client..."
|
|
9
|
+
$SCRIPT_DIR/x86-64/install.sh
|
|
10
|
+
fi
|
|
@@ -227,7 +227,11 @@ export const fetchAppPackage = async (ctx: any) => {
|
|
|
227
227
|
application,
|
|
228
228
|
screens,
|
|
229
229
|
layouts,
|
|
230
|
-
clientLibPath: clientLibraryPath(
|
|
230
|
+
clientLibPath: clientLibraryPath(
|
|
231
|
+
ctx.params.appId,
|
|
232
|
+
application.version,
|
|
233
|
+
ctx
|
|
234
|
+
),
|
|
231
235
|
}
|
|
232
236
|
}
|
|
233
237
|
|
|
@@ -3,11 +3,12 @@ const { events, context } = require("@budibase/backend-core")
|
|
|
3
3
|
const { DocumentTypes } = require("../../db/utils")
|
|
4
4
|
|
|
5
5
|
exports.exportAppDump = async function (ctx) {
|
|
6
|
-
|
|
6
|
+
let { appId, excludeRows } = ctx.query
|
|
7
7
|
const appName = decodeURI(ctx.query.appname)
|
|
8
|
+
excludeRows = excludeRows === "true"
|
|
8
9
|
const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
|
|
9
10
|
ctx.attachment(backupIdentifier)
|
|
10
|
-
ctx.body = await streamBackup(appId)
|
|
11
|
+
ctx.body = await streamBackup(appId, excludeRows)
|
|
11
12
|
|
|
12
13
|
await context.doInAppContext(appId, async () => {
|
|
13
14
|
const appDb = context.getAppDB()
|
|
@@ -3,8 +3,12 @@ const env = require("../../environment")
|
|
|
3
3
|
const { checkSlashesInUrl } = require("../../utilities")
|
|
4
4
|
const { request } = require("../../utilities/workerRequests")
|
|
5
5
|
const { clearLock } = require("../../utilities/redis")
|
|
6
|
-
const {
|
|
7
|
-
|
|
6
|
+
const {
|
|
7
|
+
Replication,
|
|
8
|
+
getProdAppID,
|
|
9
|
+
dangerousGetDB,
|
|
10
|
+
} = require("@budibase/backend-core/db")
|
|
11
|
+
const { DocumentTypes, getRowParams } = require("../../db/utils")
|
|
8
12
|
const { app: appCache } = require("@budibase/backend-core/cache")
|
|
9
13
|
const { getProdAppDB, getAppDB } = require("@budibase/backend-core/context")
|
|
10
14
|
const { events } = require("@budibase/backend-core")
|
|
@@ -133,3 +137,32 @@ exports.getBudibaseVersion = async ctx => {
|
|
|
133
137
|
}
|
|
134
138
|
await events.installation.versionChecked(version)
|
|
135
139
|
}
|
|
140
|
+
|
|
141
|
+
// TODO: remove as part of beta program
|
|
142
|
+
exports.checkBetaAccess = async ctx => {
|
|
143
|
+
const userToCheck = ctx.query.email
|
|
144
|
+
const BETA_USERS_DB = "app_bb_f9b77d06b9db4e3ca185476ab87a2364"
|
|
145
|
+
const BETA_USERS_TABLE = "ta_8c2c6df1c03f49cfb6340e85e066dd15"
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const db = dangerousGetDB(BETA_USERS_DB)
|
|
149
|
+
const betaUsers = (
|
|
150
|
+
await db.allDocs(
|
|
151
|
+
getRowParams(BETA_USERS_TABLE, null, {
|
|
152
|
+
include_docs: true,
|
|
153
|
+
})
|
|
154
|
+
)
|
|
155
|
+
).rows.map(row => row.doc)
|
|
156
|
+
|
|
157
|
+
let access = false
|
|
158
|
+
for (let betaUser of betaUsers) {
|
|
159
|
+
if (betaUser["Email address"].trim() === userToCheck) {
|
|
160
|
+
access = true
|
|
161
|
+
break
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
ctx.body = { access }
|
|
165
|
+
} catch (err) {
|
|
166
|
+
ctx.body = { access: false }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -155,34 +155,44 @@ exports.validate = async () => {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
exports.exportRows = async ctx => {
|
|
158
|
-
const { datasourceId
|
|
158
|
+
const { datasourceId } = breakExternalTableId(ctx.params.tableId)
|
|
159
159
|
const db = getAppDB()
|
|
160
|
-
|
|
160
|
+
const format = ctx.query.format
|
|
161
|
+
const { columns } = ctx.request.body
|
|
161
162
|
const datasource = await db.get(datasourceId)
|
|
162
163
|
if (!datasource || !datasource.entities) {
|
|
163
164
|
ctx.throw(400, "Datasource has not been configured for plus API.")
|
|
164
165
|
}
|
|
165
|
-
const tables = datasource.entities
|
|
166
|
-
const table = tables[tableName]
|
|
167
166
|
ctx.request.body = {
|
|
168
167
|
query: {
|
|
169
168
|
oneOf: {
|
|
170
|
-
|
|
171
|
-
id => breakRowIdField(id)[0]
|
|
172
|
-
),
|
|
169
|
+
_id: ctx.request.body.rows.map(row => JSON.parse(decodeURI(row))[0]),
|
|
173
170
|
},
|
|
174
171
|
},
|
|
175
172
|
}
|
|
176
173
|
|
|
177
174
|
let result = await exports.search(ctx)
|
|
175
|
+
let rows = []
|
|
176
|
+
|
|
177
|
+
// Filter data to only specified columns if required
|
|
178
|
+
if (columns && columns.length) {
|
|
179
|
+
for (let i = 0; i < result.rows.length; i++) {
|
|
180
|
+
rows[i] = {}
|
|
181
|
+
for (let column of columns) {
|
|
182
|
+
rows[i][column] = result.rows[i][column]
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
rows = result.rows
|
|
187
|
+
}
|
|
178
188
|
|
|
179
|
-
let headers = Object.keys(
|
|
189
|
+
let headers = Object.keys(rows[0])
|
|
180
190
|
const exporter = exporters[format]
|
|
181
191
|
const filename = `export.${format}`
|
|
182
192
|
|
|
183
193
|
// send down the file
|
|
184
194
|
ctx.attachment(filename)
|
|
185
|
-
return apiFileReturn(exporter(headers,
|
|
195
|
+
return apiFileReturn(exporter(headers, rows))
|
|
186
196
|
}
|
|
187
197
|
|
|
188
198
|
exports.fetchEnrichedRow = async ctx => {
|
|
@@ -64,6 +64,9 @@ exports.validate = async ({ tableId, row, table }) => {
|
|
|
64
64
|
// Validate.js doesn't seem to handle array
|
|
65
65
|
if (type === FieldTypes.ARRAY && row[fieldName]) {
|
|
66
66
|
if (row[fieldName].length) {
|
|
67
|
+
if (!Array.isArray(row[fieldName])) {
|
|
68
|
+
row[fieldName] = row[fieldName].split(",")
|
|
69
|
+
}
|
|
67
70
|
row[fieldName].map(val => {
|
|
68
71
|
if (
|
|
69
72
|
!constraints.inclusion.includes(val) &&
|
|
@@ -16,9 +16,15 @@ const { upload } = require("../../../utilities/fileSystem")
|
|
|
16
16
|
const { attachmentsRelativeURL } = require("../../../utilities")
|
|
17
17
|
const { DocumentTypes, isDevAppID } = require("../../../db/utils")
|
|
18
18
|
const { getAppDB, getAppId } = require("@budibase/backend-core/context")
|
|
19
|
+
const { setCookie, clearCookie } = require("@budibase/backend-core/utils")
|
|
19
20
|
const AWS = require("aws-sdk")
|
|
20
21
|
const { events } = require("@budibase/backend-core")
|
|
21
22
|
|
|
23
|
+
const fs = require("fs")
|
|
24
|
+
const {
|
|
25
|
+
downloadTarballDirect,
|
|
26
|
+
} = require("../../../utilities/fileSystem/utilities")
|
|
27
|
+
|
|
22
28
|
async function prepareUpload({ s3Key, bucket, metadata, file }) {
|
|
23
29
|
const response = await upload({
|
|
24
30
|
bucket,
|
|
@@ -38,8 +44,41 @@ async function prepareUpload({ s3Key, bucket, metadata, file }) {
|
|
|
38
44
|
}
|
|
39
45
|
}
|
|
40
46
|
|
|
47
|
+
exports.toggleBetaUiFeature = async function (ctx) {
|
|
48
|
+
const cookieName = `beta:${ctx.params.feature}`
|
|
49
|
+
|
|
50
|
+
if (ctx.cookies.get(cookieName)) {
|
|
51
|
+
clearCookie(ctx, cookieName)
|
|
52
|
+
ctx.body = {
|
|
53
|
+
message: `${ctx.params.feature} disabled`,
|
|
54
|
+
}
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let builderPath = resolve(TOP_LEVEL_PATH, "new_design_ui")
|
|
59
|
+
|
|
60
|
+
// // download it from S3
|
|
61
|
+
if (!fs.existsSync(builderPath)) {
|
|
62
|
+
fs.mkdirSync(builderPath)
|
|
63
|
+
}
|
|
64
|
+
await downloadTarballDirect(
|
|
65
|
+
"https://cdn.budi.live/beta:design_ui/new_ui.tar.gz",
|
|
66
|
+
builderPath
|
|
67
|
+
)
|
|
68
|
+
setCookie(ctx, {}, cookieName)
|
|
69
|
+
|
|
70
|
+
ctx.body = {
|
|
71
|
+
message: `${ctx.params.feature} enabled`,
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
41
75
|
exports.serveBuilder = async function (ctx) {
|
|
42
|
-
|
|
76
|
+
// Temporary: New Design UI
|
|
77
|
+
const designUiCookie = ctx.cookies.get("beta:design_ui")
|
|
78
|
+
// TODO: get this from the tmp Dir that we downloaded from MinIO
|
|
79
|
+
const uiPath = designUiCookie ? "new_design_ui" : "builder"
|
|
80
|
+
|
|
81
|
+
let builderPath = resolve(TOP_LEVEL_PATH, uiPath)
|
|
43
82
|
await send(ctx, ctx.file, { root: builderPath })
|
|
44
83
|
if (!ctx.file.includes("assets/")) {
|
|
45
84
|
await events.serve.servedBuilder()
|
|
@@ -78,7 +117,7 @@ exports.serveApp = async function (ctx) {
|
|
|
78
117
|
title: appInfo.name,
|
|
79
118
|
production: env.isProd(),
|
|
80
119
|
appId,
|
|
81
|
-
clientLibPath: clientLibraryPath(appId, appInfo.version),
|
|
120
|
+
clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
|
|
82
121
|
})
|
|
83
122
|
|
|
84
123
|
const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`)
|
package/src/api/routes/dev.js
CHANGED
|
@@ -22,5 +22,6 @@ router
|
|
|
22
22
|
.get("/api/dev/version", authorized(BUILDER), controller.getBudibaseVersion)
|
|
23
23
|
.delete("/api/dev/:appId/lock", authorized(BUILDER), controller.clearLock)
|
|
24
24
|
.post("/api/dev/:appId/revert", authorized(BUILDER), controller.revert)
|
|
25
|
+
.get("/api/beta/access", controller.checkBetaAccess)
|
|
25
26
|
|
|
26
27
|
module.exports = router
|
package/src/api/routes/static.ts
CHANGED
|
@@ -38,6 +38,7 @@ router
|
|
|
38
38
|
// TODO: for now this builder endpoint is not authorized/secured, will need to be
|
|
39
39
|
.get("/builder/:file*", controller.serveBuilder)
|
|
40
40
|
.post("/api/attachments/process", authorized(BUILDER), controller.uploadFile)
|
|
41
|
+
.post("/api/beta/:feature", controller.toggleBetaUiFeature)
|
|
41
42
|
.post(
|
|
42
43
|
"/api/attachments/:tableId/upload",
|
|
43
44
|
paramResource("tableId"),
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
const { getTable } = require("../api/controllers/table/utils")
|
|
2
|
-
const {
|
|
2
|
+
const {
|
|
3
|
+
findHBSBlocks,
|
|
4
|
+
decodeJSBinding,
|
|
5
|
+
isJSBinding,
|
|
6
|
+
encodeJSBinding,
|
|
7
|
+
} = require("@budibase/string-templates")
|
|
3
8
|
|
|
4
9
|
/**
|
|
5
10
|
* When values are input to the system generally they will be of type string as this is required for template strings.
|
|
@@ -77,11 +82,21 @@ exports.getError = err => {
|
|
|
77
82
|
}
|
|
78
83
|
|
|
79
84
|
exports.substituteLoopStep = (hbsString, substitute) => {
|
|
80
|
-
let blocks =
|
|
85
|
+
let blocks = []
|
|
86
|
+
let checkForJS = isJSBinding(hbsString)
|
|
87
|
+
if (checkForJS) {
|
|
88
|
+
hbsString = decodeJSBinding(hbsString)
|
|
89
|
+
blocks.push(hbsString)
|
|
90
|
+
} else {
|
|
91
|
+
blocks = findHBSBlocks(hbsString)
|
|
92
|
+
}
|
|
81
93
|
for (let block of blocks) {
|
|
82
|
-
let oldBlock = block
|
|
83
94
|
block = block.replace(/loop/, substitute)
|
|
84
|
-
|
|
95
|
+
if (checkForJS) {
|
|
96
|
+
hbsString = encodeJSBinding(block)
|
|
97
|
+
} else {
|
|
98
|
+
hbsString = block
|
|
99
|
+
}
|
|
85
100
|
}
|
|
86
101
|
|
|
87
102
|
return hbsString
|
|
@@ -97,7 +97,7 @@ exports.externalTrigger = async function (
|
|
|
97
97
|
// values are likely to be submitted as strings, so we shall convert to correct type
|
|
98
98
|
const coercedFields = {}
|
|
99
99
|
const fields = automation.definition.trigger.inputs.fields
|
|
100
|
-
for (let key of Object.keys(fields)) {
|
|
100
|
+
for (let key of Object.keys(fields || {})) {
|
|
101
101
|
coercedFields[key] = coerce(params.fields[key], fields[key])
|
|
102
102
|
}
|
|
103
103
|
params.fields = coercedFields
|
package/src/db/utils.js
CHANGED
|
@@ -74,6 +74,7 @@ exports.isDevAppID = isDevAppID
|
|
|
74
74
|
exports.isProdAppID = isProdAppID
|
|
75
75
|
exports.USER_METDATA_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
|
76
76
|
exports.LINK_USER_METADATA_PREFIX = `${DocumentTypes.LINK}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
|
77
|
+
exports.TABLE_ROW_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${DocumentTypes.TABLE}`
|
|
77
78
|
exports.ViewNames = ViewNames
|
|
78
79
|
exports.InternalTables = InternalTables
|
|
79
80
|
exports.DocumentTypes = DocumentTypes
|
|
@@ -50,6 +50,7 @@ export enum SourceNames {
|
|
|
50
50
|
GOOGLE_SHEETS = "GOOGLE_SHEETS",
|
|
51
51
|
FIRESTORE = "FIRESTORE",
|
|
52
52
|
REDIS = "REDIS",
|
|
53
|
+
SNOWFLAKE = "SNOWFLAKE",
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
export enum IncludeRelationships {
|
|
@@ -93,6 +94,7 @@ export interface Integration {
|
|
|
93
94
|
relationships?: boolean
|
|
94
95
|
description: string
|
|
95
96
|
friendlyName: string
|
|
97
|
+
type?: string
|
|
96
98
|
datasource: {}
|
|
97
99
|
query: {
|
|
98
100
|
[key: string]: QueryDefinition
|
package/src/environment.js
CHANGED
|
@@ -67,7 +67,8 @@ module.exports = {
|
|
|
67
67
|
SALT_ROUNDS: process.env.SALT_ROUNDS,
|
|
68
68
|
LOGGER: process.env.LOGGER,
|
|
69
69
|
LOG_LEVEL: process.env.LOG_LEVEL,
|
|
70
|
-
AUTOMATION_MAX_ITERATIONS:
|
|
70
|
+
AUTOMATION_MAX_ITERATIONS:
|
|
71
|
+
parseIntSafe(process.env.AUTOMATION_MAX_ITERATIONS) || 200,
|
|
71
72
|
SENDGRID_API_KEY: process.env.SENDGRID_API_KEY,
|
|
72
73
|
DYNAMO_ENDPOINT: process.env.DYNAMO_ENDPOINT,
|
|
73
74
|
QUERY_THREAD_TIMEOUT: parseIntSafe(process.env.QUERY_THREAD_TIMEOUT),
|
|
@@ -18,6 +18,7 @@ module AirtableModule {
|
|
|
18
18
|
description:
|
|
19
19
|
"Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet.",
|
|
20
20
|
friendlyName: "Airtable",
|
|
21
|
+
type: "Spreadsheet",
|
|
21
22
|
datasource: {
|
|
22
23
|
apiKey: {
|
|
23
24
|
type: DatasourceFieldTypes.PASSWORD,
|
|
@@ -19,6 +19,7 @@ module ArangoModule {
|
|
|
19
19
|
const SCHEMA: Integration = {
|
|
20
20
|
docs: "https://github.com/arangodb/arangojs",
|
|
21
21
|
friendlyName: "ArangoDB",
|
|
22
|
+
type: "Non-relational",
|
|
22
23
|
description:
|
|
23
24
|
"ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",
|
|
24
25
|
datasource: {
|
|
@@ -89,6 +89,28 @@ function parseFilters(filters: SearchFilters | undefined): SearchFilters {
|
|
|
89
89
|
return filters
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
function generateSelectStatement(
|
|
93
|
+
json: QueryJson,
|
|
94
|
+
knex: Knex
|
|
95
|
+
): (string | Knex.Raw)[] {
|
|
96
|
+
const { resource, meta } = json
|
|
97
|
+
const schema = meta?.table?.schema
|
|
98
|
+
return resource.fields.map(field => {
|
|
99
|
+
const fieldNames = field.split(/\./g)
|
|
100
|
+
const tableName = fieldNames[0]
|
|
101
|
+
const columnName = fieldNames[1]
|
|
102
|
+
if (columnName && knex.client.config.client === SqlClients.POSTGRES) {
|
|
103
|
+
const externalType = schema?.[columnName].externalType
|
|
104
|
+
if (externalType?.includes("money")) {
|
|
105
|
+
return knex.raw(
|
|
106
|
+
`"${tableName}"."${columnName}"::money::numeric as "${field}"`
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return `${field} as ${field}`
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
|
|
92
114
|
class InternalBuilder {
|
|
93
115
|
private readonly client: string
|
|
94
116
|
|
|
@@ -216,9 +238,7 @@ class InternalBuilder {
|
|
|
216
238
|
}
|
|
217
239
|
|
|
218
240
|
addRelationships(
|
|
219
|
-
knex: Knex,
|
|
220
241
|
query: KnexQuery,
|
|
221
|
-
fields: string | string[],
|
|
222
242
|
fromTable: string,
|
|
223
243
|
relationships: RelationshipsJson[] | undefined
|
|
224
244
|
): KnexQuery {
|
|
@@ -323,12 +343,12 @@ class InternalBuilder {
|
|
|
323
343
|
if (!resource) {
|
|
324
344
|
resource = { fields: [] }
|
|
325
345
|
}
|
|
326
|
-
let selectStatement: string | string[] = "*"
|
|
346
|
+
let selectStatement: string | (string | Knex.Raw)[] = "*"
|
|
327
347
|
// handle select
|
|
328
348
|
if (resource.fields && resource.fields.length > 0) {
|
|
329
349
|
// select the resources as the format "table.columnName" - this is what is provided
|
|
330
350
|
// by the resource builder further up
|
|
331
|
-
selectStatement =
|
|
351
|
+
selectStatement = generateSelectStatement(json, knex)
|
|
332
352
|
}
|
|
333
353
|
let foundLimit = limit || BASE_LIMIT
|
|
334
354
|
// handle pagination
|
|
@@ -363,13 +383,7 @@ class InternalBuilder {
|
|
|
363
383
|
preQuery = this.addSorting(preQuery, json)
|
|
364
384
|
}
|
|
365
385
|
// handle joins
|
|
366
|
-
query = this.addRelationships(
|
|
367
|
-
knex,
|
|
368
|
-
preQuery,
|
|
369
|
-
selectStatement,
|
|
370
|
-
tableName,
|
|
371
|
-
relationships
|
|
372
|
-
)
|
|
386
|
+
query = this.addRelationships(preQuery, tableName, relationships)
|
|
373
387
|
return this.addFilters(query, filters, { relationship: true })
|
|
374
388
|
}
|
|
375
389
|
|
|
@@ -16,6 +16,7 @@ module CouchDBModule {
|
|
|
16
16
|
const SCHEMA: Integration = {
|
|
17
17
|
docs: "https://docs.couchdb.org/en/stable/",
|
|
18
18
|
friendlyName: "CouchDB",
|
|
19
|
+
type: "Non-relational",
|
|
19
20
|
description:
|
|
20
21
|
"Apache CouchDB is an open-source document-oriented NoSQL database, implemented in Erlang.",
|
|
21
22
|
datasource: {
|
|
@@ -21,6 +21,7 @@ module DynamoModule {
|
|
|
21
21
|
description:
|
|
22
22
|
"Amazon DynamoDB is a key-value and document database that delivers single-digit millisecond performance at any scale.",
|
|
23
23
|
friendlyName: "DynamoDB",
|
|
24
|
+
type: "Non-relational",
|
|
24
25
|
datasource: {
|
|
25
26
|
region: {
|
|
26
27
|
type: DatasourceFieldTypes.STRING,
|
|
@@ -17,6 +17,7 @@ module ElasticsearchModule {
|
|
|
17
17
|
description:
|
|
18
18
|
"Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents.",
|
|
19
19
|
friendlyName: "ElasticSearch",
|
|
20
|
+
type: "Non-relational",
|
|
20
21
|
datasource: {
|
|
21
22
|
url: {
|
|
22
23
|
type: DatasourceFieldTypes.STRING,
|
|
@@ -16,6 +16,7 @@ module Firebase {
|
|
|
16
16
|
const SCHEMA: Integration = {
|
|
17
17
|
docs: "https://firebase.google.com/docs/firestore/quickstart",
|
|
18
18
|
friendlyName: "Firestore",
|
|
19
|
+
type: "Non-relational",
|
|
19
20
|
description:
|
|
20
21
|
"Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
|
|
21
22
|
datasource: {
|
|
@@ -12,6 +12,7 @@ const rest = require("./rest")
|
|
|
12
12
|
const googlesheets = require("./googlesheets")
|
|
13
13
|
const firebase = require("./firebase")
|
|
14
14
|
const redis = require("./redis")
|
|
15
|
+
const snowflake = require("./snowflake")
|
|
15
16
|
const { SourceNames } = require("../definitions/datasource")
|
|
16
17
|
const environment = require("../environment")
|
|
17
18
|
|
|
@@ -29,6 +30,7 @@ const DEFINITIONS = {
|
|
|
29
30
|
[SourceNames.REST]: rest.schema,
|
|
30
31
|
[SourceNames.FIRESTORE]: firebase.schema,
|
|
31
32
|
[SourceNames.REDIS]: redis.schema,
|
|
33
|
+
[SourceNames.SNOWFLAKE]: snowflake.schema,
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
const INTEGRATIONS = {
|
|
@@ -46,6 +48,8 @@ const INTEGRATIONS = {
|
|
|
46
48
|
[SourceNames.FIRESTORE]: firebase.integration,
|
|
47
49
|
[SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
|
|
48
50
|
[SourceNames.REDIS]: redis.integration,
|
|
51
|
+
[SourceNames.FIREBASE]: firebase.integration,
|
|
52
|
+
[SourceNames.SNOWFLAKE]: snowflake.integration,
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
// optionally add oracle integration if the oracle binary can be installed
|
|
@@ -44,6 +44,7 @@ module MSSQLModule {
|
|
|
44
44
|
description:
|
|
45
45
|
"Microsoft SQL Server is a relational database management system developed by Microsoft. ",
|
|
46
46
|
friendlyName: "MS SQL Server",
|
|
47
|
+
type: "Relational",
|
|
47
48
|
datasource: {
|
|
48
49
|
user: {
|
|
49
50
|
type: DatasourceFieldTypes.STRING,
|
|
@@ -246,6 +247,7 @@ module MSSQLModule {
|
|
|
246
247
|
autocolumn: !!autoColumns.find((col: string) => col === name),
|
|
247
248
|
name: name,
|
|
248
249
|
...convertSqlType(def.DATA_TYPE),
|
|
250
|
+
externalType: def.DATA_TYPE,
|
|
249
251
|
}
|
|
250
252
|
}
|
|
251
253
|
tables[tableName] = {
|