@budibase/server 2.1.46-alpha.12 → 2.1.46-alpha.14

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 (393) hide show
  1. package/__mocks__/aws-sdk.ts +19 -0
  2. package/builder/assets/{index.50dfbb5d.js → index.d0383787.js} +194 -194
  3. package/builder/index.html +1 -1
  4. package/coverage/clover.xml +1404 -1399
  5. package/coverage/coverage-final.json +26 -23
  6. package/coverage/lcov-report/index.html +68 -68
  7. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +1 -1
  8. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +1 -1
  9. package/coverage/lcov-report/src/api/controllers/application.ts.html +33 -21
  10. package/coverage/lcov-report/src/api/controllers/auth.ts.html +3 -3
  11. package/coverage/lcov-report/src/api/controllers/automation.ts.html +1 -1
  12. package/coverage/lcov-report/src/api/controllers/backup.ts.html +1 -1
  13. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +27 -15
  14. package/coverage/lcov-report/src/api/controllers/component.ts.html +1 -1
  15. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +1 -1
  16. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +1 -1
  17. package/coverage/lcov-report/src/api/controllers/deploy/index.html +1 -1
  18. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +1 -1
  19. package/coverage/lcov-report/src/api/controllers/dev.ts.html +1 -1
  20. package/coverage/lcov-report/src/api/controllers/index.html +17 -17
  21. package/coverage/lcov-report/src/api/controllers/integration.ts.html +1 -1
  22. package/coverage/lcov-report/src/api/controllers/layout.ts.html +1 -1
  23. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +1 -1
  24. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +1 -1
  25. package/coverage/lcov-report/src/api/controllers/permission.ts.html +1 -1
  26. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +1 -1
  27. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +1 -1
  28. package/coverage/lcov-report/src/api/controllers/plugin/index.html +1 -1
  29. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +27 -12
  30. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +1 -1
  31. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +1 -1
  32. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +1 -1
  33. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +1 -1
  34. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +1 -1
  35. package/coverage/lcov-report/src/api/controllers/public/index.html +1 -1
  36. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +1 -1
  37. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +1 -1
  38. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +1 -1
  39. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +1 -1
  40. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +1 -1
  41. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +1 -1
  42. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +1 -1
  43. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +1 -1
  44. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +1 -1
  45. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +1 -1
  46. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +1 -1
  47. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +1 -1
  48. package/coverage/lcov-report/src/api/controllers/query/import/index.html +1 -1
  49. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +1 -1
  50. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +1 -1
  51. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +1 -1
  52. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +1 -1
  53. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +1 -1
  54. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +1 -1
  55. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +1 -1
  56. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +1 -1
  57. package/coverage/lcov-report/src/api/controllers/query/index.html +1 -1
  58. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +1 -1
  59. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +1 -1
  60. package/coverage/lcov-report/src/api/controllers/role.ts.html +1 -1
  61. package/coverage/lcov-report/src/api/controllers/routing.ts.html +1 -1
  62. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +2 -5
  63. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +1 -1
  64. package/coverage/lcov-report/src/api/controllers/row/index.html +1 -1
  65. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +1 -1
  66. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +27 -24
  67. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +1 -1
  68. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +13 -4
  69. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +6 -3
  70. package/coverage/lcov-report/src/api/controllers/screen.ts.html +1 -1
  71. package/coverage/lcov-report/src/api/controllers/script.ts.html +1 -1
  72. package/coverage/lcov-report/src/api/controllers/static/index.html +11 -11
  73. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +13 -25
  74. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +1 -1
  75. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +1 -1
  76. package/coverage/lcov-report/src/api/controllers/table/index.html +1 -1
  77. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +1 -1
  78. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +1 -1
  79. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +1 -1
  80. package/coverage/lcov-report/src/api/controllers/templates.ts.html +1 -1
  81. package/coverage/lcov-report/src/api/controllers/user.ts.html +1 -1
  82. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +1 -1
  83. package/coverage/lcov-report/src/api/controllers/view/index.html +1 -1
  84. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +1 -1
  85. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +1 -1
  86. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +1 -1
  87. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +1 -1
  88. package/coverage/lcov-report/src/api/index.html +1 -1
  89. package/coverage/lcov-report/src/api/index.ts.html +1 -1
  90. package/coverage/lcov-report/src/api/routes/analytics.ts.html +1 -1
  91. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +1 -1
  92. package/coverage/lcov-report/src/api/routes/application.ts.html +1 -1
  93. package/coverage/lcov-report/src/api/routes/auth.ts.html +1 -1
  94. package/coverage/lcov-report/src/api/routes/automation.ts.html +1 -1
  95. package/coverage/lcov-report/src/api/routes/backup.ts.html +1 -1
  96. package/coverage/lcov-report/src/api/routes/cloud.ts.html +1 -1
  97. package/coverage/lcov-report/src/api/routes/component.ts.html +1 -1
  98. package/coverage/lcov-report/src/api/routes/datasource.ts.html +1 -1
  99. package/coverage/lcov-report/src/api/routes/deploy.ts.html +1 -1
  100. package/coverage/lcov-report/src/api/routes/dev.ts.html +1 -1
  101. package/coverage/lcov-report/src/api/routes/index.html +1 -1
  102. package/coverage/lcov-report/src/api/routes/index.ts.html +8 -5
  103. package/coverage/lcov-report/src/api/routes/integration.ts.html +1 -1
  104. package/coverage/lcov-report/src/api/routes/layout.ts.html +1 -1
  105. package/coverage/lcov-report/src/api/routes/metadata.ts.html +1 -1
  106. package/coverage/lcov-report/src/api/routes/migrations.ts.html +1 -1
  107. package/coverage/lcov-report/src/api/routes/permission.ts.html +1 -1
  108. package/coverage/lcov-report/src/api/routes/plugin.ts.html +1 -1
  109. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +1 -1
  110. package/coverage/lcov-report/src/api/routes/public/index.html +1 -1
  111. package/coverage/lcov-report/src/api/routes/public/index.ts.html +1 -1
  112. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +1 -1
  113. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +1 -1
  114. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +1 -1
  115. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +1 -1
  116. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +1 -1
  117. package/coverage/lcov-report/src/api/routes/public/tests/index.html +1 -1
  118. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +1 -1
  119. package/coverage/lcov-report/src/api/routes/public/users.ts.html +1 -1
  120. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +1 -1
  121. package/coverage/lcov-report/src/api/routes/public/utils/index.html +1 -1
  122. package/coverage/lcov-report/src/api/routes/query.ts.html +1 -1
  123. package/coverage/lcov-report/src/api/routes/role.ts.html +1 -1
  124. package/coverage/lcov-report/src/api/routes/routing.ts.html +1 -1
  125. package/coverage/lcov-report/src/api/routes/row.ts.html +1 -1
  126. package/coverage/lcov-report/src/api/routes/screen.ts.html +1 -1
  127. package/coverage/lcov-report/src/api/routes/script.ts.html +1 -1
  128. package/coverage/lcov-report/src/api/routes/static.ts.html +1 -1
  129. package/coverage/lcov-report/src/api/routes/table.ts.html +1 -1
  130. package/coverage/lcov-report/src/api/routes/templates.ts.html +1 -1
  131. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +1 -1
  132. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +1 -1
  133. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +1 -1
  134. package/coverage/lcov-report/src/api/routes/user.ts.html +1 -1
  135. package/coverage/lcov-report/src/api/routes/utils/index.html +1 -1
  136. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +1 -1
  137. package/coverage/lcov-report/src/api/routes/view.ts.html +1 -1
  138. package/coverage/lcov-report/src/api/routes/webhook.ts.html +1 -1
  139. package/coverage/lcov-report/src/app.ts.html +1 -1
  140. package/coverage/lcov-report/src/automations/actions.ts.html +1 -1
  141. package/coverage/lcov-report/src/automations/automationUtils.ts.html +1 -1
  142. package/coverage/lcov-report/src/automations/bullboard.ts.html +1 -1
  143. package/coverage/lcov-report/src/automations/index.html +1 -1
  144. package/coverage/lcov-report/src/automations/index.ts.html +1 -1
  145. package/coverage/lcov-report/src/automations/logging/index.html +1 -1
  146. package/coverage/lcov-report/src/automations/logging/index.ts.html +1 -1
  147. package/coverage/lcov-report/src/automations/steps/bash.ts.html +1 -1
  148. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +1 -1
  149. package/coverage/lcov-report/src/automations/steps/delay.ts.html +1 -1
  150. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +1 -1
  151. package/coverage/lcov-report/src/automations/steps/discord.ts.html +1 -1
  152. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +1 -1
  153. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +1 -1
  154. package/coverage/lcov-report/src/automations/steps/filter.ts.html +1 -1
  155. package/coverage/lcov-report/src/automations/steps/index.html +1 -1
  156. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +1 -1
  157. package/coverage/lcov-report/src/automations/steps/loop.ts.html +1 -1
  158. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +1 -1
  159. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +1 -1
  160. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +1 -1
  161. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +1 -1
  162. package/coverage/lcov-report/src/automations/steps/slack.ts.html +1 -1
  163. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +1 -1
  164. package/coverage/lcov-report/src/automations/steps/utils.ts.html +1 -1
  165. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +1 -1
  166. package/coverage/lcov-report/src/automations/tests/utilities/index.html +1 -1
  167. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +1 -1
  168. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +1 -1
  169. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +1 -1
  170. package/coverage/lcov-report/src/automations/triggerInfo/index.html +1 -1
  171. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +1 -1
  172. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +1 -1
  173. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +1 -1
  174. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +1 -1
  175. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +1 -1
  176. package/coverage/lcov-report/src/automations/triggers.ts.html +1 -1
  177. package/coverage/lcov-report/src/automations/utils.ts.html +1 -1
  178. package/coverage/lcov-report/src/constants/index.html +1 -1
  179. package/coverage/lcov-report/src/constants/index.ts.html +92 -92
  180. package/coverage/lcov-report/src/constants/layouts.ts.html +1 -1
  181. package/coverage/lcov-report/src/constants/screens.ts.html +1 -1
  182. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +1 -1
  183. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +1 -1
  184. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +1 -1
  185. package/coverage/lcov-report/src/db/defaultData/index.html +1 -1
  186. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +1 -1
  187. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +1 -1
  188. package/coverage/lcov-report/src/db/dynamoClient.ts.html +1 -1
  189. package/coverage/lcov-report/src/db/inMemoryView.ts.html +1 -1
  190. package/coverage/lcov-report/src/db/index.html +1 -1
  191. package/coverage/lcov-report/src/db/index.ts.html +1 -1
  192. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +1 -1
  193. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +1 -1
  194. package/coverage/lcov-report/src/db/linkedRows/index.html +1 -1
  195. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +1 -1
  196. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +1 -1
  197. package/coverage/lcov-report/src/db/newid.ts.html +3 -3
  198. package/coverage/lcov-report/src/db/utils.ts.html +56 -56
  199. package/coverage/lcov-report/src/definitions/automations.ts.html +1 -1
  200. package/coverage/lcov-report/src/definitions/datasource.ts.html +1 -1
  201. package/coverage/lcov-report/src/definitions/index.html +1 -1
  202. package/coverage/lcov-report/src/environment.ts.html +43 -28
  203. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +1 -1
  204. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +1 -1
  205. package/coverage/lcov-report/src/events/index.html +1 -1
  206. package/coverage/lcov-report/src/events/index.ts.html +1 -1
  207. package/coverage/lcov-report/src/events/utils.ts.html +1 -1
  208. package/coverage/lcov-report/src/index.html +16 -16
  209. package/coverage/lcov-report/src/index.ts.html +1 -1
  210. package/coverage/lcov-report/src/integrations/airtable.ts.html +1 -1
  211. package/coverage/lcov-report/src/integrations/arangodb.ts.html +1 -1
  212. package/coverage/lcov-report/src/integrations/base/index.html +1 -1
  213. package/coverage/lcov-report/src/integrations/base/query.ts.html +1 -1
  214. package/coverage/lcov-report/src/integrations/base/sql.ts.html +1 -1
  215. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +1 -1
  216. package/coverage/lcov-report/src/integrations/base/utils.ts.html +1 -1
  217. package/coverage/lcov-report/src/integrations/couchdb.ts.html +1 -1
  218. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +1 -1
  219. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +1 -1
  220. package/coverage/lcov-report/src/integrations/firebase.ts.html +1 -1
  221. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +1 -1
  222. package/coverage/lcov-report/src/integrations/index.html +5 -5
  223. package/coverage/lcov-report/src/integrations/index.ts.html +5 -17
  224. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +1 -1
  225. package/coverage/lcov-report/src/integrations/mongodb.ts.html +1 -1
  226. package/coverage/lcov-report/src/integrations/mysql.ts.html +1 -1
  227. package/coverage/lcov-report/src/integrations/oracle.ts.html +1 -1
  228. package/coverage/lcov-report/src/integrations/postgres.ts.html +1 -1
  229. package/coverage/lcov-report/src/integrations/queries/index.html +1 -1
  230. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +1 -1
  231. package/coverage/lcov-report/src/integrations/redis.ts.html +1 -1
  232. package/coverage/lcov-report/src/integrations/rest.ts.html +1 -1
  233. package/coverage/lcov-report/src/integrations/s3.ts.html +1 -1
  234. package/coverage/lcov-report/src/integrations/snowflake.ts.html +1 -1
  235. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +1 -1
  236. package/coverage/lcov-report/src/integrations/tests/index.html +1 -1
  237. package/coverage/lcov-report/src/integrations/utils.ts.html +1 -1
  238. package/coverage/lcov-report/src/middleware/appInfo.ts.html +1 -1
  239. package/coverage/lcov-report/src/middleware/authorized.ts.html +1 -1
  240. package/coverage/lcov-report/src/middleware/builder.ts.html +1 -1
  241. package/coverage/lcov-report/src/middleware/currentapp.ts.html +1 -1
  242. package/coverage/lcov-report/src/middleware/index.html +1 -1
  243. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +1 -1
  244. package/coverage/lcov-report/src/middleware/publicApi.ts.html +1 -1
  245. package/coverage/lcov-report/src/middleware/resourceId.ts.html +1 -1
  246. package/coverage/lcov-report/src/middleware/selfhost.ts.html +1 -1
  247. package/coverage/lcov-report/src/middleware/utils.ts.html +1 -1
  248. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +1 -1
  249. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +1 -1
  250. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +1 -1
  251. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +1 -1
  252. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +1 -1
  253. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +1 -1
  254. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +1 -1
  255. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +1 -1
  256. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +1 -1
  257. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +1 -1
  258. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +9 -6
  259. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +1 -1
  260. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +1 -1
  261. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +1 -1
  262. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +1 -1
  263. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +1 -1
  264. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +1 -1
  265. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +1 -1
  266. package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
  267. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +1 -1
  268. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +1 -1
  269. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +1 -1
  270. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +1 -1
  271. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +1 -1
  272. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +1 -1
  273. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +1 -1
  274. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +1 -1
  275. package/coverage/lcov-report/src/migrations/index.html +1 -1
  276. package/coverage/lcov-report/src/migrations/index.ts.html +1 -1
  277. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +1 -1
  278. package/coverage/lcov-report/src/migrations/tests/index.html +1 -1
  279. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +1 -1
  280. package/coverage/lcov-report/src/sdk/app/applications/index.html +1 -1
  281. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +1 -1
  282. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +1 -1
  283. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +1 -1
  284. package/coverage/lcov-report/src/sdk/app/automations/index.html +1 -1
  285. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +1 -1
  286. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +1 -1
  287. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +1 -1
  288. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +1 -1
  289. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +9 -21
  290. package/coverage/lcov-report/src/sdk/app/backups/index.html +11 -11
  291. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +1 -1
  292. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +1 -1
  293. package/coverage/lcov-report/src/sdk/app/tables/index.html +1 -1
  294. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +1 -1
  295. package/coverage/lcov-report/src/sdk/index.html +1 -1
  296. package/coverage/lcov-report/src/sdk/index.ts.html +1 -1
  297. package/coverage/lcov-report/src/sdk/users/index.html +1 -1
  298. package/coverage/lcov-report/src/sdk/users/index.ts.html +1 -1
  299. package/coverage/lcov-report/src/sdk/users/utils.ts.html +1 -1
  300. package/coverage/lcov-report/src/startup.ts.html +1 -1
  301. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +3 -3
  302. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +1 -1
  303. package/coverage/lcov-report/src/tests/utilities/index.html +1 -1
  304. package/coverage/lcov-report/src/tests/utilities/index.ts.html +1 -1
  305. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +1 -1
  306. package/coverage/lcov-report/src/threads/automation.ts.html +1 -1
  307. package/coverage/lcov-report/src/threads/index.html +1 -1
  308. package/coverage/lcov-report/src/threads/index.ts.html +1 -1
  309. package/coverage/lcov-report/src/threads/query.ts.html +1 -1
  310. package/coverage/lcov-report/src/threads/utils.ts.html +1 -1
  311. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +1 -1
  312. package/coverage/lcov-report/src/utilities/centralPath.ts.html +1 -1
  313. package/coverage/lcov-report/src/utilities/csvParser.ts.html +1 -1
  314. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +343 -0
  315. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +2 -2
  316. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +595 -0
  317. package/coverage/lcov-report/src/utilities/fileSystem/index.html +81 -21
  318. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +16 -1045
  319. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +280 -0
  320. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +1 -1
  321. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +193 -0
  322. package/coverage/lcov-report/src/utilities/global.ts.html +1 -1
  323. package/coverage/lcov-report/src/utilities/index.html +19 -34
  324. package/coverage/lcov-report/src/utilities/index.ts.html +31 -163
  325. package/coverage/lcov-report/src/utilities/redis.ts.html +1 -1
  326. package/coverage/lcov-report/src/utilities/routing/index.html +1 -1
  327. package/coverage/lcov-report/src/utilities/routing/index.ts.html +1 -1
  328. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +19 -19
  329. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +46 -19
  330. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +1 -1
  331. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +1 -1
  332. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +1 -1
  333. package/coverage/lcov-report/src/utilities/security.ts.html +1 -1
  334. package/coverage/lcov-report/src/utilities/statusCodes.ts.html +1 -1
  335. package/coverage/lcov-report/src/utilities/usageQuota/index.html +1 -1
  336. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +1 -1
  337. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +1 -1
  338. package/coverage/lcov-report/src/utilities/users.ts.html +1 -1
  339. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +1 -1
  340. package/coverage/lcov-report/src/watch.ts.html +1 -1
  341. package/coverage/lcov-report/src/websocket.ts.html +1 -1
  342. package/coverage/lcov.info +2322 -2298
  343. package/dist/api/controllers/application.js +9 -10
  344. package/dist/api/controllers/cloud.js +6 -2
  345. package/dist/api/controllers/plugin/index.js +6 -6
  346. package/dist/api/controllers/row/ExternalRequest.js +0 -1
  347. package/dist/api/controllers/row/internal.js +11 -11
  348. package/dist/api/controllers/row/staticFormula.js +1 -1
  349. package/dist/api/controllers/static/index.js +8 -11
  350. package/dist/environment.js +6 -1
  351. package/dist/integrations/index.js +1 -2
  352. package/dist/migrations/functions/backfill/global/configs.js +4 -4
  353. package/dist/package.json +9 -7
  354. package/dist/sdk/app/backups/imports.js +3 -7
  355. package/dist/tsconfig.build.tsbuildinfo +1 -1
  356. package/dist/utilities/fileSystem/app.js +97 -0
  357. package/dist/utilities/fileSystem/clientLibrary.js +3 -3
  358. package/dist/utilities/fileSystem/filesystem.js +182 -0
  359. package/dist/utilities/fileSystem/index.js +18 -342
  360. package/dist/utilities/fileSystem/plugin.js +63 -0
  361. package/dist/utilities/fileSystem/template.js +44 -0
  362. package/dist/utilities/index.js +1 -44
  363. package/dist/utilities/rowProcessor/index.js +12 -4
  364. package/package.json +10 -8
  365. package/src/api/controllers/application.ts +16 -12
  366. package/src/api/controllers/auth.ts +2 -2
  367. package/src/api/controllers/cloud.ts +10 -6
  368. package/src/api/controllers/plugin/index.ts +14 -9
  369. package/src/api/controllers/row/ExternalRequest.ts +0 -1
  370. package/src/api/controllers/row/internal.ts +23 -22
  371. package/src/api/controllers/row/staticFormula.ts +5 -2
  372. package/src/api/controllers/row/utils.ts +2 -1
  373. package/src/api/controllers/static/index.ts +6 -10
  374. package/src/api/routes/index.ts +4 -3
  375. package/src/api/routes/tests/row.spec.js +4 -2
  376. package/src/api/routes/tests/static.spec.js +2 -17
  377. package/src/environment.ts +6 -1
  378. package/src/integrations/index.ts +1 -5
  379. package/src/migrations/functions/backfill/global/configs.ts +5 -4
  380. package/src/sdk/app/backups/imports.ts +3 -7
  381. package/src/tests/jestSetup.ts +4 -1
  382. package/src/utilities/fileSystem/app.ts +86 -0
  383. package/src/utilities/fileSystem/clientLibrary.ts +1 -1
  384. package/src/utilities/fileSystem/filesystem.ts +170 -0
  385. package/src/utilities/fileSystem/index.ts +5 -348
  386. package/src/utilities/fileSystem/plugin.ts +65 -0
  387. package/src/utilities/fileSystem/template.ts +36 -0
  388. package/src/utilities/index.ts +1 -45
  389. package/src/utilities/rowProcessor/index.ts +17 -8
  390. package/coverage/lcov-report/src/utilities/plugins.ts.html +0 -151
  391. package/dist/utilities/plugins.js +0 -26
  392. package/src/utilities/plugins.ts +0 -22
  393. package/src/utilities/tests/plugins.spec.ts +0 -23
@@ -16,7 +16,10 @@ const { cloneDeep } = require("lodash/fp")
16
16
  * updated.
17
17
  * NOTE: this will only for affect static formulas.
18
18
  */
19
- export async function updateRelatedFormula(table: Table, enrichedRows: Row[]) {
19
+ export async function updateRelatedFormula(
20
+ table: Table,
21
+ enrichedRows: Row[] | Row
22
+ ) {
20
23
  const db = context.getAppDB()
21
24
  // no formula to update, we're done
22
25
  if (!table.relatedFormula) {
@@ -155,7 +158,7 @@ export async function finaliseRow(
155
158
  enrichedRow = await processFormulas(table, enrichedRow, { dynamic: false })
156
159
  // this updates the related formulas in other rows based on the relations to this row
157
160
  if (updateFormula) {
158
- await exports.updateRelatedFormula(table, enrichedRow)
161
+ await updateRelatedFormula(table, enrichedRow)
159
162
  }
160
163
  return { row: enrichedRow, table }
161
164
  }
@@ -7,6 +7,7 @@ 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 { Ctx } from "@budibase/types"
10
11
 
11
12
  validateJs.extend(validateJs.validators.datetime, {
12
13
  parse: function (value: string) {
@@ -25,7 +26,7 @@ export async function getDatasourceAndQuery(json: any) {
25
26
  return makeExternalQuery(datasource, json)
26
27
  }
27
28
 
28
- export async function findRow(ctx: BBContext, tableId: string, rowId: string) {
29
+ export async function findRow(ctx: Ctx, tableId: string, rowId: string) {
29
30
  const db = context.getAppDB()
30
31
  let row
31
32
  // TODO remove special user case in future
@@ -1,11 +1,9 @@
1
- import { enrichPluginURLs } from "../../../utilities/plugins"
2
-
3
1
  require("svelte/register")
4
2
 
5
3
  const send = require("koa-send")
6
4
  const { resolve, join } = require("../../../utilities/centralPath")
7
5
  const uuid = require("uuid")
8
- const { ObjectStoreBuckets } = require("../../../constants")
6
+ import { ObjectStoreBuckets } from "../../../constants"
9
7
  const { processString } = require("@budibase/string-templates")
10
8
  const {
11
9
  loadHandlebarsFile,
@@ -13,8 +11,6 @@ const {
13
11
  TOP_LEVEL_PATH,
14
12
  } = require("../../../utilities/fileSystem")
15
13
  const env = require("../../../environment")
16
- const { clientLibraryPath } = require("../../../utilities")
17
- const { attachmentsRelativeURL } = require("../../../utilities")
18
14
  const { DocumentType } = require("../../../db/utils")
19
15
  const { context, objectStore, utils } = require("@budibase/backend-core")
20
16
  const AWS = require("aws-sdk")
@@ -33,7 +29,7 @@ async function prepareUpload({ s3Key, bucket, metadata, file }: any) {
33
29
  return {
34
30
  size: file.size,
35
31
  name: file.name,
36
- url: attachmentsRelativeURL(response.Key),
32
+ url: objectStore.getAppFileUrl(s3Key),
37
33
  extension: [...file.name.split(".")].pop(),
38
34
  key: response.Key,
39
35
  }
@@ -85,7 +81,7 @@ export const uploadFile = async function (ctx: any) {
85
81
 
86
82
  return prepareUpload({
87
83
  file,
88
- s3Key: `${ctx.appId}/attachments/${processedFileName}`,
84
+ s3Key: `${context.getProdAppId()}/attachments/${processedFileName}`,
89
85
  bucket: ObjectStoreBuckets.APPS,
90
86
  })
91
87
  })
@@ -107,14 +103,14 @@ export const serveApp = async function (ctx: any) {
107
103
 
108
104
  if (!env.isJest()) {
109
105
  const App = require("./templates/BudibaseApp.svelte").default
110
- const plugins = enrichPluginURLs(appInfo.usedPlugins)
106
+ const plugins = objectStore.enrichPluginURLs(appInfo.usedPlugins)
111
107
  const { head, html, css } = App.render({
112
108
  metaImage:
113
109
  "https://res.cloudinary.com/daog6scxm/image/upload/v1666109324/meta-images/budibase-meta-image_uukc1m.png",
114
110
  title: appInfo.name,
115
111
  production: env.isProd(),
116
112
  appId,
117
- clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
113
+ clientLibPath: objectStore.clientLibraryUrl(appId, appInfo.version),
118
114
  usedPlugins: plugins,
119
115
  })
120
116
 
@@ -139,7 +135,7 @@ export const serveBuilderPreview = async function (ctx: any) {
139
135
  let appId = context.getAppId()
140
136
  const previewHbs = loadHandlebarsFile(`${__dirname}/templates/preview.hbs`)
141
137
  ctx.body = await processString(previewHbs, {
142
- clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
138
+ clientLibPath: objectStore.clientLibraryUrl(appId, appInfo.version),
143
139
  })
144
140
  } else {
145
141
  // just return the app info for jest to assert on
@@ -26,13 +26,14 @@ import cloudRoutes from "./cloud"
26
26
  import migrationRoutes from "./migrations"
27
27
  import pluginRoutes from "./plugin"
28
28
  import Router from "@koa/router"
29
- import { api } from "@budibase/pro"
29
+ import { api as pro } from "@budibase/pro"
30
30
 
31
31
  export { default as staticRoutes } from "./static"
32
32
  export { default as publicRoutes } from "./public"
33
33
 
34
- const appBackupRoutes = api.appBackups
35
- const scheduleRoutes = api.schedules
34
+ const appBackupRoutes = pro.appBackups
35
+ const scheduleRoutes = pro.schedules
36
+
36
37
  export const mainRoutes: Router[] = [
37
38
  appBackupRoutes,
38
39
  backupRoutes,
@@ -10,6 +10,7 @@ const {
10
10
  StaticQuotaName,
11
11
  MonthlyQuotaName,
12
12
  } = require("@budibase/types")
13
+ const { structures } = require("@budibase/backend-core/tests");
13
14
 
14
15
  describe("/rows", () => {
15
16
  let request = setup.getRequest()
@@ -494,12 +495,13 @@ describe("/rows", () => {
494
495
  describe("attachments", () => {
495
496
  it("should allow enriching attachment rows", async () => {
496
497
  const table = await config.createAttachmentTable()
498
+ const attachmentId = `${structures.uuid()}.csv`
497
499
  const row = await config.createRow({
498
500
  name: "test",
499
501
  description: "test",
500
502
  attachment: [
501
503
  {
502
- key: `${config.getAppId()}/attachments/test/thing.csv`,
504
+ key: `${config.getAppId()}/attachments/${attachmentId}`,
503
505
  },
504
506
  ],
505
507
  tableId: table._id,
@@ -509,7 +511,7 @@ describe("/rows", () => {
509
511
  context.doInAppContext(config.getAppId(), async () => {
510
512
  const enriched = await outputProcessing(table, [row])
511
513
  expect(enriched[0].attachment[0].url).toBe(
512
- `/prod-budi-app-assets/${config.getAppId()}/attachments/test/thing.csv`
514
+ `/files/signed/prod-budi-app-assets/${config.getProdAppId()}/attachments/${attachmentId}`
513
515
  )
514
516
  })
515
517
  })
@@ -1,20 +1,5 @@
1
- jest.mock("node-fetch")
2
- jest.mock("aws-sdk", () => ({
3
- config: {
4
- update: jest.fn(),
5
- },
6
- DynamoDB: {
7
- DocumentClient: jest.fn(),
8
- },
9
- S3: jest.fn(() => ({
10
- getSignedUrl: jest.fn(() => {
11
- return "my-url"
12
- }),
13
- })),
14
- }))
15
-
16
1
  const setup = require("./utilities")
17
- const { events, constants } = require("@budibase/backend-core")
2
+ const { constants } = require("@budibase/backend-core")
18
3
 
19
4
  describe("/static", () => {
20
5
  let request = setup.getRequest()
@@ -102,7 +87,7 @@ describe("/static", () => {
102
87
  .set(config.defaultHeaders())
103
88
  .expect("Content-Type", /json/)
104
89
  .expect(200)
105
- expect(res.body.signedUrl).toEqual("my-url")
90
+ expect(res.body.signedUrl).toEqual("http://test.com/foo/bar")
106
91
  expect(res.body.publicUrl).toEqual(
107
92
  `https://${bucket}.s3.eu-west-1.amazonaws.com/${key}`
108
93
  )
@@ -112,12 +112,17 @@ if (isDev() && module.exports.DISABLE_THREADING == null) {
112
112
  }
113
113
 
114
114
  // clean up any environment variable edge cases
115
- for (let [key, value] of Object.entries(module.exports)) {
115
+ for (let [key, value] of Object.entries(environment)) {
116
116
  // handle the edge case of "0" to disable an environment variable
117
117
  if (value === "0") {
118
118
  // @ts-ignore
119
119
  environment[key] = 0
120
120
  }
121
+ // handle the edge case of "false" to disable an environment variable
122
+ if (value === "false") {
123
+ // @ts-ignore
124
+ environment[key] = 0
125
+ }
121
126
  }
122
127
 
123
128
  export = environment
@@ -98,11 +98,7 @@ export async function getIntegration(integration: string) {
98
98
  for (let plugin of plugins) {
99
99
  if (plugin.name === integration) {
100
100
  // need to use commonJS require due to its dynamic runtime nature
101
- const retrieved: any = await getDatasourcePlugin(
102
- plugin.name,
103
- plugin.jsUrl,
104
- plugin.schema?.hash
105
- )
101
+ const retrieved: any = await getDatasourcePlugin(plugin)
106
102
  if (retrieved.integration) {
107
103
  return retrieved.integration
108
104
  } else {
@@ -5,6 +5,7 @@ import {
5
5
  isGoogleConfig,
6
6
  isOIDCConfig,
7
7
  isSettingsConfig,
8
+ ConfigType,
8
9
  } from "@budibase/types"
9
10
  import env from "./../../../../environment"
10
11
 
@@ -31,15 +32,15 @@ export const backfill = async (
31
32
  await events.email.SMTPCreated(timestamp)
32
33
  }
33
34
  if (isGoogleConfig(config)) {
34
- await events.auth.SSOCreated("google", timestamp)
35
+ await events.auth.SSOCreated(ConfigType.GOOGLE, timestamp)
35
36
  if (config.config.activated) {
36
- await events.auth.SSOActivated("google", timestamp)
37
+ await events.auth.SSOActivated(ConfigType.GOOGLE, timestamp)
37
38
  }
38
39
  }
39
40
  if (isOIDCConfig(config)) {
40
- await events.auth.SSOCreated("oidc", timestamp)
41
+ await events.auth.SSOCreated(ConfigType.OIDC, timestamp)
41
42
  if (config.config.configs[0].activated) {
42
- await events.auth.SSOActivated("oidc", timestamp)
43
+ await events.auth.SSOActivated(ConfigType.OIDC, timestamp)
43
44
  }
44
45
  }
45
46
  if (isSettingsConfig(config)) {
@@ -55,12 +55,8 @@ async function updateAttachmentColumns(prodAppId: string, db: Database) {
55
55
  continue
56
56
  }
57
57
  row[column] = row[column].map((attachment: RowAttachment) => {
58
- // URL looks like: /prod-budi-app-assets/appId/attachments/file.csv
59
- const urlParts = attachment.url.split("/")
60
- // drop the first empty element
61
- urlParts.shift()
62
- // get the prefix
63
- const prefix = urlParts.shift()
58
+ // Key looks like: appId/attachments/file.csv
59
+ const urlParts = attachment.key.split("/")
64
60
  // remove the app ID
65
61
  urlParts.shift()
66
62
  // add new app ID
@@ -69,7 +65,7 @@ async function updateAttachmentColumns(prodAppId: string, db: Database) {
69
65
  return {
70
66
  ...attachment,
71
67
  key,
72
- url: `/${prefix}/${key}`,
68
+ url: "", // calculated on retrieval using key
73
69
  }
74
70
  })
75
71
  }
@@ -19,7 +19,10 @@ import { mocks } from "@budibase/backend-core/tests"
19
19
  const tk = require("timekeeper")
20
20
  tk.freeze(mocks.date.MOCK_DATE)
21
21
 
22
- global.console.log = jest.fn() // console.log are ignored in tests
22
+ if (!process.env.DEBUG) {
23
+ global.console.log = jest.fn() // console.log are ignored in tests
24
+ global.console.warn = jest.fn() // console.warn are ignored in tests
25
+ }
23
26
 
24
27
  if (!process.env.CI) {
25
28
  // set a longer timeout in dev for debugging
@@ -0,0 +1,86 @@
1
+ import { budibaseTempDir } from "../budibaseDir"
2
+ import fs from "fs"
3
+ import { join } from "path"
4
+ import { ObjectStoreBuckets } from "../../constants"
5
+ import { updateClientLibrary } from "./clientLibrary"
6
+ import env from "../../environment"
7
+ import { objectStore, context } from "@budibase/backend-core"
8
+ import { TOP_LEVEL_PATH } from "./filesystem"
9
+
10
+ export const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules")
11
+
12
+ /**
13
+ * Uploads the latest client library to the object store.
14
+ * @param {string} appId The ID of the app which is being created.
15
+ * @return {Promise<void>} once promise completes app resources should be ready in object store.
16
+ */
17
+ export const createApp = async (appId: string) => {
18
+ await updateClientLibrary(appId)
19
+ }
20
+
21
+ /**
22
+ * Removes all of the assets created for an app in the object store.
23
+ * @param {string} appId The ID of the app which is being deleted.
24
+ * @return {Promise<void>} once promise completes the app resources will be removed from object store.
25
+ */
26
+ export const deleteApp = async (appId: string) => {
27
+ await objectStore.deleteFolder(ObjectStoreBuckets.APPS, `${appId}/`)
28
+ }
29
+
30
+ /**
31
+ * Retrieves component libraries from object store (or tmp symlink if in local)
32
+ */
33
+ export const getComponentLibraryManifest = async (library: string) => {
34
+ const appId = context.getAppId()
35
+ const filename = "manifest.json"
36
+ /* istanbul ignore next */
37
+ // when testing in cypress and so on we need to get the package
38
+ // as the environment may not be fully fleshed out for dev or prod
39
+ if (env.isTest()) {
40
+ library = library.replace("standard-components", "client")
41
+ const lib = library.split("/")[1]
42
+ const path = require.resolve(library).split(lib)[0]
43
+ return require(join(path, lib, filename))
44
+ } else if (env.isDev()) {
45
+ const path = join(NODE_MODULES_PATH, "@budibase", "client", filename)
46
+ // always load from new so that updates are refreshed
47
+ delete require.cache[require.resolve(path)]
48
+ return require(path)
49
+ }
50
+
51
+ if (!appId) {
52
+ throw new Error("No app ID found - cannot get component libraries")
53
+ }
54
+
55
+ let resp
56
+ let path
57
+ try {
58
+ // Try to load the manifest from the new file location
59
+ path = join(appId, filename)
60
+ resp = await objectStore.retrieve(ObjectStoreBuckets.APPS, path)
61
+ } catch (error) {
62
+ console.error(
63
+ `component-manifest-objectstore=failed appId=${appId} path=${path}`,
64
+ error
65
+ )
66
+ // Fallback to loading it from the old location for old apps
67
+ path = join(appId, "node_modules", library, "package", filename)
68
+ resp = await objectStore.retrieve(ObjectStoreBuckets.APPS, path)
69
+ }
70
+ if (typeof resp !== "string") {
71
+ resp = resp.toString("utf8")
72
+ }
73
+ return JSON.parse(resp)
74
+ }
75
+
76
+ /**
77
+ * Given a set of app IDs makes sure file system is cleared of any of their temp info.
78
+ */
79
+ export const cleanup = (appIds: string[]) => {
80
+ for (let appId of appIds) {
81
+ const path = join(budibaseTempDir(), appId)
82
+ if (fs.existsSync(path)) {
83
+ fs.rmdirSync(path, { recursive: true })
84
+ }
85
+ }
86
+ }
@@ -4,7 +4,7 @@ import fs from "fs"
4
4
  import { objectStore } from "@budibase/backend-core"
5
5
  import { resolve } from "../centralPath"
6
6
  import env from "../../environment"
7
- const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
7
+ import { TOP_LEVEL_PATH } from "./filesystem"
8
8
 
9
9
  /**
10
10
  * Client library paths in the object store:
@@ -0,0 +1,170 @@
1
+ import { PathLike } from "fs"
2
+ const { budibaseTempDir } = require("../budibaseDir")
3
+ const fs = require("fs")
4
+ const { join } = require("path")
5
+ const uuid = require("uuid/v4")
6
+ const env = require("../../environment")
7
+ import tar from "tar"
8
+
9
+ export const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
10
+
11
+ /**
12
+ * Upon first startup of instance there may not be everything we need in tmp directory, set it up.
13
+ */
14
+ export const init = () => {
15
+ const tempDir = budibaseTempDir()
16
+ if (!fs.existsSync(tempDir)) {
17
+ // some test cases fire this quickly enough that
18
+ // synchronous cases can end up here at the same time
19
+ try {
20
+ fs.mkdirSync(tempDir)
21
+ } catch (err: any) {
22
+ if (!err || err.code !== "EEXIST") {
23
+ throw err
24
+ }
25
+ }
26
+ }
27
+ const clientLibPath = join(budibaseTempDir(), "budibase-client.js")
28
+ if (env.isTest() && !fs.existsSync(clientLibPath)) {
29
+ fs.copyFileSync(require.resolve("@budibase/client"), clientLibPath)
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Checks if the system is currently in development mode and if it is makes sure
35
+ * everything required to function is ready.
36
+ */
37
+ export const checkDevelopmentEnvironment = () => {
38
+ if (!env.isDev() || env.isTest()) {
39
+ return
40
+ }
41
+ if (!fs.existsSync(budibaseTempDir())) {
42
+ fs.mkdirSync(budibaseTempDir())
43
+ }
44
+ let error
45
+ if (!fs.existsSync(join(process.cwd(), ".env"))) {
46
+ error = "Must run via yarn once to generate environment."
47
+ }
48
+ if (error) {
49
+ console.error(error)
50
+ process.exit(-1)
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Used to retrieve a handlebars file from the system which will be used as a template.
56
+ * This is allowable as the template handlebars files should be static and identical across
57
+ * the cluster.
58
+ * @param {string} path The path to the handlebars file which is to be loaded.
59
+ * @returns {string} The loaded handlebars file as a string - loaded as utf8.
60
+ */
61
+ export const loadHandlebarsFile = (path: PathLike) => {
62
+ return fs.readFileSync(path, "utf8")
63
+ }
64
+
65
+ /**
66
+ * When return a file from the API need to write the file to the system temporarily so we
67
+ * can create a read stream to send.
68
+ * @param {string} contents the contents of the file which is to be returned from the API.
69
+ * @return {Object} the read stream which can be put into the koa context body.
70
+ */
71
+ export const apiFileReturn = (contents: any) => {
72
+ const path = join(budibaseTempDir(), uuid())
73
+ fs.writeFileSync(path, contents)
74
+ return fs.createReadStream(path)
75
+ }
76
+
77
+ export const streamFile = (path: string) => {
78
+ return fs.createReadStream(path)
79
+ }
80
+
81
+ /**
82
+ * Writes the provided contents to a temporary file, which can be used briefly.
83
+ * @param {string} fileContents contents which will be written to a temp file.
84
+ * @return {string} the path to the temp file.
85
+ */
86
+ export const storeTempFile = (fileContents: any) => {
87
+ const path = join(budibaseTempDir(), uuid())
88
+ fs.writeFileSync(path, fileContents)
89
+ return path
90
+ }
91
+
92
+ /**
93
+ * Utility function for getting a file read stream - a simple in memory buffered read
94
+ * stream doesn't work for pouchdb.
95
+ */
96
+ export const stringToFileStream = (contents: any) => {
97
+ const path = storeTempFile(contents)
98
+ return fs.createReadStream(path)
99
+ }
100
+
101
+ /**
102
+ * Creates a temp file and returns it from the API.
103
+ * @param {string} fileContents the contents to be returned in file.
104
+ */
105
+ export const sendTempFile = (fileContents: any) => {
106
+ const path = storeTempFile(fileContents)
107
+ return fs.createReadStream(path)
108
+ }
109
+
110
+ /**
111
+ * All file reads come through here just to make sure all of them make sense
112
+ * allows a centralised location to check logic is all good.
113
+ */
114
+ export const readFileSync = (filepath: PathLike, options = "utf8") => {
115
+ return fs.readFileSync(filepath, options)
116
+ }
117
+
118
+ export const createTempFolder = (item: any) => {
119
+ const path = join(budibaseTempDir(), item)
120
+ try {
121
+ // remove old tmp directories automatically - don't combine
122
+ if (fs.existsSync(path)) {
123
+ fs.rmSync(path, { recursive: true, force: true })
124
+ }
125
+ fs.mkdirSync(path)
126
+ } catch (err: any) {
127
+ throw new Error(`Path cannot be created: ${err.message}`)
128
+ }
129
+
130
+ return path
131
+ }
132
+
133
+ export const extractTarball = async (fromFilePath: string, toPath: string) => {
134
+ await tar.extract({
135
+ file: fromFilePath,
136
+ C: toPath,
137
+ })
138
+ }
139
+
140
+ /**
141
+ * Find for a file recursively from start path applying filter, return first match
142
+ */
143
+ export const findFileRec = (startPath: PathLike, filter: string): any => {
144
+ if (!fs.existsSync(startPath)) {
145
+ return
146
+ }
147
+
148
+ const files = fs.readdirSync(startPath)
149
+ for (let i = 0, len = files.length; i < len; i++) {
150
+ const filename = join(startPath, files[i])
151
+ const stat = fs.lstatSync(filename)
152
+
153
+ if (stat.isDirectory()) {
154
+ return findFileRec(filename, filter)
155
+ } else if (filename.endsWith(filter)) {
156
+ return filename
157
+ }
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Remove a folder which is not empty from the file system
163
+ */
164
+ export const deleteFolderFileSystem = (path: PathLike) => {
165
+ if (!fs.existsSync(path)) {
166
+ return
167
+ }
168
+
169
+ fs.rmSync(path, { recursive: true, force: true })
170
+ }