@budibase/server 1.0.32 → 1.0.39

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 (382) hide show
  1. package/__mocks__/node-fetch.ts +21 -0
  2. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  3. package/builder/assets/index.3079d0f9.js +1348 -0
  4. package/builder/assets/{index.4fb3f887.css → index.39e01193.css} +1 -1
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +1591 -1345
  8. package/coverage/coverage-final.json +75 -74
  9. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/apikeys.js.html +3 -3
  11. package/coverage/lcov-report/api/controllers/application.js.html +73 -64
  12. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  13. package/coverage/lcov-report/api/controllers/automation.js.html +22 -10
  14. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/cloud.js.html +13 -4
  16. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  17. package/coverage/lcov-report/api/controllers/datasource.js.html +170 -68
  18. package/coverage/lcov-report/api/controllers/dev.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/hosting.js.html +3 -3
  20. package/coverage/lcov-report/api/controllers/index.html +39 -54
  21. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  25. package/coverage/lcov-report/api/controllers/query/index.html +126 -0
  26. package/coverage/lcov-report/api/controllers/{query.js.html → query/index.js.html} +228 -114
  27. package/coverage/lcov-report/api/controllers/query/validation.js.html +206 -0
  28. package/coverage/lcov-report/api/controllers/role.js.html +2 -2
  29. package/coverage/lcov-report/api/controllers/routing.js.html +2 -2
  30. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/index.html +22 -22
  32. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  34. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +8 -5
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  36. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  37. package/coverage/lcov-report/api/controllers/script.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 +120 -12
  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 +19 -7
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +6 -6
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +2 -2
  55. package/coverage/lcov-report/api/routes/application.js.html +2 -2
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +2 -2
  58. package/coverage/lcov-report/api/routes/backup.js.html +2 -2
  59. package/coverage/lcov-report/api/routes/cloud.js.html +2 -2
  60. package/coverage/lcov-report/api/routes/component.js.html +2 -2
  61. package/coverage/lcov-report/api/routes/datasource.js.html +2 -2
  62. package/coverage/lcov-report/api/routes/deploy.js.html +2 -2
  63. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  64. package/coverage/lcov-report/api/routes/hosting.js.html +2 -2
  65. package/coverage/lcov-report/api/routes/index.html +9 -9
  66. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/integration.js.html +2 -2
  68. package/coverage/lcov-report/api/routes/layout.js.html +2 -2
  69. package/coverage/lcov-report/api/routes/metadata.js.html +2 -2
  70. package/coverage/lcov-report/api/routes/permission.js.html +12 -3
  71. package/coverage/lcov-report/api/routes/query.js.html +20 -86
  72. package/coverage/lcov-report/api/routes/role.js.html +2 -2
  73. package/coverage/lcov-report/api/routes/routing.js.html +2 -2
  74. package/coverage/lcov-report/api/routes/row.js.html +2 -2
  75. package/coverage/lcov-report/api/routes/screen.js.html +2 -2
  76. package/coverage/lcov-report/api/routes/script.js.html +2 -2
  77. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  78. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  79. package/coverage/lcov-report/api/routes/templates.js.html +2 -2
  80. package/coverage/lcov-report/api/routes/user.js.html +33 -3
  81. package/coverage/lcov-report/api/routes/view.js.html +2 -2
  82. package/coverage/lcov-report/api/routes/webhook.js.html +2 -2
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +2 -2
  86. package/coverage/lcov-report/automations/index.html +20 -20
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +32 -8
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +11 -11
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +5 -8
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +49 -16
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +25 -25
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +2 -2
  120. package/coverage/lcov-report/db/client.js.html +19 -19
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +108 -81
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +99 -84
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +12 -12
  139. package/coverage/lcov-report/middleware/builder.js.html +10 -10
  140. package/coverage/lcov-report/middleware/currentapp.js.html +48 -36
  141. package/coverage/lcov-report/middleware/index.html +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +11 -11
  143. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +2 -2
  146. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  147. package/coverage/lcov-report/threads/automation.js.html +3 -3
  148. package/coverage/lcov-report/threads/index.html +32 -32
  149. package/coverage/lcov-report/threads/index.js.html +12 -12
  150. package/coverage/lcov-report/threads/query.js.html +560 -65
  151. package/coverage/lcov-report/threads/utils.js.html +210 -15
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +2 -2
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +28 -19
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +70 -37
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  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 +19 -19
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +247 -10
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +14 -5
  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 +22 -22
  171. package/coverage/lcov.info +2740 -2315
  172. package/dist/api/controllers/apikeys.js +2 -2
  173. package/dist/api/controllers/application.js +4 -4
  174. package/dist/api/controllers/auth.js +1 -1
  175. package/dist/api/controllers/automation.js +7 -5
  176. package/dist/api/controllers/cloud.js +2 -2
  177. package/dist/api/controllers/datasource.js +29 -0
  178. package/dist/api/controllers/deploy/index.js +2 -2
  179. package/dist/api/controllers/dev.js +2 -2
  180. package/dist/api/controllers/hosting.js +2 -2
  181. package/dist/api/controllers/permission.js +2 -2
  182. package/dist/api/controllers/query/import/index.js +79 -0
  183. package/dist/api/controllers/query/import/sources/base/index.js +64 -0
  184. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  185. package/dist/api/controllers/query/import/sources/curl.js +96 -0
  186. package/dist/api/controllers/query/import/sources/openapi2.js +142 -0
  187. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  188. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  189. package/dist/api/controllers/{query.js → query/index.js} +87 -52
  190. package/dist/api/controllers/query/validation.js +38 -0
  191. package/dist/api/controllers/role.js +1 -1
  192. package/dist/api/controllers/routing.js +1 -1
  193. package/dist/api/controllers/row/internal.js +14 -6
  194. package/dist/api/controllers/row/internalSearch.js +3 -2
  195. package/dist/api/controllers/row/utils.js +13 -6
  196. package/dist/api/controllers/screen.js +1 -1
  197. package/dist/api/controllers/user.js +40 -4
  198. package/dist/api/controllers/webhook.js +5 -1
  199. package/dist/api/index.js +1 -1
  200. package/dist/api/routes/apikeys.js +1 -1
  201. package/dist/api/routes/application.js +1 -1
  202. package/dist/api/routes/automation.js +1 -1
  203. package/dist/api/routes/backup.js +1 -1
  204. package/dist/api/routes/cloud.js +1 -1
  205. package/dist/api/routes/component.js +1 -1
  206. package/dist/api/routes/datasource.js +1 -1
  207. package/dist/api/routes/deploy.js +1 -1
  208. package/dist/api/routes/dev.js +1 -1
  209. package/dist/api/routes/hosting.js +1 -1
  210. package/dist/api/routes/integration.js +1 -1
  211. package/dist/api/routes/layout.js +1 -1
  212. package/dist/api/routes/metadata.js +1 -1
  213. package/dist/api/routes/permission.js +1 -1
  214. package/dist/api/routes/query.js +6 -34
  215. package/dist/api/routes/role.js +1 -1
  216. package/dist/api/routes/routing.js +1 -1
  217. package/dist/api/routes/row.js +1 -1
  218. package/dist/api/routes/screen.js +1 -1
  219. package/dist/api/routes/script.js +1 -1
  220. package/dist/api/routes/static.js +1 -1
  221. package/dist/api/routes/table.js +1 -1
  222. package/dist/api/routes/templates.js +1 -1
  223. package/dist/api/routes/tests/utilities/TestFunctions.js +1 -1
  224. package/dist/api/routes/user.js +4 -2
  225. package/dist/api/routes/view.js +1 -1
  226. package/dist/api/routes/webhook.js +1 -1
  227. package/dist/app.js +1 -1
  228. package/dist/automations/bullboard.js +1 -1
  229. package/dist/automations/steps/executeQuery.js +9 -2
  230. package/dist/automations/steps/outgoingWebhook.js +2 -3
  231. package/dist/automations/utils.js +11 -1
  232. package/dist/constants/index.js +3 -3
  233. package/dist/constants/screens.js +1 -1
  234. package/dist/db/client.js +1 -1
  235. package/dist/db/utils.js +9 -1
  236. package/dist/definitions/datasource.js +6 -1
  237. package/dist/environment.js +1 -0
  238. package/dist/integrations/base/sqlTable.js +1 -1
  239. package/dist/integrations/dynamodb.js +19 -0
  240. package/dist/integrations/rest.js +259 -120
  241. package/dist/integrations/s3.js +17 -8
  242. package/dist/integrations/utils.js +40 -37
  243. package/dist/middleware/authorized.js +2 -2
  244. package/dist/middleware/builder.js +2 -2
  245. package/dist/middleware/currentapp.js +6 -6
  246. package/dist/middleware/usageQuota.js +1 -1
  247. package/dist/package.json +11 -4
  248. package/dist/tests/utilities/TestConfiguration.js +55 -8
  249. package/dist/tests/utilities/structures.js +2 -2
  250. package/dist/threads/automation.js +2 -2
  251. package/dist/threads/query.js +195 -38
  252. package/dist/threads/utils.js +62 -1
  253. package/dist/tsconfig.tsbuildinfo +1 -1
  254. package/dist/utilities/budibaseDir.js +1 -1
  255. package/dist/utilities/fileSystem/utilities.js +2 -1
  256. package/dist/utilities/global.js +5 -5
  257. package/dist/utilities/index.js +11 -1
  258. package/dist/utilities/redis.js +1 -1
  259. package/dist/utilities/rowProcessor/index.js +76 -0
  260. package/dist/utilities/security.js +2 -2
  261. package/dist/utilities/usageQuota.js +2 -2
  262. package/dist/utilities/workerRequests.js +3 -3
  263. package/package.json +12 -5
  264. package/scripts/replicateApp.js +1 -1
  265. package/src/api/controllers/apikeys.js +2 -2
  266. package/src/api/controllers/application.js +7 -4
  267. package/src/api/controllers/auth.js +1 -1
  268. package/src/api/controllers/automation.js +8 -4
  269. package/src/api/controllers/cloud.js +5 -2
  270. package/src/api/controllers/datasource.js +34 -0
  271. package/src/api/controllers/deploy/index.js +2 -2
  272. package/src/api/controllers/dev.js +2 -2
  273. package/src/api/controllers/hosting.js +2 -2
  274. package/src/api/controllers/permission.js +2 -2
  275. package/src/api/controllers/query/import/index.ts +85 -0
  276. package/src/api/controllers/query/import/sources/base/index.ts +87 -0
  277. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  278. package/src/api/controllers/query/import/sources/curl.ts +102 -0
  279. package/src/api/controllers/query/import/sources/openapi2.ts +163 -0
  280. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  281. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  282. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  283. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  284. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  285. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  286. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  287. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  288. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  289. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  290. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  291. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  292. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  293. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  294. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  295. package/src/api/controllers/query/import/tests/index.spec.js +109 -0
  296. package/src/api/controllers/query/index.js +196 -0
  297. package/src/api/controllers/query/validation.js +42 -0
  298. package/src/api/controllers/role.js +1 -1
  299. package/src/api/controllers/routing.js +1 -1
  300. package/src/api/controllers/row/internal.js +14 -5
  301. package/src/api/controllers/row/internalSearch.js +3 -2
  302. package/src/api/controllers/row/utils.js +11 -8
  303. package/src/api/controllers/screen.js +1 -1
  304. package/src/api/controllers/user.js +39 -3
  305. package/src/api/controllers/webhook.js +5 -1
  306. package/src/api/index.js +1 -1
  307. package/src/api/routes/apikeys.js +1 -1
  308. package/src/api/routes/application.js +1 -1
  309. package/src/api/routes/automation.js +1 -1
  310. package/src/api/routes/backup.js +1 -1
  311. package/src/api/routes/cloud.js +1 -1
  312. package/src/api/routes/component.js +1 -1
  313. package/src/api/routes/datasource.js +1 -1
  314. package/src/api/routes/deploy.js +1 -1
  315. package/src/api/routes/dev.js +1 -1
  316. package/src/api/routes/hosting.js +1 -1
  317. package/src/api/routes/integration.js +1 -1
  318. package/src/api/routes/layout.js +1 -1
  319. package/src/api/routes/metadata.js +1 -1
  320. package/src/api/routes/permission.js +4 -1
  321. package/src/api/routes/query.js +14 -36
  322. package/src/api/routes/role.js +1 -1
  323. package/src/api/routes/routing.js +1 -1
  324. package/src/api/routes/row.js +1 -1
  325. package/src/api/routes/screen.js +1 -1
  326. package/src/api/routes/script.js +1 -1
  327. package/src/api/routes/static.js +1 -1
  328. package/src/api/routes/table.js +1 -1
  329. package/src/api/routes/templates.js +1 -1
  330. package/src/api/routes/tests/datasource.spec.js +45 -0
  331. package/src/api/routes/tests/permissions.spec.js +1 -1
  332. package/src/api/routes/tests/query.spec.js +70 -1
  333. package/src/api/routes/tests/role.spec.js +2 -2
  334. package/src/api/routes/tests/routing.spec.js +1 -1
  335. package/src/api/routes/tests/user.spec.js +1 -1
  336. package/src/api/routes/tests/utilities/TestFunctions.js +1 -1
  337. package/src/api/routes/user.js +11 -1
  338. package/src/api/routes/view.js +1 -1
  339. package/src/api/routes/webhook.js +1 -1
  340. package/src/app.ts +1 -1
  341. package/src/automations/bullboard.js +1 -1
  342. package/src/automations/steps/executeQuery.js +10 -2
  343. package/src/automations/steps/outgoingWebhook.js +2 -3
  344. package/src/automations/utils.js +12 -1
  345. package/src/constants/index.js +3 -3
  346. package/src/constants/screens.js +1 -1
  347. package/src/db/client.js +1 -1
  348. package/src/db/utils.js +10 -1
  349. package/src/definitions/common.ts +2 -16
  350. package/src/definitions/datasource.ts +98 -1
  351. package/src/environment.js +1 -0
  352. package/src/integrations/base/IntegrationBase.ts +4 -4
  353. package/src/integrations/base/sqlTable.ts +1 -1
  354. package/src/integrations/dynamodb.ts +18 -0
  355. package/src/integrations/oracle.ts +1 -1
  356. package/src/integrations/rest.ts +311 -138
  357. package/src/integrations/s3.ts +18 -7
  358. package/src/integrations/tests/rest.spec.js +432 -21
  359. package/src/integrations/utils.ts +8 -7
  360. package/src/middleware/authorized.js +2 -2
  361. package/src/middleware/builder.js +2 -2
  362. package/src/middleware/currentapp.js +11 -7
  363. package/src/middleware/tests/authorized.spec.js +2 -2
  364. package/src/middleware/tests/currentapp.spec.js +35 -41
  365. package/src/middleware/tests/usageQuota.spec.js +1 -1
  366. package/src/middleware/usageQuota.js +1 -1
  367. package/src/tests/utilities/TestConfiguration.js +65 -8
  368. package/src/tests/utilities/structures.js +2 -2
  369. package/src/threads/automation.js +2 -2
  370. package/src/threads/query.js +204 -39
  371. package/src/threads/utils.js +66 -1
  372. package/src/utilities/budibaseDir.js +1 -1
  373. package/src/utilities/fileSystem/utilities.js +3 -1
  374. package/src/utilities/global.js +8 -5
  375. package/src/utilities/index.js +12 -1
  376. package/src/utilities/redis.js +1 -1
  377. package/src/utilities/rowProcessor/index.js +79 -0
  378. package/src/utilities/security.js +5 -2
  379. package/src/utilities/usageQuota.js +2 -2
  380. package/src/utilities/workerRequests.js +3 -3
  381. package/builder/assets/index.891d496c.js +0 -1316
  382. package/src/api/controllers/query.js +0 -158
@@ -11,7 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  const CouchDB = require("../db");
12
12
  const usageQuota = require("../utilities/usageQuota");
13
13
  const env = require("../environment");
14
- const { getTenantId } = require("@budibase/auth/tenancy");
14
+ const { getTenantId } = require("@budibase/backend-core/tenancy");
15
15
  const { isExternalTable, isRowId: isExternalRowId, } = require("../integrations/utils");
16
16
  // tenants without limits
17
17
  const EXCLUDED_TENANTS = ["bb", "default", "bbtest", "bbstaging"];
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.31",
4
+ "version": "1.0.38",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -69,9 +69,10 @@
69
69
  "author": "Budibase",
70
70
  "license": "GPL-3.0",
71
71
  "dependencies": {
72
- "@budibase/auth": "^1.0.31",
73
- "@budibase/client": "^1.0.31",
74
- "@budibase/string-templates": "^1.0.31",
72
+ "@apidevtools/swagger-parser": "^10.0.3",
73
+ "@budibase/backend-core": "^1.0.38",
74
+ "@budibase/client": "^1.0.38",
75
+ "@budibase/string-templates": "^1.0.38",
75
76
  "@bull-board/api": "^3.7.0",
76
77
  "@bull-board/koa": "^3.7.0",
77
78
  "@elastic/elasticsearch": "7.10.0",
@@ -85,12 +86,15 @@
85
86
  "bull": "^3.22.4",
86
87
  "chmodr": "1.2.0",
87
88
  "csvtojson": "2.0.10",
89
+ "curlconverter": "^3.21.0",
88
90
  "dotenv": "8.2.0",
89
91
  "download": "8.0.0",
90
92
  "fix-path": "3.0.0",
93
+ "form-data": "^4.0.0",
91
94
  "fs-extra": "8.1.0",
92
95
  "jimp": "0.16.1",
93
96
  "joi": "17.2.1",
97
+ "js-yaml": "^4.1.0",
94
98
  "jsonschema": "1.4.0",
95
99
  "knex": "^0.95.6",
96
100
  "koa": "2.7.0",
@@ -118,11 +122,13 @@
118
122
  "pouchdb-replication-stream": "1.2.9",
119
123
  "server-destroy": "1.0.1",
120
124
  "svelte": "^3.38.2",
125
+ "swagger-parser": "^10.0.3",
121
126
  "to-json-schema": "0.2.5",
122
127
  "uuid": "3.3.2",
123
128
  "validate.js": "0.13.1",
124
129
  "vm2": "^3.9.3",
125
130
  "worker-farm": "^1.7.0",
131
+ "xml2js": "^0.4.23",
126
132
  "yargs": "13.2.4",
127
133
  "zlib": "1.0.5"
128
134
  },
@@ -146,6 +152,7 @@
146
152
  "eslint": "^6.8.0",
147
153
  "jest": "^27.0.5",
148
154
  "nodemon": "^2.0.4",
155
+ "openapi-types": "^9.3.1",
149
156
  "path-to-regexp": "^6.2.0",
150
157
  "prettier": "^2.3.1",
151
158
  "rimraf": "^3.0.2",
@@ -8,20 +8,20 @@ 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 { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles");
11
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
12
12
  const env = require("../../environment");
13
13
  const { basicTable, basicRow, basicRole, basicAutomation, basicDatasource, basicQuery, basicScreen, basicLayout, basicWebhook, TENANT_ID, } = require("./structures");
14
14
  const controllers = require("./controllers");
15
15
  const supertest = require("supertest");
16
16
  const { cleanup } = require("../../utilities/fileSystem");
17
- const { Cookies, Headers } = require("@budibase/auth").constants;
18
- const { jwt } = require("@budibase/auth").auth;
19
- const auth = require("@budibase/auth");
20
- const { getGlobalDB } = require("@budibase/auth/tenancy");
21
- const { createASession } = require("@budibase/auth/sessions");
22
- const { user: userCache } = require("@budibase/auth/cache");
17
+ const { Cookies, Headers } = require("@budibase/backend-core/constants");
18
+ const { jwt } = require("@budibase/backend-core/auth");
19
+ const core = require("@budibase/backend-core");
20
+ const { getGlobalDB } = require("@budibase/backend-core/tenancy");
21
+ const { createASession } = require("@budibase/backend-core/sessions");
22
+ const { user: userCache } = require("@budibase/backend-core/cache");
23
23
  const CouchDB = require("../../db");
24
- auth.init(CouchDB);
24
+ core.init(CouchDB);
25
25
  const GLOBAL_USER_ID = "us_uuid1";
26
26
  const EMAIL = "babs@babs.com";
27
27
  class TestConfiguration {
@@ -294,6 +294,53 @@ class TestConfiguration {
294
294
  return this.datasource;
295
295
  });
296
296
  }
297
+ updateDatasource(datasource) {
298
+ return __awaiter(this, void 0, void 0, function* () {
299
+ const response = yield this._req(datasource, { datasourceId: datasource._id }, controllers.datasource.update);
300
+ this.datasource = response.datasource;
301
+ return this.datasource;
302
+ });
303
+ }
304
+ restDatasource(cfg) {
305
+ return __awaiter(this, void 0, void 0, function* () {
306
+ return this.createDatasource({
307
+ datasource: Object.assign(Object.assign({}, basicDatasource().datasource), { source: "REST", config: cfg || {} }),
308
+ });
309
+ });
310
+ }
311
+ dynamicVariableDatasource() {
312
+ return __awaiter(this, void 0, void 0, function* () {
313
+ let datasource = yield this.restDatasource();
314
+ const basedOnQuery = yield this.createQuery(Object.assign(Object.assign({}, basicQuery(datasource._id)), { fields: {
315
+ path: "www.google.com",
316
+ } }));
317
+ datasource = yield this.updateDatasource(Object.assign(Object.assign({}, datasource), { config: {
318
+ dynamicVariables: [
319
+ {
320
+ queryId: basedOnQuery._id,
321
+ name: "variable3",
322
+ value: "{{ data.0.[value] }}",
323
+ },
324
+ ],
325
+ } }));
326
+ return { datasource, query: basedOnQuery };
327
+ });
328
+ }
329
+ previewQuery(request, config, datasource, fields) {
330
+ return __awaiter(this, void 0, void 0, function* () {
331
+ return request
332
+ .post(`/api/queries/preview`)
333
+ .send({
334
+ datasourceId: datasource._id,
335
+ parameters: {},
336
+ fields,
337
+ queryVerb: "read",
338
+ })
339
+ .set(config.defaultHeaders())
340
+ .expect("Content-Type", /json/)
341
+ .expect(200);
342
+ });
343
+ }
297
344
  createQuery(config = null) {
298
345
  return __awaiter(this, void 0, void 0, function* () {
299
346
  if (!this.datasource && !config) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles");
3
- const { BUILTIN_PERMISSION_IDS } = require("@budibase/auth/permissions");
2
+ const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles");
3
+ const { BUILTIN_PERMISSION_IDS } = require("@budibase/backend-core/permissions");
4
4
  const { createHomeScreen } = require("../../constants/screens");
5
5
  const { EMPTY_LAYOUT } = require("../../constants/layouts");
6
6
  const { cloneDeep } = require("lodash/fp");
@@ -14,10 +14,10 @@ const actions = require("../automations/actions");
14
14
  const automationUtils = require("../automations/automationUtils");
15
15
  const AutomationEmitter = require("../events/AutomationEmitter");
16
16
  const { processObject } = require("@budibase/string-templates");
17
- const { DEFAULT_TENANT_ID } = require("@budibase/auth").constants;
17
+ const { DEFAULT_TENANT_ID } = require("@budibase/backend-core/constants");
18
18
  const CouchDB = require("../db");
19
19
  const { DocumentTypes, isDevAppID } = require("../db/utils");
20
- const { doInTenant } = require("@budibase/auth/tenancy");
20
+ const { doInTenant } = require("@budibase/backend-core/tenancy");
21
21
  const usage = require("../utilities/usageQuota");
22
22
  const { definitions: triggerDefs } = require("../automations/triggerInfo");
23
23
  const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId;
@@ -8,51 +8,208 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- require("./utils").threadSetup();
11
+ const threadUtils = require("./utils");
12
+ threadUtils.threadSetup();
12
13
  const ScriptRunner = require("../utilities/scriptRunner");
13
14
  const { integrations } = require("../integrations");
14
- function formatResponse(resp) {
15
- if (typeof resp === "string") {
16
- try {
17
- resp = JSON.parse(resp);
18
- }
19
- catch (err) {
20
- resp = { response: resp };
21
- }
15
+ const { processStringSync } = require("@budibase/string-templates");
16
+ const CouchDB = require("../db");
17
+ const IS_TRIPLE_BRACE = new RegExp(/^{{3}.*}{3}$/);
18
+ const IS_HANDLEBARS = new RegExp(/^{{2}.*}{2}$/);
19
+ class QueryRunner {
20
+ constructor(input, flags = { noRecursiveQuery: false }) {
21
+ this.appId = input.appId;
22
+ this.datasource = input.datasource;
23
+ this.queryVerb = input.queryVerb;
24
+ this.fields = input.fields;
25
+ this.parameters = input.parameters;
26
+ this.pagination = input.pagination;
27
+ this.transformer = input.transformer;
28
+ this.queryId = input.queryId;
29
+ this.noRecursiveQuery = flags.noRecursiveQuery;
30
+ this.cachedVariables = [];
31
+ // allows the response from a query to be stored throughout this
32
+ // execution so that if it needs to be re-used for another variable
33
+ // it can be
34
+ this.queryResponse = {};
35
+ this.hasRerun = false;
22
36
  }
23
- return resp;
24
- }
25
- function runAndTransform(datasource, queryVerb, query, transformer) {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- const Integration = integrations[datasource.source];
28
- if (!Integration) {
29
- throw "Integration type does not exist.";
30
- }
31
- const integration = new Integration(datasource.config);
32
- let rows = formatResponse(yield integration[queryVerb](query));
33
- // transform as required
34
- if (transformer) {
35
- const runner = new ScriptRunner(transformer, { data: rows });
36
- rows = runner.execute();
37
- }
38
- // needs to an array for next step
39
- if (!Array.isArray(rows)) {
40
- rows = [rows];
41
- }
42
- // map into JSON if just raw primitive here
43
- if (rows.find(row => typeof row !== "object")) {
44
- rows = rows.map(value => ({ value }));
37
+ execute() {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ let { datasource, fields, queryVerb, transformer } = this;
40
+ // pre-query, make sure datasource variables are added to parameters
41
+ const parameters = yield this.addDatasourceVariables();
42
+ let query = this.enrichQueryFields(fields, parameters);
43
+ // Add pagination values for REST queries
44
+ if (this.pagination) {
45
+ query.paginationValues = this.pagination;
46
+ }
47
+ const Integration = integrations[datasource.source];
48
+ if (!Integration) {
49
+ throw "Integration type does not exist.";
50
+ }
51
+ const integration = new Integration(datasource.config);
52
+ let output = threadUtils.formatResponse(yield integration[queryVerb](query));
53
+ let rows = output, info = undefined, extra = undefined, pagination = undefined;
54
+ if (threadUtils.hasExtraData(output)) {
55
+ rows = output.data;
56
+ info = output.info;
57
+ extra = output.extra;
58
+ pagination = output.pagination;
59
+ }
60
+ // transform as required
61
+ if (transformer) {
62
+ const runner = new ScriptRunner(transformer, {
63
+ data: rows,
64
+ params: parameters,
65
+ });
66
+ rows = runner.execute();
67
+ }
68
+ // if the request fails we retry once, invalidating the cached value
69
+ if (info &&
70
+ info.code >= 400 &&
71
+ this.cachedVariables.length > 0 &&
72
+ !this.hasRerun) {
73
+ this.hasRerun = true;
74
+ // invalidate the cache value
75
+ yield threadUtils.invalidateDynamicVariables(this.cachedVariables);
76
+ return this.execute();
77
+ }
78
+ // needs to an array for next step
79
+ if (!Array.isArray(rows)) {
80
+ rows = [rows];
81
+ }
82
+ // map into JSON if just raw primitive here
83
+ if (rows.find(row => typeof row !== "object")) {
84
+ rows = rows.map(value => ({ value }));
85
+ }
86
+ // get all the potential fields in the schema
87
+ let keys = rows.flatMap(Object.keys);
88
+ if (integration.end) {
89
+ integration.end();
90
+ }
91
+ return { rows, keys, info, extra, pagination };
92
+ });
93
+ }
94
+ runAnotherQuery(queryId, parameters) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const db = new CouchDB(this.appId);
97
+ const query = yield db.get(queryId);
98
+ const datasource = yield db.get(query.datasourceId);
99
+ return new QueryRunner({
100
+ appId: this.appId,
101
+ datasource,
102
+ queryVerb: query.queryVerb,
103
+ fields: query.fields,
104
+ parameters,
105
+ transformer: query.transformer,
106
+ }, { noRecursiveQuery: true }).execute();
107
+ });
108
+ }
109
+ getDynamicVariable(variable) {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ let { parameters } = this;
112
+ const queryId = variable.queryId, name = variable.name;
113
+ let value = yield threadUtils.checkCacheForDynamicVariable(queryId, name);
114
+ if (!value) {
115
+ value = this.queryResponse[queryId]
116
+ ? this.queryResponse[queryId]
117
+ : yield this.runAnotherQuery(queryId, parameters);
118
+ // store incase this query is to be called again
119
+ this.queryResponse[queryId] = value;
120
+ yield threadUtils.storeDynamicVariable(queryId, name, value);
121
+ }
122
+ else {
123
+ this.cachedVariables.push({ queryId, name });
124
+ }
125
+ return value;
126
+ });
127
+ }
128
+ addDatasourceVariables() {
129
+ return __awaiter(this, void 0, void 0, function* () {
130
+ let { datasource, parameters, fields } = this;
131
+ if (!datasource || !datasource.config) {
132
+ return parameters;
133
+ }
134
+ const staticVars = datasource.config.staticVariables || {};
135
+ const dynamicVars = datasource.config.dynamicVariables || [];
136
+ for (let [key, value] of Object.entries(staticVars)) {
137
+ if (!parameters[key]) {
138
+ parameters[key] = value;
139
+ }
140
+ }
141
+ if (!this.noRecursiveQuery) {
142
+ // need to see if this uses any variables
143
+ const stringFields = JSON.stringify(fields);
144
+ const foundVars = dynamicVars.filter(variable => {
145
+ // don't allow a query to use its own dynamic variable (loop)
146
+ if (variable.queryId === this.queryId) {
147
+ return false;
148
+ }
149
+ // look for {{ variable }} but allow spaces between handlebars
150
+ const regex = new RegExp(`{{[ ]*${variable.name}[ ]*}}`);
151
+ return regex.test(stringFields);
152
+ });
153
+ const dynamics = foundVars.map(dynVar => this.getDynamicVariable(dynVar));
154
+ const responses = yield Promise.all(dynamics);
155
+ for (let i = 0; i < foundVars.length; i++) {
156
+ const variable = foundVars[i];
157
+ parameters[variable.name] = processStringSync(variable.value, {
158
+ data: responses[i].rows,
159
+ info: responses[i].extra,
160
+ });
161
+ // make sure its known that this uses dynamic variables in case it fails
162
+ this.hasDynamicVariables = true;
163
+ }
164
+ }
165
+ return parameters;
166
+ });
167
+ }
168
+ enrichQueryFields(fields, parameters = {}) {
169
+ const enrichedQuery = {};
170
+ // enrich the fields with dynamic parameters
171
+ for (let key of Object.keys(fields)) {
172
+ if (fields[key] == null) {
173
+ continue;
174
+ }
175
+ if (typeof fields[key] === "object") {
176
+ // enrich nested fields object
177
+ enrichedQuery[key] = this.enrichQueryFields(fields[key], parameters);
178
+ }
179
+ else if (typeof fields[key] === "string") {
180
+ // enrich string value as normal
181
+ let value = fields[key];
182
+ // add triple brace to avoid escaping e.g. '=' in cookie header
183
+ if (IS_HANDLEBARS.test(value) && !IS_TRIPLE_BRACE.test(value)) {
184
+ value = `{${value}}`;
185
+ }
186
+ enrichedQuery[key] = processStringSync(value, parameters, {
187
+ noHelpers: true,
188
+ });
189
+ }
190
+ else {
191
+ enrichedQuery[key] = fields[key];
192
+ }
45
193
  }
46
- // get all the potential fields in the schema
47
- let keys = rows.flatMap(Object.keys);
48
- if (integration.end) {
49
- integration.end();
194
+ if (enrichedQuery.json ||
195
+ enrichedQuery.customData ||
196
+ enrichedQuery.requestBody) {
197
+ try {
198
+ enrichedQuery.json = JSON.parse(enrichedQuery.json ||
199
+ enrichedQuery.customData ||
200
+ enrichedQuery.requestBody);
201
+ }
202
+ catch (err) {
203
+ // no json found, ignore
204
+ }
205
+ delete enrichedQuery.customData;
50
206
  }
51
- return { rows, keys };
52
- });
207
+ return enrichedQuery;
208
+ }
53
209
  }
54
210
  module.exports = (input, callback) => {
55
- runAndTransform(input.datasource, input.queryVerb, input.query, input.transformer)
211
+ const Runner = new QueryRunner(input);
212
+ Runner.execute()
56
213
  .then(response => {
57
214
  callback(null, response);
58
215
  })
@@ -1,7 +1,32 @@
1
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
+ };
2
11
  const env = require("../environment");
3
12
  const CouchDB = require("../db");
4
- const { init } = require("@budibase/auth");
13
+ const { init } = require("@budibase/backend-core");
14
+ const redis = require("@budibase/backend-core/redis");
15
+ const { SEPARATOR } = require("@budibase/backend-core/db");
16
+ const VARIABLE_TTL_SECONDS = 3600;
17
+ let client;
18
+ function getClient() {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ if (!client) {
21
+ client = yield new redis.Client(redis.utils.Databases.QUERY_VARS).init();
22
+ }
23
+ return client;
24
+ });
25
+ }
26
+ process.on("exit", () => __awaiter(void 0, void 0, void 0, function* () {
27
+ if (client)
28
+ yield client.finish();
29
+ }));
5
30
  exports.threadSetup = () => {
6
31
  // don't run this if not threading
7
32
  if (env.isTest() || env.DISABLE_THREADING) {
@@ -11,3 +36,39 @@ exports.threadSetup = () => {
11
36
  env.setInThread();
12
37
  init(CouchDB);
13
38
  };
39
+ function makeVariableKey(queryId, variable) {
40
+ return `${queryId}${SEPARATOR}${variable}`;
41
+ }
42
+ exports.checkCacheForDynamicVariable = (queryId, variable) => __awaiter(void 0, void 0, void 0, function* () {
43
+ const cache = yield getClient();
44
+ return cache.get(makeVariableKey(queryId, variable));
45
+ });
46
+ exports.invalidateDynamicVariables = (cachedVars) => __awaiter(void 0, void 0, void 0, function* () {
47
+ const cache = yield getClient();
48
+ let promises = [];
49
+ for (let variable of cachedVars) {
50
+ promises.push(cache.delete(makeVariableKey(variable.queryId, variable.name)));
51
+ }
52
+ yield Promise.all(promises);
53
+ });
54
+ exports.storeDynamicVariable = (queryId, variable, value) => __awaiter(void 0, void 0, void 0, function* () {
55
+ const cache = yield getClient();
56
+ yield cache.store(makeVariableKey(queryId, variable), value, VARIABLE_TTL_SECONDS);
57
+ });
58
+ exports.formatResponse = resp => {
59
+ if (typeof resp === "string") {
60
+ try {
61
+ resp = JSON.parse(resp);
62
+ }
63
+ catch (err) {
64
+ resp = { response: resp };
65
+ }
66
+ }
67
+ return resp;
68
+ };
69
+ exports.hasExtraData = response => {
70
+ return (typeof response === "object" &&
71
+ !Array.isArray(response) &&
72
+ response.data != null &&
73
+ response.info != null);
74
+ };