@budibase/server 2.3.19 → 2.3.21-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/__mocks__/node-fetch.ts +3 -0
  3. package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
  4. package/builder/assets/{index.a3f8cb92.js → index.90fba548.js} +439 -426
  5. package/builder/assets/index.b24b9dea.css +6 -0
  6. package/builder/assets/listScreenPreview.599c0aae.png +0 -0
  7. package/builder/index.html +2 -2
  8. package/dist/api/controllers/automation.js +11 -2
  9. package/dist/api/controllers/cloud.js +2 -2
  10. package/dist/api/controllers/query/index.js +2 -0
  11. package/dist/api/controllers/row/ExternalRequest.js +50 -23
  12. package/dist/api/controllers/row/external.js +12 -1
  13. package/dist/api/controllers/row/internalSearch.js +6 -450
  14. package/dist/api/controllers/row/utils.js +1 -3
  15. package/dist/api/controllers/table/external.js +8 -8
  16. package/dist/api/index.js +1 -21
  17. package/dist/api/routes/automation.js +1 -1
  18. package/dist/api/routes/public/applications.js +7 -7
  19. package/dist/api/routes/public/queries.js +2 -2
  20. package/dist/api/routes/public/rows.js +5 -5
  21. package/dist/api/routes/public/tables.js +5 -5
  22. package/dist/api/routes/public/users.js +5 -5
  23. package/dist/app.js +9 -1
  24. package/dist/constants/index.js +4 -24
  25. package/dist/db/defaultData/datasource_bb_default.js +6 -5
  26. package/dist/db/index.js +25 -2
  27. package/dist/db/linkedRows/LinkController.js +9 -8
  28. package/dist/db/utils.js +2 -5
  29. package/dist/db/views/staticViews.js +2 -1
  30. package/dist/ddApm.js +11 -0
  31. package/dist/elasticApm.js +14 -0
  32. package/dist/integrations/base/sql.js +6 -3
  33. package/dist/integrations/googlesheets.js +17 -20
  34. package/dist/middleware/authorized.js +5 -3
  35. package/dist/middleware/builder.js +6 -3
  36. package/dist/migrations/functions/backfill/global/configs.js +10 -4
  37. package/dist/migrations/tests/helpers.js +1 -1
  38. package/dist/migrations/tests/structures.js +1 -1
  39. package/dist/package.json +14 -9
  40. package/dist/sdk/app/backups/constants.js +2 -1
  41. package/dist/sdk/app/backups/exports.js +20 -7
  42. package/dist/sdk/app/datasources/datasources.js +3 -0
  43. package/dist/sdk/app/rows/attachments.js +1 -1
  44. package/dist/startup.js +3 -0
  45. package/dist/tsconfig.build.tsbuildinfo +1 -1
  46. package/dist/utilities/redis.js +2 -0
  47. package/dist/utilities/retry.js +30 -0
  48. package/jest-testcontainers-config.js +8 -0
  49. package/jest.config.ts +35 -22
  50. package/package.json +15 -10
  51. package/scripts/load/create-many-apps.js +24 -0
  52. package/scripts/load/create-many-rows.js +30 -0
  53. package/scripts/load/utils.js +66 -0
  54. package/scripts/test.sh +12 -0
  55. package/specs/{generate.js → generate.ts} +7 -9
  56. package/specs/openapi.json +30 -30
  57. package/specs/openapi.yaml +27 -27
  58. package/specs/{parameters.js → parameters.ts} +6 -6
  59. package/specs/resources/{application.js → application.ts} +4 -4
  60. package/specs/resources/{index.js → index.ts} +8 -8
  61. package/specs/resources/{misc.js → misc.ts} +3 -3
  62. package/specs/resources/{query.js → query.ts} +4 -4
  63. package/specs/resources/{row.js → row.ts} +3 -4
  64. package/specs/resources/{table.js → table.ts} +5 -5
  65. package/specs/resources/{user.js → user.ts} +3 -3
  66. package/specs/resources/utils/Resource.ts +39 -0
  67. package/specs/resources/utils/{index.js → index.ts} +1 -1
  68. package/specs/{security.js → security.ts} +1 -1
  69. package/src/api/controllers/automation.ts +13 -2
  70. package/src/api/controllers/cloud.ts +2 -2
  71. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  72. package/src/api/controllers/query/index.ts +2 -0
  73. package/src/api/controllers/row/ExternalRequest.ts +98 -27
  74. package/src/api/controllers/row/external.ts +13 -1
  75. package/src/api/controllers/row/internalSearch.ts +11 -524
  76. package/src/api/controllers/row/utils.ts +1 -2
  77. package/src/api/controllers/table/external.ts +3 -2
  78. package/src/api/index.ts +3 -22
  79. package/src/api/routes/automation.ts +1 -1
  80. package/src/api/routes/public/applications.ts +7 -8
  81. package/src/api/routes/public/queries.ts +2 -2
  82. package/src/api/routes/public/rows.ts +5 -5
  83. package/src/api/routes/public/tables.ts +5 -5
  84. package/src/api/routes/public/tests/{compare.spec.js → compare.spec.ts} +45 -26
  85. package/src/api/routes/public/tests/users.spec.js +1 -1
  86. package/src/api/routes/public/tests/utils.ts +25 -8
  87. package/src/api/routes/public/users.ts +5 -5
  88. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  89. package/src/api/routes/tests/analytics.spec.js +4 -1
  90. package/src/api/routes/tests/apikeys.spec.js +1 -1
  91. package/src/api/routes/tests/application.spec.ts +20 -6
  92. package/src/api/routes/tests/auth.spec.js +2 -2
  93. package/src/api/routes/tests/automation.spec.js +6 -2
  94. package/src/api/routes/tests/backup.spec.ts +4 -14
  95. package/src/api/routes/tests/cloud.spec.ts +20 -31
  96. package/src/api/routes/tests/component.spec.js +1 -1
  97. package/src/api/routes/tests/datasource.spec.ts +20 -3
  98. package/src/api/routes/tests/dev.spec.js +1 -1
  99. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  100. package/src/api/routes/tests/integration.spec.js +1 -1
  101. package/src/api/routes/tests/layout.spec.js +1 -1
  102. package/src/api/routes/tests/metadata.spec.js +1 -1
  103. package/src/api/routes/tests/misc.spec.js +1 -1
  104. package/src/api/routes/tests/permissions.spec.js +4 -1
  105. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
  106. package/src/api/routes/tests/role.spec.js +6 -1
  107. package/src/api/routes/tests/routing.spec.js +1 -1
  108. package/src/api/routes/tests/row.spec.js +11 -3
  109. package/src/api/routes/tests/screen.spec.js +1 -1
  110. package/src/api/routes/tests/static.spec.js +2 -13
  111. package/src/api/routes/tests/table.spec.js +1 -1
  112. package/src/api/routes/tests/templates.spec.js +1 -1
  113. package/src/api/routes/tests/user.spec.js +11 -12
  114. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -3
  115. package/src/api/routes/tests/utilities/index.ts +5 -3
  116. package/src/api/routes/tests/view.spec.js +4 -1
  117. package/src/api/routes/tests/webhook.spec.js +11 -2
  118. package/src/app.ts +12 -1
  119. package/src/automations/tests/automation.spec.js +4 -4
  120. package/src/automations/tests/bash.spec.js +1 -1
  121. package/src/automations/tests/discord.spec.js +1 -1
  122. package/src/automations/tests/executeQuery.spec.js +2 -3
  123. package/src/automations/tests/executeScript.spec.js +1 -1
  124. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  125. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  126. package/src/automations/tests/serverLog.spec.js +1 -1
  127. package/src/automations/tests/updateRow.spec.js +1 -1
  128. package/src/automations/tests/zapier.spec.js +1 -1
  129. package/src/constants/index.ts +1 -23
  130. package/src/db/defaultData/datasource_bb_default.ts +6 -10
  131. package/src/db/index.ts +2 -2
  132. package/src/db/linkedRows/LinkController.ts +2 -1
  133. package/src/db/tests/linkController.spec.js +4 -1
  134. package/src/db/tests/linkTests.spec.js +1 -1
  135. package/src/db/utils.ts +0 -4
  136. package/src/db/views/staticViews.ts +3 -3
  137. package/src/ddApm.ts +7 -0
  138. package/src/definitions/openapi.ts +449 -63
  139. package/src/elasticApm.ts +10 -0
  140. package/src/integration-test/postgres.spec.ts +1032 -0
  141. package/src/integrations/base/sql.ts +11 -5
  142. package/src/integrations/googlesheets.ts +21 -22
  143. package/src/integrations/oracle.ts +1 -1
  144. package/src/integrations/tests/couchdb.spec.ts +0 -2
  145. package/src/integrations/tests/googlesheets.spec.ts +122 -0
  146. package/src/middleware/authorized.ts +6 -4
  147. package/src/middleware/builder.ts +8 -3
  148. package/src/migrations/functions/backfill/global/configs.ts +15 -9
  149. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  150. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  151. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +4 -5
  152. package/src/migrations/tests/helpers.ts +2 -2
  153. package/src/migrations/tests/index.spec.ts +13 -20
  154. package/src/migrations/tests/structures.ts +1 -0
  155. package/src/sdk/app/backups/constants.ts +1 -0
  156. package/src/sdk/app/backups/exports.ts +32 -10
  157. package/src/sdk/app/datasources/datasources.ts +3 -0
  158. package/src/sdk/app/rows/attachments.ts +1 -1
  159. package/src/startup.ts +4 -1
  160. package/src/tests/jestEnv.ts +9 -11
  161. package/src/tests/jestSetup.ts +9 -7
  162. package/src/tests/logging.ts +34 -0
  163. package/src/tests/utilities/TestConfiguration.ts +187 -101
  164. package/src/tests/utilities/structures.ts +16 -4
  165. package/src/utilities/redis.ts +2 -0
  166. package/src/utilities/retry.ts +18 -0
  167. package/tsconfig.build.json +1 -0
  168. package/builder/assets/index.4488f38d.css +0 -6
  169. package/coverage/clover.xml +0 -11774
  170. package/coverage/coverage-final.json +0 -284
  171. package/coverage/lcov-report/base.css +0 -224
  172. package/coverage/lcov-report/block-navigation.js +0 -87
  173. package/coverage/lcov-report/favicon.png +0 -0
  174. package/coverage/lcov-report/index.html +0 -1031
  175. package/coverage/lcov-report/prettify.css +0 -1
  176. package/coverage/lcov-report/prettify.js +0 -2
  177. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  178. package/coverage/lcov-report/sorter.js +0 -196
  179. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +0 -190
  180. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +0 -247
  181. package/coverage/lcov-report/src/api/controllers/application.ts.html +0 -1987
  182. package/coverage/lcov-report/src/api/controllers/auth.ts.html +0 -301
  183. package/coverage/lcov-report/src/api/controllers/automation.ts.html +0 -940
  184. package/coverage/lcov-report/src/api/controllers/backup.ts.html +0 -148
  185. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +0 -442
  186. package/coverage/lcov-report/src/api/controllers/component.ts.html +0 -259
  187. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +0 -1135
  188. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +0 -262
  189. package/coverage/lcov-report/src/api/controllers/deploy/index.html +0 -131
  190. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +0 -694
  191. package/coverage/lcov-report/src/api/controllers/dev.ts.html +0 -472
  192. package/coverage/lcov-report/src/api/controllers/index.html +0 -431
  193. package/coverage/lcov-report/src/api/controllers/integration.ts.html +0 -124
  194. package/coverage/lcov-report/src/api/controllers/layout.ts.html +0 -226
  195. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +0 -211
  196. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +0 -127
  197. package/coverage/lcov-report/src/api/controllers/permission.ts.html +0 -619
  198. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +0 -130
  199. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +0 -310
  200. package/coverage/lcov-report/src/api/controllers/plugin/index.html +0 -206
  201. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +0 -499
  202. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +0 -253
  203. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +0 -97
  204. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +0 -121
  205. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +0 -136
  206. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +0 -385
  207. package/coverage/lcov-report/src/api/controllers/public/index.html +0 -191
  208. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +0 -181
  209. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +0 -191
  210. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +0 -124
  211. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +0 -202
  212. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +0 -178
  213. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +0 -163
  214. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +0 -181
  215. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +0 -145
  216. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +0 -328
  217. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +0 -253
  218. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +0 -325
  219. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +0 -220
  220. package/coverage/lcov-report/src/api/controllers/query/import/index.html +0 -116
  221. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +0 -373
  222. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +0 -131
  223. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +0 -379
  224. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +0 -157
  225. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +0 -403
  226. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +0 -146
  227. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +0 -586
  228. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +0 -712
  229. package/coverage/lcov-report/src/api/controllers/query/index.html +0 -131
  230. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +0 -1000
  231. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +0 -235
  232. package/coverage/lcov-report/src/api/controllers/role.ts.html +0 -397
  233. package/coverage/lcov-report/src/api/controllers/routing.ts.html +0 -370
  234. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +0 -2305
  235. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +0 -931
  236. package/coverage/lcov-report/src/api/controllers/row/index.html +0 -206
  237. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +0 -541
  238. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +0 -1609
  239. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +0 -1678
  240. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +0 -595
  241. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +0 -556
  242. package/coverage/lcov-report/src/api/controllers/screen.ts.html +0 -463
  243. package/coverage/lcov-report/src/api/controllers/script.ts.html +0 -121
  244. package/coverage/lcov-report/src/api/controllers/static/index.html +0 -116
  245. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +0 -679
  246. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +0 -649
  247. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +0 -1153
  248. package/coverage/lcov-report/src/api/controllers/table/index.html +0 -176
  249. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +0 -514
  250. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +0 -658
  251. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +0 -1273
  252. package/coverage/lcov-report/src/api/controllers/templates.ts.html +0 -214
  253. package/coverage/lcov-report/src/api/controllers/user.ts.html +0 -634
  254. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +0 -214
  255. package/coverage/lcov-report/src/api/controllers/view/index.html +0 -161
  256. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +0 -661
  257. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +0 -580
  258. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +0 -694
  259. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +0 -385
  260. package/coverage/lcov-report/src/api/index.html +0 -116
  261. package/coverage/lcov-report/src/api/index.ts.html +0 -352
  262. package/coverage/lcov-report/src/api/routes/analytics.ts.html +0 -112
  263. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +0 -121
  264. package/coverage/lcov-report/src/api/routes/application.ts.html +0 -256
  265. package/coverage/lcov-report/src/api/routes/auth.ts.html +0 -109
  266. package/coverage/lcov-report/src/api/routes/automation.ts.html +0 -346
  267. package/coverage/lcov-report/src/api/routes/backup.ts.html +0 -127
  268. package/coverage/lcov-report/src/api/routes/cloud.ts.html +0 -139
  269. package/coverage/lcov-report/src/api/routes/component.ts.html +0 -127
  270. package/coverage/lcov-report/src/api/routes/datasource.ts.html +0 -265
  271. package/coverage/lcov-report/src/api/routes/deploy.ts.html +0 -145
  272. package/coverage/lcov-report/src/api/routes/dev.ts.html +0 -199
  273. package/coverage/lcov-report/src/api/routes/index.html +0 -551
  274. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -298
  275. package/coverage/lcov-report/src/api/routes/integration.ts.html +0 -133
  276. package/coverage/lcov-report/src/api/routes/layout.ts.html +0 -133
  277. package/coverage/lcov-report/src/api/routes/metadata.ts.html +0 -199
  278. package/coverage/lcov-report/src/api/routes/migrations.ts.html +0 -127
  279. package/coverage/lcov-report/src/api/routes/permission.ts.html +0 -208
  280. package/coverage/lcov-report/src/api/routes/plugin.ts.html +0 -151
  281. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +0 -673
  282. package/coverage/lcov-report/src/api/routes/public/index.html +0 -191
  283. package/coverage/lcov-report/src/api/routes/public/index.ts.html +0 -493
  284. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +0 -116
  285. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +0 -340
  286. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +0 -313
  287. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +0 -598
  288. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +0 -586
  289. package/coverage/lcov-report/src/api/routes/public/tests/index.html +0 -116
  290. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +0 -169
  291. package/coverage/lcov-report/src/api/routes/public/users.ts.html +0 -511
  292. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +0 -238
  293. package/coverage/lcov-report/src/api/routes/public/utils/index.html +0 -116
  294. package/coverage/lcov-report/src/api/routes/query.ts.html +0 -268
  295. package/coverage/lcov-report/src/api/routes/role.ts.html +0 -157
  296. package/coverage/lcov-report/src/api/routes/routing.ts.html +0 -127
  297. package/coverage/lcov-report/src/api/routes/row.ts.html +0 -883
  298. package/coverage/lcov-report/src/api/routes/screen.ts.html +0 -154
  299. package/coverage/lcov-report/src/api/routes/script.ts.html +0 -115
  300. package/coverage/lcov-report/src/api/routes/static.ts.html +0 -280
  301. package/coverage/lcov-report/src/api/routes/table.ts.html +0 -595
  302. package/coverage/lcov-report/src/api/routes/templates.ts.html +0 -133
  303. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +0 -550
  304. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +0 -131
  305. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +0 -367
  306. package/coverage/lcov-report/src/api/routes/user.ts.html +0 -238
  307. package/coverage/lcov-report/src/api/routes/utils/index.html +0 -116
  308. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +0 -805
  309. package/coverage/lcov-report/src/api/routes/view.ts.html +0 -187
  310. package/coverage/lcov-report/src/api/routes/webhook.ts.html +0 -166
  311. package/coverage/lcov-report/src/app.ts.html +0 -424
  312. package/coverage/lcov-report/src/automations/actions.ts.html +0 -316
  313. package/coverage/lcov-report/src/automations/automationUtils.ts.html +0 -562
  314. package/coverage/lcov-report/src/automations/bullboard.ts.html +0 -199
  315. package/coverage/lcov-report/src/automations/index.html +0 -191
  316. package/coverage/lcov-report/src/automations/index.ts.html +0 -163
  317. package/coverage/lcov-report/src/automations/logging/index.html +0 -116
  318. package/coverage/lcov-report/src/automations/logging/index.ts.html +0 -199
  319. package/coverage/lcov-report/src/automations/steps/bash.ts.html +0 -319
  320. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +0 -382
  321. package/coverage/lcov-report/src/automations/steps/delay.ts.html +0 -217
  322. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +0 -349
  323. package/coverage/lcov-report/src/automations/steps/discord.ts.html +0 -397
  324. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +0 -370
  325. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +0 -325
  326. package/coverage/lcov-report/src/automations/steps/filter.ts.html +0 -394
  327. package/coverage/lcov-report/src/automations/steps/index.html +0 -371
  328. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +0 -409
  329. package/coverage/lcov-report/src/automations/steps/loop.ts.html +0 -241
  330. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +0 -499
  331. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +0 -664
  332. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +0 -355
  333. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +0 -256
  334. package/coverage/lcov-report/src/automations/steps/slack.ts.html +0 -340
  335. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +0 -439
  336. package/coverage/lcov-report/src/automations/steps/utils.ts.html +0 -223
  337. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +0 -403
  338. package/coverage/lcov-report/src/automations/tests/utilities/index.html +0 -116
  339. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +0 -265
  340. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +0 -196
  341. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +0 -193
  342. package/coverage/lcov-report/src/automations/triggerInfo/index.html +0 -206
  343. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +0 -130
  344. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +0 -196
  345. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +0 -220
  346. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +0 -220
  347. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +0 -208
  348. package/coverage/lcov-report/src/automations/triggers.ts.html +0 -553
  349. package/coverage/lcov-report/src/automations/utils.ts.html +0 -886
  350. package/coverage/lcov-report/src/constants/index.html +0 -146
  351. package/coverage/lcov-report/src/constants/index.ts.html +0 -697
  352. package/coverage/lcov-report/src/constants/layouts.ts.html +0 -526
  353. package/coverage/lcov-report/src/constants/screens.ts.html +0 -229
  354. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +0 -2059
  355. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +0 -541
  356. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +0 -427
  357. package/coverage/lcov-report/src/db/defaultData/index.html +0 -176
  358. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +0 -403
  359. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +0 -559
  360. package/coverage/lcov-report/src/db/dynamoClient.ts.html +0 -526
  361. package/coverage/lcov-report/src/db/inMemoryView.ts.html +0 -250
  362. package/coverage/lcov-report/src/db/index.html +0 -176
  363. package/coverage/lcov-report/src/db/index.ts.html +0 -133
  364. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +0 -1417
  365. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +0 -265
  366. package/coverage/lcov-report/src/db/linkedRows/index.html +0 -161
  367. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +0 -736
  368. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +0 -460
  369. package/coverage/lcov-report/src/db/newid.ts.html +0 -100
  370. package/coverage/lcov-report/src/db/utils.ts.html +0 -913
  371. package/coverage/lcov-report/src/definitions/automations.ts.html +0 -184
  372. package/coverage/lcov-report/src/definitions/index.html +0 -116
  373. package/coverage/lcov-report/src/environment.ts.html +0 -472
  374. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +0 -259
  375. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +0 -172
  376. package/coverage/lcov-report/src/events/index.html +0 -161
  377. package/coverage/lcov-report/src/events/index.ts.html +0 -100
  378. package/coverage/lcov-report/src/events/utils.ts.html +0 -319
  379. package/coverage/lcov-report/src/index.html +0 -191
  380. package/coverage/lcov-report/src/index.ts.html +0 -133
  381. package/coverage/lcov-report/src/integrations/airtable.ts.html +0 -529
  382. package/coverage/lcov-report/src/integrations/arangodb.ts.html +0 -415
  383. package/coverage/lcov-report/src/integrations/base/index.html +0 -161
  384. package/coverage/lcov-report/src/integrations/base/query.ts.html +0 -139
  385. package/coverage/lcov-report/src/integrations/base/sql.ts.html +0 -2017
  386. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +0 -691
  387. package/coverage/lcov-report/src/integrations/base/utils.ts.html +0 -121
  388. package/coverage/lcov-report/src/integrations/couchdb.ts.html +0 -484
  389. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +0 -745
  390. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +0 -646
  391. package/coverage/lcov-report/src/integrations/firebase.ts.html +0 -646
  392. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +0 -1315
  393. package/coverage/lcov-report/src/integrations/index.html +0 -371
  394. package/coverage/lcov-report/src/integrations/index.ts.html +0 -460
  395. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +0 -1012
  396. package/coverage/lcov-report/src/integrations/mongodb.ts.html +0 -1999
  397. package/coverage/lcov-report/src/integrations/mysql.ts.html +0 -979
  398. package/coverage/lcov-report/src/integrations/oracle.ts.html +0 -1387
  399. package/coverage/lcov-report/src/integrations/postgres.ts.html +0 -1087
  400. package/coverage/lcov-report/src/integrations/queries/index.html +0 -116
  401. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +0 -328
  402. package/coverage/lcov-report/src/integrations/redis.ts.html +0 -550
  403. package/coverage/lcov-report/src/integrations/rest.ts.html +0 -1372
  404. package/coverage/lcov-report/src/integrations/s3.ts.html +0 -862
  405. package/coverage/lcov-report/src/integrations/snowflake.ts.html +0 -376
  406. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +0 -85
  407. package/coverage/lcov-report/src/integrations/tests/index.html +0 -116
  408. package/coverage/lcov-report/src/integrations/utils.ts.html +0 -1036
  409. package/coverage/lcov-report/src/middleware/appInfo.ts.html +0 -145
  410. package/coverage/lcov-report/src/middleware/authorized.ts.html +0 -472
  411. package/coverage/lcov-report/src/middleware/builder.ts.html +0 -361
  412. package/coverage/lcov-report/src/middleware/currentapp.ts.html +0 -508
  413. package/coverage/lcov-report/src/middleware/index.html +0 -236
  414. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +0 -205
  415. package/coverage/lcov-report/src/middleware/publicApi.ts.html +0 -148
  416. package/coverage/lcov-report/src/middleware/resourceId.ts.html +0 -283
  417. package/coverage/lcov-report/src/middleware/selfhost.ts.html +0 -121
  418. package/coverage/lcov-report/src/middleware/utils.ts.html +0 -112
  419. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +0 -166
  420. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +0 -163
  421. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +0 -151
  422. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +0 -206
  423. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +0 -172
  424. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +0 -226
  425. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +0 -151
  426. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +0 -151
  427. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +0 -166
  428. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +0 -532
  429. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +0 -286
  430. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +0 -146
  431. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +0 -265
  432. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +0 -232
  433. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +0 -724
  434. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +0 -161
  435. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +0 -106
  436. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +0 -235
  437. package/coverage/lcov-report/src/migrations/functions/index.html +0 -161
  438. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +0 -130
  439. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +0 -520
  440. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +0 -161
  441. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +0 -94
  442. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +0 -127
  443. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +0 -115
  444. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +0 -169
  445. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +0 -124
  446. package/coverage/lcov-report/src/migrations/index.html +0 -116
  447. package/coverage/lcov-report/src/migrations/index.ts.html +0 -430
  448. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +0 -205
  449. package/coverage/lcov-report/src/migrations/tests/index.html +0 -131
  450. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +0 -283
  451. package/coverage/lcov-report/src/sdk/app/applications/index.html +0 -146
  452. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +0 -106
  453. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +0 -268
  454. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +0 -136
  455. package/coverage/lcov-report/src/sdk/app/automations/index.html +0 -131
  456. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +0 -100
  457. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +0 -214
  458. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +0 -91
  459. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +0 -604
  460. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +0 -640
  461. package/coverage/lcov-report/src/sdk/app/backups/index.html +0 -176
  462. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +0 -112
  463. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +0 -292
  464. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +0 -562
  465. package/coverage/lcov-report/src/sdk/app/datasources/index.html +0 -131
  466. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +0 -100
  467. package/coverage/lcov-report/src/sdk/app/queries/index.html +0 -131
  468. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +0 -100
  469. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +0 -235
  470. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +0 -265
  471. package/coverage/lcov-report/src/sdk/app/rows/index.html +0 -146
  472. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +0 -106
  473. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +0 -139
  474. package/coverage/lcov-report/src/sdk/app/tables/index.html +0 -116
  475. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +0 -274
  476. package/coverage/lcov-report/src/sdk/index.html +0 -116
  477. package/coverage/lcov-report/src/sdk/index.ts.html +0 -151
  478. package/coverage/lcov-report/src/sdk/users/index.html +0 -131
  479. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -100
  480. package/coverage/lcov-report/src/sdk/users/utils.ts.html +0 -277
  481. package/coverage/lcov-report/src/sdk/utils/index.html +0 -116
  482. package/coverage/lcov-report/src/sdk/utils/index.ts.html +0 -133
  483. package/coverage/lcov-report/src/startup.ts.html +0 -484
  484. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +0 -2032
  485. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +0 -127
  486. package/coverage/lcov-report/src/tests/utilities/index.html +0 -161
  487. package/coverage/lcov-report/src/tests/utilities/index.ts.html +0 -118
  488. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +0 -856
  489. package/coverage/lcov-report/src/threads/automation.ts.html +0 -1555
  490. package/coverage/lcov-report/src/threads/index.html +0 -161
  491. package/coverage/lcov-report/src/threads/index.ts.html +0 -418
  492. package/coverage/lcov-report/src/threads/query.ts.html +0 -1000
  493. package/coverage/lcov-report/src/threads/utils.ts.html +0 -373
  494. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +0 -94
  495. package/coverage/lcov-report/src/utilities/centralPath.ts.html +0 -151
  496. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +0 -343
  497. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +0 -547
  498. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +0 -601
  499. package/coverage/lcov-report/src/utilities/fileSystem/index.html +0 -206
  500. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +0 -100
  501. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +0 -277
  502. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +0 -142
  503. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +0 -193
  504. package/coverage/lcov-report/src/utilities/global.ts.html +0 -499
  505. package/coverage/lcov-report/src/utilities/index.html +0 -251
  506. package/coverage/lcov-report/src/utilities/index.ts.html +0 -487
  507. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -343
  508. package/coverage/lcov-report/src/utilities/routing/index.html +0 -116
  509. package/coverage/lcov-report/src/utilities/routing/index.ts.html +0 -181
  510. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +0 -146
  511. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +0 -922
  512. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +0 -373
  513. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +0 -373
  514. package/coverage/lcov-report/src/utilities/schema.ts.html +0 -508
  515. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +0 -169
  516. package/coverage/lcov-report/src/utilities/security.ts.html +0 -280
  517. package/coverage/lcov-report/src/utilities/usageQuota/index.html +0 -131
  518. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +0 -325
  519. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +0 -139
  520. package/coverage/lcov-report/src/utilities/users.ts.html +0 -232
  521. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +0 -646
  522. package/coverage/lcov-report/src/watch.ts.html +0 -196
  523. package/coverage/lcov-report/src/websocket.ts.html +0 -163
  524. package/coverage/lcov.info +0 -21777
  525. package/dist/api/routes/public/tests/utils.js +0 -33
  526. package/dist/integrations/base/utils.js +0 -16
  527. package/specs/resources/utils/Resource.js +0 -26
  528. package/src/integrations/base/utils.ts +0 -12
@@ -6,11 +6,11 @@ import {
6
6
  SearchFilters,
7
7
  SortDirection,
8
8
  } from "@budibase/types"
9
+ import { db as dbCore } from "@budibase/backend-core"
9
10
  import { QueryOptions } from "../../definitions/datasource"
10
11
  import { isIsoDateString, SqlClient } from "../utils"
11
12
  import SqlTableQueryBuilder from "./sqlTable"
12
13
  import environment from "../../environment"
13
- import { removeKeyNumbering } from "./utils"
14
14
 
15
15
  const envLimit = environment.SQL_MAX_ROWS
16
16
  ? parseInt(environment.SQL_MAX_ROWS)
@@ -90,10 +90,15 @@ function parseFilters(filters: SearchFilters | undefined): SearchFilters {
90
90
  function generateSelectStatement(
91
91
  json: QueryJson,
92
92
  knex: Knex
93
- ): (string | Knex.Raw)[] {
93
+ ): (string | Knex.Raw)[] | "*" {
94
94
  const { resource, meta } = json
95
+
96
+ if (!resource) {
97
+ return "*"
98
+ }
99
+
95
100
  const schema = meta?.table?.schema
96
- return resource!.fields.map(field => {
101
+ return resource.fields.map(field => {
97
102
  const fieldNames = field.split(/\./g)
98
103
  const tableName = fieldNames[0]
99
104
  const columnName = fieldNames[1]
@@ -131,7 +136,7 @@ class InternalBuilder {
131
136
  fn: (key: string, value: any) => void
132
137
  ) {
133
138
  for (let [key, value] of Object.entries(structure)) {
134
- const updatedKey = removeKeyNumbering(key)
139
+ const updatedKey = dbCore.removeKeyNumbering(key)
135
140
  const isRelationshipField = updatedKey.includes(".")
136
141
  if (!opts.relationship && !isRelationshipField) {
137
142
  fn(`${opts.tableName}.${updatedKey}`, value)
@@ -405,6 +410,7 @@ class InternalBuilder {
405
410
  delete parsedBody[key]
406
411
  }
407
412
  }
413
+
408
414
  // mysql can't use returning
409
415
  if (opts.disableReturning) {
410
416
  return query.insert(parsedBody)
@@ -509,7 +515,7 @@ class InternalBuilder {
509
515
  if (opts.disableReturning) {
510
516
  return query.delete()
511
517
  } else {
512
- return query.delete().returning("*")
518
+ return query.delete().returning(generateSelectStatement(json, knex))
513
519
  }
514
520
  }
515
521
  }
@@ -11,9 +11,8 @@ import { OAuth2Client } from "google-auth-library"
11
11
  import { buildExternalTableId } from "./utils"
12
12
  import { DataSourceOperation, FieldTypes } from "../constants"
13
13
  import { GoogleSpreadsheet } from "google-spreadsheet"
14
- import env from "../environment"
15
- import { tenancy, db as dbCore, constants } from "@budibase/backend-core"
16
- const fetch = require("node-fetch")
14
+ import fetch from "node-fetch"
15
+ import { configs, HTTPError } from "@budibase/backend-core"
17
16
 
18
17
  interface GoogleSheetsConfig {
19
18
  spreadsheetId: string
@@ -112,7 +111,7 @@ const SCHEMA: Integration = {
112
111
 
113
112
  class GoogleSheetsIntegration implements DatasourcePlus {
114
113
  private readonly config: GoogleSheetsConfig
115
- private client: any
114
+ private client: GoogleSpreadsheet
116
115
  public tables: Record<string, Table> = {}
117
116
  public schemaErrors: Record<string, string> = {}
118
117
 
@@ -173,16 +172,9 @@ class GoogleSheetsIntegration implements DatasourcePlus {
173
172
  async connect() {
174
173
  try {
175
174
  // Initialise oAuth client
176
- const db = tenancy.getGlobalDB()
177
- let googleConfig = await dbCore.getScopedConfig(db, {
178
- type: constants.Config.GOOGLE,
179
- })
180
-
175
+ let googleConfig = await configs.getGoogleDatasourceConfig()
181
176
  if (!googleConfig) {
182
- googleConfig = {
183
- clientID: env.GOOGLE_CLIENT_ID,
184
- clientSecret: env.GOOGLE_CLIENT_SECRET,
185
- }
177
+ throw new HTTPError("Google config not found", 400)
186
178
  }
187
179
 
188
180
  const oauthClient = new OAuth2Client({
@@ -211,7 +203,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
211
203
 
212
204
  async buildSchema(datasourceId: string) {
213
205
  await this.connect()
214
- const sheets = await this.client.sheetsByIndex
206
+ const sheets = this.client.sheetsByIndex
215
207
  const tables: Record<string, Table> = {}
216
208
  for (let sheet of sheets) {
217
209
  // must fetch rows to determine schema
@@ -294,7 +286,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
294
286
  async updateTable(table?: any) {
295
287
  try {
296
288
  await this.connect()
297
- const sheet = await this.client.sheetsByTitle[table.name]
289
+ const sheet = this.client.sheetsByTitle[table.name]
298
290
  await sheet.loadHeaderRow()
299
291
 
300
292
  if (table._rename) {
@@ -308,10 +300,17 @@ class GoogleSheetsIntegration implements DatasourcePlus {
308
300
  }
309
301
  await sheet.setHeaderRow(headers)
310
302
  } else {
311
- let newField = Object.keys(table.schema).find(
303
+ const updatedHeaderValues = [...sheet.headerValues]
304
+
305
+ const newField = Object.keys(table.schema).find(
312
306
  key => !sheet.headerValues.includes(key)
313
307
  )
314
- await sheet.setHeaderRow([...sheet.headerValues, newField])
308
+
309
+ if (newField) {
310
+ updatedHeaderValues.push(newField)
311
+ }
312
+
313
+ await sheet.setHeaderRow(updatedHeaderValues)
315
314
  }
316
315
  } catch (err) {
317
316
  console.error("Error updating table in google sheets", err)
@@ -322,7 +321,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
322
321
  async deleteTable(sheet: any) {
323
322
  try {
324
323
  await this.connect()
325
- const sheetToDelete = await this.client.sheetsByTitle[sheet]
324
+ const sheetToDelete = this.client.sheetsByTitle[sheet]
326
325
  return await sheetToDelete.delete()
327
326
  } catch (err) {
328
327
  console.error("Error deleting table in google sheets", err)
@@ -333,7 +332,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
333
332
  async create(query: { sheet: string; row: any }) {
334
333
  try {
335
334
  await this.connect()
336
- const sheet = await this.client.sheetsByTitle[query.sheet]
335
+ const sheet = this.client.sheetsByTitle[query.sheet]
337
336
  const rowToInsert =
338
337
  typeof query.row === "string" ? JSON.parse(query.row) : query.row
339
338
  const row = await sheet.addRow(rowToInsert)
@@ -349,7 +348,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
349
348
  async read(query: { sheet: string }) {
350
349
  try {
351
350
  await this.connect()
352
- const sheet = await this.client.sheetsByTitle[query.sheet]
351
+ const sheet = this.client.sheetsByTitle[query.sheet]
353
352
  const rows = await sheet.getRows()
354
353
  const headerValues = sheet.headerValues
355
354
  const response = []
@@ -368,7 +367,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
368
367
  async update(query: { sheet: string; rowIndex: number; row: any }) {
369
368
  try {
370
369
  await this.connect()
371
- const sheet = await this.client.sheetsByTitle[query.sheet]
370
+ const sheet = this.client.sheetsByTitle[query.sheet]
372
371
  const rows = await sheet.getRows()
373
372
  const row = rows[query.rowIndex]
374
373
  if (row) {
@@ -392,7 +391,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
392
391
 
393
392
  async delete(query: { sheet: string; rowIndex: number }) {
394
393
  await this.connect()
395
- const sheet = await this.client.sheetsByTitle[query.sheet]
394
+ const sheet = this.client.sheetsByTitle[query.sheet]
396
395
  const rows = await sheet.getRows()
397
396
  const row = rows[query.rowIndex]
398
397
  if (row) {
@@ -247,7 +247,7 @@ class OracleIntegration extends Sql implements DatasourcePlus {
247
247
  )
248
248
  }
249
249
 
250
- private internalConvertType(column: OracleColumn): { type: string } {
250
+ private internalConvertType(column: OracleColumn): { type: FieldTypes } {
251
251
  if (this.isBooleanType(column)) {
252
252
  return { type: FieldTypes.BOOLEAN }
253
253
  }
@@ -1,5 +1,3 @@
1
- import { DatabaseWithConnection } from "@budibase/backend-core/src/db"
2
-
3
1
  jest.mock("@budibase/backend-core", () => {
4
2
  const core = jest.requireActual("@budibase/backend-core")
5
3
  return {
@@ -0,0 +1,122 @@
1
+ import type { GoogleSpreadsheetWorksheet } from "google-spreadsheet"
2
+
3
+ jest.mock("google-auth-library")
4
+ const { OAuth2Client } = require("google-auth-library")
5
+
6
+ const setCredentialsMock = jest.fn()
7
+ const getAccessTokenMock = jest.fn()
8
+
9
+ OAuth2Client.mockImplementation(() => {
10
+ return {
11
+ setCredentials: setCredentialsMock,
12
+ getAccessToken: getAccessTokenMock,
13
+ }
14
+ })
15
+
16
+ jest.mock("google-spreadsheet")
17
+ const { GoogleSpreadsheet } = require("google-spreadsheet")
18
+
19
+ const sheetsByTitle: { [title: string]: GoogleSpreadsheetWorksheet } = {}
20
+
21
+ GoogleSpreadsheet.mockImplementation(() => {
22
+ return {
23
+ useOAuth2Client: jest.fn(),
24
+ loadInfo: jest.fn(),
25
+ sheetsByTitle,
26
+ }
27
+ })
28
+
29
+ import { structures } from "@budibase/backend-core/tests"
30
+ import TestConfiguration from "../../tests/utilities/TestConfiguration"
31
+ import GoogleSheetsIntegration from "../googlesheets"
32
+ import { FieldType, Table, TableSchema } from "../../../../types/src/documents"
33
+
34
+ describe("Google Sheets Integration", () => {
35
+ let integration: any,
36
+ config = new TestConfiguration()
37
+
38
+ beforeEach(async () => {
39
+ integration = new GoogleSheetsIntegration.integration({
40
+ spreadsheetId: "randomId",
41
+ auth: {
42
+ appId: "appId",
43
+ accessToken: "accessToken",
44
+ refreshToken: "refreshToken",
45
+ },
46
+ })
47
+ await config.init()
48
+ })
49
+
50
+ function createBasicTable(name: string, columns: string[]): Table {
51
+ return {
52
+ name,
53
+ schema: {
54
+ ...columns.reduce((p, c) => {
55
+ p[c] = {
56
+ name: c,
57
+ type: FieldType.STRING,
58
+ constraints: {
59
+ type: "string",
60
+ },
61
+ }
62
+ return p
63
+ }, {} as TableSchema),
64
+ },
65
+ }
66
+ }
67
+
68
+ function createSheet({
69
+ headerValues,
70
+ }: {
71
+ headerValues: string[]
72
+ }): GoogleSpreadsheetWorksheet {
73
+ return {
74
+ // to ignore the unmapped fields
75
+ ...({} as any),
76
+ loadHeaderRow: jest.fn(),
77
+ headerValues,
78
+ setHeaderRow: jest.fn(),
79
+ }
80
+ }
81
+
82
+ describe("update table", () => {
83
+ test("adding a new field will be adding a new header row", async () => {
84
+ await config.doInContext(structures.uuid(), async () => {
85
+ const tableColumns = ["name", "description", "new field"]
86
+ const table = createBasicTable(structures.uuid(), tableColumns)
87
+
88
+ const sheet = createSheet({ headerValues: ["name", "description"] })
89
+ sheetsByTitle[table.name] = sheet
90
+ await integration.updateTable(table)
91
+
92
+ expect(sheet.loadHeaderRow).toBeCalledTimes(1)
93
+ expect(sheet.setHeaderRow).toBeCalledTimes(1)
94
+ expect(sheet.setHeaderRow).toBeCalledWith(tableColumns)
95
+ })
96
+ })
97
+
98
+ test("removing an existing field will not remove the data from the spreadsheet", async () => {
99
+ await config.doInContext(structures.uuid(), async () => {
100
+ const tableColumns = ["name"]
101
+ const table = createBasicTable(structures.uuid(), tableColumns)
102
+
103
+ const sheet = createSheet({
104
+ headerValues: ["name", "description", "location"],
105
+ })
106
+ sheetsByTitle[table.name] = sheet
107
+ await integration.updateTable(table)
108
+
109
+ expect(sheet.loadHeaderRow).toBeCalledTimes(1)
110
+ expect(sheet.setHeaderRow).toBeCalledTimes(1)
111
+ expect(sheet.setHeaderRow).toBeCalledWith([
112
+ "name",
113
+ "description",
114
+ "location",
115
+ ])
116
+
117
+ // No undefineds are sent
118
+ expect((sheet.setHeaderRow as any).mock.calls[0][0]).toHaveLength(3)
119
+ })
120
+ })
121
+ })
122
+ })
@@ -79,10 +79,6 @@ export default (
79
79
  return ctx.throw(403, "No user info found")
80
80
  }
81
81
 
82
- // check general builder stuff, this middleware is a good way
83
- // to find API endpoints which are builder focused
84
- await builderMiddleware(ctx, permType)
85
-
86
82
  // get the resource roles
87
83
  let resourceRoles: any = []
88
84
  let otherLevelRoles: any = []
@@ -112,6 +108,12 @@ export default (
112
108
  return ctx.throw(403, "Session not authenticated")
113
109
  }
114
110
 
111
+ // check general builder stuff, this middleware is a good way
112
+ // to find API endpoints which are builder focused
113
+ if (permType === permissions.PermissionType.BUILDER) {
114
+ await builderMiddleware(ctx)
115
+ }
116
+
115
117
  try {
116
118
  // check authorized
117
119
  await checkAuthorized(ctx, resourceRoles, permType, permLevel)
@@ -64,13 +64,18 @@ async function updateAppUpdatedAt(ctx: BBContext) {
64
64
  })
65
65
  }
66
66
 
67
- export default async function builder(ctx: BBContext, permType: string) {
67
+ export default async function builder(ctx: BBContext) {
68
68
  const appId = ctx.appId
69
69
  // this only functions within an app context
70
70
  if (!appId) {
71
71
  return
72
72
  }
73
- const isBuilderApi = permType === permissions.PermissionType.BUILDER
73
+
74
+ // check authenticated
75
+ if (!ctx.isAuthenticated) {
76
+ return ctx.throw(403, "Session not authenticated")
77
+ }
78
+
74
79
  const referer = ctx.headers["referer"]
75
80
 
76
81
  const overviewPath = "/builder/portal/overview/"
@@ -82,7 +87,7 @@ export default async function builder(ctx: BBContext, permType: string) {
82
87
  const hasAppId = !referer ? false : referer.includes(appId)
83
88
  const editingApp = referer ? hasAppId : false
84
89
  // check this is a builder call and editing
85
- if (!isBuilderApi || !editingApp) {
90
+ if (!editingApp) {
86
91
  return
87
92
  }
88
93
  // check locks
@@ -1,4 +1,9 @@
1
- import { events, db as dbUtils } from "@budibase/backend-core"
1
+ import {
2
+ events,
3
+ DocumentType,
4
+ SEPARATOR,
5
+ UNICODE_MAX,
6
+ } from "@budibase/backend-core"
2
7
  import {
3
8
  Config,
4
9
  isSMTPConfig,
@@ -9,15 +14,16 @@ import {
9
14
  } from "@budibase/types"
10
15
  import env from "./../../../../environment"
11
16
 
17
+ export const getConfigParams = () => {
18
+ return {
19
+ include_docs: true,
20
+ startkey: `${DocumentType.CONFIG}${SEPARATOR}`,
21
+ endkey: `${DocumentType.CONFIG}${SEPARATOR}${UNICODE_MAX}`,
22
+ }
23
+ }
24
+
12
25
  const getConfigs = async (globalDb: any): Promise<Config[]> => {
13
- const response = await globalDb.allDocs(
14
- dbUtils.getConfigParams(
15
- {},
16
- {
17
- include_docs: true,
18
- }
19
- )
20
- )
26
+ const response = await globalDb.allDocs(getConfigParams())
21
27
  return response.rows.map((row: any) => row.doc)
22
28
  }
23
29
 
@@ -6,7 +6,7 @@ const migration = require("../appUrls")
6
6
  describe("run", () => {
7
7
  let config = new TestConfig(false)
8
8
 
9
- beforeEach(async () => {
9
+ beforeAll(async () => {
10
10
  await config.init()
11
11
  })
12
12
 
@@ -11,7 +11,7 @@ const migration = require("../syncQuotas")
11
11
  describe("run", () => {
12
12
  let config = new TestConfig(false)
13
13
 
14
- beforeEach(async () => {
14
+ beforeAll(async () => {
15
15
  await config.init()
16
16
  })
17
17
 
@@ -8,9 +8,8 @@ jest.mock("@budibase/backend-core", () => {
8
8
  }
9
9
  }
10
10
  })
11
- const { tenancy, db: dbCore } = require("@budibase/backend-core")
11
+ const { context, db: dbCore } = require("@budibase/backend-core")
12
12
  const TestConfig = require("../../../tests/utilities/TestConfiguration")
13
- const { TENANT_ID } = require("../../../tests/utilities/structures")
14
13
 
15
14
  // mock email view creation
16
15
 
@@ -19,15 +18,15 @@ const migration = require("../userEmailViewCasing")
19
18
  describe("run", () => {
20
19
  let config = new TestConfig(false)
21
20
 
22
- beforeEach(async () => {
21
+ beforeAll(async () => {
23
22
  await config.init()
24
23
  })
25
24
 
26
25
  afterAll(config.end)
27
26
 
28
27
  it("runs successfully", async () => {
29
- await tenancy.doInTenant(TENANT_ID, async () => {
30
- const globalDb = tenancy.getGlobalDB()
28
+ await config.doInTenant(async () => {
29
+ const globalDb = context.getGlobalDB()
31
30
  await migration.run(globalDb)
32
31
  expect(dbCore.createNewUserEmailView).toHaveBeenCalledTimes(1)
33
32
  })
@@ -1,7 +1,7 @@
1
1
  // Mimic configs test configuration from worker, creation configs directly in database
2
2
 
3
3
  import * as structures from "./structures"
4
- import { db } from "@budibase/backend-core"
4
+ import { configs } from "@budibase/backend-core"
5
5
  import { Config } from "@budibase/types"
6
6
 
7
7
  export const saveSettingsConfig = async (globalDb: any) => {
@@ -25,7 +25,7 @@ export const saveSmtpConfig = async (globalDb: any) => {
25
25
  }
26
26
 
27
27
  const saveConfig = async (config: Config, globalDb: any) => {
28
- config._id = db.generateConfigID({ type: config.type })
28
+ config._id = configs.generateConfigID(config.type)
29
29
 
30
30
  let response
31
31
  try {
@@ -10,8 +10,9 @@ import * as structures from "../../tests/utilities/structures"
10
10
  import { MIGRATIONS } from "../"
11
11
  import * as helpers from "./helpers"
12
12
 
13
- const { mocks } = require("@budibase/backend-core/tests")
14
- const timestamp = mocks.date.MOCK_DATE.toISOString()
13
+ import tk from "timekeeper"
14
+ const timestamp = new Date().toISOString()
15
+ tk.freeze(timestamp)
15
16
 
16
17
  const clearMigrations = async () => {
17
18
  const dbs = [context.getDevAppDB(), context.getProdAppDB()]
@@ -92,24 +93,16 @@ describe("migrations", () => {
92
93
  await clearMigrations()
93
94
  const appId = config.prodAppId
94
95
  const roles = { [appId]: "role_12345" }
95
- await config.createUser(
96
- undefined,
97
- undefined,
98
- undefined,
99
- undefined,
100
- false,
101
- true,
102
- roles
103
- ) // admin only
104
- await config.createUser(
105
- undefined,
106
- undefined,
107
- undefined,
108
- undefined,
109
- false,
110
- false,
111
- roles
112
- ) // non admin non builder
96
+ await config.createUser({
97
+ builder: false,
98
+ admin: true,
99
+ roles,
100
+ }) // admin only
101
+ await config.createUser({
102
+ builder: false,
103
+ admin: false,
104
+ roles,
105
+ }) // non admin non builder
113
106
  await config.createTable()
114
107
  await config.createRow()
115
108
  await config.createRow()
@@ -20,6 +20,7 @@ export const oidc = (conf?: OIDCConfig): OIDCConfig => {
20
20
  name: "Active Directory",
21
21
  uuid: utils.newid(),
22
22
  activated: true,
23
+ scopes: [],
23
24
  ...conf,
24
25
  },
25
26
  ],
@@ -1,2 +1,3 @@
1
1
  export const DB_EXPORT_FILE = "db.txt"
2
2
  export const GLOBAL_DB_EXPORT_FILE = "global.txt"
3
+ export const STATIC_APP_FILES = ["manifest.json", "budibase-client.js"]
@@ -7,10 +7,15 @@ import {
7
7
  TABLE_ROW_PREFIX,
8
8
  USER_METDATA_PREFIX,
9
9
  } from "../../../db/utils"
10
- import { DB_EXPORT_FILE, GLOBAL_DB_EXPORT_FILE } from "./constants"
10
+ import {
11
+ DB_EXPORT_FILE,
12
+ GLOBAL_DB_EXPORT_FILE,
13
+ STATIC_APP_FILES,
14
+ } from "./constants"
11
15
  import fs from "fs"
12
16
  import { join } from "path"
13
17
  import env from "../../../environment"
18
+
14
19
  const uuid = require("uuid/v4")
15
20
  const tar = require("tar")
16
21
  const MemoryStream = require("memorystream")
@@ -45,12 +50,18 @@ function tarFilesToTmp(tmpDir: string, files: string[]) {
45
50
  * @return {*} either a readable stream or a string
46
51
  */
47
52
  export async function exportDB(dbName: string, opts: ExportOpts = {}) {
53
+ const exportOpts = {
54
+ filter: opts?.filter,
55
+ batch_size: 1000,
56
+ batch_limit: 5,
57
+ style: "main_only",
58
+ }
48
59
  return dbCore.doWithDB(dbName, async (db: any) => {
49
60
  // Write the dump to file if required
50
61
  if (opts?.exportPath) {
51
62
  const path = opts?.exportPath
52
63
  const writeStream = fs.createWriteStream(path)
53
- await db.dump(writeStream, { filter: opts?.filter })
64
+ await db.dump(writeStream, exportOpts)
54
65
  return path
55
66
  } else {
56
67
  // Stringify the dump in memory if required
@@ -59,7 +70,7 @@ export async function exportDB(dbName: string, opts: ExportOpts = {}) {
59
70
  memStream.on("data", (chunk: any) => {
60
71
  appString += chunk.toString()
61
72
  })
62
- await db.dump(memStream, { filter: opts?.filter })
73
+ await db.dump(memStream, exportOpts)
63
74
  return appString
64
75
  }
65
76
  })
@@ -85,14 +96,25 @@ export async function exportApp(appId: string, config?: ExportOpts) {
85
96
  const prodAppId = dbCore.getProdAppID(appId)
86
97
  const appPath = `${prodAppId}/`
87
98
  // export bucket contents
88
- let tmpPath
99
+ let tmpPath = createTempFolder(uuid())
89
100
  if (!env.isTest()) {
90
- tmpPath = await objectStore.retrieveDirectory(
91
- ObjectStoreBuckets.APPS,
92
- appPath
93
- )
94
- } else {
95
- tmpPath = createTempFolder(uuid())
101
+ // write just the static files
102
+ if (config?.excludeRows) {
103
+ for (let path of STATIC_APP_FILES) {
104
+ const contents = await objectStore.retrieve(
105
+ ObjectStoreBuckets.APPS,
106
+ join(appPath, path)
107
+ )
108
+ fs.writeFileSync(join(tmpPath, path), contents)
109
+ }
110
+ }
111
+ // get all of the files
112
+ else {
113
+ tmpPath = await objectStore.retrieveDirectory(
114
+ ObjectStoreBuckets.APPS,
115
+ appPath
116
+ )
117
+ }
96
118
  }
97
119
  const downloadedPath = join(tmpPath, appPath)
98
120
  if (fs.existsSync(downloadedPath)) {
@@ -88,6 +88,9 @@ export async function removeSecrets(datasources: Datasource[]) {
88
88
  const definitions = await getDefinitions()
89
89
  for (let datasource of datasources) {
90
90
  const schema = definitions[datasource.source]
91
+ if (!schema) {
92
+ continue
93
+ }
91
94
  if (datasource.config) {
92
95
  // strip secrets from response, so they don't show in the network request
93
96
  if (datasource.config.auth) {
@@ -13,13 +13,13 @@ function generateAttachmentFindParams(
13
13
  ) {
14
14
  const params: CouchFindOptions = {
15
15
  selector: {
16
+ $or: attachmentCols.map(col => ({ [col]: { $exists: true } })),
16
17
  _id: {
17
18
  $regex: `^${DocumentType.ROW}${SEPARATOR}${tableId}`,
18
19
  },
19
20
  },
20
21
  limit: FIND_LIMIT,
21
22
  }
22
- attachmentCols.forEach(col => (params.selector[col] = { $exists: true }))
23
23
  if (bookmark) {
24
24
  params.bookmark = bookmark
25
25
  }
package/src/startup.ts CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  generateApiKey,
6
6
  getChecklist,
7
7
  } from "./utilities/workerRequests"
8
- import { installation, tenancy, logging } from "@budibase/backend-core"
8
+ import { installation, tenancy, logging, events } from "@budibase/backend-core"
9
9
  import fs from "fs"
10
10
  import { watch } from "./watch"
11
11
  import * as automations from "./automations"
@@ -124,6 +124,9 @@ export async function startup(app?: any, server?: any) {
124
124
  // get the references to the queue promises, don't await as
125
125
  // they will never end, unless the processing stops
126
126
  let queuePromises = []
127
+ // configure events to use the pro audit log write
128
+ // can't integrate directly into backend-core due to cyclic issues
129
+ queuePromises.push(events.processors.init(pro.sdk.auditLogs.write))
127
130
  queuePromises.push(automations.init())
128
131
  queuePromises.push(initPro())
129
132
  if (app) {