@budibase/server 2.6.19-alpha.0 → 2.6.20

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.
Files changed (64) hide show
  1. package/builder/assets/{index.b9eeb2a8.js → index.69c5c1ea.js} +318 -310
  2. package/builder/assets/{index.07382a47.css → index.86c992bf.css} +2 -2
  3. package/builder/index.html +2 -2
  4. package/dist/api/controllers/datasource.js +39 -70
  5. package/dist/api/controllers/integration.js +2 -2
  6. package/dist/api/routes/datasource.js +0 -1
  7. package/dist/automations/steps/make.js +5 -19
  8. package/dist/automations/steps/zapier.js +6 -19
  9. package/dist/db/dynamoClient.js +1 -1
  10. package/dist/integrations/airtable.js +2 -28
  11. package/dist/integrations/arangodb.js +3 -19
  12. package/dist/integrations/couchdb.js +1 -16
  13. package/dist/integrations/dynamodb.js +0 -16
  14. package/dist/integrations/elasticsearch.js +0 -15
  15. package/dist/integrations/firebase.js +0 -15
  16. package/dist/integrations/googlesheets.js +1 -30
  17. package/dist/integrations/index.js +2 -5
  18. package/dist/integrations/microsoftSqlServer.js +0 -16
  19. package/dist/integrations/mongodb.js +0 -16
  20. package/dist/integrations/mysql.js +5 -21
  21. package/dist/integrations/oracle.js +0 -29
  22. package/dist/integrations/postgres.js +7 -26
  23. package/dist/integrations/redis.js +1 -20
  24. package/dist/integrations/s3.js +4 -23
  25. package/dist/integrations/snowflake.js +0 -15
  26. package/dist/migrations/functions/backfill/app/queries.js +2 -1
  27. package/dist/sdk/app/datasources/datasources.js +3 -10
  28. package/dist/sdk/users/utils.js +30 -23
  29. package/dist/tsconfig.build.tsbuildinfo +1 -1
  30. package/dist/utilities/global.js +1 -4
  31. package/jest.config.ts +3 -3
  32. package/nodemon.json +3 -7
  33. package/package.json +9 -10
  34. package/src/api/controllers/datasource.ts +49 -88
  35. package/src/api/controllers/integration.ts +3 -3
  36. package/src/api/routes/datasource.ts +0 -5
  37. package/src/automations/steps/make.ts +1 -18
  38. package/src/automations/steps/zapier.ts +1 -18
  39. package/src/automations/tests/zapier.spec.js +27 -0
  40. package/src/db/dynamoClient.ts +1 -1
  41. package/src/integration-test/postgres.spec.ts +1 -0
  42. package/src/integrations/airtable.ts +4 -31
  43. package/src/integrations/arangodb.ts +2 -18
  44. package/src/integrations/couchdb.ts +4 -18
  45. package/src/integrations/dynamodb.ts +5 -34
  46. package/src/integrations/elasticsearch.ts +1 -16
  47. package/src/integrations/firebase.ts +0 -15
  48. package/src/integrations/googlesheets.ts +2 -31
  49. package/src/integrations/index.ts +7 -12
  50. package/src/integrations/microsoftSqlServer.ts +0 -16
  51. package/src/integrations/mongodb.ts +0 -16
  52. package/src/integrations/mysql.ts +16 -27
  53. package/src/integrations/oracle.ts +6 -28
  54. package/src/integrations/postgres.ts +3 -21
  55. package/src/integrations/redis.ts +3 -26
  56. package/src/integrations/s3.ts +3 -19
  57. package/src/integrations/snowflake.ts +1 -20
  58. package/src/migrations/functions/backfill/app/queries.ts +1 -1
  59. package/src/sdk/app/datasources/datasources.ts +1 -7
  60. package/src/sdk/users/utils.ts +32 -24
  61. package/src/utilities/global.ts +1 -4
  62. package/tsconfig.json +1 -1
  63. package/src/automations/tests/make.spec.ts +0 -54
  64. package/src/automations/tests/zapier.spec.ts +0 -56
@@ -3,8 +3,6 @@ import {
3
3
  DatasourceFieldType,
4
4
  QueryType,
5
5
  IntegrationBase,
6
- DatasourceFeature,
7
- ConnectionInfo,
8
6
  } from "@budibase/types"
9
7
 
10
8
  import { Client, ClientOptions } from "@elastic/elasticsearch"
@@ -22,7 +20,6 @@ const SCHEMA: Integration = {
22
20
  "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.",
23
21
  friendlyName: "ElasticSearch",
24
22
  type: "Non-relational",
25
- features: [DatasourceFeature.CONNECTION_CHECKING],
26
23
  datasource: {
27
24
  url: {
28
25
  type: DatasourceFieldType.STRING,
@@ -98,7 +95,7 @@ const SCHEMA: Integration = {
98
95
 
99
96
  class ElasticSearchIntegration implements IntegrationBase {
100
97
  private config: ElasticsearchConfig
101
- private client
98
+ private client: any
102
99
 
103
100
  constructor(config: ElasticsearchConfig) {
104
101
  this.config = config
@@ -117,18 +114,6 @@ class ElasticSearchIntegration implements IntegrationBase {
117
114
  this.client = new Client(clientConfig)
118
115
  }
119
116
 
120
- async testConnection(): Promise<ConnectionInfo> {
121
- try {
122
- await this.client.info()
123
- return { connected: true }
124
- } catch (e: any) {
125
- return {
126
- connected: false,
127
- error: e.message as string,
128
- }
129
- }
130
- }
131
-
132
117
  async create(query: { index: string; json: object }) {
133
118
  const { index, json } = query
134
119
 
@@ -3,8 +3,6 @@ import {
3
3
  Integration,
4
4
  QueryType,
5
5
  IntegrationBase,
6
- DatasourceFeature,
7
- ConnectionInfo,
8
6
  } from "@budibase/types"
9
7
  import { Firestore, WhereFilterOp } from "@google-cloud/firestore"
10
8
 
@@ -20,7 +18,6 @@ const SCHEMA: Integration = {
20
18
  type: "Non-relational",
21
19
  description:
22
20
  "Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
23
- features: [DatasourceFeature.CONNECTION_CHECKING],
24
21
  datasource: {
25
22
  email: {
26
23
  type: DatasourceFieldType.STRING,
@@ -102,18 +99,6 @@ class FirebaseIntegration implements IntegrationBase {
102
99
  })
103
100
  }
104
101
 
105
- async testConnection(): Promise<ConnectionInfo> {
106
- try {
107
- await this.client.listCollections()
108
- return { connected: true }
109
- } catch (e: any) {
110
- return {
111
- connected: false,
112
- error: e.message as string,
113
- }
114
- }
115
- }
116
-
117
102
  async create(query: { json: object; extra: { [key: string]: string } }) {
118
103
  try {
119
104
  const documentReference = this.client
@@ -1,6 +1,4 @@
1
1
  import {
2
- ConnectionInfo,
3
- DatasourceFeature,
4
2
  DatasourceFieldType,
5
3
  DatasourcePlus,
6
4
  FieldType,
@@ -17,7 +15,7 @@ import {
17
15
  } from "@budibase/types"
18
16
  import { OAuth2Client } from "google-auth-library"
19
17
  import { buildExternalTableId, finaliseExternalTables } from "./utils"
20
- import { GoogleSpreadsheet, GoogleSpreadsheetRow } from "google-spreadsheet"
18
+ import { GoogleSpreadsheet } from "google-spreadsheet"
21
19
  import fetch from "node-fetch"
22
20
  import { configs, HTTPError } from "@budibase/backend-core"
23
21
  import { dataFilters } from "@budibase/shared-core"
@@ -66,7 +64,6 @@ const SCHEMA: Integration = {
66
64
  "Create and collaborate on online spreadsheets in real-time and from any device. ",
67
65
  friendlyName: "Google Sheets",
68
66
  type: "Spreadsheet",
69
- features: [DatasourceFeature.CONNECTION_CHECKING],
70
67
  datasource: {
71
68
  spreadsheetId: {
72
69
  display: "Google Sheet URL",
@@ -142,19 +139,6 @@ class GoogleSheetsIntegration implements DatasourcePlus {
142
139
  this.client = new GoogleSpreadsheet(spreadsheetId)
143
140
  }
144
141
 
145
- async testConnection(): Promise<ConnectionInfo> {
146
- try {
147
- await this.connect()
148
- await this.client.loadInfo()
149
- return { connected: true }
150
- } catch (e: any) {
151
- return {
152
- connected: false,
153
- error: e.message as string,
154
- }
155
- }
156
- }
157
-
158
142
  getBindingIdentifier() {
159
143
  return ""
160
144
  }
@@ -450,20 +434,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
450
434
  try {
451
435
  await this.connect()
452
436
  const sheet = this.client.sheetsByTitle[query.sheet]
453
- let rows: GoogleSpreadsheetRow[] = []
454
- if (query.paginate) {
455
- const limit = query.paginate.limit || 100
456
- let page: number =
457
- typeof query.paginate.page === "number"
458
- ? query.paginate.page
459
- : parseInt(query.paginate.page || "1")
460
- rows = await sheet.getRows({
461
- limit,
462
- offset: (page - 1) * limit,
463
- })
464
- } else {
465
- rows = await sheet.getRows()
466
- }
437
+ const rows = await sheet.getRows()
467
438
  const filtered = dataFilters.runLuceneQuery(rows, query.filters)
468
439
  const headerValues = sheet.headerValues
469
440
  let response = []
@@ -20,7 +20,7 @@ import env from "../environment"
20
20
  import { cloneDeep } from "lodash"
21
21
  import sdk from "../sdk"
22
22
 
23
- const DEFINITIONS: Record<SourceName, Integration | undefined> = {
23
+ const DEFINITIONS: { [key: string]: Integration } = {
24
24
  [SourceName.POSTGRES]: postgres.schema,
25
25
  [SourceName.DYNAMODB]: dynamodb.schema,
26
26
  [SourceName.MONGODB]: mongodb.schema,
@@ -36,10 +36,9 @@ const DEFINITIONS: Record<SourceName, Integration | undefined> = {
36
36
  [SourceName.GOOGLE_SHEETS]: googlesheets.schema,
37
37
  [SourceName.REDIS]: redis.schema,
38
38
  [SourceName.SNOWFLAKE]: snowflake.schema,
39
- [SourceName.ORACLE]: undefined,
40
39
  }
41
40
 
42
- const INTEGRATIONS: Record<SourceName, any> = {
41
+ const INTEGRATIONS: { [key: string]: any } = {
43
42
  [SourceName.POSTGRES]: postgres.integration,
44
43
  [SourceName.DYNAMODB]: dynamodb.integration,
45
44
  [SourceName.MONGODB]: mongodb.integration,
@@ -56,7 +55,6 @@ const INTEGRATIONS: Record<SourceName, any> = {
56
55
  [SourceName.REDIS]: redis.integration,
57
56
  [SourceName.FIRESTORE]: firebase.integration,
58
57
  [SourceName.SNOWFLAKE]: snowflake.integration,
59
- [SourceName.ORACLE]: undefined,
60
58
  }
61
59
 
62
60
  // optionally add oracle integration if the oracle binary can be installed
@@ -69,13 +67,10 @@ if (
69
67
  INTEGRATIONS[SourceName.ORACLE] = oracle.integration
70
68
  }
71
69
 
72
- export async function getDefinition(
73
- source: SourceName
74
- ): Promise<Integration | undefined> {
70
+ export async function getDefinition(source: SourceName): Promise<Integration> {
75
71
  // check if its integrated, faster
76
- const definition = DEFINITIONS[source]
77
- if (definition) {
78
- return definition
72
+ if (DEFINITIONS[source]) {
73
+ return DEFINITIONS[source]
79
74
  }
80
75
  const allDefinitions = await getDefinitions()
81
76
  return allDefinitions[source]
@@ -103,7 +98,7 @@ export async function getDefinitions() {
103
98
  }
104
99
  }
105
100
 
106
- export async function getIntegration(integration: SourceName) {
101
+ export async function getIntegration(integration: string) {
107
102
  if (INTEGRATIONS[integration]) {
108
103
  return INTEGRATIONS[integration]
109
104
  }
@@ -112,7 +107,7 @@ export async function getIntegration(integration: SourceName) {
112
107
  for (let plugin of plugins) {
113
108
  if (plugin.name === integration) {
114
109
  // need to use commonJS require due to its dynamic runtime nature
115
- const retrieved = await getDatasourcePlugin(plugin)
110
+ const retrieved: any = await getDatasourcePlugin(plugin)
116
111
  if (retrieved.integration) {
117
112
  return retrieved.integration
118
113
  } else {
@@ -8,8 +8,6 @@ import {
8
8
  QueryType,
9
9
  SqlQuery,
10
10
  DatasourcePlus,
11
- DatasourceFeature,
12
- ConnectionInfo,
13
11
  } from "@budibase/types"
14
12
  import {
15
13
  getSqlQuery,
@@ -41,7 +39,6 @@ const SCHEMA: Integration = {
41
39
  "Microsoft SQL Server is a relational database management system developed by Microsoft. ",
42
40
  friendlyName: "MS SQL Server",
43
41
  type: "Relational",
44
- features: [DatasourceFeature.CONNECTION_CHECKING],
45
42
  datasource: {
46
43
  user: {
47
44
  type: DatasourceFieldType.STRING,
@@ -124,19 +121,6 @@ class SqlServerIntegration extends Sql implements DatasourcePlus {
124
121
  }
125
122
  }
126
123
 
127
- async testConnection() {
128
- const response: ConnectionInfo = {
129
- connected: false,
130
- }
131
- try {
132
- await this.connect()
133
- response.connected = true
134
- } catch (e: any) {
135
- response.error = e.message as string
136
- }
137
- return response
138
- }
139
-
140
124
  getBindingIdentifier(): string {
141
125
  return `@p${this.index++}`
142
126
  }
@@ -3,8 +3,6 @@ import {
3
3
  DatasourceFieldType,
4
4
  QueryType,
5
5
  IntegrationBase,
6
- DatasourceFeature,
7
- ConnectionInfo,
8
6
  } from "@budibase/types"
9
7
  import {
10
8
  MongoClient,
@@ -40,7 +38,6 @@ const getSchema = () => {
40
38
  type: "Non-relational",
41
39
  description:
42
40
  "MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
43
- features: [DatasourceFeature.CONNECTION_CHECKING],
44
41
  datasource: {
45
42
  connectionString: {
46
43
  type: DatasourceFieldType.STRING,
@@ -361,19 +358,6 @@ class MongoIntegration implements IntegrationBase {
361
358
  this.client = new MongoClient(config.connectionString, options)
362
359
  }
363
360
 
364
- async testConnection() {
365
- const response: ConnectionInfo = {
366
- connected: false,
367
- }
368
- try {
369
- await this.connect()
370
- response.connected = true
371
- } catch (e: any) {
372
- response.error = e.message as string
373
- }
374
- return response
375
- }
376
-
377
361
  async connect() {
378
362
  return this.client.connect()
379
363
  }
@@ -7,8 +7,6 @@ import {
7
7
  Table,
8
8
  TableSchema,
9
9
  DatasourcePlus,
10
- DatasourceFeature,
11
- ConnectionInfo,
12
10
  } from "@budibase/types"
13
11
  import {
14
12
  getSqlQuery,
@@ -22,11 +20,18 @@ import { NUMBER_REGEX } from "../utilities"
22
20
  import Sql from "./base/sql"
23
21
  import { MySQLColumn } from "./base/types"
24
22
 
25
- import mysql from "mysql2/promise"
23
+ const mysql = require("mysql2/promise")
26
24
 
27
- interface MySQLConfig extends mysql.ConnectionOptions {
25
+ interface MySQLConfig {
26
+ host: string
27
+ port: number
28
+ user: string
29
+ password: string
28
30
  database: string
31
+ ssl?: { [key: string]: any }
29
32
  rejectUnauthorized: boolean
33
+ typeCast: Function
34
+ multipleStatements: boolean
30
35
  }
31
36
 
32
37
  const SCHEMA: Integration = {
@@ -36,7 +41,6 @@ const SCHEMA: Integration = {
36
41
  type: "Relational",
37
42
  description:
38
43
  "MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
39
- features: [DatasourceFeature.CONNECTION_CHECKING],
40
44
  datasource: {
41
45
  host: {
42
46
  type: DatasourceFieldType.STRING,
@@ -88,6 +92,8 @@ const SCHEMA: Integration = {
88
92
  },
89
93
  }
90
94
 
95
+ const TimezoneAwareDateTypes = ["timestamp"]
96
+
91
97
  function bindingTypeCoerce(bindings: any[]) {
92
98
  for (let i = 0; i < bindings.length; i++) {
93
99
  const binding = bindings[i]
@@ -114,7 +120,7 @@ function bindingTypeCoerce(bindings: any[]) {
114
120
 
115
121
  class MySQLIntegration extends Sql implements DatasourcePlus {
116
122
  private config: MySQLConfig
117
- private client?: mysql.Connection
123
+ private client: any
118
124
  public tables: Record<string, Table> = {}
119
125
  public schemaErrors: Record<string, string> = {}
120
126
 
@@ -128,8 +134,7 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
128
134
  if (
129
135
  config.rejectUnauthorized != null &&
130
136
  !config.rejectUnauthorized &&
131
- config.ssl &&
132
- typeof config.ssl !== "string"
137
+ config.ssl
133
138
  ) {
134
139
  config.ssl.rejectUnauthorized = config.rejectUnauthorized
135
140
  }
@@ -155,22 +160,6 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
155
160
  }
156
161
  }
157
162
 
158
- async testConnection() {
159
- const response: ConnectionInfo = {
160
- connected: false,
161
- }
162
- try {
163
- const [result] = await this.internalQuery(
164
- { sql: "SELECT 1+1 AS checkRes" },
165
- { connect: true }
166
- )
167
- response.connected = result?.checkRes == 2
168
- } catch (e: any) {
169
- response.error = e.message as string
170
- }
171
- return response
172
- }
173
-
174
163
  getBindingIdentifier(): string {
175
164
  return "?"
176
165
  }
@@ -184,7 +173,7 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
184
173
  }
185
174
 
186
175
  async disconnect() {
187
- await this.client!.end()
176
+ await this.client.end()
188
177
  }
189
178
 
190
179
  async internalQuery(
@@ -203,10 +192,10 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
203
192
  ? baseBindings
204
193
  : bindingTypeCoerce(baseBindings)
205
194
  // Node MySQL is callback based, so we must wrap our call in a promise
206
- const response = await this.client!.query(query.sql, bindings)
195
+ const response = await this.client.query(query.sql, bindings)
207
196
  return response[0]
208
197
  } finally {
209
- if (opts?.connect && this.client) {
198
+ if (opts?.connect) {
210
199
  await this.disconnect()
211
200
  }
212
201
  }
@@ -7,8 +7,6 @@ import {
7
7
  SqlQuery,
8
8
  Table,
9
9
  DatasourcePlus,
10
- DatasourceFeature,
11
- ConnectionInfo,
12
10
  } from "@budibase/types"
13
11
  import {
14
12
  buildExternalTableId,
@@ -26,7 +24,12 @@ import {
26
24
  ExecuteOptions,
27
25
  Result,
28
26
  } from "oracledb"
29
- import { OracleTable, OracleColumn, OracleColumnsResponse } from "./base/types"
27
+ import {
28
+ OracleTable,
29
+ OracleColumn,
30
+ OracleColumnsResponse,
31
+ OracleConstraint,
32
+ } from "./base/types"
30
33
  let oracledb: any
31
34
  try {
32
35
  oracledb = require("oracledb")
@@ -50,7 +53,6 @@ const SCHEMA: Integration = {
50
53
  type: "Relational",
51
54
  description:
52
55
  "Oracle Database is an object-relational database management system developed by Oracle Corporation",
53
- features: [DatasourceFeature.CONNECTION_CHECKING],
54
56
  datasource: {
55
57
  host: {
56
58
  type: DatasourceFieldType.STRING,
@@ -323,30 +325,6 @@ class OracleIntegration extends Sql implements DatasourcePlus {
323
325
  this.schemaErrors = final.errors
324
326
  }
325
327
 
326
- async testConnection() {
327
- const response: ConnectionInfo = {
328
- connected: false,
329
- }
330
- let connection
331
- try {
332
- connection = await this.getConnection()
333
- response.connected = true
334
- } catch (err: any) {
335
- response.connected = false
336
- response.error = err.message
337
- } finally {
338
- if (connection) {
339
- try {
340
- await connection.close()
341
- } catch (err: any) {
342
- response.connected = false
343
- response.error = err.message
344
- }
345
- }
346
- }
347
- return response
348
- }
349
-
350
328
  private async internalQuery<T>(query: SqlQuery): Promise<Result<T>> {
351
329
  let connection
352
330
  try {
@@ -6,8 +6,6 @@ import {
6
6
  SqlQuery,
7
7
  Table,
8
8
  DatasourcePlus,
9
- DatasourceFeature,
10
- ConnectionInfo,
11
9
  } from "@budibase/types"
12
10
  import {
13
11
  getSqlQuery,
@@ -20,7 +18,7 @@ import Sql from "./base/sql"
20
18
  import { PostgresColumn } from "./base/types"
21
19
  import { escapeDangerousCharacters } from "../utilities"
22
20
 
23
- import { Client, types } from "pg"
21
+ const { Client, types } = require("pg")
24
22
 
25
23
  // Return "date" and "timestamp" types as plain strings.
26
24
  // This lets us reference the original stored timezone.
@@ -52,7 +50,6 @@ const SCHEMA: Integration = {
52
50
  type: "Relational",
53
51
  description:
54
52
  "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
55
- features: [DatasourceFeature.CONNECTION_CHECKING],
56
53
  datasource: {
57
54
  host: {
58
55
  type: DatasourceFieldType.STRING,
@@ -117,7 +114,7 @@ const SCHEMA: Integration = {
117
114
  }
118
115
 
119
116
  class PostgresIntegration extends Sql implements DatasourcePlus {
120
- private readonly client: Client
117
+ private readonly client: any
121
118
  private readonly config: PostgresConfig
122
119
  private index: number = 1
123
120
  private open: boolean
@@ -153,21 +150,6 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
153
150
  this.open = false
154
151
  }
155
152
 
156
- async testConnection() {
157
- const response: ConnectionInfo = {
158
- connected: false,
159
- }
160
- try {
161
- await this.openConnection()
162
- response.connected = true
163
- } catch (e: any) {
164
- response.error = e.message as string
165
- } finally {
166
- await this.closeConnection()
167
- }
168
- return response
169
- }
170
-
171
153
  getBindingIdentifier(): string {
172
154
  return `$${this.index++}`
173
155
  }
@@ -181,7 +163,7 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
181
163
  if (!this.config.schema) {
182
164
  this.config.schema = "public"
183
165
  }
184
- await this.client.query(`SET search_path TO ${this.config.schema}`)
166
+ this.client.query(`SET search_path TO ${this.config.schema}`)
185
167
  this.COLUMNS_SQL = `select * from information_schema.columns where table_schema = '${this.config.schema}'`
186
168
  this.open = true
187
169
  }
@@ -1,10 +1,4 @@
1
- import {
2
- ConnectionInfo,
3
- DatasourceFeature,
4
- DatasourceFieldType,
5
- Integration,
6
- QueryType,
7
- } from "@budibase/types"
1
+ import { DatasourceFieldType, Integration, QueryType } from "@budibase/types"
8
2
  import Redis from "ioredis"
9
3
 
10
4
  interface RedisConfig {
@@ -17,11 +11,9 @@ interface RedisConfig {
17
11
 
18
12
  const SCHEMA: Integration = {
19
13
  docs: "https://redis.io/docs/",
20
- description:
21
- "Redis is a caching tool, providing powerful key-value store capabilities.",
14
+ description: "",
22
15
  friendlyName: "Redis",
23
16
  type: "Non-relational",
24
- features: [DatasourceFeature.CONNECTION_CHECKING],
25
17
  datasource: {
26
18
  host: {
27
19
  type: "string",
@@ -94,7 +86,7 @@ const SCHEMA: Integration = {
94
86
 
95
87
  class RedisIntegration {
96
88
  private readonly config: RedisConfig
97
- private client
89
+ private client: any
98
90
 
99
91
  constructor(config: RedisConfig) {
100
92
  this.config = config
@@ -107,21 +99,6 @@ class RedisIntegration {
107
99
  })
108
100
  }
109
101
 
110
- async testConnection() {
111
- const response: ConnectionInfo = {
112
- connected: false,
113
- }
114
- try {
115
- await this.client.ping()
116
- response.connected = true
117
- } catch (e: any) {
118
- response.error = e.message as string
119
- } finally {
120
- await this.disconnect()
121
- }
122
- return response
123
- }
124
-
125
102
  async disconnect() {
126
103
  return this.client.quit()
127
104
  }
@@ -3,12 +3,10 @@ import {
3
3
  QueryType,
4
4
  IntegrationBase,
5
5
  DatasourceFieldType,
6
- DatasourceFeature,
7
- ConnectionInfo,
8
6
  } from "@budibase/types"
9
7
 
10
- import AWS from "aws-sdk"
11
- import csv from "csvtojson"
8
+ const AWS = require("aws-sdk")
9
+ const csv = require("csvtojson")
12
10
 
13
11
  interface S3Config {
14
12
  region: string
@@ -24,7 +22,6 @@ const SCHEMA: Integration = {
24
22
  "Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance.",
25
23
  friendlyName: "Amazon S3",
26
24
  type: "Object store",
27
- features: [DatasourceFeature.CONNECTION_CHECKING],
28
25
  datasource: {
29
26
  region: {
30
27
  type: "string",
@@ -155,7 +152,7 @@ const SCHEMA: Integration = {
155
152
 
156
153
  class S3Integration implements IntegrationBase {
157
154
  private readonly config: S3Config
158
- private client
155
+ private client: any
159
156
 
160
157
  constructor(config: S3Config) {
161
158
  this.config = config
@@ -168,19 +165,6 @@ class S3Integration implements IntegrationBase {
168
165
  this.client = new AWS.S3(this.config)
169
166
  }
170
167
 
171
- async testConnection() {
172
- const response: ConnectionInfo = {
173
- connected: false,
174
- }
175
- try {
176
- await this.client.listBuckets().promise()
177
- response.connected = true
178
- } catch (e: any) {
179
- response.error = e.message as string
180
- }
181
- return response
182
- }
183
-
184
168
  async create(query: {
185
169
  bucket: string
186
170
  location: string
@@ -1,10 +1,4 @@
1
- import {
2
- ConnectionInfo,
3
- DatasourceFeature,
4
- Integration,
5
- QueryType,
6
- SqlQuery,
7
- } from "@budibase/types"
1
+ import { Integration, QueryType, SqlQuery } from "@budibase/types"
8
2
  import { Snowflake } from "snowflake-promise"
9
3
 
10
4
  interface SnowflakeConfig {
@@ -22,7 +16,6 @@ const SCHEMA: Integration = {
22
16
  "Snowflake is a solution for data warehousing, data lakes, data engineering, data science, data application development, and securely sharing and consuming shared data.",
23
17
  friendlyName: "Snowflake",
24
18
  type: "Relational",
25
- features: [DatasourceFeature.CONNECTION_CHECKING],
26
19
  datasource: {
27
20
  account: {
28
21
  type: "string",
@@ -72,18 +65,6 @@ class SnowflakeIntegration {
72
65
  this.client = new Snowflake(config)
73
66
  }
74
67
 
75
- async testConnection(): Promise<ConnectionInfo> {
76
- try {
77
- await this.client.connect()
78
- return { connected: true }
79
- } catch (e: any) {
80
- return {
81
- connected: false,
82
- error: e.message as string,
83
- }
84
- }
85
- }
86
-
87
68
  async internalQuery(query: SqlQuery) {
88
69
  await this.client.connect()
89
70
  try {
@@ -33,7 +33,7 @@ export const backfill = async (appDb: any, timestamp: string | number) => {
33
33
  datasource = {
34
34
  type: "unknown",
35
35
  _id: query.datasourceId,
36
- source: "unknown" as SourceName,
36
+ source: SourceName.UNKNOWN,
37
37
  }
38
38
  } else {
39
39
  throw e