@budibase/server 1.0.145 → 1.0.146

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 (173) hide show
  1. package/__mocks__/@google-cloud/firestore.ts +36 -0
  2. package/__mocks__/pg.ts +1 -9
  3. package/builder/assets/{index.6b7d3283.js → index.c773a612.js} +2 -2
  4. package/builder/index.html +1 -1
  5. package/coverage/clover.xml +2 -2
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +1 -1
  16. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +1 -1
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +1 -1
  118. package/coverage/lcov-report/db/utils.js.html +1 -1
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +1 -1
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  128. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  129. package/coverage/lcov-report/middleware/index.html +1 -1
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  135. package/coverage/lcov-report/threads/automation.js.html +1 -1
  136. package/coverage/lcov-report/threads/index.html +1 -1
  137. package/coverage/lcov-report/threads/query.js.html +1 -1
  138. package/coverage/lcov-report/threads/utils.js.html +1 -1
  139. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  140. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  141. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  142. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  143. package/coverage/lcov-report/utilities/global.js.html +1 -1
  144. package/coverage/lcov-report/utilities/index.html +1 -1
  145. package/coverage/lcov-report/utilities/index.js.html +1 -1
  146. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  147. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  148. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  149. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  150. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  151. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  152. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  153. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  154. package/coverage/lcov-report/utilities/security.js.html +1 -1
  155. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  156. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  157. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  158. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  159. package/coverage/lcov-report/utilities/users.js.html +1 -1
  160. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  161. package/dist/api/controllers/row/ExternalRequest.js +3 -2
  162. package/dist/integrations/firebase.js +9 -9
  163. package/dist/integrations/index.js +1 -0
  164. package/dist/integrations/postgres.js +15 -11
  165. package/dist/package.json +5 -5
  166. package/dist/tsconfig.build.tsbuildinfo +1 -1
  167. package/package.json +6 -6
  168. package/src/api/controllers/row/ExternalRequest.ts +3 -2
  169. package/src/integrations/firebase.ts +10 -10
  170. package/src/integrations/index.ts +1 -0
  171. package/src/integrations/postgres.ts +9 -11
  172. package/src/integrations/tests/firebase.spec.js +92 -0
  173. package/src/integrations/tests/postgres.spec.js +0 -4
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.145",
4
+ "version": "1.0.146",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -68,10 +68,10 @@
68
68
  "license": "GPL-3.0",
69
69
  "dependencies": {
70
70
  "@apidevtools/swagger-parser": "^10.0.3",
71
- "@budibase/backend-core": "^1.0.145",
72
- "@budibase/client": "^1.0.145",
73
- "@budibase/pro": "1.0.144",
74
- "@budibase/string-templates": "^1.0.145",
71
+ "@budibase/backend-core": "^1.0.146",
72
+ "@budibase/client": "^1.0.146",
73
+ "@budibase/pro": "1.0.145",
74
+ "@budibase/string-templates": "^1.0.146",
75
75
  "@bull-board/api": "^3.7.0",
76
76
  "@bull-board/koa": "^3.7.0",
77
77
  "@elastic/elasticsearch": "7.10.0",
@@ -180,5 +180,5 @@
180
180
  "optionalDependencies": {
181
181
  "oracledb": "^5.3.0"
182
182
  },
183
- "gitHead": "910849cd761c34cc6eac80bb3662a8522356f7b3"
183
+ "gitHead": "fed4ca2402679b539e73344e2f230bffb63dbb99"
184
184
  }
@@ -175,9 +175,10 @@ module External {
175
175
  const thisRow: Row = {}
176
176
  // filter the row down to what is actually the row (not joined)
177
177
  for (let fieldName of Object.keys(table.schema)) {
178
- const value = row[`${table.name}.${fieldName}`] || row[fieldName]
178
+ const pathValue = row[`${table.name}.${fieldName}`]
179
+ const value = pathValue != null ? pathValue : row[fieldName]
179
180
  // all responses include "select col as table.col" so that overlaps are handled
180
- if (value) {
181
+ if (value != null) {
181
182
  thisRow[fieldName] = value
182
183
  }
183
184
  }
@@ -92,13 +92,13 @@ module Firebase {
92
92
 
93
93
  class FirebaseIntegration implements IntegrationBase {
94
94
  private config: FirebaseConfig
95
- private db: Firestore
95
+ private client: Firestore
96
96
 
97
97
  constructor(config: FirebaseConfig) {
98
98
  this.config = config
99
99
  if (config.serviceAccount) {
100
100
  const serviceAccount = JSON.parse(config.serviceAccount)
101
- this.db = new Firestore({
101
+ this.client = new Firestore({
102
102
  projectId: serviceAccount.project_id,
103
103
  credentials: {
104
104
  client_email: serviceAccount.client_email,
@@ -106,7 +106,7 @@ module Firebase {
106
106
  },
107
107
  })
108
108
  } else {
109
- this.db = new Firestore({
109
+ this.client = new Firestore({
110
110
  projectId: config.projectId,
111
111
  credentials: {
112
112
  client_email: config.email,
@@ -118,7 +118,7 @@ module Firebase {
118
118
 
119
119
  async create(query: { json: object; extra: { [key: string]: string } }) {
120
120
  try {
121
- const documentReference = this.db
121
+ const documentReference = this.client
122
122
  .collection(query.extra.collection)
123
123
  .doc()
124
124
  await documentReference.set({ ...query.json, id: documentReference.id })
@@ -133,7 +133,7 @@ module Firebase {
133
133
  async read(query: { json: object; extra: { [key: string]: string } }) {
134
134
  try {
135
135
  let snapshot
136
- const collectionRef = this.db.collection(query.extra.collection)
136
+ const collectionRef = this.client.collection(query.extra.collection)
137
137
  if (
138
138
  query.extra.filterField &&
139
139
  query.extra.filter &&
@@ -164,19 +164,19 @@ module Firebase {
164
164
  extra: { [key: string]: string }
165
165
  }) {
166
166
  try {
167
- await this.db
167
+ await this.client
168
168
  .collection(query.extra.collection)
169
169
  .doc(query.json.id)
170
170
  .update(query.json)
171
171
 
172
172
  return (
173
- await this.db
173
+ await this.client
174
174
  .collection(query.extra.collection)
175
175
  .doc(query.json.id)
176
176
  .get()
177
177
  ).data()
178
178
  } catch (err) {
179
- console.error("Error writing to firebase", err)
179
+ console.error("Error writing to Firestore", err)
180
180
  throw err
181
181
  }
182
182
  }
@@ -186,13 +186,13 @@ module Firebase {
186
186
  extra: { [key: string]: string }
187
187
  }) {
188
188
  try {
189
- await this.db
189
+ await this.client
190
190
  .collection(query.extra.collection)
191
191
  .doc(query.json.id)
192
192
  .delete()
193
193
  return true
194
194
  } catch (err) {
195
- console.error("Error writing to mongodb", err)
195
+ console.error("Error deleting from Firestore", err)
196
196
  throw err
197
197
  }
198
198
  }
@@ -46,6 +46,7 @@ const INTEGRATIONS = {
46
46
  [SourceNames.FIREBASE]: firebase.integration,
47
47
  [SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
48
48
  [SourceNames.REDIS]: redis.integration,
49
+ [SourceNames.FIREBASE]: firebase.integration,
49
50
  }
50
51
 
51
52
  // optionally add oracle integration if the oracle binary can be installed
@@ -16,7 +16,7 @@ import {
16
16
  import { DatasourcePlus } from "./base/datasourcePlus"
17
17
 
18
18
  module PostgresModule {
19
- const { Pool } = require("pg")
19
+ const { Client } = require("pg")
20
20
  const Sql = require("./base/sql")
21
21
  const { escapeDangerousCharacters } = require("../utilities")
22
22
 
@@ -104,7 +104,6 @@ module PostgresModule {
104
104
  }
105
105
 
106
106
  class PostgresIntegration extends Sql implements DatasourcePlus {
107
- static pool: any
108
107
  private readonly client: any
109
108
  private readonly config: PostgresConfig
110
109
  private index: number = 1
@@ -136,11 +135,7 @@ module PostgresModule {
136
135
  }
137
136
  : undefined,
138
137
  }
139
- if (!this.pool) {
140
- this.pool = new Pool(newConfig)
141
- }
142
-
143
- this.client = this.pool
138
+ this.client = new Client(newConfig)
144
139
  this.setSchema()
145
140
  }
146
141
 
@@ -171,16 +166,17 @@ module PostgresModule {
171
166
  } catch (err) {
172
167
  // @ts-ignore
173
168
  throw new Error(err)
169
+ } finally {
170
+ await this.client.end()
174
171
  }
175
172
  }
176
173
 
177
- setSchema() {
174
+ async setSchema() {
175
+ await this.client.connect()
178
176
  if (!this.config.schema) {
179
177
  this.config.schema = "public"
180
178
  }
181
- this.client.on("connect", (client: any) => {
182
- client.query(`SET search_path TO ${this.config.schema}`)
183
- })
179
+ this.client.query(`SET search_path TO ${this.config.schema}`)
184
180
  this.COLUMNS_SQL = `select * from information_schema.columns where table_schema = '${this.config.schema}'`
185
181
  }
186
182
 
@@ -208,6 +204,8 @@ module PostgresModule {
208
204
  }
209
205
  } catch (err) {
210
206
  tableKeys = {}
207
+ } finally {
208
+ await this.client.close()
211
209
  }
212
210
 
213
211
  const columnsResponse = await this.client.query(this.COLUMNS_SQL)
@@ -0,0 +1,92 @@
1
+ const firebase = require("@google-cloud/firestore")
2
+ const FirebaseIntegration = require("../firebase")
3
+ jest.mock("@google-cloud/firestore")
4
+
5
+ class TestConfiguration {
6
+ constructor(config = {}) {
7
+ this.integration = new FirebaseIntegration.integration(config)
8
+ }
9
+ }
10
+
11
+ describe("Firebase Integration", () => {
12
+ let config
13
+ let tableName = "Users"
14
+
15
+ beforeEach(() => {
16
+ config = new TestConfiguration({
17
+ serviceAccount: "{}"
18
+ })
19
+ })
20
+
21
+ it("calls the create method with the correct params", async () => {
22
+ await config.integration.create({
23
+ table: tableName,
24
+ json: {
25
+ Name: "Test Name"
26
+ },
27
+ extra: {
28
+ collection: "test"
29
+ }
30
+ })
31
+ expect(config.integration.client.collection).toHaveBeenCalledWith("test")
32
+ expect(config.integration.client.set).toHaveBeenCalledWith({
33
+ Name: "Test Name",
34
+ id: "test_id"
35
+ })
36
+ })
37
+
38
+ it("calls the read method with the correct params", async () => {
39
+ const response = await config.integration.read({
40
+ table: tableName,
41
+ json: {
42
+ Name: "Test"
43
+ },
44
+ extra: {
45
+ collection: "test",
46
+ filterField: "field",
47
+ filter: "==",
48
+ filterValue: "value",
49
+ }
50
+ })
51
+ expect(config.integration.client.collection).toHaveBeenCalledWith("test")
52
+ expect(config.integration.client.where).toHaveBeenCalledWith("field", "==", "value")
53
+ expect(response).toEqual([{ result: "test"}])
54
+ })
55
+
56
+ it("calls the update method with the correct params", async () => {
57
+ const response = await config.integration.update({
58
+ table: tableName,
59
+ json: {
60
+ id: "test",
61
+ Name: "Test"
62
+ },
63
+ extra: {
64
+ collection: "test"
65
+ }
66
+ })
67
+ expect(config.integration.client.collection).toHaveBeenCalledWith("test")
68
+ expect(config.integration.client.update).toHaveBeenCalledWith({
69
+ Name: "Test",
70
+ id: "test"
71
+ })
72
+ expect(response).toEqual({
73
+ result: "test"
74
+ })
75
+ })
76
+
77
+ it("calls the delete method with the correct params", async () => {
78
+ const response = await config.integration.delete({
79
+ table: tableName,
80
+ json: {
81
+ id: "test",
82
+ Name: "Test"
83
+ },
84
+ extra: {
85
+ collection: "test"
86
+ }
87
+ })
88
+ expect(config.integration.client.collection).toHaveBeenCalledWith("test")
89
+ expect(config.integration.client.doc).toHaveBeenCalledWith("test")
90
+ expect(config.integration.client.delete).toHaveBeenCalled()
91
+ })
92
+ })
@@ -15,10 +15,6 @@ describe("Postgres Integration", () => {
15
15
  config = new TestConfiguration()
16
16
  })
17
17
 
18
- it("calls the connection callback", async () => {
19
- expect(pg.on).toHaveBeenCalledWith('connect', expect.anything())
20
- })
21
-
22
18
  it("calls the create method with the correct params", async () => {
23
19
  const sql = "insert into users (name, age) values ('Joe', 123);"
24
20
  await config.integration.create({