@budibase/server 2.2.12-alpha.5 → 2.2.12-alpha.50

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 (577) hide show
  1. package/__mocks__/node-fetch.ts +2 -0
  2. package/builder/assets/{bb-emblem.4e4717da.svg → bb-emblem.05f7ae7a.svg} +1 -1
  3. package/builder/assets/bg.c1563288.png +0 -0
  4. package/builder/assets/bulgaria.bd68393d.png +0 -0
  5. package/builder/assets/covanta.72c46c1e.png +0 -0
  6. package/builder/assets/index.22dc2872.css +6 -0
  7. package/builder/assets/{index.d930bfc5.js → index.d24b0406.js} +423 -427
  8. package/builder/assets/schnellecke.cf1837a8.png +0 -0
  9. package/builder/index.html +2 -2
  10. package/coverage/clover.xml +5670 -5622
  11. package/coverage/coverage-final.json +282 -279
  12. package/coverage/lcov-report/index.html +458 -413
  13. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +9 -9
  14. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +6 -6
  15. package/coverage/lcov-report/src/api/controllers/application.ts.html +199 -178
  16. package/coverage/lcov-report/src/api/controllers/auth.ts.html +10 -10
  17. package/coverage/lcov-report/src/api/controllers/automation.ts.html +37 -37
  18. package/coverage/lcov-report/src/api/controllers/backup.ts.html +8 -8
  19. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +19 -19
  20. package/coverage/lcov-report/src/api/controllers/component.ts.html +12 -12
  21. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +117 -93
  22. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +18 -18
  23. package/coverage/lcov-report/src/api/controllers/deploy/index.html +7 -7
  24. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +83 -83
  25. package/coverage/lcov-report/src/api/controllers/dev.ts.html +28 -28
  26. package/coverage/lcov-report/src/api/controllers/index.html +105 -105
  27. package/coverage/lcov-report/src/api/controllers/integration.ts.html +5 -5
  28. package/coverage/lcov-report/src/api/controllers/layout.ts.html +9 -9
  29. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +11 -11
  30. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +6 -6
  31. package/coverage/lcov-report/src/api/controllers/permission.ts.html +14 -14
  32. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +4 -4
  33. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +20 -20
  34. package/coverage/lcov-report/src/api/controllers/plugin/index.html +31 -31
  35. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +32 -32
  36. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +10 -10
  37. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +5 -5
  38. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +4 -4
  39. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +4 -4
  40. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +31 -31
  41. package/coverage/lcov-report/src/api/controllers/public/index.html +58 -58
  42. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +7 -7
  43. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +25 -25
  44. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +9 -9
  45. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +8 -8
  46. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +4 -4
  47. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +4 -4
  48. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +4 -4
  49. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +15 -15
  50. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +21 -21
  51. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +21 -21
  52. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +27 -27
  53. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +8 -8
  54. package/coverage/lcov-report/src/api/controllers/query/import/index.html +8 -8
  55. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +11 -11
  56. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +14 -14
  57. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +14 -14
  58. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +8 -8
  59. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +12 -12
  60. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +23 -23
  61. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +16 -16
  62. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +20 -20
  63. package/coverage/lcov-report/src/api/controllers/query/index.html +16 -16
  64. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +94 -70
  65. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +9 -9
  66. package/coverage/lcov-report/src/api/controllers/role.ts.html +9 -9
  67. package/coverage/lcov-report/src/api/controllers/routing.ts.html +10 -10
  68. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +58 -40
  69. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +87 -57
  70. package/coverage/lcov-report/src/api/controllers/row/index.html +66 -66
  71. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +36 -36
  72. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +155 -83
  73. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +146 -146
  74. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +33 -33
  75. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +153 -39
  76. package/coverage/lcov-report/src/api/controllers/screen.ts.html +12 -12
  77. package/coverage/lcov-report/src/api/controllers/script.ts.html +11 -11
  78. package/coverage/lcov-report/src/api/controllers/static/index.html +15 -15
  79. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +49 -52
  80. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +60 -60
  81. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +56 -50
  82. package/coverage/lcov-report/src/api/controllers/table/index.html +48 -48
  83. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +155 -68
  84. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +58 -61
  85. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +93 -96
  86. package/coverage/lcov-report/src/api/controllers/templates.ts.html +21 -21
  87. package/coverage/lcov-report/src/api/controllers/user.ts.html +103 -79
  88. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +64 -19
  89. package/coverage/lcov-report/src/api/controllers/view/index.html +38 -38
  90. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +57 -96
  91. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +22 -22
  92. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +8 -8
  93. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +69 -63
  94. package/coverage/lcov-report/src/api/index.html +15 -15
  95. package/coverage/lcov-report/src/api/index.ts.html +35 -35
  96. package/coverage/lcov-report/src/api/routes/analytics.ts.html +10 -10
  97. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +11 -11
  98. package/coverage/lcov-report/src/api/routes/application.ts.html +13 -13
  99. package/coverage/lcov-report/src/api/routes/auth.ts.html +9 -9
  100. package/coverage/lcov-report/src/api/routes/automation.ts.html +14 -14
  101. package/coverage/lcov-report/src/api/routes/backup.ts.html +11 -11
  102. package/coverage/lcov-report/src/api/routes/cloud.ts.html +11 -11
  103. package/coverage/lcov-report/src/api/routes/component.ts.html +11 -11
  104. package/coverage/lcov-report/src/api/routes/datasource.ts.html +12 -12
  105. package/coverage/lcov-report/src/api/routes/deploy.ts.html +11 -11
  106. package/coverage/lcov-report/src/api/routes/dev.ts.html +17 -17
  107. package/coverage/lcov-report/src/api/routes/index.html +67 -67
  108. package/coverage/lcov-report/src/api/routes/index.ts.html +43 -37
  109. package/coverage/lcov-report/src/api/routes/integration.ts.html +11 -11
  110. package/coverage/lcov-report/src/api/routes/layout.ts.html +11 -11
  111. package/coverage/lcov-report/src/api/routes/metadata.ts.html +12 -12
  112. package/coverage/lcov-report/src/api/routes/migrations.ts.html +10 -10
  113. package/coverage/lcov-report/src/api/routes/permission.ts.html +12 -12
  114. package/coverage/lcov-report/src/api/routes/plugin.ts.html +10 -10
  115. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +16 -16
  116. package/coverage/lcov-report/src/api/routes/public/index.html +24 -24
  117. package/coverage/lcov-report/src/api/routes/public/index.ts.html +60 -60
  118. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +5 -5
  119. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +12 -12
  120. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +11 -11
  121. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +14 -14
  122. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +14 -14
  123. package/coverage/lcov-report/src/api/routes/public/tests/index.html +7 -7
  124. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +5 -5
  125. package/coverage/lcov-report/src/api/routes/public/users.ts.html +14 -14
  126. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +21 -21
  127. package/coverage/lcov-report/src/api/routes/public/utils/index.html +5 -5
  128. package/coverage/lcov-report/src/api/routes/query.ts.html +14 -14
  129. package/coverage/lcov-report/src/api/routes/role.ts.html +12 -12
  130. package/coverage/lcov-report/src/api/routes/routing.ts.html +11 -11
  131. package/coverage/lcov-report/src/api/routes/row.ts.html +14 -14
  132. package/coverage/lcov-report/src/api/routes/screen.ts.html +12 -12
  133. package/coverage/lcov-report/src/api/routes/script.ts.html +13 -13
  134. package/coverage/lcov-report/src/api/routes/static.ts.html +18 -18
  135. package/coverage/lcov-report/src/api/routes/table.ts.html +29 -98
  136. package/coverage/lcov-report/src/api/routes/templates.ts.html +11 -11
  137. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +13 -13
  138. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +23 -23
  139. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +14 -14
  140. package/coverage/lcov-report/src/api/routes/user.ts.html +12 -12
  141. package/coverage/lcov-report/src/api/routes/utils/index.html +3 -3
  142. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +44 -44
  143. package/coverage/lcov-report/src/api/routes/view.ts.html +13 -13
  144. package/coverage/lcov-report/src/api/routes/webhook.ts.html +13 -13
  145. package/coverage/lcov-report/src/app.ts.html +22 -16
  146. package/coverage/lcov-report/src/automations/actions.ts.html +31 -31
  147. package/coverage/lcov-report/src/automations/automationUtils.ts.html +61 -61
  148. package/coverage/lcov-report/src/automations/bullboard.ts.html +19 -19
  149. package/coverage/lcov-report/src/automations/index.html +54 -54
  150. package/coverage/lcov-report/src/automations/index.ts.html +23 -23
  151. package/coverage/lcov-report/src/automations/logging/index.html +3 -3
  152. package/coverage/lcov-report/src/automations/logging/index.ts.html +10 -10
  153. package/coverage/lcov-report/src/automations/steps/bash.ts.html +11 -11
  154. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +9 -9
  155. package/coverage/lcov-report/src/automations/steps/delay.ts.html +7 -7
  156. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +9 -9
  157. package/coverage/lcov-report/src/automations/steps/discord.ts.html +11 -11
  158. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +9 -9
  159. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +9 -9
  160. package/coverage/lcov-report/src/automations/steps/filter.ts.html +12 -12
  161. package/coverage/lcov-report/src/automations/steps/index.html +75 -75
  162. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +10 -10
  163. package/coverage/lcov-report/src/automations/steps/loop.ts.html +5 -5
  164. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +19 -19
  165. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +43 -43
  166. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +9 -9
  167. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +10 -10
  168. package/coverage/lcov-report/src/automations/steps/slack.ts.html +10 -10
  169. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +9 -9
  170. package/coverage/lcov-report/src/automations/steps/utils.ts.html +12 -12
  171. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +8 -8
  172. package/coverage/lcov-report/src/automations/tests/utilities/index.html +15 -15
  173. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +24 -24
  174. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +6 -6
  175. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +6 -6
  176. package/coverage/lcov-report/src/automations/triggerInfo/index.html +17 -17
  177. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +10 -10
  178. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +6 -6
  179. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +6 -6
  180. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +6 -6
  181. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +6 -6
  182. package/coverage/lcov-report/src/automations/triggers.ts.html +53 -38
  183. package/coverage/lcov-report/src/automations/utils.ts.html +69 -69
  184. package/coverage/lcov-report/src/constants/index.html +19 -19
  185. package/coverage/lcov-report/src/constants/index.ts.html +80 -80
  186. package/coverage/lcov-report/src/constants/layouts.ts.html +9 -9
  187. package/coverage/lcov-report/src/constants/screens.ts.html +4 -4
  188. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +45 -45
  189. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +8 -8
  190. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +8 -8
  191. package/coverage/lcov-report/src/db/defaultData/index.html +43 -43
  192. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +8 -8
  193. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +8 -8
  194. package/coverage/lcov-report/src/db/dynamoClient.ts.html +26 -26
  195. package/coverage/lcov-report/src/db/inMemoryView.ts.html +13 -13
  196. package/coverage/lcov-report/src/db/index.html +32 -32
  197. package/coverage/lcov-report/src/db/index.ts.html +10 -10
  198. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +38 -38
  199. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +7 -7
  200. package/coverage/lcov-report/src/db/linkedRows/index.html +37 -37
  201. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +40 -40
  202. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +25 -25
  203. package/coverage/lcov-report/src/db/newid.ts.html +5 -5
  204. package/coverage/lcov-report/src/db/utils.ts.html +76 -76
  205. package/coverage/lcov-report/src/definitions/automations.ts.html +9 -6
  206. package/coverage/lcov-report/src/definitions/index.html +5 -20
  207. package/coverage/lcov-report/src/environment.ts.html +16 -16
  208. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +14 -14
  209. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +8 -8
  210. package/coverage/lcov-report/src/events/index.html +20 -20
  211. package/coverage/lcov-report/src/events/index.ts.html +7 -7
  212. package/coverage/lcov-report/src/events/utils.ts.html +11 -11
  213. package/coverage/lcov-report/src/index.html +36 -36
  214. package/coverage/lcov-report/src/index.ts.html +8 -8
  215. package/coverage/lcov-report/src/integrations/airtable.ts.html +10 -10
  216. package/coverage/lcov-report/src/integrations/arangodb.ts.html +9 -9
  217. package/coverage/lcov-report/src/integrations/base/index.html +28 -28
  218. package/coverage/lcov-report/src/integrations/base/query.ts.html +15 -9
  219. package/coverage/lcov-report/src/integrations/base/sql.ts.html +37 -37
  220. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +22 -22
  221. package/coverage/lcov-report/src/integrations/base/utils.ts.html +5 -5
  222. package/coverage/lcov-report/src/integrations/couchdb.ts.html +10 -10
  223. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +17 -17
  224. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +9 -9
  225. package/coverage/lcov-report/src/integrations/firebase.ts.html +12 -12
  226. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +41 -41
  227. package/coverage/lcov-report/src/integrations/index.html +124 -124
  228. package/coverage/lcov-report/src/integrations/index.ts.html +47 -47
  229. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +31 -31
  230. package/coverage/lcov-report/src/integrations/mongodb.ts.html +421 -289
  231. package/coverage/lcov-report/src/integrations/mysql.ts.html +28 -28
  232. package/coverage/lcov-report/src/integrations/oracle.ts.html +31 -31
  233. package/coverage/lcov-report/src/integrations/postgres.ts.html +22 -22
  234. package/coverage/lcov-report/src/integrations/queries/index.html +19 -19
  235. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +18 -153
  236. package/coverage/lcov-report/src/integrations/redis.ts.html +8 -8
  237. package/coverage/lcov-report/src/integrations/rest.ts.html +43 -52
  238. package/coverage/lcov-report/src/integrations/s3.ts.html +17 -17
  239. package/coverage/lcov-report/src/integrations/snowflake.ts.html +15 -15
  240. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +1 -1
  241. package/coverage/lcov-report/src/integrations/tests/index.html +1 -1
  242. package/coverage/lcov-report/src/integrations/utils.ts.html +49 -49
  243. package/coverage/lcov-report/src/middleware/appInfo.ts.html +11 -11
  244. package/coverage/lcov-report/src/middleware/authorized.ts.html +49 -37
  245. package/coverage/lcov-report/src/middleware/builder.ts.html +26 -26
  246. package/coverage/lcov-report/src/middleware/currentapp.ts.html +50 -47
  247. package/coverage/lcov-report/src/middleware/index.html +40 -40
  248. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +10 -10
  249. package/coverage/lcov-report/src/middleware/publicApi.ts.html +9 -9
  250. package/coverage/lcov-report/src/middleware/resourceId.ts.html +23 -23
  251. package/coverage/lcov-report/src/middleware/selfhost.ts.html +2 -2
  252. package/coverage/lcov-report/src/middleware/utils.ts.html +4 -4
  253. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +6 -6
  254. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +7 -7
  255. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +7 -7
  256. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +31 -31
  257. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +8 -8
  258. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +13 -13
  259. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +7 -7
  260. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +7 -7
  261. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +8 -8
  262. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +21 -21
  263. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +10 -10
  264. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +19 -19
  265. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +9 -9
  266. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +13 -13
  267. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +23 -23
  268. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +26 -26
  269. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +7 -7
  270. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +14 -14
  271. package/coverage/lcov-report/src/migrations/functions/index.html +18 -18
  272. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +8 -8
  273. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +11 -11
  274. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +11 -11
  275. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +3 -3
  276. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +6 -6
  277. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +8 -8
  278. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +7 -7
  279. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +4 -4
  280. package/coverage/lcov-report/src/migrations/index.html +15 -15
  281. package/coverage/lcov-report/src/migrations/index.ts.html +43 -43
  282. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +4 -4
  283. package/coverage/lcov-report/src/migrations/tests/index.html +6 -6
  284. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +3 -3
  285. package/coverage/lcov-report/src/sdk/app/applications/index.html +11 -11
  286. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +6 -6
  287. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +24 -24
  288. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +15 -15
  289. package/coverage/lcov-report/src/sdk/app/automations/index.html +7 -7
  290. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +5 -5
  291. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +8 -8
  292. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +5 -5
  293. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +30 -30
  294. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +24 -24
  295. package/coverage/lcov-report/src/sdk/app/backups/index.html +27 -27
  296. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +7 -7
  297. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +12 -12
  298. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +493 -0
  299. package/coverage/lcov-report/src/sdk/app/datasources/index.html +131 -0
  300. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +100 -0
  301. package/coverage/lcov-report/src/sdk/app/queries/index.html +131 -0
  302. package/coverage/lcov-report/src/{utilities/statusCodes.ts.html → sdk/app/queries/index.ts.html} +22 -28
  303. package/coverage/lcov-report/src/{definitions/datasource.ts.html → sdk/app/queries/queries.ts.html} +82 -82
  304. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +8 -8
  305. package/coverage/lcov-report/src/sdk/app/rows/index.html +8 -8
  306. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +6 -6
  307. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +4 -4
  308. package/coverage/lcov-report/src/sdk/app/tables/index.html +15 -15
  309. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +29 -20
  310. package/coverage/lcov-report/src/sdk/index.html +7 -7
  311. package/coverage/lcov-report/src/sdk/index.ts.html +24 -12
  312. package/coverage/lcov-report/src/sdk/users/index.html +6 -6
  313. package/coverage/lcov-report/src/sdk/users/index.ts.html +5 -5
  314. package/coverage/lcov-report/src/sdk/users/utils.ts.html +29 -29
  315. package/coverage/lcov-report/src/sdk/utils/index.html +116 -0
  316. package/coverage/lcov-report/src/sdk/utils/index.ts.html +133 -0
  317. package/coverage/lcov-report/src/startup.ts.html +40 -55
  318. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +141 -132
  319. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +20 -20
  320. package/coverage/lcov-report/src/tests/utilities/index.html +30 -30
  321. package/coverage/lcov-report/src/tests/utilities/index.ts.html +2 -2
  322. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +232 -43
  323. package/coverage/lcov-report/src/threads/automation.ts.html +225 -195
  324. package/coverage/lcov-report/src/threads/index.html +46 -46
  325. package/coverage/lcov-report/src/threads/index.ts.html +38 -38
  326. package/coverage/lcov-report/src/threads/query.ts.html +73 -34
  327. package/coverage/lcov-report/src/threads/utils.ts.html +26 -26
  328. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +4 -4
  329. package/coverage/lcov-report/src/utilities/centralPath.ts.html +10 -10
  330. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +11 -11
  331. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +12 -12
  332. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +32 -26
  333. package/coverage/lcov-report/src/utilities/fileSystem/index.html +42 -42
  334. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +1 -1
  335. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +10 -13
  336. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +9 -9
  337. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +7 -7
  338. package/coverage/lcov-report/src/utilities/global.ts.html +61 -61
  339. package/coverage/lcov-report/src/utilities/index.html +80 -95
  340. package/coverage/lcov-report/src/utilities/index.ts.html +32 -32
  341. package/coverage/lcov-report/src/utilities/redis.ts.html +35 -35
  342. package/coverage/lcov-report/src/utilities/routing/index.html +1 -1
  343. package/coverage/lcov-report/src/utilities/routing/index.ts.html +5 -5
  344. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +32 -32
  345. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +67 -67
  346. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +9 -9
  347. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +26 -26
  348. package/coverage/lcov-report/src/utilities/{csvParser.ts.html → schema.ts.html} +173 -233
  349. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +8 -8
  350. package/coverage/lcov-report/src/utilities/security.ts.html +13 -13
  351. package/coverage/lcov-report/src/utilities/usageQuota/index.html +9 -9
  352. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +8 -8
  353. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +3 -3
  354. package/coverage/lcov-report/src/utilities/users.ts.html +7 -7
  355. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +61 -34
  356. package/coverage/lcov-report/src/watch.ts.html +20 -20
  357. package/coverage/lcov-report/src/websocket.ts.html +5 -5
  358. package/coverage/lcov.info +11919 -11276
  359. package/dist/api/controllers/application.js +73 -74
  360. package/dist/api/controllers/cloud.js +1 -1
  361. package/dist/api/controllers/datasource.js +24 -15
  362. package/dist/api/controllers/query/index.js +23 -13
  363. package/dist/api/controllers/row/ExternalRequest.js +12 -3
  364. package/dist/api/controllers/row/external.js +20 -13
  365. package/dist/api/controllers/row/internal.js +40 -15
  366. package/dist/api/controllers/row/utils.js +35 -3
  367. package/dist/api/controllers/static/index.js +45 -42
  368. package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -1
  369. package/dist/api/controllers/table/external.js +16 -35
  370. package/dist/api/controllers/table/index.js +44 -15
  371. package/dist/api/controllers/table/internal.js +6 -7
  372. package/dist/api/controllers/table/utils.js +9 -9
  373. package/dist/api/controllers/user.js +14 -6
  374. package/dist/api/controllers/view/exporters.js +22 -6
  375. package/dist/api/controllers/view/index.js +20 -56
  376. package/dist/api/controllers/view/viewBuilder.js +15 -2
  377. package/dist/api/controllers/webhook.js +45 -43
  378. package/dist/api/routes/analytics.js +2 -1
  379. package/dist/api/routes/apikeys.js +2 -1
  380. package/dist/api/routes/application.js +2 -1
  381. package/dist/api/routes/auth.js +2 -1
  382. package/dist/api/routes/automation.js +2 -1
  383. package/dist/api/routes/backup.js +2 -1
  384. package/dist/api/routes/cloud.js +2 -1
  385. package/dist/api/routes/component.js +2 -1
  386. package/dist/api/routes/datasource.js +2 -1
  387. package/dist/api/routes/deploy.js +2 -1
  388. package/dist/api/routes/dev.js +2 -1
  389. package/dist/api/routes/index.js +2 -0
  390. package/dist/api/routes/integration.js +2 -1
  391. package/dist/api/routes/layout.js +2 -1
  392. package/dist/api/routes/metadata.js +2 -1
  393. package/dist/api/routes/migrations.js +2 -1
  394. package/dist/api/routes/permission.js +2 -1
  395. package/dist/api/routes/query.js +2 -1
  396. package/dist/api/routes/role.js +2 -1
  397. package/dist/api/routes/routing.js +2 -1
  398. package/dist/api/routes/row.js +2 -2
  399. package/dist/api/routes/screen.js +2 -1
  400. package/dist/api/routes/script.js +2 -1
  401. package/dist/api/routes/static.js +6 -5
  402. package/dist/api/routes/table.js +8 -38
  403. package/dist/api/routes/templates.js +2 -1
  404. package/dist/api/routes/user.js +2 -1
  405. package/dist/api/routes/utils/validators.js +1 -1
  406. package/dist/api/routes/view.js +2 -1
  407. package/dist/api/routes/webhook.js +2 -1
  408. package/dist/app.js +9 -7
  409. package/dist/automations/logging/index.js +5 -25
  410. package/dist/automations/triggers.js +1 -0
  411. package/dist/db/index.js +5 -2
  412. package/dist/db/linkedRows/LinkController.js +2 -1
  413. package/dist/db/linkedRows/LinkDocument.js +2 -1
  414. package/dist/db/newid.js +4 -2
  415. package/dist/definitions/datasource.js +0 -6
  416. package/dist/environment.js +2 -1
  417. package/dist/events/AutomationEmitter.js +2 -1
  418. package/dist/events/BudibaseEmitter.js +2 -1
  419. package/dist/events/index.js +2 -1
  420. package/dist/index.js +2 -2
  421. package/dist/integrations/base/query.js +7 -2
  422. package/dist/integrations/base/sqlTable.js +14 -14
  423. package/dist/integrations/dynamodb.js +8 -5
  424. package/dist/integrations/index.js +5 -5
  425. package/dist/integrations/mongodb.js +311 -271
  426. package/dist/integrations/mysql.js +2 -2
  427. package/dist/integrations/queries/sql.js +73 -100
  428. package/dist/integrations/rest.js +16 -18
  429. package/dist/middleware/authorized.js +2 -1
  430. package/dist/middleware/builder.js +4 -2
  431. package/dist/middleware/currentapp.js +6 -3
  432. package/dist/middleware/publicApi.js +4 -2
  433. package/dist/middleware/selfhost.js +4 -1
  434. package/dist/package.json +9 -7
  435. package/dist/sdk/app/datasources/datasources.js +147 -0
  436. package/dist/sdk/app/datasources/index.js +27 -0
  437. package/dist/sdk/app/queries/index.js +27 -0
  438. package/dist/sdk/app/queries/queries.js +60 -0
  439. package/dist/sdk/app/tables/index.js +6 -2
  440. package/dist/sdk/index.js +4 -0
  441. package/dist/sdk/utils/index.js +29 -0
  442. package/dist/startup.js +17 -17
  443. package/dist/threads/automation.js +18 -7
  444. package/dist/threads/index.js +4 -4
  445. package/dist/threads/query.js +27 -13
  446. package/dist/tsconfig.build.tsbuildinfo +1 -1
  447. package/dist/utilities/fileSystem/filesystem.js +38 -36
  448. package/dist/utilities/fileSystem/plugin.js +17 -14
  449. package/dist/utilities/fileSystem/template.js +7 -4
  450. package/dist/utilities/schema.js +108 -0
  451. package/dist/utilities/scriptRunner.js +2 -1
  452. package/dist/utilities/statusCodes.js +2 -1
  453. package/dist/utilities/workerRequests.js +2 -0
  454. package/dist/watch.js +2 -25
  455. package/jest.config.ts +5 -2
  456. package/package.json +10 -8
  457. package/scripts/dev/manage.js +1 -0
  458. package/src/api/controllers/application.ts +81 -74
  459. package/src/api/controllers/cloud.ts +1 -1
  460. package/src/api/controllers/datasource.ts +33 -25
  461. package/src/api/controllers/query/index.ts +49 -41
  462. package/src/api/controllers/row/ExternalRequest.ts +8 -2
  463. package/src/api/controllers/row/external.ts +24 -14
  464. package/src/api/controllers/row/internal.ts +42 -18
  465. package/src/api/controllers/row/utils.ts +40 -2
  466. package/src/api/controllers/static/index.ts +18 -19
  467. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -1
  468. package/src/api/controllers/table/external.ts +18 -16
  469. package/src/api/controllers/table/index.ts +46 -17
  470. package/src/api/controllers/table/internal.ts +6 -7
  471. package/src/api/controllers/table/utils.ts +12 -13
  472. package/src/api/controllers/user.ts +21 -13
  473. package/src/api/controllers/view/exporters.ts +20 -5
  474. package/src/api/controllers/view/index.ts +22 -35
  475. package/src/api/controllers/view/tests/viewBuilder.spec.js +1 -1
  476. package/src/api/controllers/view/viewBuilder.ts +1 -1
  477. package/src/api/controllers/webhook.ts +48 -46
  478. package/src/api/routes/analytics.ts +1 -1
  479. package/src/api/routes/apikeys.ts +1 -1
  480. package/src/api/routes/application.ts +1 -1
  481. package/src/api/routes/auth.ts +1 -1
  482. package/src/api/routes/automation.ts +1 -1
  483. package/src/api/routes/backup.ts +1 -1
  484. package/src/api/routes/cloud.ts +1 -1
  485. package/src/api/routes/component.ts +1 -1
  486. package/src/api/routes/datasource.ts +1 -1
  487. package/src/api/routes/deploy.ts +1 -1
  488. package/src/api/routes/dev.ts +1 -1
  489. package/src/api/routes/index.ts +2 -0
  490. package/src/api/routes/integration.ts +1 -1
  491. package/src/api/routes/layout.ts +1 -1
  492. package/src/api/routes/metadata.ts +1 -1
  493. package/src/api/routes/migrations.ts +1 -1
  494. package/src/api/routes/permission.ts +1 -1
  495. package/src/api/routes/query.ts +1 -1
  496. package/src/api/routes/role.ts +1 -1
  497. package/src/api/routes/routing.ts +1 -1
  498. package/src/api/routes/row.ts +1 -1
  499. package/src/api/routes/screen.ts +1 -1
  500. package/src/api/routes/script.ts +1 -1
  501. package/src/api/routes/static.ts +2 -2
  502. package/src/api/routes/table.ts +16 -39
  503. package/src/api/routes/templates.ts +1 -1
  504. package/src/api/routes/tests/datasource.spec.ts +35 -1
  505. package/src/api/routes/tests/misc.spec.js +4 -10
  506. package/src/api/routes/tests/plugin.spec.ts +10 -10
  507. package/src/api/routes/tests/table.spec.js +8 -30
  508. package/src/api/routes/tests/user.spec.js +20 -1
  509. package/src/api/routes/tests/utilities/TestFunctions.ts +1 -1
  510. package/src/api/routes/user.ts +1 -1
  511. package/src/api/routes/utils/validators.ts +1 -1
  512. package/src/api/routes/view.ts +1 -1
  513. package/src/api/routes/webhook.ts +1 -1
  514. package/src/app.ts +5 -3
  515. package/src/automations/logging/index.ts +1 -1
  516. package/src/automations/tests/loop.spec.ts +45 -0
  517. package/src/automations/triggers.ts +6 -1
  518. package/src/db/index.ts +1 -1
  519. package/src/db/linkedRows/LinkController.ts +1 -1
  520. package/src/db/linkedRows/LinkDocument.ts +1 -1
  521. package/src/db/newid.ts +1 -1
  522. package/src/db/tests/linkController.spec.js +1 -1
  523. package/src/definitions/automations.ts +1 -0
  524. package/src/definitions/datasource.ts +0 -41
  525. package/src/environment.ts +1 -1
  526. package/src/events/AutomationEmitter.ts +1 -1
  527. package/src/events/BudibaseEmitter.ts +1 -1
  528. package/src/events/index.ts +1 -1
  529. package/src/index.ts +1 -1
  530. package/src/integrations/base/query.ts +3 -1
  531. package/src/integrations/base/sqlTable.ts +1 -1
  532. package/src/integrations/dynamodb.ts +3 -3
  533. package/src/integrations/index.ts +4 -4
  534. package/src/integrations/mongodb.ts +315 -271
  535. package/src/integrations/mysql.ts +1 -1
  536. package/src/integrations/queries/sql.ts +5 -50
  537. package/src/integrations/rest.ts +16 -19
  538. package/src/integrations/tests/rest.spec.ts +19 -15
  539. package/src/middleware/authorized.ts +5 -1
  540. package/src/middleware/builder.ts +1 -1
  541. package/src/middleware/currentapp.ts +4 -3
  542. package/src/middleware/publicApi.ts +1 -1
  543. package/src/middleware/selfhost.ts +1 -1
  544. package/src/middleware/tests/authorized.spec.js +1 -1
  545. package/src/middleware/tests/currentapp.spec.js +1 -1
  546. package/src/middleware/tests/selfhost.spec.js +1 -1
  547. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +10 -6
  548. package/src/sdk/app/datasources/datasources.ts +136 -0
  549. package/src/sdk/app/datasources/index.ts +5 -0
  550. package/src/sdk/app/queries/index.ts +5 -0
  551. package/src/sdk/app/queries/queries.ts +50 -0
  552. package/src/sdk/app/tables/index.ts +6 -3
  553. package/src/sdk/index.ts +4 -0
  554. package/src/sdk/utils/index.ts +16 -0
  555. package/src/startup.ts +3 -8
  556. package/src/tests/jestEnv.ts +13 -0
  557. package/src/tests/jestSetup.ts +0 -14
  558. package/src/tests/utilities/TestConfiguration.ts +16 -13
  559. package/src/tests/utilities/structures.ts +65 -2
  560. package/src/threads/automation.ts +18 -8
  561. package/src/threads/definitions.ts +3 -0
  562. package/src/threads/index.ts +1 -1
  563. package/src/threads/query.ts +28 -15
  564. package/src/utilities/fileSystem/filesystem.ts +7 -5
  565. package/src/utilities/fileSystem/plugin.ts +3 -4
  566. package/src/utilities/fileSystem/template.ts +2 -2
  567. package/src/utilities/schema.ts +141 -0
  568. package/src/utilities/scriptRunner.ts +1 -1
  569. package/src/utilities/statusCodes.ts +1 -1
  570. package/src/utilities/workerRequests.ts +10 -1
  571. package/src/watch.ts +1 -1
  572. package/tsconfig.json +2 -1
  573. package/builder/assets/index.fa480d5b.css +0 -6
  574. package/dist/utilities/csvParser.js +0 -152
  575. package/src/utilities/csvParser.ts +0 -161
  576. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -15
  577. package/src/utilities/tests/csvParser.spec.js +0 -112
@@ -27,7 +27,7 @@ import {
27
27
  import { cloneDeep } from "lodash/fp"
28
28
  import { context, db as dbCore } from "@budibase/backend-core"
29
29
  import { finaliseRow, updateRelatedFormula } from "./staticFormula"
30
- import * as exporters from "../view/exporters"
30
+ import { csv, json, jsonWithSchema, Format } from "../view/exporters"
31
31
  import { apiFileReturn } from "../../../utilities/fileSystem"
32
32
  import {
33
33
  Ctx,
@@ -38,6 +38,8 @@ import {
38
38
  Table,
39
39
  } from "@budibase/types"
40
40
 
41
+ const { cleanExportRows } = require("./utils")
42
+
41
43
  const CALCULATION_TYPES = {
42
44
  SUM: "sum",
43
45
  COUNT: "count",
@@ -357,6 +359,14 @@ export async function search(ctx: Ctx) {
357
359
  params.version = ctx.version
358
360
  params.tableId = tableId
359
361
 
362
+ let table
363
+ if (params.sort && !params.sortType) {
364
+ table = await db.get(tableId)
365
+ const schema = table.schema
366
+ const sortField = schema[params.sort]
367
+ params.sortType = sortField.type == "number" ? "number" : "string"
368
+ }
369
+
360
370
  let response
361
371
  if (paginate) {
362
372
  response = await paginatedSearch(query, params)
@@ -370,7 +380,7 @@ export async function search(ctx: Ctx) {
370
380
  if (tableId === InternalTables.USER_METADATA) {
371
381
  response.rows = await getGlobalUsersFromMetadata(response.rows)
372
382
  }
373
- const table = await db.get(tableId)
383
+ table = table || (await db.get(tableId))
374
384
  response.rows = await outputProcessing(table, response.rows)
375
385
  }
376
386
 
@@ -389,16 +399,25 @@ export async function exportRows(ctx: Ctx) {
389
399
  const table = await db.get(ctx.params.tableId)
390
400
  const rowIds = ctx.request.body.rows
391
401
  let format = ctx.query.format
392
- const { columns } = ctx.request.body
393
- let response = (
394
- await db.allDocs({
395
- include_docs: true,
396
- keys: rowIds,
397
- })
398
- ).rows.map(row => row.doc)
402
+ const { columns, query } = ctx.request.body
403
+
404
+ let result
405
+ if (rowIds) {
406
+ let response = (
407
+ await db.allDocs({
408
+ include_docs: true,
409
+ keys: rowIds,
410
+ })
411
+ ).rows.map(row => row.doc)
412
+
413
+ result = await outputProcessing(table, response)
414
+ } else if (query) {
415
+ let searchResponse = await exports.search(ctx)
416
+ result = searchResponse.rows
417
+ }
399
418
 
400
- let result = (await outputProcessing(table, response)) as Row[]
401
419
  let rows: Row[] = []
420
+ let schema = table.schema
402
421
 
403
422
  // Filter data to only specified columns if required
404
423
  if (columns && columns.length) {
@@ -412,14 +431,19 @@ export async function exportRows(ctx: Ctx) {
412
431
  rows = result
413
432
  }
414
433
 
415
- let headers = Object.keys(rows[0])
416
- // @ts-ignore
417
- const exporter = exporters[format]
418
- const filename = `export.${format}`
419
-
420
- // send down the file
421
- ctx.attachment(filename)
422
- return apiFileReturn(exporter(headers, rows))
434
+ let exportRows = cleanExportRows(rows, schema, format, columns)
435
+ if (format === Format.CSV) {
436
+ ctx.attachment("export.csv")
437
+ return apiFileReturn(csv(Object.keys(rows[0]), exportRows))
438
+ } else if (format === Format.JSON) {
439
+ ctx.attachment("export.json")
440
+ return apiFileReturn(json(exportRows))
441
+ } else if (format === Format.JSON_WITH_SCHEMA) {
442
+ ctx.attachment("export.json")
443
+ return apiFileReturn(jsonWithSchema(schema, exportRows))
444
+ } else {
445
+ throw "Format not recognised"
446
+ }
423
447
  }
424
448
 
425
449
  export async function fetchEnrichedRow(ctx: Ctx) {
@@ -7,7 +7,9 @@ import { BBContext, Row, Table } from "@budibase/types"
7
7
  export { removeKeyNumbering } from "../../../integrations/base/utils"
8
8
  const validateJs = require("validate.js")
9
9
  const { cloneDeep } = require("lodash/fp")
10
+ import { Format } from "../view/exporters"
10
11
  import { Ctx } from "@budibase/types"
12
+ import sdk from "../../../sdk"
11
13
 
12
14
  validateJs.extend(validateJs.validators.datetime, {
13
15
  parse: function (value: string) {
@@ -21,8 +23,7 @@ validateJs.extend(validateJs.validators.datetime, {
21
23
 
22
24
  export async function getDatasourceAndQuery(json: any) {
23
25
  const datasourceId = json.endpoint.datasourceId
24
- const db = context.getAppDB()
25
- const datasource = await db.get(datasourceId)
26
+ const datasource = await sdk.datasources.get(datasourceId)
26
27
  return makeExternalQuery(datasource, json)
27
28
  }
28
29
 
@@ -117,3 +118,40 @@ export async function validate({
117
118
  }
118
119
  return { valid: Object.keys(errors).length === 0, errors }
119
120
  }
121
+
122
+ export function cleanExportRows(
123
+ rows: any[],
124
+ schema: any,
125
+ format: string,
126
+ columns: string[]
127
+ ) {
128
+ let cleanRows = [...rows]
129
+
130
+ const relationships = Object.entries(schema)
131
+ .filter((entry: any[]) => entry[1].type === FieldTypes.LINK)
132
+ .map(entry => entry[0])
133
+
134
+ relationships.forEach(column => {
135
+ cleanRows.forEach(row => {
136
+ delete row[column]
137
+ })
138
+ delete schema[column]
139
+ })
140
+
141
+ // Intended to avoid 'undefined' in export
142
+ if (format === Format.CSV) {
143
+ const schemaKeys = Object.keys(schema)
144
+ for (let key of schemaKeys) {
145
+ if (columns?.length && columns.indexOf(key) > 0) {
146
+ continue
147
+ }
148
+ for (let row of cleanRows) {
149
+ if (row[key] == null) {
150
+ row[key] = ""
151
+ }
152
+ }
153
+ }
154
+ }
155
+
156
+ return cleanRows
157
+ }
@@ -1,20 +1,21 @@
1
1
  require("svelte/register")
2
2
 
3
- const send = require("koa-send")
4
- const { resolve, join } = require("../../../utilities/centralPath")
3
+ import { resolve, join } from "../../../utilities/centralPath"
5
4
  const uuid = require("uuid")
6
5
  import { ObjectStoreBuckets } from "../../../constants"
7
- const { processString } = require("@budibase/string-templates")
8
- const {
6
+ import { processString } from "@budibase/string-templates"
7
+ import {
9
8
  loadHandlebarsFile,
10
9
  NODE_MODULES_PATH,
11
10
  TOP_LEVEL_PATH,
12
- } = require("../../../utilities/fileSystem")
13
- const env = require("../../../environment")
14
- const { DocumentType } = require("../../../db/utils")
15
- const { context, objectStore, utils } = require("@budibase/backend-core")
16
- const AWS = require("aws-sdk")
17
- const fs = require("fs")
11
+ } from "../../../utilities/fileSystem"
12
+ import env from "../../../environment"
13
+ import { DocumentType } from "../../../db/utils"
14
+ import { context, objectStore, utils } from "@budibase/backend-core"
15
+ import AWS from "aws-sdk"
16
+ import fs from "fs"
17
+ import sdk from "../../../sdk"
18
+ const send = require("koa-send")
18
19
 
19
20
  async function prepareUpload({ s3Key, bucket, metadata, file }: any) {
20
21
  const response = await objectStore.upload({
@@ -110,7 +111,7 @@ export const serveApp = async function (ctx: any) {
110
111
  title: appInfo.name,
111
112
  production: env.isProd(),
112
113
  appId,
113
- clientLibPath: objectStore.clientLibraryUrl(appId, appInfo.version),
114
+ clientLibPath: objectStore.clientLibraryUrl(appId!, appInfo.version),
114
115
  usedPlugins: plugins,
115
116
  })
116
117
 
@@ -135,7 +136,7 @@ export const serveBuilderPreview = async function (ctx: any) {
135
136
  let appId = context.getAppId()
136
137
  const previewHbs = loadHandlebarsFile(`${__dirname}/templates/preview.hbs`)
137
138
  ctx.body = await processString(previewHbs, {
138
- clientLibPath: objectStore.clientLibraryUrl(appId, appInfo.version),
139
+ clientLibPath: objectStore.clientLibraryUrl(appId!, appInfo.version),
139
140
  })
140
141
  } else {
141
142
  // just return the app info for jest to assert on
@@ -150,13 +151,11 @@ export const serveClientLibrary = async function (ctx: any) {
150
151
  }
151
152
 
152
153
  export const getSignedUploadURL = async function (ctx: any) {
153
- const database = context.getAppDB()
154
-
155
154
  // Ensure datasource is valid
156
155
  let datasource
157
156
  try {
158
157
  const { datasourceId } = ctx.params
159
- datasource = await database.get(datasourceId)
158
+ datasource = await sdk.datasources.get(datasourceId, { enriched: true })
160
159
  if (!datasource) {
161
160
  ctx.throw(400, "The specified datasource could not be found")
162
161
  }
@@ -172,8 +171,8 @@ export const getSignedUploadURL = async function (ctx: any) {
172
171
  // Determine type of datasource and generate signed URL
173
172
  let signedUrl
174
173
  let publicUrl
175
- const awsRegion = datasource?.config?.region || "eu-west-1"
176
- if (datasource.source === "S3") {
174
+ const awsRegion = (datasource?.config?.region || "eu-west-1") as string
175
+ if (datasource?.source === "S3") {
177
176
  const { bucket, key } = ctx.request.body || {}
178
177
  if (!bucket || !key) {
179
178
  ctx.throw(400, "bucket and key values are required")
@@ -182,8 +181,8 @@ export const getSignedUploadURL = async function (ctx: any) {
182
181
  try {
183
182
  const s3 = new AWS.S3({
184
183
  region: awsRegion,
185
- accessKeyId: datasource?.config?.accessKeyId,
186
- secretAccessKey: datasource?.config?.secretAccessKey,
184
+ accessKeyId: datasource?.config?.accessKeyId as string,
185
+ secretAccessKey: datasource?.config?.secretAccessKey as string,
187
186
  apiVersion: "2006-03-01",
188
187
  signatureVersion: "v4",
189
188
  })
@@ -2,7 +2,6 @@
2
2
  export let title = ""
3
3
  export let favicon = ""
4
4
  export let metaImage = ""
5
- export let url = ""
6
5
 
7
6
  export let clientLibPath
8
7
  export let usedPlugins
@@ -10,9 +10,9 @@ import {
10
10
  } from "./utils"
11
11
  import { FieldTypes, RelationshipTypes } from "../../../constants"
12
12
  import { makeExternalQuery } from "../../../integrations/base/query"
13
- import * as csvParser from "../../../utilities/csvParser"
14
13
  import { handleRequest } from "../row/external"
15
14
  import { events, context } from "@budibase/backend-core"
15
+ import { parse, isRows, isSchema } from "../../../utilities/schema"
16
16
  import {
17
17
  Datasource,
18
18
  Table,
@@ -197,7 +197,7 @@ export async function save(ctx: BBContext) {
197
197
  const table: TableRequest = ctx.request.body
198
198
  const renamed = table?._rename
199
199
  // can't do this right now
200
- delete table.dataImport
200
+ delete table.rows
201
201
  const datasourceId = getDatasourceId(ctx.request.body)!
202
202
  // table doesn't exist already, note that it is created
203
203
  if (!table._id) {
@@ -219,7 +219,7 @@ export async function save(ctx: BBContext) {
219
219
  }
220
220
 
221
221
  const db = context.getAppDB()
222
- const datasource = await db.get(datasourceId)
222
+ const datasource = await sdk.datasources.get(datasourceId)
223
223
  if (!datasource.entities) {
224
224
  datasource.entities = {}
225
225
  }
@@ -322,15 +322,17 @@ export async function destroy(ctx: BBContext) {
322
322
  const datasourceId = getDatasourceId(tableToDelete)
323
323
 
324
324
  const db = context.getAppDB()
325
- const datasource = await db.get(datasourceId)
325
+ const datasource = await sdk.datasources.get(datasourceId!)
326
326
  const tables = datasource.entities
327
327
 
328
328
  const operation = Operation.DELETE_TABLE
329
- await makeTableRequest(datasource, operation, tableToDelete, tables)
330
-
331
- cleanupRelationships(tableToDelete, tables)
329
+ if (tables) {
330
+ await makeTableRequest(datasource, operation, tableToDelete, tables)
331
+ cleanupRelationships(tableToDelete, tables)
332
+ delete tables[tableToDelete.name]
333
+ datasource.entities = tables
334
+ }
332
335
 
333
- delete datasource.entities[tableToDelete.name]
334
336
  await db.put(datasource)
335
337
 
336
338
  return tableToDelete
@@ -338,17 +340,17 @@ export async function destroy(ctx: BBContext) {
338
340
 
339
341
  export async function bulkImport(ctx: BBContext) {
340
342
  const table = await sdk.tables.getTable(ctx.params.tableId)
341
- const { dataImport } = ctx.request.body
342
- if (!dataImport || !dataImport.schema || !dataImport.csvString) {
343
+ const { rows }: { rows: unknown } = ctx.request.body
344
+ const schema: unknown = table.schema
345
+
346
+ if (!rows || !isRows(rows) || !isSchema(schema)) {
343
347
  ctx.throw(400, "Provided data import information is invalid.")
344
348
  }
345
- const rows = await csvParser.transform({
346
- ...dataImport,
347
- existingTable: table,
348
- })
349
+
350
+ const parsedRows = await parse(rows, schema)
349
351
  await handleRequest(Operation.BULK_CREATE, table._id!, {
350
- rows,
352
+ rows: parsedRows,
351
353
  })
352
- await events.rows.imported(table, "csv", rows.length)
354
+ await events.rows.imported(table, parsedRows.length)
353
355
  return table
354
356
  }
@@ -1,11 +1,16 @@
1
1
  import * as internal from "./internal"
2
2
  import * as external from "./external"
3
- import * as csvParser from "../../../utilities/csvParser"
3
+ import {
4
+ validate as validateSchema,
5
+ isSchema,
6
+ isRows,
7
+ } from "../../../utilities/schema"
4
8
  import { isExternalTable, isSQL } from "../../../integrations/utils"
5
9
  import { getDatasourceParams } from "../../../db/utils"
6
10
  import { context, events } from "@budibase/backend-core"
7
11
  import { Table, BBContext } from "@budibase/types"
8
12
  import sdk from "../../../sdk"
13
+ import csv from "csvtojson"
9
14
 
10
15
  function pickApi({ tableId, table }: { tableId?: string; table?: Table }) {
11
16
  if (table && !tableId) {
@@ -56,16 +61,16 @@ export async function find(ctx: BBContext) {
56
61
  export async function save(ctx: BBContext) {
57
62
  const appId = ctx.appId
58
63
  const table = ctx.request.body
59
- const importFormat =
60
- table.dataImport && table.dataImport.csvString ? "csv" : undefined
64
+ const isImport = table.rows
65
+
61
66
  const savedTable = await pickApi({ table }).save(ctx)
62
67
  if (!table._id) {
63
68
  await events.table.created(savedTable)
64
69
  } else {
65
70
  await events.table.updated(savedTable)
66
71
  }
67
- if (importFormat) {
68
- await events.table.imported(savedTable, importFormat)
72
+ if (isImport) {
73
+ await events.table.imported(savedTable)
69
74
  }
70
75
  ctx.status = 200
71
76
  ctx.message = `Table ${table.name} saved successfully.`
@@ -96,19 +101,43 @@ export async function bulkImport(ctx: BBContext) {
96
101
  ctx.body = { message: `Bulk rows created.` }
97
102
  }
98
103
 
99
- export async function validateCSVSchema(ctx: BBContext) {
100
- // tableId being specified means its an import to an existing table
101
- const { csvString, schema = {}, tableId } = ctx.request.body
102
- let existingTable
104
+ export async function csvToJson(ctx: BBContext) {
105
+ const { csvString } = ctx.request.body
106
+
107
+ const result = await csv().fromString(csvString)
108
+
109
+ ctx.status = 200
110
+ ctx.body = result
111
+ }
112
+
113
+ export async function validateNewTableImport(ctx: BBContext) {
114
+ const { rows, schema }: { rows: unknown; schema: unknown } = ctx.request.body
115
+
116
+ if (isRows(rows) && isSchema(schema)) {
117
+ ctx.status = 200
118
+ ctx.body = validateSchema(rows, schema)
119
+ } else {
120
+ ctx.status = 422
121
+ }
122
+ }
123
+
124
+ export async function validateExistingTableImport(ctx: BBContext) {
125
+ const { rows, tableId }: { rows: unknown; tableId: unknown } =
126
+ ctx.request.body
127
+
128
+ let schema = null
103
129
  if (tableId) {
104
- existingTable = await sdk.tables.getTable(tableId)
130
+ const table = await sdk.tables.getTable(tableId)
131
+ schema = table.schema
132
+ } else {
133
+ ctx.status = 422
134
+ return
105
135
  }
106
- let result: Record<string, any> | undefined = await csvParser.parse(
107
- csvString,
108
- schema
109
- )
110
- if (existingTable) {
111
- result = csvParser.updateSchema({ schema: result, existingTable })
136
+
137
+ if (tableId && isRows(rows) && isSchema(schema)) {
138
+ ctx.status = 200
139
+ ctx.body = validateSchema(rows, schema)
140
+ } else {
141
+ ctx.status = 422
112
142
  }
113
- ctx.body = { schema: result }
114
143
  }
@@ -3,7 +3,7 @@ import { getRowParams, generateTableID } from "../../../db/utils"
3
3
  import { FieldTypes } from "../../../constants"
4
4
  import { TableSaveFunctions, hasTypeChanged, handleDataImport } from "./utils"
5
5
  import { context } from "@budibase/backend-core"
6
- import { isTest } from "../../../environment"
6
+ import env from "../../../environment"
7
7
  import {
8
8
  cleanupAttachments,
9
9
  fixAutoColumnSubType,
@@ -13,7 +13,6 @@ import { Table } from "@budibase/types"
13
13
  import { quotas } from "@budibase/pro"
14
14
  import { isEqual } from "lodash"
15
15
  import { cloneDeep } from "lodash/fp"
16
- import env from "../../../environment"
17
16
  import sdk from "../../../sdk"
18
17
 
19
18
  function checkAutoColumns(table: Table, oldTable: Table) {
@@ -36,7 +35,7 @@ function checkAutoColumns(table: Table, oldTable: Table) {
36
35
 
37
36
  export async function save(ctx: any) {
38
37
  const db = context.getAppDB()
39
- const { dataImport, ...rest } = ctx.request.body
38
+ const { rows, ...rest } = ctx.request.body
40
39
  let tableToSave = {
41
40
  type: "table",
42
41
  _id: generateTableID(),
@@ -62,7 +61,7 @@ export async function save(ctx: any) {
62
61
  const tableSaveFunctions = new TableSaveFunctions({
63
62
  user: ctx.user,
64
63
  oldTable,
65
- dataImport,
64
+ importRows: rows,
66
65
  })
67
66
  tableToSave = await tableSaveFunctions.before(tableToSave)
68
67
 
@@ -164,7 +163,7 @@ export async function destroy(ctx: any) {
164
163
  await db.remove(tableToDelete._id, tableToDelete._rev)
165
164
 
166
165
  // remove table search index
167
- if (!isTest() || env.COUCH_DB_URL) {
166
+ if (!env.isTest() || env.COUCH_DB_URL) {
168
167
  const currentIndexes = await db.getIndexes()
169
168
  const existingIndex = currentIndexes.indexes.find(
170
169
  (existing: any) => existing.name === `search:${ctx.params.tableId}`
@@ -186,7 +185,7 @@ export async function destroy(ctx: any) {
186
185
 
187
186
  export async function bulkImport(ctx: any) {
188
187
  const table = await sdk.tables.getTable(ctx.params.tableId)
189
- const { dataImport } = ctx.request.body
190
- await handleDataImport(ctx.user, table, dataImport)
188
+ const { rows } = ctx.request.body
189
+ await handleDataImport(ctx.user, table, rows)
191
190
  return table
192
191
  }
@@ -1,4 +1,4 @@
1
- import { transform } from "../../../utilities/csvParser"
1
+ import { parse, isSchema, isRows } from "../../../utilities/schema"
2
2
  import { getRowParams, generateRowID, InternalTables } from "../../../db/utils"
3
3
  import { isEqual } from "lodash"
4
4
  import { AutoFieldSubTypes, FieldTypes } from "../../../constants"
@@ -128,24 +128,23 @@ export function importToRows(data: any, table: any, user: any = {}) {
128
128
  return finalData
129
129
  }
130
130
 
131
- export async function handleDataImport(user: any, table: any, dataImport: any) {
132
- if (!dataImport || !dataImport.csvString) {
131
+ export async function handleDataImport(user: any, table: any, rows: any) {
132
+ const schema: unknown = table.schema
133
+
134
+ if (!rows || !isRows(rows) || !isSchema(schema)) {
133
135
  return table
134
136
  }
135
137
 
136
138
  const db = context.getAppDB()
137
- // Populate the table with rows imported from CSV in a bulk update
138
- const data = await transform({
139
- ...dataImport,
140
- existingTable: table,
141
- })
139
+ const data = parse(rows, schema)
142
140
 
143
141
  let finalData: any = importToRows(data, table, user)
144
142
 
145
143
  await quotas.addRows(finalData.length, () => db.bulkDocs(finalData), {
146
144
  tableId: table._id,
147
145
  })
148
- await events.rows.imported(table, "csv", finalData.length)
146
+
147
+ await events.rows.imported(table, finalData.length)
149
148
  return table
150
149
  }
151
150
 
@@ -210,14 +209,14 @@ class TableSaveFunctions {
210
209
  db: any
211
210
  user: any
212
211
  oldTable: any
213
- dataImport: any
212
+ importRows: any
214
213
  rows: any
215
214
 
216
- constructor({ user, oldTable, dataImport }: any) {
215
+ constructor({ user, oldTable, importRows }: any) {
217
216
  this.db = context.getAppDB()
218
217
  this.user = user
219
218
  this.oldTable = oldTable
220
- this.dataImport = dataImport
219
+ this.importRows = importRows
221
220
  // any rows that need updated
222
221
  this.rows = []
223
222
  }
@@ -241,7 +240,7 @@ class TableSaveFunctions {
241
240
  // after saving
242
241
  async after(table: any) {
243
242
  table = await handleSearchIndexes(table)
244
- table = await handleDataImport(this.user, table, this.dataImport)
243
+ table = await handleDataImport(this.user, table, this.importRows)
245
244
  return table
246
245
  }
247
246
 
@@ -4,19 +4,21 @@ import { getGlobalUsers, getRawGlobalUser } from "../../utilities/global"
4
4
  import { getFullUser } from "../../utilities/users"
5
5
  import {
6
6
  context,
7
- constants,
8
7
  roles as rolesCore,
9
8
  db as dbCore,
10
9
  } from "@budibase/backend-core"
11
- import { BBContext, User } from "@budibase/types"
10
+ import { BBContext, Ctx, SyncUserRequest, User } from "@budibase/types"
12
11
  import sdk from "../../sdk"
13
12
 
14
- export async function syncUser(ctx: BBContext) {
13
+ export async function syncUser(ctx: Ctx<SyncUserRequest>) {
15
14
  let deleting = false,
16
15
  user: User | any
17
16
  const userId = ctx.params.id
17
+
18
+ const previousUser = ctx.request.body?.previousUser
19
+
18
20
  try {
19
- user = await getRawGlobalUser(userId)
21
+ user = (await getRawGlobalUser(userId)) as User
20
22
  } catch (err: any) {
21
23
  if (err && err.status === 404) {
22
24
  user = {}
@@ -25,6 +27,11 @@ export async function syncUser(ctx: BBContext) {
25
27
  throw err
26
28
  }
27
29
  }
30
+
31
+ let previousApps = previousUser
32
+ ? Object.keys(previousUser.roles).map(appId => appId)
33
+ : []
34
+
28
35
  const roles = deleting ? {} : user.roles
29
36
  // remove props which aren't useful to metadata
30
37
  delete user.password
@@ -40,8 +47,9 @@ export async function syncUser(ctx: BBContext) {
40
47
  .filter(entry => entry[1] !== rolesCore.BUILTIN_ROLE_IDS.PUBLIC)
41
48
  .map(([appId]) => appId)
42
49
  }
43
- for (let prodAppId of prodAppIds) {
50
+ for (let prodAppId of new Set([...prodAppIds, ...previousApps])) {
44
51
  const roleId = roles[prodAppId]
52
+ const deleteFromApp = !roleId
45
53
  const devAppId = dbCore.getDevelopmentAppID(prodAppId)
46
54
  for (let appId of [prodAppId, devAppId]) {
47
55
  if (!(await dbCore.dbExists(appId))) {
@@ -54,24 +62,24 @@ export async function syncUser(ctx: BBContext) {
54
62
  try {
55
63
  metadata = await db.get(metadataId)
56
64
  } catch (err) {
57
- if (deleting) {
65
+ if (deleteFromApp) {
58
66
  return
59
67
  }
60
68
  metadata = {
61
69
  tableId: InternalTables.USER_METADATA,
62
70
  }
63
71
  }
72
+
73
+ if (deleteFromApp) {
74
+ await db.remove(metadata)
75
+ return
76
+ }
77
+
64
78
  // assign the roleId for the metadata doc
65
79
  if (roleId) {
66
80
  metadata.roleId = roleId
67
81
  }
68
- let combined = !deleting
69
- ? sdk.users.combineMetadataAndUser(user, metadata)
70
- : {
71
- ...metadata,
72
- status: constants.UserStatus.INACTIVE,
73
- metadata: rolesCore.BUILTIN_ROLE_IDS.PUBLIC,
74
- }
82
+ let combined = sdk.users.combineMetadataAndUser(user, metadata)
75
83
  // if its null then there was no updates required
76
84
  if (combined) {
77
85
  await db.put(combined)
@@ -1,4 +1,4 @@
1
- import { Row } from "@budibase/types"
1
+ import { Row, TableSchema } from "@budibase/types"
2
2
 
3
3
  export function csv(headers: string[], rows: Row[]) {
4
4
  let csv = headers.map(key => `"${key}"`).join(",")
@@ -18,11 +18,26 @@ export function csv(headers: string[], rows: Row[]) {
18
18
  return csv
19
19
  }
20
20
 
21
- export function json(headers: string[], rows: Row[]) {
21
+ export function json(rows: Row[]) {
22
22
  return JSON.stringify(rows, undefined, 2)
23
23
  }
24
24
 
25
- export const ExportFormats = {
26
- CSV: "csv",
27
- JSON: "json",
25
+ export function jsonWithSchema(schema: TableSchema, rows: Row[]) {
26
+ const newSchema: TableSchema = {}
27
+ Object.values(schema).forEach(column => {
28
+ if (!column.autocolumn) {
29
+ newSchema[column.name] = column
30
+ }
31
+ })
32
+ return JSON.stringify({ schema: newSchema, rows }, undefined, 2)
33
+ }
34
+
35
+ export enum Format {
36
+ CSV = "csv",
37
+ JSON = "json",
38
+ JSON_WITH_SCHEMA = "jsonWithSchema",
39
+ }
40
+
41
+ export function isFormat(format: any): format is Format {
42
+ return Object.values(Format).includes(format as Format)
28
43
  }