@@ -158,7 +166,7 @@
>
diff --git a/packages/server/src/api/controllers/datasource.js b/packages/server/src/api/controllers/datasource.js
index 8b9b765a5f..36d345912e 100644
--- a/packages/server/src/api/controllers/datasource.js
+++ b/packages/server/src/api/controllers/datasource.js
@@ -7,7 +7,7 @@ const {
getTableParams,
} = require("../../db/utils")
const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
-const { integrations } = require("../../integrations")
+const { getIntegration } = require("../../integrations")
const { getDatasourceAndQuery } = require("./row/utils")
const { invalidateDynamicVariables } = require("../../threads/utils")
const { getAppDB } = require("@budibase/backend-core/context")
@@ -114,7 +114,7 @@ exports.update = async function (ctx) {
// Drain connection pools when configuration is changed
if (datasource.source) {
- const source = integrations[datasource.source]
+ const source = await getIntegration(datasource.source)
if (source && source.pool) {
await source.pool.end()
}
@@ -149,7 +149,7 @@ exports.save = async function (ctx) {
// Drain connection pools when configuration is changed
if (datasource.source) {
- const source = integrations[datasource.source]
+ const source = await getIntegration(datasource.source)
if (source && source.pool) {
await source.pool.end()
}
@@ -218,7 +218,7 @@ function updateError(error, newError, tables) {
}
const buildSchemaHelper = async datasource => {
- const Connector = integrations[datasource.source]
+ const Connector = await getIntegration(datasource.source)
// Connect to the DB and build the schema
const connector = new Connector(datasource.config)
diff --git a/packages/server/src/integrations/base/query.ts b/packages/server/src/integrations/base/query.ts
index 1f3ed3dd74..7435b28141 100644
--- a/packages/server/src/integrations/base/query.ts
+++ b/packages/server/src/integrations/base/query.ts
@@ -1,11 +1,11 @@
import { QueryJson, Datasource } from "@budibase/types"
-const { integrations } = require("../index")
+const { getIntegration } = require("../index")
export async function makeExternalQuery(
datasource: Datasource,
json: QueryJson
) {
- const Integration = integrations[datasource.source]
+ const Integration = await getIntegration(datasource.source)
// query is the opinionated function
if (Integration.prototype.query) {
const integration = new Integration(datasource.config)
diff --git a/packages/server/src/integrations/index.ts b/packages/server/src/integrations/index.ts
index bde7235ac8..bf267e46cc 100644
--- a/packages/server/src/integrations/index.ts
+++ b/packages/server/src/integrations/index.ts
@@ -67,8 +67,22 @@ if (environment.SELF_HOSTED) {
module.exports = {
getDefinitions: async () => {
- const custom = await getPlugins(PluginType.DATASOURCE)
- return cloneDeep(DEFINITIONS)
+ const plugins = await getPlugins(PluginType.DATASOURCE)
+ // extract the actual schema from each custom
+ const pluginSchemas: { [key: string]: Integration } = {}
+ for (let plugin of plugins) {
+ const sourceId = plugin.name
+ pluginSchemas[sourceId] = {
+ ...plugin.schema["schema"],
+ custom: true,
+ }
+ }
+ return {
+ ...cloneDeep(DEFINITIONS),
+ ...pluginSchemas,
+ }
+ },
+ getIntegration: async () => {
+ return INTEGRATIONS
},
- integrations: INTEGRATIONS,
}
diff --git a/packages/server/src/threads/query.ts b/packages/server/src/threads/query.ts
index 6b93a00200..86cbf89c87 100644
--- a/packages/server/src/threads/query.ts
+++ b/packages/server/src/threads/query.ts
@@ -2,7 +2,7 @@ import { default as threadUtils } from "./utils"
threadUtils.threadSetup()
import { WorkerCallback, QueryEvent, QueryVariable } from "./definitions"
const ScriptRunner = require("../utilities/scriptRunner")
-const { integrations } = require("../integrations")
+const { getIntegration } = require("../integrations")
const { processStringSync } = require("@budibase/string-templates")
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
const {
@@ -62,7 +62,7 @@ class QueryRunner {
let datasourceClone = cloneDeep(datasource)
let fieldsClone = cloneDeep(fields)
- const Integration = integrations[datasourceClone.source]
+ const Integration = await getIntegration(datasourceClone.source)
if (!Integration) {
throw "Integration type does not exist."
}