@budibase/server 0.9.184 → 0.9.185-alpha.11

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 (290) hide show
  1. package/Dockerfile +1 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/pg.ts +3 -0
  4. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  5. package/builder/assets/index.053c6f7a.js +1321 -0
  6. package/builder/assets/index.4a7c5636.css +1 -0
  7. package/builder/assets/vendor.470042a4.js +152 -0
  8. package/builder/assets/vendor.5e1fe644.css +1 -0
  9. package/builder/index.html +4 -4
  10. package/coverage/clover.xml +1357 -959
  11. package/coverage/coverage-final.json +91 -87
  12. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  13. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  14. package/coverage/lcov-report/api/controllers/application.js.html +65 -14
  15. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  16. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  17. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/datasource.js.html +147 -27
  21. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  22. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  23. package/coverage/lcov-report/api/controllers/index.html +90 -90
  24. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
  26. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  27. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  28. package/coverage/lcov-report/api/controllers/query.js.html +53 -209
  29. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  30. package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
  31. package/coverage/lcov-report/api/controllers/row/external.js.html +12 -6
  32. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  33. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  34. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  35. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  37. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +980 -0
  40. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +545 -0
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +172 -49
  44. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  45. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.html +9 -9
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +5 -5
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  52. package/coverage/lcov-report/api/index.html +1 -1
  53. package/coverage/lcov-report/api/index.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  65. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/index.html +4 -4
  67. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  73. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/table.js.html +35 -2
  80. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  82. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  84. package/coverage/lcov-report/automations/actions.js.html +2 -2
  85. package/coverage/lcov-report/automations/automationUtils.js.html +3 -3
  86. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  87. package/coverage/lcov-report/automations/index.html +33 -48
  88. package/coverage/lcov-report/automations/index.js.html +2 -2
  89. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  94. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/index.html +14 -14
  98. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  100. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  101. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  106. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  111. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  116. package/coverage/lcov-report/automations/utils.js.html +42 -12
  117. package/coverage/lcov-report/constants/index.html +5 -5
  118. package/coverage/lcov-report/constants/index.js.html +49 -4
  119. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  120. package/coverage/lcov-report/constants/screens.js.html +1 -1
  121. package/coverage/lcov-report/db/client.js.html +2 -2
  122. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  123. package/coverage/lcov-report/db/index.html +2 -2
  124. package/coverage/lcov-report/db/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  126. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  127. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  128. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  129. package/coverage/lcov-report/db/newid.js.html +1 -1
  130. package/coverage/lcov-report/db/utils.js.html +1 -1
  131. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  132. package/coverage/lcov-report/events/index.html +6 -6
  133. package/coverage/lcov-report/events/index.js.html +1 -1
  134. package/coverage/lcov-report/events/utils.js.html +5 -5
  135. package/coverage/lcov-report/index.html +98 -83
  136. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  137. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  138. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  139. package/coverage/lcov-report/middleware/authorized.js.html +11 -8
  140. package/coverage/lcov-report/middleware/builder.js.html +16 -7
  141. package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
  142. package/coverage/lcov-report/middleware/index.html +23 -23
  143. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  144. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  145. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  147. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  148. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +83 -32
  149. package/coverage/lcov-report/threads/index.html +141 -0
  150. package/coverage/lcov-report/threads/index.js.html +260 -0
  151. package/coverage/lcov-report/threads/query.js.html +269 -0
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  156. package/coverage/lcov-report/utilities/global.js.html +26 -11
  157. package/coverage/lcov-report/utilities/index.html +49 -49
  158. package/coverage/lcov-report/utilities/index.js.html +65 -17
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
  160. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  167. package/coverage/lcov-report/utilities/security.js.html +3 -3
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  171. package/coverage/lcov.info +2301 -1599
  172. package/dist/api/controllers/application.js +16 -2
  173. package/dist/api/controllers/auth.js +3 -3
  174. package/dist/api/controllers/datasource.js +47 -16
  175. package/dist/api/controllers/deploy/index.js +2 -0
  176. package/dist/api/controllers/dev.js +4 -1
  177. package/dist/api/controllers/query.js +30 -58
  178. package/dist/api/controllers/row/ExternalRequest.js +37 -14
  179. package/dist/api/controllers/row/external.js +1 -0
  180. package/dist/api/controllers/row/utils.js +6 -12
  181. package/dist/api/controllers/static/index.js +1 -1
  182. package/dist/api/controllers/table/external.js +242 -0
  183. package/dist/api/controllers/table/index.js +49 -123
  184. package/dist/api/controllers/table/internal.js +150 -0
  185. package/dist/api/controllers/table/utils.js +62 -28
  186. package/dist/api/controllers/user.js +123 -11
  187. package/dist/api/routes/query.js +1 -1
  188. package/dist/api/routes/table.js +7 -1
  189. package/dist/api/routes/user.js +2 -1
  190. package/dist/app.js +2 -11
  191. package/dist/automations/bullboard.js +37 -10
  192. package/dist/automations/triggers.js +7 -3
  193. package/dist/automations/utils.js +11 -2
  194. package/dist/constants/index.js +13 -0
  195. package/dist/definitions/datasource.js +4 -0
  196. package/dist/integrations/base/IntegrationBase.js +2 -0
  197. package/dist/integrations/base/datasourcePlus.js +2 -0
  198. package/dist/integrations/base/sql.js +334 -180
  199. package/dist/integrations/base/sqlTable.js +143 -0
  200. package/dist/integrations/base/utils.js +30 -0
  201. package/dist/integrations/microsoftSqlServer.js +117 -9
  202. package/dist/integrations/mysql.js +14 -84
  203. package/dist/integrations/postgres.js +35 -28
  204. package/dist/integrations/utils.js +56 -9
  205. package/dist/middleware/authorized.js +2 -1
  206. package/dist/middleware/builder.js +4 -1
  207. package/dist/package.json +7 -6
  208. package/dist/tests/utilities/TestConfiguration.js +2 -1
  209. package/dist/{automations/thread.js → threads/automation.js} +23 -7
  210. package/dist/threads/index.js +58 -0
  211. package/dist/threads/query.js +61 -0
  212. package/dist/tsconfig.tsbuildinfo +1 -1
  213. package/dist/utilities/csvParser.js +46 -5
  214. package/dist/utilities/global.js +6 -2
  215. package/dist/utilities/index.js +18 -2
  216. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  217. package/dist/utilities/scriptRunner.js +4 -1
  218. package/package.json +8 -7
  219. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  220. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  221. package/scripts/integrations/mssql/data/setup.sql +54 -0
  222. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  223. package/scripts/integrations/mssql/reset.sh +3 -0
  224. package/scripts/likeCypress.ts +33 -0
  225. package/src/api/controllers/application.js +19 -2
  226. package/src/api/controllers/auth.js +3 -0
  227. package/src/api/controllers/datasource.js +56 -16
  228. package/src/api/controllers/deploy/index.js +2 -0
  229. package/src/api/controllers/dev.js +4 -1
  230. package/src/api/controllers/query.js +29 -81
  231. package/src/api/controllers/row/ExternalRequest.ts +47 -16
  232. package/src/api/controllers/row/external.js +2 -0
  233. package/src/api/controllers/row/utils.js +8 -11
  234. package/src/api/controllers/static/index.js +1 -1
  235. package/src/api/controllers/table/external.js +300 -0
  236. package/src/api/controllers/table/index.js +47 -137
  237. package/src/api/controllers/table/internal.js +155 -0
  238. package/src/api/controllers/table/utils.js +74 -33
  239. package/src/api/controllers/user.js +132 -13
  240. package/src/api/routes/query.js +1 -0
  241. package/src/api/routes/table.js +11 -0
  242. package/src/api/routes/tests/datasource.spec.js +2 -2
  243. package/src/api/routes/tests/misc.spec.js +5 -1
  244. package/src/api/routes/tests/query.spec.js +0 -1
  245. package/src/api/routes/user.js +5 -0
  246. package/src/app.ts +2 -10
  247. package/src/automations/bullboard.js +28 -11
  248. package/src/automations/tests/automation.spec.js +3 -4
  249. package/src/automations/triggers.js +7 -3
  250. package/src/automations/utils.js +12 -2
  251. package/src/constants/index.js +15 -0
  252. package/src/definitions/common.ts +7 -1
  253. package/src/definitions/datasource.ts +9 -3
  254. package/src/integrations/airtable.ts +2 -1
  255. package/src/integrations/arangodb.ts +2 -1
  256. package/src/integrations/base/IntegrationBase.ts +6 -0
  257. package/src/integrations/base/datasourcePlus.ts +9 -0
  258. package/src/integrations/base/sql.ts +359 -222
  259. package/src/integrations/base/sqlTable.ts +180 -0
  260. package/src/integrations/base/utils.ts +22 -0
  261. package/src/integrations/couchdb.ts +2 -1
  262. package/src/integrations/dynamodb.ts +2 -1
  263. package/src/integrations/elasticsearch.ts +2 -1
  264. package/src/integrations/microsoftSqlServer.ts +145 -13
  265. package/src/integrations/mongodb.ts +2 -1
  266. package/src/integrations/mysql.ts +20 -94
  267. package/src/integrations/postgres.ts +45 -35
  268. package/src/integrations/rest.ts +2 -1
  269. package/src/integrations/s3.ts +2 -1
  270. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  271. package/src/integrations/tests/postgres.spec.js +4 -0
  272. package/src/integrations/utils.ts +60 -8
  273. package/src/middleware/authorized.js +2 -1
  274. package/src/middleware/builder.js +4 -1
  275. package/src/tests/utilities/TestConfiguration.js +2 -1
  276. package/src/{automations/thread.js → threads/automation.js} +24 -7
  277. package/src/threads/index.js +60 -0
  278. package/src/threads/query.js +63 -0
  279. package/src/utilities/csvParser.js +48 -5
  280. package/src/utilities/global.js +7 -2
  281. package/src/utilities/index.js +18 -2
  282. package/src/utilities/queue/inMemoryQueue.js +7 -0
  283. package/src/utilities/scriptRunner.js +4 -1
  284. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  285. package/src/utilities/tests/csvParser.spec.js +3 -0
  286. package/tsconfig.json +1 -1
  287. package/builder/assets/index.34964222.js +0 -201
  288. package/builder/assets/index.7469e1e4.css +0 -29
  289. package/builder/assets/vendor.278a305c.js +0 -9
  290. package/builder/assets/vendor.d75d5eb7.css +0 -1
@@ -1,11 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.copyExistingPropsOver = exports.isIsoDateString = exports.isSQL = exports.getSqlQuery = exports.convertType = exports.breakRowIdField = exports.convertRowId = exports.isRowId = exports.generateRowIdField = exports.breakExternalTableId = exports.buildExternalTableId = exports.isExternalTable = void 0;
3
+ exports.finaliseExternalTables = exports.isIsoDateString = exports.isSQL = exports.getSqlQuery = exports.convertSqlType = exports.breakRowIdField = exports.convertRowId = exports.isRowId = exports.generateRowIdField = exports.breakExternalTableId = exports.buildExternalTableId = exports.isExternalTable = exports.SqlClients = void 0;
4
4
  const datasource_1 = require("../definitions/datasource");
5
5
  const { DocumentTypes, SEPARATOR } = require("../db/utils");
6
- const { FieldTypes } = require("../constants");
6
+ const { FieldTypes, BuildSchemaErrors } = require("../constants");
7
7
  const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`;
8
8
  const ROW_ID_REGEX = /^\[.*]$/g;
9
+ const SQL_TYPE_MAP = {
10
+ text: FieldTypes.LONGFORM,
11
+ varchar: FieldTypes.STRING,
12
+ integer: FieldTypes.NUMBER,
13
+ bigint: FieldTypes.NUMBER,
14
+ decimal: FieldTypes.NUMBER,
15
+ smallint: FieldTypes.NUMBER,
16
+ real: FieldTypes.NUMBER,
17
+ "double precision": FieldTypes.NUMBER,
18
+ timestamp: FieldTypes.DATETIME,
19
+ time: FieldTypes.DATETIME,
20
+ boolean: FieldTypes.BOOLEAN,
21
+ json: FieldTypes.JSON,
22
+ date: FieldTypes.DATETIME,
23
+ blob: FieldTypes.LONGFORM,
24
+ enum: FieldTypes.STRING,
25
+ float: FieldTypes.NUMBER,
26
+ int: FieldTypes.NUMBER,
27
+ numeric: FieldTypes.NUMBER,
28
+ mediumint: FieldTypes.NUMBER,
29
+ dec: FieldTypes.NUMBER,
30
+ double: FieldTypes.NUMBER,
31
+ fixed: FieldTypes.NUMBER,
32
+ datetime: FieldTypes.DATETIME,
33
+ tinyint: FieldTypes.BOOLEAN,
34
+ };
35
+ var SqlClients;
36
+ (function (SqlClients) {
37
+ SqlClients["MS_SQL"] = "mssql";
38
+ SqlClients["POSTGRES"] = "pg";
39
+ SqlClients["MY_SQL"] = "mysql";
40
+ })(SqlClients = exports.SqlClients || (exports.SqlClients = {}));
9
41
  function isExternalTable(tableId) {
10
42
  return tableId.includes(DocumentTypes.DATASOURCE);
11
43
  }
@@ -66,15 +98,15 @@ function breakRowIdField(_id) {
66
98
  }
67
99
  }
68
100
  exports.breakRowIdField = breakRowIdField;
69
- function convertType(type, map) {
70
- for (let [external, internal] of Object.entries(map)) {
101
+ function convertSqlType(type) {
102
+ for (let [external, internal] of Object.entries(SQL_TYPE_MAP)) {
71
103
  if (type.toLowerCase().includes(external)) {
72
104
  return internal;
73
105
  }
74
106
  }
75
107
  return FieldTypes.STRING;
76
108
  }
77
- exports.convertType = convertType;
109
+ exports.convertSqlType = convertSqlType;
78
110
  function getSqlQuery(query) {
79
111
  if (typeof query === "string") {
80
112
  return { sql: query };
@@ -101,10 +133,10 @@ function isIsoDateString(str) {
101
133
  }
102
134
  exports.isIsoDateString = isIsoDateString;
103
135
  // add the existing relationships from the entities if they exist, to prevent them from being overridden
104
- function copyExistingPropsOver(tableName, tables, entities) {
136
+ function copyExistingPropsOver(tableName, table, entities) {
105
137
  if (entities && entities[tableName]) {
106
138
  if (entities[tableName].primaryDisplay) {
107
- tables[tableName].primaryDisplay = entities[tableName].primaryDisplay;
139
+ table.primaryDisplay = entities[tableName].primaryDisplay;
108
140
  }
109
141
  const existingTableSchema = entities[tableName].schema;
110
142
  for (let key in existingTableSchema) {
@@ -112,9 +144,24 @@ function copyExistingPropsOver(tableName, tables, entities) {
112
144
  continue;
113
145
  }
114
146
  if (existingTableSchema[key].type === "link") {
115
- tables[tableName].schema[key] = existingTableSchema[key];
147
+ table.schema[key] = existingTableSchema[key];
116
148
  }
117
149
  }
118
150
  }
151
+ return table;
119
152
  }
120
- exports.copyExistingPropsOver = copyExistingPropsOver;
153
+ function finaliseExternalTables(tables, entities) {
154
+ const finalTables = {};
155
+ const errors = {};
156
+ for (let [name, table] of Object.entries(tables)) {
157
+ // make sure every table has a key
158
+ if (table.primary == null || table.primary.length === 0) {
159
+ errors[name] = BuildSchemaErrors.NO_KEY;
160
+ continue;
161
+ }
162
+ // make sure all previous props have been added back
163
+ finalTables[name] = copyExistingPropsOver(name, table, entities);
164
+ }
165
+ return { tables: finalTables, errors };
166
+ }
167
+ exports.finaliseExternalTables = finaliseExternalTables;
@@ -18,7 +18,8 @@ function hasResource(ctx) {
18
18
  module.exports =
19
19
  (permType, permLevel = null) => (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
20
20
  // webhooks don't need authentication, each webhook unique
21
- if (isWebhookEndpoint(ctx)) {
21
+ // also internal requests (between services) don't need authorized
22
+ if (isWebhookEndpoint(ctx) || ctx.internal) {
22
23
  return next();
23
24
  }
24
25
  if (!ctx.user) {
@@ -13,6 +13,7 @@ const { doesUserHaveLock, updateLock, checkDebounce, setDebounce, } = require(".
13
13
  const CouchDB = require("../db");
14
14
  const { DocumentTypes } = require("../db/utils");
15
15
  const { PermissionTypes } = require("@budibase/auth/permissions");
16
+ const { app: appCache } = require("@budibase/auth/cache");
16
17
  const DEBOUNCE_TIME_SEC = 30;
17
18
  /************************************************** *
18
19
  * This middleware has been broken out of the *
@@ -51,7 +52,9 @@ function updateAppUpdatedAt(ctx) {
51
52
  const db = new CouchDB(appId);
52
53
  const metadata = yield db.get(DocumentTypes.APP_METADATA);
53
54
  metadata.updatedAt = new Date().toISOString();
54
- yield db.put(metadata);
55
+ const response = yield db.put(metadata);
56
+ metadata._rev = response.rev;
57
+ yield appCache.invalidateAppMetadata(appId, metadata);
55
58
  // set a new debounce record with a short TTL
56
59
  yield setDebounce(appId, DEBOUNCE_TIME_SEC);
57
60
  });
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "0.9.183",
4
+ "version": "0.9.185-alpha.10",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.js",
7
7
  "repository": {
@@ -68,9 +68,11 @@
68
68
  "author": "Budibase",
69
69
  "license": "AGPL-3.0-or-later",
70
70
  "dependencies": {
71
- "@budibase/auth": "^0.9.183",
72
- "@budibase/client": "^0.9.183",
73
- "@budibase/string-templates": "^0.9.183",
71
+ "@budibase/auth": "^0.9.185-alpha.10",
72
+ "@budibase/client": "^0.9.185-alpha.10",
73
+ "@budibase/string-templates": "^0.9.185-alpha.10",
74
+ "@bull-board/api": "^3.7.0",
75
+ "@bull-board/koa": "^3.7.0",
74
76
  "@elastic/elasticsearch": "7.10.0",
75
77
  "@koa/router": "8.0.0",
76
78
  "@sendgrid/mail": "7.1.1",
@@ -80,7 +82,6 @@
80
82
  "aws-sdk": "^2.767.0",
81
83
  "bcryptjs": "2.4.3",
82
84
  "bull": "^3.22.4",
83
- "bull-board": "^2.0.1",
84
85
  "chmodr": "1.2.0",
85
86
  "csvtojson": "2.0.10",
86
87
  "dotenv": "8.2.0",
@@ -120,6 +121,7 @@
120
121
  "uuid": "3.3.2",
121
122
  "validate.js": "0.13.1",
122
123
  "vm2": "^3.9.3",
124
+ "worker-farm": "^1.7.0",
123
125
  "yargs": "13.2.4",
124
126
  "zlib": "1.0.5"
125
127
  },
@@ -138,7 +140,6 @@
138
140
  "copyfiles": "^2.4.1",
139
141
  "docker-compose": "^0.23.6",
140
142
  "eslint": "^6.8.0",
141
- "express": "^4.17.1",
142
143
  "jest": "^27.0.5",
143
144
  "nodemon": "^2.0.4",
144
145
  "prettier": "^2.3.1",
@@ -289,7 +289,8 @@ class TestConfiguration {
289
289
  createDatasource(config = null) {
290
290
  return __awaiter(this, void 0, void 0, function* () {
291
291
  config = config || basicDatasource();
292
- this.datasource = yield this._req(config, null, controllers.datasource.save);
292
+ const response = yield this._req(config, null, controllers.datasource.save);
293
+ this.datasource = response.datasource;
293
294
  return this.datasource;
294
295
  });
295
296
  }
@@ -8,8 +8,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const actions = require("./actions");
12
- const automationUtils = require("./automationUtils");
11
+ const actions = require("../automations/actions");
12
+ const automationUtils = require("../automations/automationUtils");
13
13
  const AutomationEmitter = require("../events/AutomationEmitter");
14
14
  const { processObject } = require("@budibase/string-templates");
15
15
  const { DEFAULT_TENANT_ID } = require("@budibase/auth").constants;
@@ -18,7 +18,9 @@ const { DocumentTypes, isDevAppID } = require("../db/utils");
18
18
  const { doInTenant } = require("@budibase/auth/tenancy");
19
19
  const env = require("../environment");
20
20
  const usage = require("../utilities/usageQuota");
21
+ const { definitions: triggerDefs } = require("../automations/triggerInfo");
21
22
  const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId;
23
+ const CRON_STEP_ID = triggerDefs.CRON.stepId;
22
24
  const STOPPED_STATUS = { success: false, status: "STOPPED" };
23
25
  /**
24
26
  * The automation orchestrator is a class responsible for executing automations.
@@ -31,6 +33,8 @@ class Orchestrator {
31
33
  this._chainCount = this._metadata ? this._metadata.automationChainCount : 0;
32
34
  this._appId = triggerOutput.appId;
33
35
  this._app = null;
36
+ const triggerStepId = automation.definition.trigger.stepId;
37
+ triggerOutput = this.cleanupTriggerOutputs(triggerStepId, triggerOutput);
34
38
  // remove from context
35
39
  delete triggerOutput.appId;
36
40
  delete triggerOutput.metadata;
@@ -42,10 +46,15 @@ class Orchestrator {
42
46
  this._emitter = new AutomationEmitter(this._chainCount + 1);
43
47
  this.executionOutput = { trigger: {}, steps: [] };
44
48
  // setup the execution output
45
- const triggerStepId = automation.definition.trigger.stepId;
46
49
  const triggerId = automation.definition.trigger.id;
47
50
  this.updateExecutionOutput(triggerId, triggerStepId, null, triggerOutput);
48
51
  }
52
+ cleanupTriggerOutputs(stepId, triggerOutput) {
53
+ if (stepId === CRON_STEP_ID) {
54
+ triggerOutput.timestamp = Date.now();
55
+ }
56
+ return triggerOutput;
57
+ }
49
58
  getStepFunctionality(stepId) {
50
59
  return __awaiter(this, void 0, void 0, function* () {
51
60
  let step = yield actions.getAction(stepId);
@@ -122,7 +131,14 @@ class Orchestrator {
122
131
  });
123
132
  }
124
133
  }
125
- module.exports = (job) => __awaiter(void 0, void 0, void 0, function* () {
126
- const automationOrchestrator = new Orchestrator(job.data.automation, job.data.event);
127
- return automationOrchestrator.execute();
128
- });
134
+ module.exports = (input, callback) => {
135
+ const automationOrchestrator = new Orchestrator(input.data.automation, input.data.event);
136
+ automationOrchestrator
137
+ .execute()
138
+ .then(response => {
139
+ callback(null, response);
140
+ })
141
+ .catch(err => {
142
+ callback(err);
143
+ });
144
+ };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ const workerFarm = require("worker-farm");
3
+ const env = require("../environment");
4
+ const ThreadType = {
5
+ QUERY: "query",
6
+ AUTOMATION: "automation",
7
+ };
8
+ function typeToFile(type) {
9
+ let filename = null;
10
+ switch (type) {
11
+ case ThreadType.QUERY:
12
+ filename = "./query";
13
+ break;
14
+ case ThreadType.AUTOMATION:
15
+ filename = "./automation";
16
+ break;
17
+ default:
18
+ throw "Unknown thread type";
19
+ }
20
+ return require.resolve(filename);
21
+ }
22
+ class Thread {
23
+ constructor(type, opts = { timeoutMs: null, count: 1 }) {
24
+ this.type = type;
25
+ if (!env.isTest()) {
26
+ const workerOpts = {
27
+ autoStart: true,
28
+ maxConcurrentWorkers: opts.count ? opts.count : 1,
29
+ };
30
+ if (opts.timeoutMs) {
31
+ workerOpts.maxCallTime = opts.timeoutMs;
32
+ }
33
+ this.workers = workerFarm(workerOpts, typeToFile(type));
34
+ }
35
+ }
36
+ run(data) {
37
+ return new Promise((resolve, reject) => {
38
+ let fncToCall;
39
+ // if in test then don't use threading
40
+ if (env.isTest()) {
41
+ fncToCall = require(typeToFile(this.type));
42
+ }
43
+ else {
44
+ fncToCall = this.workers;
45
+ }
46
+ fncToCall(data, (err, response) => {
47
+ if (err) {
48
+ reject(err);
49
+ }
50
+ else {
51
+ resolve(response);
52
+ }
53
+ });
54
+ });
55
+ }
56
+ }
57
+ module.exports.Thread = Thread;
58
+ module.exports.ThreadType = ThreadType;
@@ -0,0 +1,61 @@
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
+ const ScriptRunner = require("../utilities/scriptRunner");
12
+ const { integrations } = require("../integrations");
13
+ function formatResponse(resp) {
14
+ if (typeof resp === "string") {
15
+ try {
16
+ resp = JSON.parse(resp);
17
+ }
18
+ catch (err) {
19
+ resp = { response: resp };
20
+ }
21
+ }
22
+ return resp;
23
+ }
24
+ function runAndTransform(datasource, queryVerb, query, transformer) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const Integration = integrations[datasource.source];
27
+ if (!Integration) {
28
+ throw "Integration type does not exist.";
29
+ }
30
+ const integration = new Integration(datasource.config);
31
+ let rows = formatResponse(yield integration[queryVerb](query));
32
+ // transform as required
33
+ if (transformer) {
34
+ const runner = new ScriptRunner(transformer, { data: rows });
35
+ rows = runner.execute();
36
+ }
37
+ // needs to an array for next step
38
+ if (!Array.isArray(rows)) {
39
+ rows = [rows];
40
+ }
41
+ // map into JSON if just raw primitive here
42
+ if (rows.find(row => typeof row !== "object")) {
43
+ rows = rows.map(value => ({ value }));
44
+ }
45
+ // get all the potential fields in the schema
46
+ let keys = rows.flatMap(Object.keys);
47
+ if (integration.end) {
48
+ integration.end();
49
+ }
50
+ return { rows, keys };
51
+ });
52
+ }
53
+ module.exports = (input, callback) => {
54
+ runAndTransform(input.datasource, input.queryVerb, input.query, input.transformer)
55
+ .then(response => {
56
+ callback(null, response);
57
+ })
58
+ .catch(err => {
59
+ callback(err);
60
+ });
61
+ };