@budibase/server 1.0.79 → 1.0.80-alpha.0

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 (308) hide show
  1. package/__mocks__/node-fetch.ts +1 -0
  2. package/builder/assets/index.b37e0ebb.js +1288 -0
  3. package/builder/assets/{index.c8d1e8f0.css → index.c57242d4.css} +2 -2
  4. package/builder/assets/{vendor.20f80cec.js → vendor.a7c6ad0a.js} +190 -216
  5. package/builder/index.html +3 -3
  6. package/coverage/clover.xml +2399 -2336
  7. package/coverage/coverage-final.json +138 -137
  8. package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  10. package/coverage/lcov-report/api/controllers/application.js.html +152 -149
  11. package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
  12. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  13. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  14. package/coverage/lcov-report/api/controllers/cloud.js.html +11 -11
  15. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  16. package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
  17. package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
  18. package/coverage/lcov-report/api/controllers/index.html +16 -16
  19. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  22. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  24. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.js.html +26 -26
  26. package/coverage/lcov-report/api/controllers/query/validation.js.html +10 -10
  27. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  29. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  30. package/coverage/lcov-report/api/controllers/row/index.html +27 -27
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +46 -46
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +94 -82
  33. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +204 -204
  34. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -24
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -29
  36. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  37. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  38. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +49 -49
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  40. package/coverage/lcov-report/api/controllers/table/index.html +11 -11
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +47 -44
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +50 -50
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +80 -80
  44. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  45. package/coverage/lcov-report/api/controllers/user.js.html +19 -19
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +12 -12
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -27
  52. package/coverage/lcov-report/api/index.html +10 -10
  53. package/coverage/lcov-report/api/index.js.html +37 -28
  54. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  56. package/coverage/lcov-report/api/routes/application.js.html +9 -9
  57. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  58. package/coverage/lcov-report/api/routes/automation.js.html +19 -109
  59. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  60. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  61. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/datasource.js.html +18 -156
  63. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  64. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  65. package/coverage/lcov-report/api/routes/index.html +35 -35
  66. package/coverage/lcov-report/api/routes/index.js.html +38 -32
  67. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  69. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  70. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  71. package/coverage/lcov-report/api/routes/permission.js.html +16 -58
  72. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  73. package/coverage/lcov-report/api/routes/role.js.html +15 -78
  74. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  75. package/coverage/lcov-report/api/routes/row.js.html +17 -14
  76. package/coverage/lcov-report/api/routes/screen.js.html +14 -95
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  79. package/coverage/lcov-report/api/routes/table.js.html +17 -62
  80. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  81. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  82. package/coverage/lcov-report/api/routes/utils/index.html +111 -0
  83. package/coverage/lcov-report/api/routes/utils/validators.js.html +737 -0
  84. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  85. package/coverage/lcov-report/api/routes/webhook.js.html +14 -62
  86. package/coverage/lcov-report/automations/actions.js.html +24 -24
  87. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  88. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  89. package/coverage/lcov-report/automations/index.html +1 -1
  90. package/coverage/lcov-report/automations/index.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -7
  93. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  95. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  98. package/coverage/lcov-report/automations/steps/filter.js.html +12 -9
  99. package/coverage/lcov-report/automations/steps/index.html +1 -1
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +11 -11
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  105. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  107. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +26 -26
  118. package/coverage/lcov-report/automations/utils.js.html +35 -35
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +40 -28
  121. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  122. package/coverage/lcov-report/constants/screens.js.html +4 -4
  123. package/coverage/lcov-report/db/client.js.html +18 -18
  124. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  125. package/coverage/lcov-report/db/index.html +15 -15
  126. package/coverage/lcov-report/db/index.js.html +3 -3
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +21 -21
  128. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +36 -36
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +30 -30
  131. package/coverage/lcov-report/db/newid.js.html +4 -4
  132. package/coverage/lcov-report/db/utils.js.html +123 -87
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  134. package/coverage/lcov-report/events/index.html +1 -1
  135. package/coverage/lcov-report/events/index.js.html +8 -8
  136. package/coverage/lcov-report/events/utils.js.html +18 -18
  137. package/coverage/lcov-report/index.html +89 -74
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  141. package/coverage/lcov-report/middleware/authorized.js.html +29 -29
  142. package/coverage/lcov-report/middleware/builder.js.html +16 -16
  143. package/coverage/lcov-report/middleware/currentapp.js.html +44 -44
  144. package/coverage/lcov-report/middleware/index.html +1 -1
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +14 -14
  146. package/coverage/lcov-report/middleware/resourceId.js.html +29 -29
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +17 -17
  149. package/coverage/lcov-report/middleware/utils.js.html +4 -4
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +19 -19
  152. package/coverage/lcov-report/threads/index.js.html +10 -10
  153. package/coverage/lcov-report/threads/query.js.html +123 -39
  154. package/coverage/lcov-report/threads/utils.js.html +14 -14
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  157. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  158. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  159. package/coverage/lcov-report/utilities/global.js.html +28 -28
  160. package/coverage/lcov-report/utilities/index.html +18 -18
  161. package/coverage/lcov-report/utilities/index.js.html +24 -24
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
  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 +6 -6
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +60 -60
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +13 -13
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  170. package/coverage/lcov-report/utilities/security.js.html +8 -8
  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 +12 -12
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +5 -5
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +200 -53
  178. package/coverage/lcov.info +3323 -3224
  179. package/dist/api/controllers/application.js +1 -0
  180. package/dist/api/controllers/public/applications.js +94 -0
  181. package/dist/api/controllers/public/mapping/applications.js +29 -0
  182. package/dist/api/controllers/public/mapping/index.js +11 -0
  183. package/dist/api/controllers/public/mapping/queries.js +36 -0
  184. package/dist/api/controllers/public/mapping/rows.js +24 -0
  185. package/dist/api/controllers/public/mapping/tables.js +23 -0
  186. package/dist/api/controllers/public/mapping/types.js +2 -0
  187. package/dist/api/controllers/public/mapping/users.js +29 -0
  188. package/dist/api/controllers/public/queries.js +38 -0
  189. package/dist/api/controllers/public/rows.js +97 -0
  190. package/dist/api/controllers/public/tables.js +75 -0
  191. package/dist/api/controllers/public/users.js +95 -0
  192. package/dist/api/controllers/public/utils.js +49 -0
  193. package/dist/api/controllers/row/internal.js +4 -1
  194. package/dist/api/controllers/table/index.js +2 -1
  195. package/dist/api/controllers/webhook.js +3 -5
  196. package/dist/api/index.js +3 -1
  197. package/dist/api/routes/automation.js +3 -31
  198. package/dist/api/routes/datasource.js +3 -50
  199. package/dist/api/routes/index.js +2 -0
  200. package/dist/api/routes/permission.js +4 -14
  201. package/dist/api/routes/public/applications.js +141 -0
  202. package/dist/api/routes/public/index.js +101 -0
  203. package/dist/api/routes/public/middleware/mapper.js +94 -0
  204. package/dist/api/routes/public/queries.js +77 -0
  205. package/dist/api/routes/public/rows.js +229 -0
  206. package/dist/api/routes/public/tables.js +154 -0
  207. package/dist/api/routes/public/users.js +137 -0
  208. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  209. package/dist/api/routes/role.js +3 -19
  210. package/dist/api/routes/row.js +3 -4
  211. package/dist/api/routes/screen.js +2 -23
  212. package/dist/api/routes/table.js +3 -17
  213. package/dist/api/routes/tests/utilities/index.js +23 -0
  214. package/dist/api/routes/utils/validators.js +200 -0
  215. package/dist/api/routes/webhook.js +2 -17
  216. package/dist/automations/steps/filter.js +2 -2
  217. package/dist/automations/steps/queryRows.js +1 -1
  218. package/dist/automations/utils.js +2 -2
  219. package/dist/constants/index.js +3 -0
  220. package/dist/db/utils.js +11 -0
  221. package/dist/definitions/openapi.js +6 -0
  222. package/dist/environment.js +1 -0
  223. package/dist/integrations/googlesheets.js +3 -0
  224. package/dist/integrations/microsoftSqlServer.js +35 -29
  225. package/dist/integrations/mysql.js +3 -0
  226. package/dist/integrations/oracle.js +14 -19
  227. package/dist/integrations/postgres.js +34 -28
  228. package/dist/package.json +11 -7
  229. package/dist/tests/utilities/TestConfiguration.js +25 -8
  230. package/dist/threads/query.js +33 -8
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/dist/utilities/workerRequests.js +50 -15
  233. package/package.json +12 -8
  234. package/scripts/integrations/oracle/oracle.md +2 -2
  235. package/scripts/integrations/postgres/init.sql +5 -3
  236. package/scripts/likeCypress.ts +9 -6
  237. package/specs/generate.js +83 -0
  238. package/specs/openapi.json +2222 -0
  239. package/specs/openapi.yaml +1530 -0
  240. package/specs/parameters.js +59 -0
  241. package/specs/resources/application.js +101 -0
  242. package/specs/resources/index.js +24 -0
  243. package/specs/resources/misc.js +12 -0
  244. package/specs/resources/query.js +189 -0
  245. package/specs/resources/row.js +125 -0
  246. package/specs/resources/table.js +191 -0
  247. package/specs/resources/user.js +126 -0
  248. package/specs/resources/utils/Resource.js +26 -0
  249. package/specs/resources/utils/index.js +11 -0
  250. package/specs/security.js +7 -0
  251. package/src/api/controllers/application.js +1 -0
  252. package/src/api/controllers/public/applications.ts +74 -0
  253. package/src/api/controllers/public/mapping/applications.ts +32 -0
  254. package/src/api/controllers/public/mapping/index.ts +13 -0
  255. package/src/api/controllers/public/mapping/queries.ts +39 -0
  256. package/src/api/controllers/public/mapping/rows.ts +31 -0
  257. package/src/api/controllers/public/mapping/tables.ts +26 -0
  258. package/src/api/controllers/public/mapping/types.ts +13 -0
  259. package/src/api/controllers/public/mapping/users.ts +32 -0
  260. package/src/api/controllers/public/queries.ts +20 -0
  261. package/src/api/controllers/public/rows.ts +77 -0
  262. package/src/api/controllers/public/tables.ts +56 -0
  263. package/src/api/controllers/public/users.ts +82 -0
  264. package/src/api/controllers/public/utils.ts +38 -0
  265. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  266. package/src/api/controllers/row/internal.js +4 -0
  267. package/src/api/controllers/table/index.js +2 -1
  268. package/src/api/controllers/webhook.js +3 -6
  269. package/src/api/index.js +4 -1
  270. package/src/api/routes/automation.js +3 -33
  271. package/src/api/routes/datasource.js +6 -52
  272. package/src/api/routes/index.js +2 -0
  273. package/src/api/routes/permission.js +4 -18
  274. package/src/api/routes/public/applications.ts +156 -0
  275. package/src/api/routes/public/index.ts +118 -0
  276. package/src/api/routes/public/middleware/mapper.ts +81 -0
  277. package/src/api/routes/public/queries.ts +81 -0
  278. package/src/api/routes/public/rows.ts +242 -0
  279. package/src/api/routes/public/tables.ts +169 -0
  280. package/src/api/routes/public/tests/compare.spec.js +184 -0
  281. package/src/api/routes/public/users.ts +144 -0
  282. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  283. package/src/api/routes/role.js +3 -24
  284. package/src/api/routes/row.js +3 -2
  285. package/src/api/routes/screen.js +2 -29
  286. package/src/api/routes/table.js +4 -19
  287. package/src/api/routes/tests/utilities/index.js +24 -0
  288. package/src/api/routes/utils/validators.js +219 -0
  289. package/src/api/routes/webhook.js +2 -18
  290. package/src/automations/steps/filter.js +3 -2
  291. package/src/automations/steps/queryRows.js +1 -1
  292. package/src/automations/utils.js +2 -2
  293. package/src/constants/index.js +4 -0
  294. package/src/db/utils.js +12 -0
  295. package/src/definitions/common.ts +4 -0
  296. package/src/definitions/openapi.ts +943 -0
  297. package/src/environment.js +1 -0
  298. package/src/integrations/base/datasourcePlus.ts +3 -0
  299. package/src/integrations/googlesheets.ts +5 -2
  300. package/src/integrations/microsoftSqlServer.ts +38 -33
  301. package/src/integrations/mysql.ts +4 -0
  302. package/src/integrations/oracle.ts +27 -35
  303. package/src/integrations/postgres.ts +33 -26
  304. package/src/tests/utilities/TestConfiguration.js +23 -2
  305. package/src/threads/query.js +37 -9
  306. package/src/utilities/workerRequests.js +65 -16
  307. package/builder/assets/index.f28c5d54.js +0 -1352
  308. package/scripts/proxy/generateProxyConfig.js +0 -70
@@ -84,31 +84,10 @@ var PostgresModule;
84
84
  },
85
85
  },
86
86
  };
87
- function internalQuery(client, query) {
88
- return __awaiter(this, void 0, void 0, function* () {
89
- // need to handle a specific issue with json data types in postgres,
90
- // new lines inside the JSON data will break it
91
- if (query && query.sql) {
92
- const matches = query.sql.match(JSON_REGEX);
93
- if (matches && matches.length > 0) {
94
- for (let match of matches) {
95
- const escaped = escapeDangerousCharacters(match);
96
- query.sql = query.sql.replace(match, escaped);
97
- }
98
- }
99
- }
100
- try {
101
- return yield client.query(query.sql, query.bindings || []);
102
- }
103
- catch (err) {
104
- // @ts-ignore
105
- throw new Error(err);
106
- }
107
- });
108
- }
109
87
  class PostgresIntegration extends Sql {
110
88
  constructor(config) {
111
89
  super(utils_1.SqlClients.POSTGRES);
90
+ this.index = 1;
112
91
  this.tables = {};
113
92
  this.schemaErrors = {};
114
93
  this.PRIMARY_KEYS_SQL = `
@@ -133,6 +112,33 @@ var PostgresModule;
133
112
  this.client = this.pool;
134
113
  this.setSchema();
135
114
  }
115
+ getBindingIdentifier() {
116
+ return `$${this.index++}`;
117
+ }
118
+ internalQuery(query) {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ const client = this.client;
121
+ this.index = 1;
122
+ // need to handle a specific issue with json data types in postgres,
123
+ // new lines inside the JSON data will break it
124
+ if (query && query.sql) {
125
+ const matches = query.sql.match(JSON_REGEX);
126
+ if (matches && matches.length > 0) {
127
+ for (let match of matches) {
128
+ const escaped = escapeDangerousCharacters(match);
129
+ query.sql = query.sql.replace(match, escaped);
130
+ }
131
+ }
132
+ }
133
+ try {
134
+ return yield client.query(query.sql, query.bindings || []);
135
+ }
136
+ catch (err) {
137
+ // @ts-ignore
138
+ throw new Error(err);
139
+ }
140
+ });
141
+ }
136
142
  setSchema() {
137
143
  if (!this.config.schema) {
138
144
  this.config.schema = "public";
@@ -202,25 +208,25 @@ var PostgresModule;
202
208
  }
203
209
  create(query) {
204
210
  return __awaiter(this, void 0, void 0, function* () {
205
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
211
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
206
212
  return response.rows.length ? response.rows : [{ created: true }];
207
213
  });
208
214
  }
209
215
  read(query) {
210
216
  return __awaiter(this, void 0, void 0, function* () {
211
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
217
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
212
218
  return response.rows;
213
219
  });
214
220
  }
215
221
  update(query) {
216
222
  return __awaiter(this, void 0, void 0, function* () {
217
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
223
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
218
224
  return response.rows.length ? response.rows : [{ updated: true }];
219
225
  });
220
226
  }
221
227
  delete(query) {
222
228
  return __awaiter(this, void 0, void 0, function* () {
223
- const response = yield internalQuery(this.client, utils_1.getSqlQuery(query));
229
+ const response = yield this.internalQuery(utils_1.getSqlQuery(query));
224
230
  return response.rows.length ? response.rows : [{ deleted: true }];
225
231
  });
226
232
  }
@@ -231,12 +237,12 @@ var PostgresModule;
231
237
  if (Array.isArray(input)) {
232
238
  const responses = [];
233
239
  for (let query of input) {
234
- responses.push(yield internalQuery(this.client, query));
240
+ responses.push(yield this.internalQuery(query));
235
241
  }
236
242
  return responses;
237
243
  }
238
244
  else {
239
- const response = yield internalQuery(this.client, input);
245
+ const response = yield this.internalQuery(input);
240
246
  return response.rows.length ? response.rows : [{ [operation]: true }];
241
247
  }
242
248
  });
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.78",
4
+ "version": "1.0.79",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -21,10 +21,8 @@
21
21
  "dev:stack:down": "node scripts/dev/manage.js down",
22
22
  "dev:stack:nuke": "node scripts/dev/manage.js nuke",
23
23
  "dev:builder": "yarn run dev:stack:up && nodemon",
24
- "generate:proxy:compose": "node scripts/proxy/generateProxyConfig compose",
25
- "generate:proxy:preprod": "node scripts/proxy/generateProxyConfig preprod",
26
- "generate:proxy:prod": "node scripts/proxy/generateProxyConfig prod",
27
24
  "format": "prettier --config ../../.prettierrc.json 'src/**/*.ts' --write",
25
+ "specs": "node specs/generate.js && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
28
26
  "lint": "eslint --fix src/",
29
27
  "lint:fix": "yarn run format && yarn run lint",
30
28
  "initialise": "node scripts/initialise.js",
@@ -73,9 +71,9 @@
73
71
  "license": "GPL-3.0",
74
72
  "dependencies": {
75
73
  "@apidevtools/swagger-parser": "^10.0.3",
76
- "@budibase/backend-core": "^1.0.78",
77
- "@budibase/client": "^1.0.78",
78
- "@budibase/string-templates": "^1.0.78",
74
+ "@budibase/backend-core": "^1.0.79",
75
+ "@budibase/client": "^1.0.79",
76
+ "@budibase/string-templates": "^1.0.79",
79
77
  "@bull-board/api": "^3.7.0",
80
78
  "@bull-board/koa": "^3.7.0",
81
79
  "@elastic/elasticsearch": "7.10.0",
@@ -110,6 +108,7 @@
110
108
  "koa-send": "5.0.0",
111
109
  "koa-session": "5.12.0",
112
110
  "koa-static": "5.0.0",
111
+ "koa2-ratelimit": "^1.1.0",
113
112
  "lodash": "4.17.21",
114
113
  "memorystream": "^0.3.1",
115
114
  "mongodb": "3.6.3",
@@ -125,6 +124,7 @@
125
124
  "pouchdb-all-dbs": "1.0.2",
126
125
  "pouchdb-find": "^7.2.2",
127
126
  "pouchdb-replication-stream": "1.2.9",
127
+ "redis": "4",
128
128
  "server-destroy": "1.0.1",
129
129
  "svelte": "^3.38.2",
130
130
  "swagger-parser": "^10.0.3",
@@ -150,6 +150,7 @@
150
150
  "@types/koa-router": "^7.4.2",
151
151
  "@types/node": "^15.12.4",
152
152
  "@types/oracledb": "^5.2.1",
153
+ "@types/redis": "^4.0.11",
153
154
  "@typescript-eslint/parser": "4.28.0",
154
155
  "apidoc": "^0.50.2",
155
156
  "babel-jest": "^27.0.2",
@@ -157,12 +158,15 @@
157
158
  "docker-compose": "^0.23.6",
158
159
  "eslint": "^6.8.0",
159
160
  "jest": "^27.0.5",
161
+ "jest-openapi": "^0.14.2",
160
162
  "nodemon": "^2.0.4",
161
163
  "openapi-types": "^9.3.1",
164
+ "openapi-typescript": "^5.2.0",
162
165
  "path-to-regexp": "^6.2.0",
163
166
  "prettier": "^2.3.1",
164
167
  "rimraf": "^3.0.2",
165
168
  "supertest": "^4.0.2",
169
+ "swagger-jsdoc": "^6.1.0",
166
170
  "ts-jest": "^27.0.3",
167
171
  "ts-node": "^10.0.0",
168
172
  "typescript": "^4.3.5",
@@ -24,6 +24,8 @@ const { createASession } = require("@budibase/backend-core/sessions");
24
24
  const { user: userCache } = require("@budibase/backend-core/cache");
25
25
  const newid = require("../../db/newid");
26
26
  const context = require("@budibase/backend-core/context");
27
+ const { generateDevInfoID, SEPARATOR } = require("@budibase/backend-core/db");
28
+ const { encrypt } = require("@budibase/backend-core/encryption");
27
29
  const GLOBAL_USER_ID = "us_uuid1";
28
30
  const EMAIL = "babs@babs.com";
29
31
  const CSRF_TOKEN = "e3727778-7af0-4226-b5eb-f43cbe60a306";
@@ -42,6 +44,9 @@ class TestConfiguration {
42
44
  getRequest() {
43
45
  return this.request;
44
46
  }
47
+ getApp() {
48
+ return this.app;
49
+ }
45
50
  getAppId() {
46
51
  return this.appId;
47
52
  }
@@ -80,6 +85,22 @@ class TestConfiguration {
80
85
  }
81
86
  });
82
87
  }
88
+ generateApiKey(userId = GLOBAL_USER_ID) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ const db = getGlobalDB(TENANT_ID);
91
+ const id = generateDevInfoID(userId);
92
+ let devInfo;
93
+ try {
94
+ devInfo = yield db.get(id);
95
+ }
96
+ catch (err) {
97
+ devInfo = { _id: id, userId };
98
+ }
99
+ devInfo.apiKey = encrypt(`${TENANT_ID}${SEPARATOR}${newid()}`);
100
+ yield db.put(devInfo);
101
+ return devInfo.apiKey;
102
+ });
103
+ }
83
104
  globalUser({ id = GLOBAL_USER_ID, builder = true, email = EMAIL, roles, } = {}) {
84
105
  return __awaiter(this, void 0, void 0, function* () {
85
106
  const db = getGlobalDB(TENANT_ID);
@@ -122,7 +143,7 @@ class TestConfiguration {
122
143
  }
123
144
  cleanup(this.allApps.map(app => app.appId));
124
145
  }
125
- defaultHeaders() {
146
+ defaultHeaders(extras = {}) {
126
147
  const auth = {
127
148
  userId: GLOBAL_USER_ID,
128
149
  sessionId: "sessionid",
@@ -134,14 +155,10 @@ class TestConfiguration {
134
155
  };
135
156
  const authToken = jwt.sign(auth, env.JWT_SECRET);
136
157
  const appToken = jwt.sign(app, env.JWT_SECRET);
137
- const headers = {
138
- Accept: "application/json",
139
- Cookie: [
158
+ const headers = Object.assign({ Accept: "application/json", Cookie: [
140
159
  `${Cookies.Auth}=${authToken}`,
141
160
  `${Cookies.CurrentApp}=${appToken}`,
142
- ],
143
- [Headers.CSRF_TOKEN]: CSRF_TOKEN,
144
- };
161
+ ], [Headers.CSRF_TOKEN]: CSRF_TOKEN }, extras);
145
162
  if (this.appId) {
146
163
  headers[Headers.APP_ID] = this.appId;
147
164
  }
@@ -204,7 +221,7 @@ class TestConfiguration {
204
221
  getTable(tableId = null) {
205
222
  return __awaiter(this, void 0, void 0, function* () {
206
223
  tableId = tableId || this.table._id;
207
- return this._req(null, { id: tableId }, controllers.table.find);
224
+ return this._req(null, { tableId }, controllers.table.find);
208
225
  });
209
226
  }
210
227
  createLinkedTable(relationshipType = null, links = ["link"]) {
@@ -12,8 +12,9 @@ const threadUtils = require("./utils");
12
12
  threadUtils.threadSetup();
13
13
  const ScriptRunner = require("../utilities/scriptRunner");
14
14
  const { integrations } = require("../integrations");
15
- const { processStringSync } = require("@budibase/string-templates");
15
+ const { processStringSync, findHBSBlocks, } = require("@budibase/string-templates");
16
16
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
17
+ const { isSQL } = require("../integrations/utils");
17
18
  class QueryRunner {
18
19
  constructor(input, flags = { noRecursiveQuery: false }) {
19
20
  this.datasource = input.datasource;
@@ -31,21 +32,45 @@ class QueryRunner {
31
32
  this.queryResponse = {};
32
33
  this.hasRerun = false;
33
34
  }
35
+ interpolateSQL(fields, parameters, integration) {
36
+ let sql = fields.sql;
37
+ if (!sql) {
38
+ return fields;
39
+ }
40
+ const bindings = findHBSBlocks(sql);
41
+ let variables = [];
42
+ for (let binding of bindings) {
43
+ let variable = integration.getBindingIdentifier();
44
+ variables.push(binding);
45
+ sql = sql.replace(binding, variable);
46
+ }
47
+ // replicate the knex structure
48
+ fields.sql = sql;
49
+ fields.bindings = this.enrichQueryFields(variables, parameters);
50
+ return fields;
51
+ }
34
52
  execute() {
35
53
  return __awaiter(this, void 0, void 0, function* () {
36
54
  let { datasource, fields, queryVerb, transformer } = this;
55
+ const Integration = integrations[datasource.source];
56
+ if (!Integration) {
57
+ throw "Integration type does not exist.";
58
+ }
59
+ const integration = new Integration(datasource.config);
37
60
  // pre-query, make sure datasource variables are added to parameters
38
61
  const parameters = yield this.addDatasourceVariables();
39
- let query = this.enrichQueryFields(fields, parameters);
62
+ let query;
63
+ // handle SQL injections by interpolating the variables
64
+ if (isSQL(datasource)) {
65
+ query = this.interpolateSQL(fields, parameters, integration);
66
+ }
67
+ else {
68
+ query = this.enrichQueryFields(fields, parameters);
69
+ }
40
70
  // Add pagination values for REST queries
41
71
  if (this.pagination) {
42
72
  query.paginationValues = this.pagination;
43
73
  }
44
- const Integration = integrations[datasource.source];
45
- if (!Integration) {
46
- throw "Integration type does not exist.";
47
- }
48
- const integration = new Integration(datasource.config);
49
74
  let output = threadUtils.formatResponse(yield integration[queryVerb](query));
50
75
  let rows = output, info = undefined, extra = undefined, pagination = undefined;
51
76
  if (threadUtils.hasExtraData(output)) {
@@ -168,7 +193,7 @@ class QueryRunner {
168
193
  });
169
194
  }
170
195
  enrichQueryFields(fields, parameters = {}) {
171
- const enrichedQuery = {};
196
+ const enrichedQuery = Array.isArray(fields) ? [] : {};
172
197
  // enrich the fields with dynamic parameters
173
198
  for (let key of Object.keys(fields)) {
174
199
  if (fields[key] == null) {