@budibase/server 1.0.99 → 1.0.102

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 (228) hide show
  1. package/builder/assets/index.7d3fac69.js +1291 -0
  2. package/builder/assets/{index.7c8961b4.css → index.ea3718aa.css} +2 -2
  3. package/builder/assets/{vendor.a7c6ad0a.js → vendor.8e34a169.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +267 -253
  6. package/coverage/coverage-final.json +13 -13
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +16 -16
  18. package/coverage/lcov-report/api/controllers/integration.js.html +59 -11
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +2 -2
  26. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +19 -7
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +6 -6
  35. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/analytics.js.html +3 -3
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  82. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  85. package/coverage/lcov-report/automations/actions.js.html +1 -1
  86. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  87. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  88. package/coverage/lcov-report/automations/index.html +12 -12
  89. package/coverage/lcov-report/automations/index.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/index.html +1 -1
  99. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  116. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  117. package/coverage/lcov-report/automations/utils.js.html +20 -8
  118. package/coverage/lcov-report/constants/index.html +1 -1
  119. package/coverage/lcov-report/constants/index.js.html +1 -1
  120. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  121. package/coverage/lcov-report/constants/screens.js.html +1 -1
  122. package/coverage/lcov-report/db/client.js.html +1 -1
  123. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  124. package/coverage/lcov-report/db/index.html +1 -1
  125. package/coverage/lcov-report/db/index.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  128. package/coverage/lcov-report/db/linkedRows/index.js.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -7
  130. package/coverage/lcov-report/db/newid.js.html +2 -2
  131. package/coverage/lcov-report/db/utils.js.html +2 -2
  132. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  133. package/coverage/lcov-report/events/index.html +1 -1
  134. package/coverage/lcov-report/events/index.js.html +1 -1
  135. package/coverage/lcov-report/events/utils.js.html +1 -1
  136. package/coverage/lcov-report/index.html +24 -24
  137. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  138. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  139. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  140. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  141. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  142. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  143. package/coverage/lcov-report/middleware/index.html +1 -1
  144. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  145. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  146. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  149. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +1 -1
  152. package/coverage/lcov-report/threads/index.js.html +1 -1
  153. package/coverage/lcov-report/threads/query.js.html +1 -1
  154. package/coverage/lcov-report/threads/utils.js.html +1 -1
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  157. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  158. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  159. package/coverage/lcov-report/utilities/global.js.html +1 -1
  160. package/coverage/lcov-report/utilities/index.html +1 -1
  161. package/coverage/lcov-report/utilities/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  163. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +12 -12
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  170. package/coverage/lcov-report/utilities/security.js.html +1 -1
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +1 -1
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  178. package/coverage/lcov.info +409 -391
  179. package/dist/api/controllers/integration.js +15 -1
  180. package/dist/api/controllers/query/import/index.js +2 -1
  181. package/dist/api/controllers/query/import/sources/base/index.js +12 -1
  182. package/dist/api/controllers/query/import/sources/curl.js +2 -2
  183. package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
  184. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  185. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  186. package/dist/api/controllers/row/internal.js +2 -1
  187. package/dist/api/routes/analytics.js +2 -2
  188. package/dist/automations/utils.js +3 -1
  189. package/dist/definitions/datasource.js +1 -0
  190. package/dist/environment.js +2 -0
  191. package/dist/integrations/base/sql.js +16 -9
  192. package/dist/integrations/dynamodb.js +3 -1
  193. package/dist/integrations/firebase.js +192 -0
  194. package/dist/integrations/googlesheets.js +17 -1
  195. package/dist/integrations/index.js +3 -1
  196. package/dist/integrations/mysql.js +14 -1
  197. package/dist/integrations/rest.js +2 -1
  198. package/dist/package.json +7 -4
  199. package/dist/tsconfig.tsbuildinfo +1 -1
  200. package/package.json +8 -5
  201. package/scripts/dev/manage.js +2 -1
  202. package/src/api/controllers/integration.js +17 -1
  203. package/src/api/controllers/query/import/index.ts +2 -1
  204. package/src/api/controllers/query/import/sources/base/index.ts +12 -2
  205. package/src/api/controllers/query/import/sources/curl.ts +2 -2
  206. package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
  207. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  208. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  209. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  210. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  211. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  212. package/src/api/controllers/query/import/tests/index.spec.js +43 -0
  213. package/src/api/controllers/row/internal.js +5 -1
  214. package/src/api/routes/analytics.js +2 -2
  215. package/src/api/routes/tests/misc.spec.js +2 -2
  216. package/src/automations/utils.js +5 -1
  217. package/src/definitions/datasource.ts +2 -5
  218. package/src/definitions/openapi.ts +468 -468
  219. package/src/environment.js +2 -0
  220. package/src/integrations/base/sql.ts +14 -9
  221. package/src/integrations/dynamodb.ts +3 -1
  222. package/src/integrations/firebase.ts +205 -0
  223. package/src/integrations/googlesheets.ts +16 -1
  224. package/src/integrations/index.ts +3 -1
  225. package/src/integrations/mysql.ts +15 -1
  226. package/src/integrations/rest.ts +2 -1
  227. package/src/integrations/tests/sql.spec.js +51 -0
  228. package/builder/assets/index.44b5c19a.js +0 -1291
@@ -91,7 +91,8 @@ exports.patch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
91
91
  const isUserTable = tableId === InternalTables.USER_METADATA;
92
92
  let oldRow;
93
93
  try {
94
- oldRow = yield db.get(inputs._id);
94
+ let dbTable = yield db.get(tableId);
95
+ oldRow = yield outputProcessing(dbTable, yield findRow(ctx, tableId, inputs._id));
95
96
  }
96
97
  catch (err) {
97
98
  if (isUserTable) {
@@ -3,6 +3,6 @@ const Router = require("@koa/router");
3
3
  const controller = require("../controllers/analytics");
4
4
  const router = Router();
5
5
  router
6
- .get("/api/analytics", controller.isEnabled)
7
- .post("/api/analytics/ping", controller.endUserPing);
6
+ .get("/api/bbtel", controller.isEnabled)
7
+ .post("/api/bbtel/ping", controller.endUserPing);
8
8
  module.exports = router;
@@ -25,10 +25,12 @@ const Runner = new Thread(ThreadType.AUTOMATION);
25
25
  exports.processEvent = (job) => __awaiter(void 0, void 0, void 0, function* () {
26
26
  try {
27
27
  // need to actually await these so that an error can be captured properly
28
+ console.log(`${job.data.automation.appId} automation ${job.data.automation._id} running`);
28
29
  return yield Runner.run(job);
29
30
  }
30
31
  catch (err) {
31
- console.error(`${job.data.automation.appId} automation ${job.data.automation._id} was unable to run - ${err}`);
32
+ const errJson = JSON.stringify(err);
33
+ console.error(`${job.data.automation.appId} automation ${job.data.automation._id} was unable to run - ${errJson}`);
32
34
  console.trace(err);
33
35
  return { err };
34
36
  }
@@ -50,6 +50,7 @@ var SourceNames;
50
50
  SourceNames["REST"] = "REST";
51
51
  SourceNames["ORACLE"] = "ORACLE";
52
52
  SourceNames["GOOGLE_SHEETS"] = "GOOGLE_SHEETS";
53
+ SourceNames["FIREBASE"] = "FIREBASE";
53
54
  })(SourceNames = exports.SourceNames || (exports.SourceNames = {}));
54
55
  var IncludeRelationships;
55
56
  (function (IncludeRelationships) {
@@ -38,6 +38,8 @@ module.exports = {
38
38
  MULTI_TENANCY: process.env.MULTI_TENANCY,
39
39
  HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
40
40
  API_REQ_LIMIT_PER_SEC: process.env.API_REQ_LIMIT_PER_SEC,
41
+ GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
42
+ GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
41
43
  // environment
42
44
  NODE_ENV: process.env.NODE_ENV,
43
45
  JEST_WORKER_ID: process.env.JEST_WORKER_ID,
@@ -34,11 +34,8 @@ function parse(input) {
34
34
  if (typeof input !== "string") {
35
35
  return input;
36
36
  }
37
- if (input === MAX_ISO_DATE) {
38
- return new Date(8640000000000000);
39
- }
40
- if (input === MIN_ISO_DATE) {
41
- return new Date(-8640000000000000);
37
+ if (input === MAX_ISO_DATE || input === MIN_ISO_DATE) {
38
+ return null;
42
39
  }
43
40
  if (utils_1.isIsoDateString(input)) {
44
41
  return new Date(input);
@@ -127,11 +124,21 @@ class InternalBuilder {
127
124
  }
128
125
  if (filters.range) {
129
126
  iterate(filters.range, (key, value) => {
130
- if (!value.high || !value.low) {
131
- return;
127
+ if (value.low && value.high) {
128
+ // Use a between operator if we have 2 valid range values
129
+ const fnc = allOr ? "orWhereBetween" : "whereBetween";
130
+ query = query[fnc](key, [value.low, value.high]);
131
+ }
132
+ else if (value.low) {
133
+ // Use just a single greater than operator if we only have a low
134
+ const fnc = allOr ? "orWhere" : "where";
135
+ query = query[fnc](key, ">", value.low);
136
+ }
137
+ else if (value.high) {
138
+ // Use just a single less than operator if we only have a high
139
+ const fnc = allOr ? "orWhere" : "where";
140
+ query = query[fnc](key, "<", value.high);
132
141
  }
133
- const fnc = allOr ? "orWhereBetween" : "whereBetween";
134
- query = query[fnc](key, [value.low, value.high]);
135
142
  });
136
143
  }
137
144
  if (filters.equal) {
@@ -124,7 +124,9 @@ var DynamoModule;
124
124
  class DynamoDBIntegration {
125
125
  constructor(config) {
126
126
  this.config = config;
127
- this.connect();
127
+ if (!this.config.endpoint) {
128
+ this.connect();
129
+ }
128
130
  let options = {
129
131
  correctClockSkew: true,
130
132
  endpoint: config.endpoint ? config.endpoint : undefined,
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const datasource_1 = require("../definitions/datasource");
13
+ const firestore_1 = require("@google-cloud/firestore");
14
+ var Firebase;
15
+ (function (Firebase) {
16
+ const SCHEMA = {
17
+ docs: "https://firebase.google.com/docs/firestore/quickstart",
18
+ friendlyName: "Firestore",
19
+ description: "Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
20
+ datasource: {
21
+ email: {
22
+ type: datasource_1.DatasourceFieldTypes.STRING,
23
+ required: true,
24
+ },
25
+ privateKey: {
26
+ type: datasource_1.DatasourceFieldTypes.STRING,
27
+ required: true,
28
+ },
29
+ projectId: {
30
+ type: datasource_1.DatasourceFieldTypes.STRING,
31
+ required: true,
32
+ },
33
+ serviceAccount: {
34
+ type: datasource_1.DatasourceFieldTypes.JSON,
35
+ required: false,
36
+ },
37
+ },
38
+ query: {
39
+ create: {
40
+ type: datasource_1.QueryTypes.JSON,
41
+ },
42
+ read: {
43
+ type: datasource_1.QueryTypes.JSON,
44
+ },
45
+ update: {
46
+ type: datasource_1.QueryTypes.JSON,
47
+ },
48
+ delete: {
49
+ type: datasource_1.QueryTypes.JSON,
50
+ },
51
+ },
52
+ extra: {
53
+ collection: {
54
+ displayName: "Collection",
55
+ type: datasource_1.DatasourceFieldTypes.STRING,
56
+ required: true,
57
+ },
58
+ filterField: {
59
+ displayName: "Filter field",
60
+ type: datasource_1.DatasourceFieldTypes.STRING,
61
+ required: false,
62
+ },
63
+ filter: {
64
+ displayName: "Filter comparison",
65
+ type: datasource_1.DatasourceFieldTypes.LIST,
66
+ required: false,
67
+ data: {
68
+ read: [
69
+ "==",
70
+ "<",
71
+ "<=",
72
+ "==",
73
+ "!=",
74
+ ">=",
75
+ ">",
76
+ "array-contains",
77
+ "in",
78
+ "not-in",
79
+ "array-contains-any",
80
+ ],
81
+ },
82
+ },
83
+ filterValue: {
84
+ displayName: "Filter value",
85
+ type: datasource_1.DatasourceFieldTypes.STRING,
86
+ required: false,
87
+ },
88
+ },
89
+ };
90
+ class FirebaseIntegration {
91
+ constructor(config) {
92
+ this.config = config;
93
+ if (config.serviceAccount) {
94
+ const serviceAccount = JSON.parse(config.serviceAccount);
95
+ this.db = new firestore_1.Firestore({
96
+ projectId: serviceAccount.project_id,
97
+ credentials: {
98
+ client_email: serviceAccount.client_email,
99
+ private_key: serviceAccount.private_key,
100
+ },
101
+ });
102
+ }
103
+ else {
104
+ this.db = new firestore_1.Firestore({
105
+ projectId: config.projectId,
106
+ credentials: {
107
+ client_email: config.email,
108
+ private_key: config.privateKey,
109
+ },
110
+ });
111
+ }
112
+ }
113
+ create(query) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ try {
116
+ const documentReference = this.db
117
+ .collection(query.extra.collection)
118
+ .doc();
119
+ yield documentReference.set(Object.assign(Object.assign({}, query.json), { id: documentReference.id }));
120
+ const snapshot = yield documentReference.get();
121
+ return snapshot.data();
122
+ }
123
+ catch (err) {
124
+ console.error("Error writing to Firestore", err);
125
+ throw err;
126
+ }
127
+ });
128
+ }
129
+ read(query) {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ try {
132
+ let snapshot;
133
+ const collectionRef = this.db.collection(query.extra.collection);
134
+ if (query.extra.filterField &&
135
+ query.extra.filter &&
136
+ query.extra.filterValue) {
137
+ snapshot = yield collectionRef
138
+ .where(query.extra.filterField, query.extra.filter, query.extra.filterValue)
139
+ .get();
140
+ }
141
+ else {
142
+ snapshot = yield collectionRef.get();
143
+ }
144
+ const result = [];
145
+ snapshot.forEach(doc => result.push(doc.data()));
146
+ return result;
147
+ }
148
+ catch (err) {
149
+ console.error("Error querying Firestore", err);
150
+ throw err;
151
+ }
152
+ });
153
+ }
154
+ update(query) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ try {
157
+ yield this.db
158
+ .collection(query.extra.collection)
159
+ .doc(query.json.id)
160
+ .update(query.json);
161
+ return (yield this.db
162
+ .collection(query.extra.collection)
163
+ .doc(query.json.id)
164
+ .get()).data();
165
+ }
166
+ catch (err) {
167
+ console.error("Error writing to firebase", err);
168
+ throw err;
169
+ }
170
+ });
171
+ }
172
+ delete(query) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ try {
175
+ yield this.db
176
+ .collection(query.extra.collection)
177
+ .doc(query.json.id)
178
+ .delete();
179
+ return true;
180
+ }
181
+ catch (err) {
182
+ console.error("Error writing to mongodb", err);
183
+ throw err;
184
+ }
185
+ });
186
+ }
187
+ }
188
+ module.exports = {
189
+ schema: SCHEMA,
190
+ integration: FirebaseIntegration,
191
+ };
192
+ })(Firebase || (Firebase = {}));
@@ -8,12 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  const datasource_1 = require("../definitions/datasource");
13
16
  const google_auth_library_1 = require("google-auth-library");
14
17
  const utils_1 = require("./utils");
15
18
  const constants_1 = require("../constants");
16
19
  const google_spreadsheet_1 = require("google-spreadsheet");
20
+ const environment_1 = __importDefault(require("../environment"));
17
21
  var GoogleSheetsModule;
18
22
  (function (GoogleSheetsModule) {
19
23
  const { getGlobalDB } = require("@budibase/backend-core/tenancy");
@@ -120,13 +124,25 @@ var GoogleSheetsModule;
120
124
  try {
121
125
  // Initialise oAuth client
122
126
  const db = getGlobalDB();
123
- const googleConfig = yield getScopedConfig(db, {
127
+ let googleConfig = yield getScopedConfig(db, {
124
128
  type: Configs.GOOGLE,
125
129
  });
130
+ if (!googleConfig) {
131
+ googleConfig = {
132
+ clientID: environment_1.default.GOOGLE_CLIENT_ID,
133
+ clientSecret: environment_1.default.GOOGLE_CLIENT_SECRET,
134
+ };
135
+ }
126
136
  const oauthClient = new google_auth_library_1.OAuth2Client({
127
137
  clientId: googleConfig.clientID,
128
138
  clientSecret: googleConfig.clientSecret,
129
139
  });
140
+ oauthClient.on("tokens", tokens => {
141
+ oauthClient.setCredentials({
142
+ refresh_token: googleConfig.refreshToken,
143
+ access_token: tokens.access_token,
144
+ });
145
+ });
130
146
  oauthClient.credentials.access_token = this.config.auth.accessToken;
131
147
  oauthClient.credentials.refresh_token = this.config.auth.refreshToken;
132
148
  this.client.useOAuth2Client(oauthClient);
@@ -11,6 +11,7 @@ const mysql = require("./mysql");
11
11
  const arangodb = require("./arangodb");
12
12
  const rest = require("./rest");
13
13
  const googlesheets = require("./googlesheets");
14
+ const firebase = require("./firebase");
14
15
  const { SourceNames } = require("../definitions/datasource");
15
16
  const environment = require("../environment");
16
17
  const DEFINITIONS = {
@@ -38,6 +39,8 @@ const INTEGRATIONS = {
38
39
  [SourceNames.MYSQL]: mysql.integration,
39
40
  [SourceNames.ARANGODB]: arangodb.integration,
40
41
  [SourceNames.REST]: rest.integration,
42
+ [SourceNames.FIREBASE]: firebase.integration,
43
+ [SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
41
44
  };
42
45
  // optionally add oracle integration if the oracle binary can be installed
43
46
  if (!(process.arch === "arm64" && process.platform === "darwin")) {
@@ -47,7 +50,6 @@ if (!(process.arch === "arm64" && process.platform === "darwin")) {
47
50
  }
48
51
  if (environment.SELF_HOSTED) {
49
52
  DEFINITIONS[SourceNames.GOOGLE_SHEETS] = googlesheets.schema;
50
- INTEGRATIONS[SourceNames.GOOGLE_SHEETS] = googlesheets.integration;
51
53
  }
52
54
  module.exports = {
53
55
  definitions: DEFINITIONS,
@@ -65,6 +65,19 @@ var MySQLModule;
65
65
  },
66
66
  },
67
67
  };
68
+ function bindingTypeCoerce(bindings) {
69
+ for (let i = 0; i < bindings.length; i++) {
70
+ const binding = bindings[i];
71
+ if (typeof binding !== "string") {
72
+ continue;
73
+ }
74
+ const matches = binding.match(/^\d*/g);
75
+ if (matches && matches[0] !== "" && !isNaN(Number(matches[0]))) {
76
+ bindings[i] = parseFloat(binding);
77
+ }
78
+ }
79
+ return bindings;
80
+ }
68
81
  class MySQLIntegration extends Sql {
69
82
  constructor(config) {
70
83
  super(utils_1.SqlClients.MY_SQL);
@@ -99,7 +112,7 @@ var MySQLModule;
99
112
  yield this.connect();
100
113
  }
101
114
  // Node MySQL is callback based, so we must wrap our call in a promise
102
- const response = yield this.client.query(query.sql, query.bindings || []);
115
+ const response = yield this.client.query(query.sql, bindingTypeCoerce(query.bindings || []));
103
116
  return response[0];
104
117
  }
105
118
  finally {
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const datasource_1 = require("../definitions/datasource");
13
+ const lodash_1 = require("lodash");
13
14
  const BodyTypes = {
14
15
  NONE: "none",
15
16
  FORM_DATA: "form",
@@ -148,7 +149,7 @@ var RestModule;
148
149
  // Check if a pagination cursor exists in the response
149
150
  let nextCursor = null;
150
151
  if (pagination === null || pagination === void 0 ? void 0 : pagination.responseParam) {
151
- nextCursor = data === null || data === void 0 ? void 0 : data[pagination.responseParam];
152
+ nextCursor = lodash_1.get(data, pagination.responseParam);
152
153
  }
153
154
  return {
154
155
  data,
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.98",
4
+ "version": "1.0.101",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -68,12 +68,13 @@
68
68
  "license": "GPL-3.0",
69
69
  "dependencies": {
70
70
  "@apidevtools/swagger-parser": "^10.0.3",
71
- "@budibase/backend-core": "^1.0.98",
72
- "@budibase/client": "^1.0.98",
73
- "@budibase/string-templates": "^1.0.98",
71
+ "@budibase/backend-core": "^1.0.101",
72
+ "@budibase/client": "^1.0.101",
73
+ "@budibase/string-templates": "^1.0.101",
74
74
  "@bull-board/api": "^3.7.0",
75
75
  "@bull-board/koa": "^3.7.0",
76
76
  "@elastic/elasticsearch": "7.10.0",
77
+ "@google-cloud/firestore": "^5.0.2",
77
78
  "@koa/router": "8.0.0",
78
79
  "@sendgrid/mail": "7.1.1",
79
80
  "@sentry/node": "^6.0.0",
@@ -145,6 +146,7 @@
145
146
  "@types/jest": "^26.0.23",
146
147
  "@types/koa": "^2.13.3",
147
148
  "@types/koa-router": "^7.4.2",
149
+ "@types/lodash": "4.14.180",
148
150
  "@types/node": "^15.12.4",
149
151
  "@types/oracledb": "^5.2.1",
150
152
  "@types/redis": "^4.0.11",
@@ -153,6 +155,7 @@
153
155
  "copyfiles": "^2.4.1",
154
156
  "docker-compose": "^0.23.6",
155
157
  "eslint": "^6.8.0",
158
+ "is-wsl": "^2.2.0",
156
159
  "jest": "^27.0.5",
157
160
  "jest-openapi": "^0.14.2",
158
161
  "nodemon": "^2.0.4",