@budibase/server 0.0.32 → 0.0.999-alpha.30

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 (977) hide show
  1. package/.dockerignore +6 -0
  2. package/.yarnrc +1 -0
  3. package/Dockerfile +41 -0
  4. package/LICENSE +391 -377
  5. package/__mocks__/@elastic/elasticsearch.ts +24 -0
  6. package/__mocks__/@google-cloud/firestore.ts +36 -0
  7. package/__mocks__/@sendgrid/mail.ts +22 -0
  8. package/__mocks__/airtable.ts +8 -0
  9. package/__mocks__/arangojs.ts +24 -0
  10. package/__mocks__/aws-sdk.ts +80 -0
  11. package/__mocks__/mongodb.ts +39 -0
  12. package/__mocks__/mssql.ts +24 -0
  13. package/__mocks__/mysql2/promise.ts +17 -0
  14. package/__mocks__/mysql2.ts +14 -0
  15. package/__mocks__/node-fetch.ts +201 -0
  16. package/__mocks__/oracledb.ts +31 -0
  17. package/__mocks__/pg.ts +30 -0
  18. package/babel.config.js +3 -0
  19. package/build/entitlements.mac.plist +14 -0
  20. package/build/icon.icns +0 -0
  21. package/build/icon.png +0 -0
  22. package/build/icons/512x512.png +0 -0
  23. package/build/pouchdb.js +9 -0
  24. package/builder/assets/auth0-logo.6fa5973f.png +0 -0
  25. package/builder/assets/backups-default.8c011f1b.png +0 -0
  26. package/builder/assets/bb-emblem.05f7ae7a.svg +80 -0
  27. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  28. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  29. package/builder/assets/bg.29e85dd5.png +0 -0
  30. package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
  31. package/builder/assets/bulgaria.bd68393d.png +0 -0
  32. package/builder/assets/covanta.72c46c1e.png +0 -0
  33. package/builder/assets/discord.c14881e9.svg +10 -0
  34. package/builder/assets/google-logo.c16467b8.png +0 -0
  35. package/builder/assets/index.c0265b74.css +6 -0
  36. package/builder/assets/index.c977bf31.js +1776 -0
  37. package/builder/assets/integromat.42212f11.png +0 -0
  38. package/builder/assets/listScreenPreview.599c0aae.png +0 -0
  39. package/builder/assets/microsoft-logo.07033b2a.png +0 -0
  40. package/builder/assets/oidc-logo.cb2fff74.png +0 -0
  41. package/builder/assets/okta-logo.61437d3d.png +0 -0
  42. package/builder/assets/onelogin-logo.181cc193.png +0 -0
  43. package/builder/assets/oracle.66592424.png +0 -0
  44. package/builder/assets/remixicon.0ac8bc3c.ttf +0 -0
  45. package/builder/assets/remixicon.64bb3a0f.eot +0 -0
  46. package/builder/assets/remixicon.a10268fe.svg +6835 -0
  47. package/builder/assets/remixicon.c2dacfbc.woff +0 -0
  48. package/builder/assets/remixicon.e61f0d10.woff2 +0 -0
  49. package/builder/assets/schnellecke.cf1837a8.png +0 -0
  50. package/builder/assets/slack.1e1f7cfb.svg +33 -0
  51. package/builder/assets/zapier.3fbd8f5c.png +0 -0
  52. package/builder/index.html +10 -13
  53. package/dist/api/controllers/analytics.js +46 -0
  54. package/dist/api/controllers/apikeys.js +72 -0
  55. package/dist/api/controllers/application.js +575 -0
  56. package/dist/api/controllers/auth.js +80 -0
  57. package/dist/api/controllers/automation.js +303 -0
  58. package/dist/api/controllers/backup.js +37 -0
  59. package/dist/api/controllers/cloud.js +130 -0
  60. package/dist/api/controllers/component.js +59 -0
  61. package/dist/api/controllers/datasource.js +306 -0
  62. package/dist/api/controllers/deploy/Deployment.js +53 -0
  63. package/dist/api/controllers/deploy/index.js +198 -0
  64. package/dist/api/controllers/dev.js +146 -0
  65. package/dist/api/controllers/integration.js +28 -0
  66. package/dist/api/controllers/layout.js +49 -0
  67. package/dist/api/controllers/metadata.js +63 -0
  68. package/dist/api/controllers/migrations.js +29 -0
  69. package/dist/api/controllers/ops.js +40 -0
  70. package/dist/api/controllers/permission.js +162 -0
  71. package/dist/api/controllers/plugin/file.js +24 -0
  72. package/dist/api/controllers/plugin/github.js +69 -0
  73. package/dist/api/controllers/plugin/index.js +112 -0
  74. package/dist/api/controllers/plugin/npm.js +58 -0
  75. package/dist/api/controllers/plugin/uploaders.js +11 -0
  76. package/dist/api/controllers/plugin/url.js +24 -0
  77. package/dist/api/controllers/plugin/utils.js +27 -0
  78. package/dist/api/controllers/public/applications.js +146 -0
  79. package/dist/api/controllers/public/mapping/applications.js +29 -0
  80. package/dist/api/controllers/public/mapping/index.js +11 -0
  81. package/dist/api/controllers/public/mapping/queries.js +36 -0
  82. package/dist/api/controllers/public/mapping/rows.js +24 -0
  83. package/dist/api/controllers/public/mapping/tables.js +23 -0
  84. package/dist/api/controllers/public/mapping/types.js +2 -0
  85. package/dist/api/controllers/public/mapping/users.js +29 -0
  86. package/dist/api/controllers/public/metrics.js +113 -0
  87. package/dist/api/controllers/public/queries.js +58 -0
  88. package/dist/api/controllers/public/rows.js +120 -0
  89. package/dist/api/controllers/public/tables.js +95 -0
  90. package/dist/api/controllers/public/users.js +93 -0
  91. package/dist/api/controllers/public/utils.js +56 -0
  92. package/dist/api/controllers/query/import/index.js +87 -0
  93. package/dist/api/controllers/query/import/sources/base/index.js +75 -0
  94. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  95. package/dist/api/controllers/query/import/sources/curl.js +99 -0
  96. package/dist/api/controllers/query/import/sources/openapi2.js +145 -0
  97. package/dist/api/controllers/query/import/sources/openapi3.js +177 -0
  98. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  99. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  100. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  101. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  102. package/dist/api/controllers/query/index.js +299 -0
  103. package/dist/api/controllers/query/validation.js +53 -0
  104. package/dist/api/controllers/role.js +109 -0
  105. package/dist/api/controllers/routing.js +105 -0
  106. package/dist/api/controllers/row/ExternalRequest.js +676 -0
  107. package/dist/api/controllers/row/external.js +339 -0
  108. package/dist/api/controllers/row/index.js +203 -0
  109. package/dist/api/controllers/row/internal.js +502 -0
  110. package/dist/api/controllers/row/internalSearch.js +28 -0
  111. package/dist/api/controllers/row/staticFormula.js +165 -0
  112. package/dist/api/controllers/row/utils.js +183 -0
  113. package/dist/api/controllers/screen.js +110 -0
  114. package/dist/api/controllers/script.js +30 -0
  115. package/dist/api/controllers/static/index.js +268 -0
  116. package/dist/api/controllers/static/templates/BudibaseApp.svelte +135 -0
  117. package/dist/api/controllers/static/templates/app.hbs +13 -0
  118. package/dist/api/controllers/static/templates/preview.hbs +117 -0
  119. package/dist/api/controllers/table/bulkFormula.js +173 -0
  120. package/dist/api/controllers/table/external.js +279 -0
  121. package/dist/api/controllers/table/index.js +179 -0
  122. package/dist/api/controllers/table/internal.js +194 -0
  123. package/dist/api/controllers/table/utils.js +374 -0
  124. package/dist/api/controllers/templates.js +56 -0
  125. package/dist/api/controllers/user.js +124 -0
  126. package/dist/api/controllers/view/exporters.js +44 -0
  127. package/dist/api/controllers/view/index.js +193 -0
  128. package/dist/api/controllers/view/utils.js +177 -0
  129. package/dist/api/controllers/view/viewBuilder.js +158 -0
  130. package/dist/api/controllers/webhook.js +134 -0
  131. package/dist/api/index.js +56 -0
  132. package/dist/api/routes/analytics.js +34 -0
  133. package/dist/api/routes/apikeys.js +37 -0
  134. package/dist/api/routes/application.js +48 -0
  135. package/dist/api/routes/auth.js +33 -0
  136. package/dist/api/routes/automation.js +50 -0
  137. package/dist/api/routes/backup.js +35 -0
  138. package/dist/api/routes/cloud.js +39 -0
  139. package/dist/api/routes/component.js +35 -0
  140. package/dist/api/routes/datasource.js +43 -0
  141. package/dist/api/routes/deploy.js +37 -0
  142. package/dist/api/routes/dev.js +49 -0
  143. package/dist/api/routes/index.js +77 -0
  144. package/dist/api/routes/integration.js +37 -0
  145. package/dist/api/routes/layout.js +37 -0
  146. package/dist/api/routes/metadata.js +40 -0
  147. package/dist/api/routes/migrations.js +36 -0
  148. package/dist/api/routes/ops.js +52 -0
  149. package/dist/api/routes/permission.js +44 -0
  150. package/dist/api/routes/plugin.js +39 -0
  151. package/dist/api/routes/public/applications.js +174 -0
  152. package/dist/api/routes/public/index.js +131 -0
  153. package/dist/api/routes/public/metrics.js +30 -0
  154. package/dist/api/routes/public/middleware/mapper.js +97 -0
  155. package/dist/api/routes/public/queries.js +72 -0
  156. package/dist/api/routes/public/rows.js +158 -0
  157. package/dist/api/routes/public/tables.js +152 -0
  158. package/dist/api/routes/public/users.js +135 -0
  159. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  160. package/dist/api/routes/query.js +47 -0
  161. package/dist/api/routes/role.js +40 -0
  162. package/dist/api/routes/routing.js +39 -0
  163. package/dist/api/routes/row.js +239 -0
  164. package/dist/api/routes/screen.js +39 -0
  165. package/dist/api/routes/script.js +35 -0
  166. package/dist/api/routes/static.js +80 -0
  167. package/dist/api/routes/table.js +163 -0
  168. package/dist/api/routes/templates.js +37 -0
  169. package/dist/api/routes/user.js +43 -0
  170. package/dist/api/routes/utils/validators.js +238 -0
  171. package/dist/api/routes/view.js +42 -0
  172. package/dist/api/routes/webhook.js +43 -0
  173. package/dist/app.js +132 -0
  174. package/dist/automations/actions.js +137 -0
  175. package/dist/automations/automationUtils.js +173 -0
  176. package/dist/automations/bullboard.js +71 -0
  177. package/dist/automations/index.js +43 -0
  178. package/dist/automations/logging/index.js +53 -0
  179. package/dist/automations/steps/bash.js +111 -0
  180. package/dist/automations/steps/createRow.js +108 -0
  181. package/dist/automations/steps/delay.js +53 -0
  182. package/dist/automations/steps/deleteRow.js +96 -0
  183. package/dist/automations/steps/discord.js +116 -0
  184. package/dist/automations/steps/executeQuery.js +134 -0
  185. package/dist/automations/steps/executeScript.js +106 -0
  186. package/dist/automations/steps/filter.js +112 -0
  187. package/dist/automations/steps/integromat.js +119 -0
  188. package/dist/automations/steps/loop.js +54 -0
  189. package/dist/automations/steps/outgoingWebhook.js +166 -0
  190. package/dist/automations/steps/queryRows.js +216 -0
  191. package/dist/automations/steps/sendSmtpEmail.js +115 -0
  192. package/dist/automations/steps/serverLog.js +65 -0
  193. package/dist/automations/steps/slack.js +98 -0
  194. package/dist/automations/steps/updateRow.js +144 -0
  195. package/dist/automations/steps/utils.js +56 -0
  196. package/dist/automations/steps/zapier.js +117 -0
  197. package/dist/automations/triggerInfo/app.js +36 -0
  198. package/dist/automations/triggerInfo/cron.js +35 -0
  199. package/dist/automations/triggerInfo/index.js +40 -0
  200. package/dist/automations/triggerInfo/rowDeleted.js +36 -0
  201. package/dist/automations/triggerInfo/rowSaved.js +44 -0
  202. package/dist/automations/triggerInfo/rowUpdated.js +44 -0
  203. package/dist/automations/triggerInfo/webhook.js +40 -0
  204. package/dist/automations/triggers.js +180 -0
  205. package/dist/automations/utils.js +264 -0
  206. package/dist/constants/definitions.js +2 -0
  207. package/dist/constants/index.js +181 -0
  208. package/dist/constants/layouts.js +148 -0
  209. package/dist/constants/screens.js +51 -0
  210. package/dist/db/defaultData/datasource_bb_default.js +574 -0
  211. package/dist/db/defaultData/employeeImport.js +155 -0
  212. package/dist/db/defaultData/expensesImport.js +117 -0
  213. package/dist/db/defaultData/inventoryImport.js +109 -0
  214. package/dist/db/defaultData/jobsImport.js +152 -0
  215. package/dist/db/dynamoClient.js +124 -0
  216. package/dist/db/inMemoryView.js +62 -0
  217. package/dist/db/index.js +43 -0
  218. package/dist/db/linkedRows/LinkController.js +392 -0
  219. package/dist/db/linkedRows/LinkDocument.js +33 -0
  220. package/dist/db/linkedRows/index.js +206 -0
  221. package/dist/db/linkedRows/linkUtils.js +131 -0
  222. package/dist/db/newid.js +7 -0
  223. package/dist/db/utils.js +247 -0
  224. package/dist/db/views/staticViews.js +144 -0
  225. package/dist/ddApm.js +11 -0
  226. package/dist/definitions/automations.js +8 -0
  227. package/dist/definitions/common.js +2 -0
  228. package/dist/definitions/datasource.js +7 -0
  229. package/dist/definitions/openapi.js +6 -0
  230. package/dist/environment.js +113 -0
  231. package/dist/events/AutomationEmitter.js +53 -0
  232. package/dist/events/BudibaseEmitter.js +25 -0
  233. package/dist/events/docUpdates/index.js +17 -0
  234. package/dist/events/docUpdates/processors.js +18 -0
  235. package/dist/events/docUpdates/syncUsers.js +49 -0
  236. package/dist/events/index.js +11 -0
  237. package/dist/events/utils.js +43 -0
  238. package/dist/index.js +16 -0
  239. package/dist/integrations/airtable.js +147 -0
  240. package/dist/integrations/arangodb.js +103 -0
  241. package/dist/integrations/base/query.js +32 -0
  242. package/dist/integrations/base/sql.js +600 -0
  243. package/dist/integrations/base/sqlTable.js +160 -0
  244. package/dist/integrations/base/types.js +2 -0
  245. package/dist/integrations/couchdb.js +125 -0
  246. package/dist/integrations/dynamodb.js +194 -0
  247. package/dist/integrations/elasticsearch.js +186 -0
  248. package/dist/integrations/firebase.js +174 -0
  249. package/dist/integrations/googlesheets.js +455 -0
  250. package/dist/integrations/index.js +135 -0
  251. package/dist/integrations/microsoftSqlServer.js +273 -0
  252. package/dist/integrations/mongodb.js +614 -0
  253. package/dist/integrations/mysql.js +256 -0
  254. package/dist/integrations/oracle.js +375 -0
  255. package/dist/integrations/postgres.js +300 -0
  256. package/dist/integrations/queries/sql.js +84 -0
  257. package/dist/integrations/redis.js +168 -0
  258. package/dist/integrations/rest.js +400 -0
  259. package/dist/integrations/s3.js +237 -0
  260. package/dist/integrations/snowflake.js +99 -0
  261. package/dist/integrations/utils.js +295 -0
  262. package/dist/middleware/appInfo.js +22 -0
  263. package/dist/middleware/authorized.js +112 -0
  264. package/dist/middleware/builder.js +93 -0
  265. package/dist/middleware/currentapp.js +103 -0
  266. package/dist/middleware/joi-validator.js +43 -0
  267. package/dist/middleware/publicApi.js +25 -0
  268. package/dist/middleware/resourceId.js +59 -0
  269. package/dist/middleware/selfhost.js +24 -0
  270. package/dist/middleware/utils.js +8 -0
  271. package/dist/migrations/functions/appUrls.js +42 -0
  272. package/dist/migrations/functions/backfill/app/automations.js +31 -0
  273. package/dist/migrations/functions/backfill/app/datasources.js +28 -0
  274. package/dist/migrations/functions/backfill/app/layouts.js +33 -0
  275. package/dist/migrations/functions/backfill/app/queries.js +50 -0
  276. package/dist/migrations/functions/backfill/app/roles.js +28 -0
  277. package/dist/migrations/functions/backfill/app/screens.js +28 -0
  278. package/dist/migrations/functions/backfill/app/tables.js +37 -0
  279. package/dist/migrations/functions/backfill/app.js +176 -0
  280. package/dist/migrations/functions/backfill/global/configs.js +67 -0
  281. package/dist/migrations/functions/backfill/global/quotas.js +60 -0
  282. package/dist/migrations/functions/backfill/global/users.js +50 -0
  283. package/dist/migrations/functions/backfill/global.js +205 -0
  284. package/dist/migrations/functions/backfill/index.js +32 -0
  285. package/dist/migrations/functions/backfill/installation.js +80 -0
  286. package/dist/migrations/functions/syncQuotas.js +50 -0
  287. package/dist/migrations/functions/tableSettings.js +130 -0
  288. package/dist/migrations/functions/usageQuotas/index.js +16 -0
  289. package/dist/migrations/functions/usageQuotas/syncApps.js +25 -0
  290. package/dist/migrations/functions/usageQuotas/syncPlugins.js +23 -0
  291. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  292. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  293. package/dist/migrations/index.js +111 -0
  294. package/dist/migrations/tests/helpers.js +72 -0
  295. package/dist/migrations/tests/structures.js +37 -0
  296. package/dist/package.json +180 -0
  297. package/dist/sdk/app/applications/index.js +28 -0
  298. package/dist/sdk/app/applications/sync.js +164 -0
  299. package/dist/sdk/app/applications/utils.js +21 -0
  300. package/dist/sdk/app/automations/index.js +29 -0
  301. package/dist/sdk/app/automations/webhook.js +54 -0
  302. package/dist/sdk/app/backups/constants.js +6 -0
  303. package/dist/sdk/app/backups/exports.js +184 -0
  304. package/dist/sdk/app/backups/imports.js +170 -0
  305. package/dist/sdk/app/backups/index.js +29 -0
  306. package/dist/sdk/app/backups/statistics.js +73 -0
  307. package/dist/sdk/app/datasources/datasources.js +166 -0
  308. package/dist/sdk/app/datasources/index.js +27 -0
  309. package/dist/sdk/app/queries/index.js +27 -0
  310. package/dist/sdk/app/queries/queries.js +60 -0
  311. package/dist/sdk/app/rows/attachments.js +61 -0
  312. package/dist/sdk/app/rows/index.js +28 -0
  313. package/dist/sdk/app/rows/rows.js +30 -0
  314. package/dist/sdk/app/tables/index.js +65 -0
  315. package/dist/sdk/index.js +27 -0
  316. package/dist/sdk/plugins/index.js +27 -0
  317. package/dist/sdk/plugins/plugins.js +53 -0
  318. package/dist/sdk/users/index.js +27 -0
  319. package/dist/sdk/users/utils.js +87 -0
  320. package/dist/sdk/utils/index.js +29 -0
  321. package/dist/startup.js +158 -0
  322. package/dist/threads/automation.js +449 -0
  323. package/dist/threads/definitions.js +2 -0
  324. package/dist/threads/index.js +137 -0
  325. package/dist/threads/query.js +265 -0
  326. package/dist/threads/utils.js +122 -0
  327. package/dist/tsconfig.build.tsbuildinfo +1 -0
  328. package/dist/utilities/appDirectoryTemplate/package.json +10 -0
  329. package/dist/utilities/budibaseDir.js +5 -0
  330. package/dist/utilities/centralPath.js +27 -0
  331. package/dist/utilities/fileSystem/app.js +88 -0
  332. package/dist/utilities/fileSystem/clientLibrary.js +138 -0
  333. package/dist/utilities/fileSystem/filesystem.js +180 -0
  334. package/dist/utilities/fileSystem/index.js +21 -0
  335. package/dist/utilities/fileSystem/plugin.js +76 -0
  336. package/dist/utilities/fileSystem/processor.js +34 -0
  337. package/dist/utilities/fileSystem/template.js +47 -0
  338. package/dist/utilities/global.js +149 -0
  339. package/dist/utilities/index.js +143 -0
  340. package/dist/utilities/redis.js +117 -0
  341. package/dist/utilities/retry.js +30 -0
  342. package/dist/utilities/routing/index.js +39 -0
  343. package/dist/utilities/rowProcessor/index.js +284 -0
  344. package/dist/utilities/rowProcessor/map.js +99 -0
  345. package/dist/utilities/rowProcessor/utils.js +88 -0
  346. package/dist/utilities/schema.js +108 -0
  347. package/dist/utilities/scriptRunner.js +26 -0
  348. package/dist/utilities/security.js +57 -0
  349. package/dist/utilities/statusCodes.js +9 -0
  350. package/dist/utilities/usageQuota/rows.js +88 -0
  351. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  352. package/dist/utilities/users.js +57 -0
  353. package/dist/utilities/workerRequests.js +171 -0
  354. package/dist/watch.js +53 -0
  355. package/dist/websockets/client.js +14 -0
  356. package/dist/websockets/grid.js +60 -0
  357. package/dist/websockets/index.js +17 -0
  358. package/dist/websockets/websocket.js +78 -0
  359. package/docker_run.sh +7 -0
  360. package/jest-testcontainers-config.js +8 -0
  361. package/jest.config.ts +52 -0
  362. package/nodemon.json +10 -0
  363. package/package.json +166 -31
  364. package/pm2.config.js +9 -0
  365. package/scripts/account.js +8 -0
  366. package/scripts/dev/manage.js +119 -0
  367. package/scripts/docs/README.md +31 -0
  368. package/scripts/docs/generate.js +74 -0
  369. package/scripts/docs/toSwagger.js +320 -0
  370. package/scripts/exportAppTemplate.js +64 -0
  371. package/scripts/integrations/customer-categories/docker-compose.yml +28 -0
  372. package/scripts/integrations/customer-categories/init.sql +41 -0
  373. package/scripts/integrations/customer-categories/reset.sh +3 -0
  374. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  375. package/scripts/integrations/mssql/data/entrypoint.sh +25 -0
  376. package/scripts/integrations/mssql/data/setup.sql +80 -0
  377. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  378. package/scripts/integrations/mssql/reset.sh +3 -0
  379. package/scripts/integrations/mysql/docker-compose.yaml +21 -0
  380. package/scripts/integrations/mysql/init.sql +32 -0
  381. package/scripts/integrations/mysql/reset.sh +3 -0
  382. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  383. package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
  384. package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +23 -0
  385. package/scripts/integrations/oracle/instantclient/linux/install.sh +10 -0
  386. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  387. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  388. package/scripts/integrations/oracle/oracle.md +90 -0
  389. package/scripts/integrations/pg-json/docker-compose.yml +28 -0
  390. package/scripts/integrations/pg-json/init.sql +22 -0
  391. package/scripts/integrations/pg-json/reset.sh +3 -0
  392. package/scripts/integrations/postgres/docker-compose.yml +28 -0
  393. package/scripts/integrations/postgres/emp-skill.sql +46 -0
  394. package/scripts/integrations/postgres/emp-territory.sql +32 -0
  395. package/scripts/integrations/postgres/init.sql +57 -0
  396. package/scripts/integrations/postgres/reset.sh +3 -0
  397. package/scripts/integrations/service-vehicles/docker-compose.yml +28 -0
  398. package/scripts/integrations/service-vehicles/init.sql +52 -0
  399. package/scripts/integrations/service-vehicles/reset.sh +3 -0
  400. package/scripts/load/create-many-apps.js +24 -0
  401. package/scripts/load/create-many-rows.js +30 -0
  402. package/scripts/load/utils.js +66 -0
  403. package/scripts/localdomain.js +52 -0
  404. package/scripts/multiTenancy.js +8 -0
  405. package/scripts/selfhost.js +8 -0
  406. package/scripts/test.sh +14 -0
  407. package/scripts/watchtower-hooks/post-check.sh +1 -0
  408. package/scripts/watchtower-hooks/post-update.sh +1 -0
  409. package/scripts/watchtower-hooks/pre-check.sh +1 -0
  410. package/scripts/watchtower-hooks/pre-update.sh +1 -0
  411. package/specs/generate.ts +92 -0
  412. package/specs/openapi.json +2782 -0
  413. package/specs/openapi.yaml +2111 -0
  414. package/specs/parameters.ts +59 -0
  415. package/specs/resources/application.ts +137 -0
  416. package/specs/resources/index.ts +26 -0
  417. package/specs/resources/metrics.ts +81 -0
  418. package/specs/resources/misc.ts +128 -0
  419. package/specs/resources/query.ts +217 -0
  420. package/specs/resources/row.ts +124 -0
  421. package/specs/resources/table.ts +197 -0
  422. package/specs/resources/user.ts +132 -0
  423. package/specs/resources/utils/Resource.ts +39 -0
  424. package/specs/resources/utils/index.ts +11 -0
  425. package/specs/security.ts +7 -0
  426. package/src/api/controllers/analytics.ts +35 -0
  427. package/src/api/controllers/apikeys.ts +54 -0
  428. package/src/api/controllers/application.ts +633 -0
  429. package/src/api/controllers/auth.ts +72 -0
  430. package/src/api/controllers/automation.ts +302 -0
  431. package/src/api/controllers/backup.ts +21 -0
  432. package/src/api/controllers/cloud.ts +119 -0
  433. package/src/api/controllers/component.ts +58 -0
  434. package/src/api/controllers/datasource.ts +351 -0
  435. package/src/api/controllers/deploy/Deployment.ts +59 -0
  436. package/src/api/controllers/deploy/index.ts +203 -0
  437. package/src/api/controllers/dev.ts +129 -0
  438. package/src/api/controllers/integration.ts +13 -0
  439. package/src/api/controllers/layout.ts +47 -0
  440. package/src/api/controllers/metadata.ts +42 -0
  441. package/src/api/controllers/migrations.ts +14 -0
  442. package/src/api/controllers/ops.ts +32 -0
  443. package/src/api/controllers/permission.ts +178 -0
  444. package/src/api/controllers/plugin/file.ts +15 -0
  445. package/src/api/controllers/plugin/github.ts +75 -0
  446. package/src/api/controllers/plugin/index.ts +101 -0
  447. package/src/api/controllers/plugin/npm.ts +56 -0
  448. package/src/api/controllers/plugin/uploaders.ts +4 -0
  449. package/src/api/controllers/plugin/url.ts +12 -0
  450. package/src/api/controllers/plugin/utils.ts +17 -0
  451. package/src/api/controllers/public/applications.ts +100 -0
  452. package/src/api/controllers/public/mapping/applications.ts +32 -0
  453. package/src/api/controllers/public/mapping/index.ts +13 -0
  454. package/src/api/controllers/public/mapping/queries.ts +39 -0
  455. package/src/api/controllers/public/mapping/rows.ts +31 -0
  456. package/src/api/controllers/public/mapping/tables.ts +26 -0
  457. package/src/api/controllers/public/mapping/types.ts +21 -0
  458. package/src/api/controllers/public/mapping/users.ts +32 -0
  459. package/src/api/controllers/public/metrics.ts +251 -0
  460. package/src/api/controllers/public/queries.ts +20 -0
  461. package/src/api/controllers/public/rows.ts +81 -0
  462. package/src/api/controllers/public/tables.ts +56 -0
  463. package/src/api/controllers/public/users.ts +80 -0
  464. package/src/api/controllers/public/utils.ts +45 -0
  465. package/src/api/controllers/query/import/index.ts +96 -0
  466. package/src/api/controllers/query/import/sources/base/index.ts +98 -0
  467. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  468. package/src/api/controllers/query/import/sources/curl.ts +106 -0
  469. package/src/api/controllers/query/import/sources/openapi2.ts +167 -0
  470. package/src/api/controllers/query/import/sources/openapi3.ts +209 -0
  471. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  472. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  473. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  474. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  475. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  476. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  477. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  478. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  479. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  480. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  481. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  482. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  483. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  484. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  485. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  486. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  487. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  488. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  489. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  490. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  491. package/src/api/controllers/query/import/tests/index.spec.js +162 -0
  492. package/src/api/controllers/query/index.ts +307 -0
  493. package/src/api/controllers/query/validation.ts +50 -0
  494. package/src/api/controllers/role.ts +104 -0
  495. package/src/api/controllers/routing.ts +95 -0
  496. package/src/api/controllers/row/ExternalRequest.ts +821 -0
  497. package/src/api/controllers/row/external.ts +304 -0
  498. package/src/api/controllers/row/index.ts +162 -0
  499. package/src/api/controllers/row/internal.ts +500 -0
  500. package/src/api/controllers/row/internalSearch.ts +18 -0
  501. package/src/api/controllers/row/staticFormula.ts +170 -0
  502. package/src/api/controllers/row/utils.ts +156 -0
  503. package/src/api/controllers/screen.ts +126 -0
  504. package/src/api/controllers/script.ts +12 -0
  505. package/src/api/controllers/static/index.ts +241 -0
  506. package/src/api/controllers/static/templates/BudibaseApp.svelte +135 -0
  507. package/src/api/controllers/static/templates/app.hbs +13 -0
  508. package/src/api/controllers/static/templates/preview.hbs +117 -0
  509. package/src/api/controllers/table/bulkFormula.ts +188 -0
  510. package/src/api/controllers/table/external.ts +364 -0
  511. package/src/api/controllers/table/index.ts +143 -0
  512. package/src/api/controllers/table/internal.ts +191 -0
  513. package/src/api/controllers/table/tests/utils.spec.ts +97 -0
  514. package/src/api/controllers/table/utils.ts +422 -0
  515. package/src/api/controllers/templates.ts +43 -0
  516. package/src/api/controllers/user.ts +97 -0
  517. package/src/api/controllers/view/exporters.ts +43 -0
  518. package/src/api/controllers/view/index.ts +192 -0
  519. package/src/api/controllers/view/tests/__snapshots__/viewBuilder.spec.js.snap +147 -0
  520. package/src/api/controllers/view/tests/viewBuilder.spec.js +65 -0
  521. package/src/api/controllers/view/utils.ts +165 -0
  522. package/src/api/controllers/view/viewBuilder.ts +203 -0
  523. package/src/api/controllers/webhook.ts +100 -0
  524. package/src/api/index.ts +63 -0
  525. package/src/api/routes/analytics.ts +9 -0
  526. package/src/api/routes/apikeys.ts +12 -0
  527. package/src/api/routes/application.ts +57 -0
  528. package/src/api/routes/auth.ts +8 -0
  529. package/src/api/routes/automation.ts +87 -0
  530. package/src/api/routes/backup.ts +14 -0
  531. package/src/api/routes/cloud.ts +18 -0
  532. package/src/api/routes/component.ts +14 -0
  533. package/src/api/routes/datasource.ts +60 -0
  534. package/src/api/routes/deploy.ts +20 -0
  535. package/src/api/routes/dev.ts +38 -0
  536. package/src/api/routes/index.ts +73 -0
  537. package/src/api/routes/integration.ts +16 -0
  538. package/src/api/routes/layout.ts +16 -0
  539. package/src/api/routes/metadata.ts +38 -0
  540. package/src/api/routes/migrations.ts +14 -0
  541. package/src/api/routes/ops.ts +30 -0
  542. package/src/api/routes/permission.ts +41 -0
  543. package/src/api/routes/plugin.ts +22 -0
  544. package/src/api/routes/public/applications.ts +195 -0
  545. package/src/api/routes/public/index.ts +145 -0
  546. package/src/api/routes/public/metrics.ts +28 -0
  547. package/src/api/routes/public/middleware/mapper.ts +85 -0
  548. package/src/api/routes/public/queries.ts +76 -0
  549. package/src/api/routes/public/rows.ts +171 -0
  550. package/src/api/routes/public/tables.ts +167 -0
  551. package/src/api/routes/public/tests/compare.spec.ts +185 -0
  552. package/src/api/routes/public/tests/metrics.spec.js +34 -0
  553. package/src/api/routes/public/tests/users.spec.js +38 -0
  554. package/src/api/routes/public/tests/utils.ts +45 -0
  555. package/src/api/routes/public/users.ts +142 -0
  556. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  557. package/src/api/routes/query.ts +61 -0
  558. package/src/api/routes/role.ts +24 -0
  559. package/src/api/routes/routing.ts +14 -0
  560. package/src/api/routes/row.ts +266 -0
  561. package/src/api/routes/screen.ts +23 -0
  562. package/src/api/routes/script.ts +10 -0
  563. package/src/api/routes/static.ts +65 -0
  564. package/src/api/routes/table.ts +170 -0
  565. package/src/api/routes/templates.ts +16 -0
  566. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +93 -0
  567. package/src/api/routes/tests/__snapshots__/view.spec.js.snap +38 -0
  568. package/src/api/routes/tests/analytics.spec.js +62 -0
  569. package/src/api/routes/tests/apikeys.spec.js +59 -0
  570. package/src/api/routes/tests/appSync.spec.ts +31 -0
  571. package/src/api/routes/tests/application.spec.ts +327 -0
  572. package/src/api/routes/tests/auth.spec.js +24 -0
  573. package/src/api/routes/tests/automation.spec.js +349 -0
  574. package/src/api/routes/tests/backup.spec.ts +45 -0
  575. package/src/api/routes/tests/cloud.spec.ts +54 -0
  576. package/src/api/routes/tests/component.spec.js +32 -0
  577. package/src/api/routes/tests/data/budibase-component-1.0.1.tgz +0 -0
  578. package/src/api/routes/tests/data/comment-box-1.0.2.tar.gz +0 -0
  579. package/src/api/routes/tests/data/export-test.tar.gz +0 -0
  580. package/src/api/routes/tests/data/export.txt +1 -0
  581. package/src/api/routes/tests/data/old-app.txt +3 -0
  582. package/src/api/routes/tests/datasource.spec.ts +238 -0
  583. package/src/api/routes/tests/dev.spec.js +40 -0
  584. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  585. package/src/api/routes/tests/integration.spec.js +52 -0
  586. package/src/api/routes/tests/internalSearch.spec.js +197 -0
  587. package/src/api/routes/tests/layout.spec.js +59 -0
  588. package/src/api/routes/tests/metadata.spec.js +65 -0
  589. package/src/api/routes/tests/misc.spec.js +91 -0
  590. package/src/api/routes/tests/permissions.spec.js +133 -0
  591. package/src/api/routes/tests/plugin.spec.ts +179 -0
  592. package/src/api/routes/tests/query.seq.spec.js +538 -0
  593. package/src/api/routes/tests/role.spec.js +131 -0
  594. package/src/api/routes/tests/routing.spec.js +116 -0
  595. package/src/api/routes/tests/row.spec.js +573 -0
  596. package/src/api/routes/tests/screen.spec.js +103 -0
  597. package/src/api/routes/tests/static.spec.js +140 -0
  598. package/src/api/routes/tests/table.spec.js +302 -0
  599. package/src/api/routes/tests/templates.spec.js +24 -0
  600. package/src/api/routes/tests/user.spec.js +208 -0
  601. package/src/api/routes/tests/utilities/TestFunctions.ts +177 -0
  602. package/src/api/routes/tests/utilities/index.ts +96 -0
  603. package/src/api/routes/tests/view.spec.js +419 -0
  604. package/src/api/routes/tests/webhook.spec.js +134 -0
  605. package/src/api/routes/user.ts +46 -0
  606. package/src/api/routes/utils/validators.ts +240 -0
  607. package/src/api/routes/view.ts +34 -0
  608. package/src/api/routes/webhook.ts +27 -0
  609. package/src/app.ts +114 -0
  610. package/src/automations/actions.ts +109 -0
  611. package/src/automations/automationUtils.ts +163 -0
  612. package/src/automations/bullboard.ts +38 -0
  613. package/src/automations/index.ts +26 -0
  614. package/src/automations/logging/index.ts +38 -0
  615. package/src/automations/steps/bash.ts +81 -0
  616. package/src/automations/steps/createRow.ts +102 -0
  617. package/src/automations/steps/delay.ts +46 -0
  618. package/src/automations/steps/deleteRow.ts +91 -0
  619. package/src/automations/steps/discord.ts +106 -0
  620. package/src/automations/steps/executeQuery.ts +98 -0
  621. package/src/automations/steps/executeScript.ts +83 -0
  622. package/src/automations/steps/filter.ts +105 -0
  623. package/src/automations/steps/integromat.ts +110 -0
  624. package/src/automations/steps/loop.ts +58 -0
  625. package/src/automations/steps/outgoingWebhook.ts +141 -0
  626. package/src/automations/steps/queryRows.ts +196 -0
  627. package/src/automations/steps/sendSmtpEmail.ts +92 -0
  628. package/src/automations/steps/serverLog.ts +59 -0
  629. package/src/automations/steps/slack.ts +87 -0
  630. package/src/automations/steps/updateRow.ts +121 -0
  631. package/src/automations/steps/utils.ts +46 -0
  632. package/src/automations/steps/zapier.ts +108 -0
  633. package/src/automations/tests/automation.spec.ts +99 -0
  634. package/src/automations/tests/bash.spec.js +34 -0
  635. package/src/automations/tests/createRow.spec.ts +46 -0
  636. package/src/automations/tests/delay.spec.js +16 -0
  637. package/src/automations/tests/deleteRow.spec.ts +55 -0
  638. package/src/automations/tests/discord.spec.js +27 -0
  639. package/src/automations/tests/executeQuery.spec.js +48 -0
  640. package/src/automations/tests/executeScript.spec.js +48 -0
  641. package/src/automations/tests/filter.spec.js +49 -0
  642. package/src/automations/tests/loop.spec.ts +45 -0
  643. package/src/automations/tests/outgoingWebhook.spec.js +39 -0
  644. package/src/automations/tests/queryRows.spec.js +117 -0
  645. package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
  646. package/src/automations/tests/serverLog.spec.js +22 -0
  647. package/src/automations/tests/updateRow.spec.js +44 -0
  648. package/src/automations/tests/utilities/index.ts +60 -0
  649. package/src/automations/tests/zapier.spec.js +27 -0
  650. package/src/automations/triggerInfo/app.ts +40 -0
  651. package/src/automations/triggerInfo/cron.ts +39 -0
  652. package/src/automations/triggerInfo/index.ts +15 -0
  653. package/src/automations/triggerInfo/rowDeleted.ts +40 -0
  654. package/src/automations/triggerInfo/rowSaved.ts +48 -0
  655. package/src/automations/triggerInfo/rowUpdated.ts +48 -0
  656. package/src/automations/triggerInfo/webhook.ts +44 -0
  657. package/src/automations/triggers.ts +156 -0
  658. package/src/automations/unitTests/automationUtils.spec.ts +133 -0
  659. package/src/automations/utils.ts +267 -0
  660. package/src/constants/definitions.ts +42 -0
  661. package/src/constants/index.ts +183 -0
  662. package/src/constants/layouts.ts +147 -0
  663. package/src/constants/screens.ts +48 -0
  664. package/src/db/defaultData/datasource_bb_default.ts +654 -0
  665. package/src/db/defaultData/employeeImport.ts +152 -0
  666. package/src/db/defaultData/expensesImport.ts +114 -0
  667. package/src/db/defaultData/inventoryImport.ts +106 -0
  668. package/src/db/defaultData/jobsImport.ts +158 -0
  669. package/src/db/dynamoClient.ts +147 -0
  670. package/src/db/inMemoryView.ts +55 -0
  671. package/src/db/index.ts +16 -0
  672. package/src/db/linkedRows/LinkController.ts +445 -0
  673. package/src/db/linkedRows/LinkDocument.ts +60 -0
  674. package/src/db/linkedRows/index.ts +217 -0
  675. package/src/db/linkedRows/linkUtils.ts +125 -0
  676. package/src/db/newid.ts +5 -0
  677. package/src/db/tests/linkController.spec.js +236 -0
  678. package/src/db/tests/linkTests.spec.js +65 -0
  679. package/src/db/utils.ts +272 -0
  680. package/src/db/views/staticViews.ts +132 -0
  681. package/src/ddApm.ts +7 -0
  682. package/src/definitions/automations.ts +33 -0
  683. package/src/definitions/common.ts +54 -0
  684. package/src/definitions/datasource.ts +9 -0
  685. package/src/definitions/openapi.ts +1233 -0
  686. package/src/environment.ts +125 -0
  687. package/src/events/AutomationEmitter.ts +58 -0
  688. package/src/events/BudibaseEmitter.ts +29 -0
  689. package/src/events/docUpdates/index.ts +1 -0
  690. package/src/events/docUpdates/processors.ts +14 -0
  691. package/src/events/docUpdates/syncUsers.ts +35 -0
  692. package/src/events/index.ts +6 -0
  693. package/src/events/utils.ts +78 -0
  694. package/src/index.ts +16 -0
  695. package/src/integration-test/postgres.spec.ts +1026 -0
  696. package/src/integrations/airtable.ts +148 -0
  697. package/src/integrations/arangodb.ts +110 -0
  698. package/src/integrations/base/query.ts +18 -0
  699. package/src/integrations/base/sql.ts +651 -0
  700. package/src/integrations/base/sqlTable.ts +202 -0
  701. package/src/integrations/base/types.ts +134 -0
  702. package/src/integrations/couchdb.ts +133 -0
  703. package/src/integrations/dynamodb.ts +220 -0
  704. package/src/integrations/elasticsearch.ts +187 -0
  705. package/src/integrations/firebase.ts +187 -0
  706. package/src/integrations/googlesheets.ts +511 -0
  707. package/src/integrations/index.ts +125 -0
  708. package/src/integrations/microsoftSqlServer.ts +312 -0
  709. package/src/integrations/mongodb.ts +638 -0
  710. package/src/integrations/mysql.ts +300 -0
  711. package/src/integrations/oracle.ts +435 -0
  712. package/src/integrations/postgres.ts +336 -0
  713. package/src/integrations/queries/sql.ts +81 -0
  714. package/src/integrations/redis.ts +163 -0
  715. package/src/integrations/rest.ts +436 -0
  716. package/src/integrations/s3.ts +260 -0
  717. package/src/integrations/snowflake.ts +97 -0
  718. package/src/integrations/tests/TestConfiguration.js +0 -0
  719. package/src/integrations/tests/airtable.spec.ts +75 -0
  720. package/src/integrations/tests/arangodb.spec.ts +38 -0
  721. package/src/integrations/tests/couchdb.spec.ts +86 -0
  722. package/src/integrations/tests/dynamodb.spec.ts +155 -0
  723. package/src/integrations/tests/elasticsearch.spec.ts +82 -0
  724. package/src/integrations/tests/firebase.spec.ts +97 -0
  725. package/src/integrations/tests/googlesheets.spec.ts +126 -0
  726. package/src/integrations/tests/microsoftSqlServer.spec.ts +56 -0
  727. package/src/integrations/tests/mongo.spec.ts +334 -0
  728. package/src/integrations/tests/mysql.spec.ts +133 -0
  729. package/src/integrations/tests/oracle.spec.ts +96 -0
  730. package/src/integrations/tests/postgres.spec.ts +81 -0
  731. package/src/integrations/tests/redis.spec.ts +88 -0
  732. package/src/integrations/tests/rest.spec.ts +595 -0
  733. package/src/integrations/tests/s3.spec.ts +112 -0
  734. package/src/integrations/tests/sql.spec.ts +639 -0
  735. package/src/integrations/utils.ts +330 -0
  736. package/src/middleware/appInfo.ts +20 -0
  737. package/src/middleware/authorized.ts +131 -0
  738. package/src/middleware/builder.ts +97 -0
  739. package/src/middleware/currentapp.ts +112 -0
  740. package/src/middleware/joi-validator.ts +40 -0
  741. package/src/middleware/publicApi.ts +21 -0
  742. package/src/middleware/resourceId.ts +66 -0
  743. package/src/middleware/selfhost.ts +12 -0
  744. package/src/middleware/tests/authorized.spec.js +163 -0
  745. package/src/middleware/tests/currentapp.spec.js +207 -0
  746. package/src/middleware/tests/resourceId.spec.js +105 -0
  747. package/src/middleware/tests/selfhost.spec.js +43 -0
  748. package/src/middleware/utils.ts +9 -0
  749. package/src/migrations/functions/appUrls.ts +27 -0
  750. package/src/migrations/functions/backfill/app/automations.ts +26 -0
  751. package/src/migrations/functions/backfill/app/datasources.ts +22 -0
  752. package/src/migrations/functions/backfill/app/layouts.ts +29 -0
  753. package/src/migrations/functions/backfill/app/queries.ts +47 -0
  754. package/src/migrations/functions/backfill/app/roles.ts +22 -0
  755. package/src/migrations/functions/backfill/app/screens.ts +22 -0
  756. package/src/migrations/functions/backfill/app/tables.ts +27 -0
  757. package/src/migrations/functions/backfill/app.ts +149 -0
  758. package/src/migrations/functions/backfill/global/configs.ts +73 -0
  759. package/src/migrations/functions/backfill/global/quotas.ts +60 -0
  760. package/src/migrations/functions/backfill/global/users.ts +49 -0
  761. package/src/migrations/functions/backfill/global.ts +213 -0
  762. package/src/migrations/functions/backfill/index.ts +7 -0
  763. package/src/migrations/functions/backfill/installation.ts +50 -0
  764. package/src/migrations/functions/syncQuotas.ts +15 -0
  765. package/src/migrations/functions/tableSettings.ts +145 -0
  766. package/src/migrations/functions/tests/appUrls.spec.js +26 -0
  767. package/src/migrations/functions/tests/syncQuotas.spec.js +26 -0
  768. package/src/migrations/functions/tests/tableSettings.spec.ts +144 -0
  769. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +34 -0
  770. package/src/migrations/functions/usageQuotas/index.ts +3 -0
  771. package/src/migrations/functions/usageQuotas/syncApps.ts +14 -0
  772. package/src/migrations/functions/usageQuotas/syncPlugins.ts +10 -0
  773. package/src/migrations/functions/usageQuotas/syncRows.ts +27 -0
  774. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +35 -0
  775. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +53 -0
  776. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  777. package/src/migrations/index.ts +115 -0
  778. package/src/migrations/tests/helpers.ts +40 -0
  779. package/src/migrations/tests/index.spec.ts +142 -0
  780. package/src/migrations/tests/structures.ts +67 -0
  781. package/src/sdk/app/applications/index.ts +7 -0
  782. package/src/sdk/app/applications/sync.ts +168 -0
  783. package/src/sdk/app/applications/tests/sync.spec.ts +137 -0
  784. package/src/sdk/app/applications/utils.ts +17 -0
  785. package/src/sdk/app/automations/index.ts +5 -0
  786. package/src/sdk/app/automations/webhook.ts +43 -0
  787. package/src/sdk/app/backups/constants.ts +3 -0
  788. package/src/sdk/app/backups/exports.ts +195 -0
  789. package/src/sdk/app/backups/imports.ts +185 -0
  790. package/src/sdk/app/backups/index.ts +9 -0
  791. package/src/sdk/app/backups/statistics.ts +69 -0
  792. package/src/sdk/app/datasources/datasources.ts +162 -0
  793. package/src/sdk/app/datasources/index.ts +5 -0
  794. package/src/sdk/app/queries/index.ts +5 -0
  795. package/src/sdk/app/queries/queries.ts +50 -0
  796. package/src/sdk/app/rows/attachments.ts +60 -0
  797. package/src/sdk/app/rows/index.ts +7 -0
  798. package/src/sdk/app/rows/rows.ts +18 -0
  799. package/src/sdk/app/tables/index.ts +63 -0
  800. package/src/sdk/index.ts +24 -0
  801. package/src/sdk/plugins/index.ts +5 -0
  802. package/src/sdk/plugins/plugins.ts +41 -0
  803. package/src/sdk/tests/attachments.spec.ts +76 -0
  804. package/src/sdk/users/index.ts +5 -0
  805. package/src/sdk/users/tests/utils.spec.ts +128 -0
  806. package/src/sdk/users/utils.ts +93 -0
  807. package/src/sdk/utils/index.ts +16 -0
  808. package/src/startup.ts +138 -0
  809. package/src/tests/jestEnv.ts +11 -0
  810. package/src/tests/jestSetup.ts +22 -0
  811. package/src/tests/utilities/TestConfiguration.ts +768 -0
  812. package/src/tests/utilities/controllers.ts +14 -0
  813. package/src/tests/utilities/index.ts +11 -0
  814. package/src/tests/utilities/structures.ts +289 -0
  815. package/src/threads/automation.ts +502 -0
  816. package/src/threads/definitions.ts +21 -0
  817. package/src/threads/index.ts +111 -0
  818. package/src/threads/query.ts +305 -0
  819. package/src/threads/utils.ts +96 -0
  820. package/src/utilities/appDirectoryTemplate/package.json +10 -0
  821. package/src/utilities/budibaseDir.ts +3 -0
  822. package/src/utilities/centralPath.ts +22 -0
  823. package/src/utilities/fileSystem/app.ts +79 -0
  824. package/src/utilities/fileSystem/clientLibrary.ts +154 -0
  825. package/src/utilities/fileSystem/filesystem.ts +168 -0
  826. package/src/utilities/fileSystem/index.ts +5 -0
  827. package/src/utilities/fileSystem/plugin.ts +73 -0
  828. package/src/utilities/fileSystem/processor.ts +19 -0
  829. package/src/utilities/fileSystem/template.ts +36 -0
  830. package/src/utilities/global.ts +153 -0
  831. package/src/utilities/index.ts +134 -0
  832. package/src/utilities/redis.ts +88 -0
  833. package/src/utilities/retry.ts +18 -0
  834. package/src/utilities/routing/index.ts +32 -0
  835. package/src/utilities/rowProcessor/index.ts +279 -0
  836. package/src/utilities/rowProcessor/map.ts +96 -0
  837. package/src/utilities/rowProcessor/tests/utils.spec.ts +57 -0
  838. package/src/utilities/rowProcessor/utils.ts +96 -0
  839. package/src/utilities/schema.ts +141 -0
  840. package/src/utilities/scriptRunner.ts +28 -0
  841. package/src/utilities/security.ts +65 -0
  842. package/{utilities/statusCodes.js → src/utilities/statusCodes.ts} +1 -1
  843. package/src/utilities/tests/test.csv +4 -0
  844. package/src/utilities/usageQuota/rows.ts +80 -0
  845. package/src/utilities/usageQuota/usageQuoteReset.ts +18 -0
  846. package/src/utilities/users.ts +49 -0
  847. package/src/utilities/workerRequests.ts +188 -0
  848. package/src/watch.ts +37 -0
  849. package/src/websockets/client.ts +11 -0
  850. package/src/websockets/grid.ts +55 -0
  851. package/src/websockets/index.ts +14 -0
  852. package/src/websockets/websocket.ts +83 -0
  853. package/tsconfig.build.json +28 -0
  854. package/tsconfig.json +22 -0
  855. package/app.js +0 -20
  856. package/appPackages/_master/access_levels.json +0 -175
  857. package/appPackages/_master/appDefinition.json +0 -527
  858. package/appPackages/_master/main.js +0 -125
  859. package/appPackages/_master/node_modules/.yarn-integrity +0 -20
  860. package/appPackages/_master/node_modules/@budibase/materialdesign-components/README.md +0 -33
  861. package/appPackages/_master/node_modules/@budibase/materialdesign-components/components.json +0 -249
  862. package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js +0 -11282
  863. package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js.map +0 -1
  864. package/appPackages/_master/node_modules/@budibase/materialdesign-components/package.json +0 -50
  865. package/appPackages/_master/node_modules/@budibase/standard-components/README.md +0 -33
  866. package/appPackages/_master/node_modules/@budibase/standard-components/components.json +0 -239
  867. package/appPackages/_master/node_modules/@budibase/standard-components/dist/generators.js +0 -198
  868. package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js +0 -3460
  869. package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js.map +0 -1
  870. package/appPackages/_master/node_modules/@budibase/standard-components/package.json +0 -38
  871. package/appPackages/_master/package-lock.json +0 -247
  872. package/appPackages/_master/package.json +0 -14
  873. package/appPackages/_master/pages/main/page.json +0 -199
  874. package/appPackages/_master/pages/main/screens/Apps List.json +0 -131
  875. package/appPackages/_master/pages/main/screens/Manage App.json +0 -292
  876. package/appPackages/_master/pages/main/screens/New App.json +0 -410
  877. package/appPackages/_master/pages/main/screens/New Instance.json +0 -227
  878. package/appPackages/_master/pages/unauthenticated/page.json +0 -83
  879. package/appPackages/_master/plugins.js +0 -3
  880. package/appPackages/_master/public/_shared/budibase-logo.png +0 -0
  881. package/appPackages/_master/public/main/budibase-client.js +0 -25115
  882. package/appPackages/_master/public/main/budibase-client.js.map +0 -1
  883. package/appPackages/_master/public/main/index.html +0 -48
  884. package/appPackages/_master/public/main/index.js +0 -3397
  885. package/appPackages/_master/public/main/index.js.map +0 -1
  886. package/appPackages/_master/public/unauthenticated/budibase-client.js +0 -25115
  887. package/appPackages/_master/public/unauthenticated/budibase-client.js.map +0 -1
  888. package/appPackages/_master/public/unauthenticated/index.html +0 -40
  889. package/appPackages/_master/public/unauthenticated/index.js +0 -3397
  890. package/appPackages/_master/public/unauthenticated/index.js.map +0 -1
  891. package/appPackages/_master/yarn.lock +0 -13
  892. package/builder/__app.html +0 -22
  893. package/builder/assets/budibase-emblem-white.svg +0 -29
  894. package/builder/assets/budibase-logo-only.png +0 -0
  895. package/builder/assets/budibase-logo-white.png +0 -0
  896. package/builder/assets/budibase-logo.png +0 -0
  897. package/builder/assets/javascript-logo.svg +0 -1
  898. package/builder/assets/roboto-v20-latin-ext_latin-300.woff +0 -0
  899. package/builder/assets/roboto-v20-latin-ext_latin-300.woff2 +0 -0
  900. package/builder/assets/roboto-v20-latin-ext_latin-500.woff +0 -0
  901. package/builder/assets/roboto-v20-latin-ext_latin-500.woff2 +0 -0
  902. package/builder/assets/roboto-v20-latin-ext_latin-700.woff +0 -0
  903. package/builder/assets/roboto-v20-latin-ext_latin-700.woff2 +0 -0
  904. package/builder/assets/roboto-v20-latin-ext_latin-900.woff +0 -0
  905. package/builder/assets/roboto-v20-latin-ext_latin-900.woff2 +0 -0
  906. package/builder/assets/roboto-v20-latin-ext_latin-regular.woff +0 -0
  907. package/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 +0 -0
  908. package/builder/budibase-client.esm.mjs +0 -24948
  909. package/builder/budibase.css +0 -120
  910. package/builder/bundle.css +0 -70
  911. package/builder/bundle.css.map +0 -146
  912. package/builder/bundle.js +0 -99294
  913. package/builder/bundle.js.map +0 -1
  914. package/builder/codemirror.css +0 -349
  915. package/builder/favicon.png +0 -0
  916. package/builder/flatpickr.css +0 -784
  917. package/builder/fonts.css +0 -47
  918. package/builder/global.css +0 -111
  919. package/builder/monokai.css +0 -41
  920. package/builder/uikit.min.css +0 -1
  921. package/config.contributors.js +0 -13
  922. package/config.dev.js +0 -13
  923. package/config.sample.js +0 -33
  924. package/index.js +0 -24
  925. package/initialise/buildAppContext.js +0 -11
  926. package/initialise/createInstanceDb.js +0 -37
  927. package/initialise/createMasterDb.js +0 -34
  928. package/initialise/initialiseBudibase.js +0 -1
  929. package/initialise/initialiseRuntimePackages.js +0 -42
  930. package/middleware/routeHandlers/aggregatesPost.js +0 -12
  931. package/middleware/routeHandlers/appDefault.js +0 -21
  932. package/middleware/routeHandlers/authenticate.js +0 -15
  933. package/middleware/routeHandlers/changeMyPassword.js +0 -9
  934. package/middleware/routeHandlers/createTemporaryAccess.js +0 -17
  935. package/middleware/routeHandlers/createUser.js +0 -10
  936. package/middleware/routeHandlers/deleteRecord.js +0 -9
  937. package/middleware/routeHandlers/disableUser.js +0 -11
  938. package/middleware/routeHandlers/enableUser.js +0 -6
  939. package/middleware/routeHandlers/executeAction.js +0 -9
  940. package/middleware/routeHandlers/getAccessLevels.js +0 -6
  941. package/middleware/routeHandlers/getRecord.js +0 -15
  942. package/middleware/routeHandlers/getUsers.js +0 -6
  943. package/middleware/routeHandlers/helpers.js +0 -15
  944. package/middleware/routeHandlers/index.js +0 -45
  945. package/middleware/routeHandlers/listRecordsGet.js +0 -8
  946. package/middleware/routeHandlers/listRecordsPost.js +0 -12
  947. package/middleware/routeHandlers/lookupField.js +0 -14
  948. package/middleware/routeHandlers/postFiles.js +0 -13
  949. package/middleware/routeHandlers/saveAppHierarchy.js +0 -6
  950. package/middleware/routeHandlers/saveRecord.js +0 -6
  951. package/middleware/routeHandlers/setPasswordFromTemporaryCode.js +0 -20
  952. package/middleware/routeHandlers/upgradeData.js +0 -11
  953. package/middleware/routers.js +0 -330
  954. package/middleware/session.js +0 -24
  955. package/utilities/budibaseApi.js +0 -84
  956. package/utilities/builder/buildPage.js +0 -164
  957. package/utilities/builder/componentLibraryInfo.js +0 -77
  958. package/utilities/builder/convertCssToFiles.js +0 -43
  959. package/utilities/builder/deleteCodeMeta.js +0 -9
  960. package/utilities/builder/getPages.js +0 -20
  961. package/utilities/builder/index.js +0 -165
  962. package/utilities/builder/index.template.html +0 -44
  963. package/utilities/builder/listScreens.js +0 -48
  964. package/utilities/builder/publicPath.js +0 -3
  965. package/utilities/builder/saveBackend.js +0 -28
  966. package/utilities/constructHierarchy.js +0 -8
  967. package/utilities/createAppPackage.js +0 -101
  968. package/utilities/databaseManager.js +0 -4
  969. package/utilities/datastore.js +0 -2
  970. package/utilities/exceptions.js +0 -16
  971. package/utilities/injectedPlugins/createUser.js +0 -19
  972. package/utilities/injectedPlugins/disableUser.js +0 -3
  973. package/utilities/injectedPlugins/enableUser.js +0 -3
  974. package/utilities/injectedPlugins/index.js +0 -76
  975. package/utilities/masterAppInternal.js +0 -384
  976. package/utilities/runtimePackages.js +0 -34
  977. package/utilities/targzAppPackage.js +0 -119
@@ -0,0 +1,168 @@
1
+ import { PathLike } from "fs"
2
+ import fs from "fs"
3
+ import { budibaseTempDir } from "../budibaseDir"
4
+ import { join } from "path"
5
+ import env from "../../environment"
6
+ import tar from "tar"
7
+ const uuid = require("uuid/v4")
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
+ }
28
+
29
+ /**
30
+ * Checks if the system is currently in development mode and if it is makes sure
31
+ * everything required to function is ready.
32
+ */
33
+ export const checkDevelopmentEnvironment = () => {
34
+ if (!env.isDev() || env.isTest()) {
35
+ return
36
+ }
37
+ if (!fs.existsSync(budibaseTempDir())) {
38
+ fs.mkdirSync(budibaseTempDir())
39
+ }
40
+ let error
41
+ if (!fs.existsSync(join(process.cwd(), ".env"))) {
42
+ error = "Must run via yarn once to generate environment."
43
+ }
44
+ if (error) {
45
+ console.error(error)
46
+ process.exit(-1)
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Used to retrieve a handlebars file from the system which will be used as a template.
52
+ * This is allowable as the template handlebars files should be static and identical across
53
+ * the cluster.
54
+ * @param {string} path The path to the handlebars file which is to be loaded.
55
+ * @returns {string} The loaded handlebars file as a string - loaded as utf8.
56
+ */
57
+ export const loadHandlebarsFile = (path: PathLike) => {
58
+ return fs.readFileSync(path, "utf8")
59
+ }
60
+
61
+ /**
62
+ * When return a file from the API need to write the file to the system temporarily so we
63
+ * can create a read stream to send.
64
+ * @param {string} contents the contents of the file which is to be returned from the API.
65
+ * @return {Object} the read stream which can be put into the koa context body.
66
+ */
67
+ export const apiFileReturn = (contents: any) => {
68
+ const path = join(budibaseTempDir(), uuid())
69
+ fs.writeFileSync(path, contents)
70
+ return fs.createReadStream(path)
71
+ }
72
+
73
+ export const streamFile = (path: string) => {
74
+ return fs.createReadStream(path)
75
+ }
76
+
77
+ /**
78
+ * Writes the provided contents to a temporary file, which can be used briefly.
79
+ * @param {string} fileContents contents which will be written to a temp file.
80
+ * @return {string} the path to the temp file.
81
+ */
82
+ export const storeTempFile = (fileContents: any) => {
83
+ const path = join(budibaseTempDir(), uuid())
84
+ fs.writeFileSync(path, fileContents)
85
+ return path
86
+ }
87
+
88
+ /**
89
+ * Utility function for getting a file read stream - a simple in memory buffered read
90
+ * stream doesn't work for pouchdb.
91
+ */
92
+ export const stringToFileStream = (contents: any) => {
93
+ const path = storeTempFile(contents)
94
+ return fs.createReadStream(path)
95
+ }
96
+
97
+ /**
98
+ * Creates a temp file and returns it from the API.
99
+ * @param {string} fileContents the contents to be returned in file.
100
+ */
101
+ export const sendTempFile = (fileContents: any) => {
102
+ const path = storeTempFile(fileContents)
103
+ return fs.createReadStream(path)
104
+ }
105
+
106
+ /**
107
+ * All file reads come through here just to make sure all of them make sense
108
+ * allows a centralised location to check logic is all good.
109
+ */
110
+ export const readFileSync = (filepath: PathLike, options = "utf8") => {
111
+ // @ts-ignore
112
+ return fs.readFileSync(filepath, options)
113
+ }
114
+
115
+ export const createTempFolder = (item: any) => {
116
+ const path = join(budibaseTempDir(), item)
117
+ try {
118
+ // remove old tmp directories automatically - don't combine
119
+ if (fs.existsSync(path)) {
120
+ fs.rmSync(path, { recursive: true, force: true })
121
+ }
122
+ fs.mkdirSync(path)
123
+ } catch (err: any) {
124
+ throw new Error(`Path cannot be created: ${err.message}`)
125
+ }
126
+
127
+ return path
128
+ }
129
+
130
+ export const extractTarball = async (fromFilePath: string, toPath: string) => {
131
+ await tar.extract({
132
+ file: fromFilePath,
133
+ C: toPath,
134
+ })
135
+ }
136
+
137
+ /**
138
+ * Find for a file recursively from start path applying filter, return first match
139
+ */
140
+ export const findFileRec = (startPath: PathLike, filter: string): any => {
141
+ if (!fs.existsSync(startPath)) {
142
+ return
143
+ }
144
+
145
+ const files = fs.readdirSync(startPath)
146
+ for (let i = 0, len = files.length; i < len; i++) {
147
+ // @ts-ignore
148
+ const filename = join(startPath, files[i])
149
+ const stat = fs.lstatSync(filename)
150
+
151
+ if (stat.isDirectory()) {
152
+ return findFileRec(filename, filter)
153
+ } else if (filename.endsWith(filter)) {
154
+ return filename
155
+ }
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Remove a folder which is not empty from the file system
161
+ */
162
+ export const deleteFolderFileSystem = (path: PathLike) => {
163
+ if (!fs.existsSync(path)) {
164
+ return
165
+ }
166
+
167
+ fs.rmSync(path, { recursive: true, force: true })
168
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./app"
2
+ export * from "./clientLibrary"
3
+ export * from "./filesystem"
4
+ export * from "./plugin"
5
+ export * from "./template"
@@ -0,0 +1,73 @@
1
+ import { Plugin } from "@budibase/types"
2
+ import { budibaseTempDir } from "../budibaseDir"
3
+ import fs from "fs"
4
+ import { join } from "path"
5
+ import { objectStore } from "@budibase/backend-core"
6
+
7
+ const DATASOURCE_PATH = join(budibaseTempDir(), "datasource")
8
+ const AUTOMATION_PATH = join(budibaseTempDir(), "automation")
9
+
10
+ export const getPluginMetadata = async (path: string) => {
11
+ let metadata: any = {}
12
+ try {
13
+ const pkg = fs.readFileSync(join(path, "package.json"), "utf8")
14
+ const schema = fs.readFileSync(join(path, "schema.json"), "utf8")
15
+
16
+ metadata.schema = JSON.parse(schema)
17
+ metadata.package = JSON.parse(pkg)
18
+
19
+ if (
20
+ !metadata.package.name ||
21
+ !metadata.package.version ||
22
+ !metadata.package.description
23
+ ) {
24
+ throw new Error(
25
+ "package.json is missing one of 'name', 'version' or 'description'."
26
+ )
27
+ }
28
+ } catch (err: any) {
29
+ throw new Error(
30
+ `Unable to process schema.json/package.json in plugin. ${err.message}`
31
+ )
32
+ }
33
+
34
+ return { metadata, directory: path }
35
+ }
36
+
37
+ async function getPluginImpl(path: string, plugin: Plugin) {
38
+ const hash = plugin.schema?.hash
39
+ if (!fs.existsSync(path)) {
40
+ fs.mkdirSync(path)
41
+ }
42
+ const filename = join(path, plugin.name)
43
+ const metadataName = `${filename}.bbmetadata`
44
+ if (fs.existsSync(filename)) {
45
+ const currentHash = fs.readFileSync(metadataName, "utf8")
46
+ // if hash is the same return the file, otherwise remove it and re-download
47
+ if (currentHash === hash) {
48
+ return require(filename)
49
+ } else {
50
+ console.log(`Updating plugin: ${plugin.name}`)
51
+ delete require.cache[require.resolve(filename)]
52
+ fs.unlinkSync(filename)
53
+ }
54
+ }
55
+ const pluginKey = objectStore.getPluginJSKey(plugin)
56
+ const pluginJs = await objectStore.retrieve(
57
+ objectStore.ObjectStoreBuckets.PLUGINS,
58
+ pluginKey
59
+ )
60
+
61
+ fs.writeFileSync(filename, pluginJs)
62
+ fs.writeFileSync(metadataName, hash)
63
+
64
+ return require(filename)
65
+ }
66
+
67
+ export const getDatasourcePlugin = async (plugin: Plugin) => {
68
+ return getPluginImpl(DATASOURCE_PATH, plugin)
69
+ }
70
+
71
+ export const getAutomationPlugin = async (plugin: Plugin) => {
72
+ return getPluginImpl(AUTOMATION_PATH, plugin)
73
+ }
@@ -0,0 +1,19 @@
1
+ import jimp from "jimp"
2
+
3
+ const FORMATS = {
4
+ IMAGES: ["png", "jpg", "jpeg", "gif", "bmp", "tiff"],
5
+ }
6
+
7
+ function processImage(file: { path: string }) {
8
+ // this will overwrite the temp file
9
+ return jimp.read(file.path).then(img => {
10
+ return img.resize(300, jimp.AUTO).write(file.path)
11
+ })
12
+ }
13
+
14
+ export async function process(file: { extension: string; path: string }) {
15
+ if (FORMATS.IMAGES.includes(file.extension.toLowerCase())) {
16
+ await processImage(file)
17
+ }
18
+ return file
19
+ }
@@ -0,0 +1,36 @@
1
+ import fs from "fs"
2
+ import { join } from "path"
3
+ import { ObjectStoreBuckets } from "../../constants"
4
+ import { objectStore } from "@budibase/backend-core"
5
+
6
+ /**
7
+ * This function manages temporary template files which are stored by Koa.
8
+ * @param {Object} template The template object retrieved from the Koa context object.
9
+ * @returns {Object} Returns an fs read stream which can be loaded into the database.
10
+ */
11
+ export const getTemplateStream = async (template: any) => {
12
+ if (template.file) {
13
+ return fs.createReadStream(template.file.path)
14
+ } else {
15
+ const [type, name] = template.key.split("/")
16
+ const tmpPath = await downloadTemplate(type, name)
17
+ return fs.createReadStream(join(tmpPath, name, "db", "dump.txt"))
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Retrieves a template and pipes it to minio as well as making it available temporarily.
23
+ * @param {string} type The type of template which is to be retrieved.
24
+ * @param name
25
+ * @return {Promise<*>}
26
+ */
27
+ export const downloadTemplate = async (type: string, name: string) => {
28
+ const DEFAULT_TEMPLATES_BUCKET =
29
+ "prod-budi-templates.s3-eu-west-1.amazonaws.com"
30
+ const templateUrl = `https://${DEFAULT_TEMPLATES_BUCKET}/templates/${type}/${name}.tar.gz`
31
+ return objectStore.downloadTarball(
32
+ templateUrl,
33
+ ObjectStoreBuckets.TEMPLATES,
34
+ type
35
+ )
36
+ }
@@ -0,0 +1,153 @@
1
+ import { getMultiIDParams, getGlobalIDFromUserMetadataID } from "../db/utils"
2
+ import {
3
+ roles,
4
+ db as dbCore,
5
+ cache,
6
+ tenancy,
7
+ context,
8
+ } from "@budibase/backend-core"
9
+ import env from "../environment"
10
+ import { groups } from "@budibase/pro"
11
+ import { UserCtx, ContextUser, User, UserGroup } from "@budibase/types"
12
+ import { global } from "yargs"
13
+
14
+ export function updateAppRole(
15
+ user: ContextUser,
16
+ { appId }: { appId?: string } = {}
17
+ ) {
18
+ appId = appId || context.getAppId()
19
+
20
+ if (!user || (!user.roles && !user.userGroups)) {
21
+ return user
22
+ }
23
+ // if in an multi-tenancy environment make sure roles are never updated
24
+ if (env.MULTI_TENANCY && appId && !tenancy.isUserInAppTenant(appId, user)) {
25
+ delete user.builder
26
+ delete user.admin
27
+ user.roleId = roles.BUILTIN_ROLE_IDS.PUBLIC
28
+ return user
29
+ }
30
+ // always use the deployed app
31
+ if (appId && user.roles) {
32
+ user.roleId = user.roles[dbCore.getProdAppID(appId)]
33
+ }
34
+ // if a role wasn't found then either set as admin (builder) or public (everyone else)
35
+ if (!user.roleId && user.builder && user.builder.global) {
36
+ user.roleId = roles.BUILTIN_ROLE_IDS.ADMIN
37
+ } else if (!user.roleId && !user?.userGroups?.length) {
38
+ user.roleId = roles.BUILTIN_ROLE_IDS.PUBLIC
39
+ }
40
+
41
+ delete user.roles
42
+ return user
43
+ }
44
+
45
+ async function checkGroupRoles(
46
+ user: ContextUser,
47
+ opts: { appId?: string; groups?: UserGroup[] } = {}
48
+ ) {
49
+ if (user.roleId && user.roleId !== roles.BUILTIN_ROLE_IDS.PUBLIC) {
50
+ return user
51
+ }
52
+ if (opts.appId) {
53
+ user.roleId = await groups.getGroupRoleId(user as User, opts.appId, {
54
+ groups: opts.groups,
55
+ })
56
+ }
57
+ // final fallback, simply couldn't find a role - user must be public
58
+ if (!user.roleId) {
59
+ user.roleId = roles.BUILTIN_ROLE_IDS.PUBLIC
60
+ }
61
+ return user
62
+ }
63
+
64
+ export async function processUser(
65
+ user: ContextUser,
66
+ opts: { appId?: string; groups?: UserGroup[] } = {}
67
+ ) {
68
+ if (user) {
69
+ delete user.password
70
+ }
71
+ const appId = opts.appId || context.getAppId()
72
+ user = updateAppRole(user, { appId })
73
+ if (!user.roleId && user?.userGroups?.length) {
74
+ user = await checkGroupRoles(user, { appId, groups: opts?.groups })
75
+ }
76
+
77
+ return user
78
+ }
79
+
80
+ export async function getCachedSelf(ctx: UserCtx, appId: string) {
81
+ // this has to be tenant aware, can't depend on the context to find it out
82
+ // running some middlewares before the tenancy causes context to break
83
+ const user = await cache.user.getUser(ctx.user?._id!)
84
+ return processUser(user, { appId })
85
+ }
86
+
87
+ export async function getRawGlobalUser(userId: string) {
88
+ const db = tenancy.getGlobalDB()
89
+ return db.get(getGlobalIDFromUserMetadataID(userId))
90
+ }
91
+
92
+ export async function getGlobalUser(userId: string) {
93
+ const appId = context.getAppId()
94
+ let user = await getRawGlobalUser(userId)
95
+ return processUser(user, { appId })
96
+ }
97
+
98
+ export async function getGlobalUsers(
99
+ userIds?: string[],
100
+ opts?: { noProcessing?: boolean }
101
+ ) {
102
+ const appId = context.getAppId()
103
+ const db = tenancy.getGlobalDB()
104
+ let globalUsers
105
+ if (userIds) {
106
+ globalUsers = (await db.allDocs(getMultiIDParams(userIds))).rows.map(
107
+ row => row.doc
108
+ )
109
+ } else {
110
+ globalUsers = (
111
+ await db.allDocs(
112
+ dbCore.getGlobalUserParams(null, {
113
+ include_docs: true,
114
+ })
115
+ )
116
+ ).rows.map(row => row.doc)
117
+ }
118
+ globalUsers = globalUsers
119
+ .filter(user => user != null)
120
+ .map(user => {
121
+ delete user.password
122
+ delete user.forceResetPassword
123
+ return user
124
+ })
125
+ if (!appId) {
126
+ return globalUsers
127
+ }
128
+
129
+ if (opts?.noProcessing) {
130
+ return globalUsers
131
+ } else {
132
+ // pass in the groups, meaning we don't actually need to retrieve them for
133
+ // each user individually
134
+ const allGroups = await groups.fetch()
135
+ return Promise.all(
136
+ globalUsers.map(user => processUser(user, { groups: allGroups }))
137
+ )
138
+ }
139
+ }
140
+
141
+ export async function getGlobalUsersFromMetadata(users: ContextUser[]) {
142
+ const globalUsers = await getGlobalUsers(users.map(user => user._id!))
143
+ return users.map(user => {
144
+ const globalUser = globalUsers.find(
145
+ globalUser => globalUser && user._id?.includes(globalUser._id)
146
+ )
147
+ return {
148
+ ...globalUser,
149
+ // doing user second overwrites the id and rev (always metadata)
150
+ ...user,
151
+ }
152
+ })
153
+ }
@@ -0,0 +1,134 @@
1
+ import env from "../environment"
2
+ import { context } from "@budibase/backend-core"
3
+ import { generateMetadataID } from "../db/utils"
4
+ import { Document } from "@budibase/types"
5
+ import stream from "stream"
6
+ const Readable = stream.Readable
7
+
8
+ export function wait(ms: number) {
9
+ return new Promise(resolve => setTimeout(resolve, ms))
10
+ }
11
+
12
+ export const isDev = env.isDev
13
+
14
+ export const NUMBER_REGEX = /^[+-]?([0-9]*[.])?[0-9]+$/g
15
+
16
+ export function removeFromArray(array: any[], element: any) {
17
+ const index = array.indexOf(element)
18
+ if (index !== -1) {
19
+ array.splice(index, 1)
20
+ }
21
+ return array
22
+ }
23
+
24
+ /**
25
+ * Makes sure that a URL has the correct number of slashes, while maintaining the
26
+ * http(s):// double slashes.
27
+ * @param {string} url The URL to test and remove any extra double slashes.
28
+ * @return {string} The updated url.
29
+ */
30
+ export function checkSlashesInUrl(url: string) {
31
+ return url.replace(/(https?:\/\/)|(\/)+/g, "$1$2")
32
+ }
33
+
34
+ export async function updateEntityMetadata(
35
+ type: string,
36
+ entityId: string,
37
+ updateFn: any
38
+ ) {
39
+ const db = context.getAppDB()
40
+ const id = generateMetadataID(type, entityId)
41
+ // read it to see if it exists, we'll overwrite it no matter what
42
+ let rev, metadata: Document
43
+ try {
44
+ const oldMetadata = await db.get(id)
45
+ rev = oldMetadata._rev
46
+ metadata = updateFn(oldMetadata)
47
+ } catch (err) {
48
+ rev = null
49
+ metadata = updateFn({})
50
+ }
51
+ metadata._id = id
52
+ if (rev) {
53
+ metadata._rev = rev
54
+ }
55
+ const response = await db.put(metadata)
56
+ return {
57
+ ...metadata,
58
+ _id: id,
59
+ _rev: response.rev,
60
+ }
61
+ }
62
+
63
+ export async function saveEntityMetadata(
64
+ type: string,
65
+ entityId: string,
66
+ metadata: Document
67
+ ) {
68
+ return updateEntityMetadata(type, entityId, () => {
69
+ return metadata
70
+ })
71
+ }
72
+
73
+ export async function deleteEntityMetadata(type: string, entityId: string) {
74
+ const db = context.getAppDB()
75
+ const id = generateMetadataID(type, entityId)
76
+ let rev
77
+ try {
78
+ const metadata = await db.get(id)
79
+ if (metadata) {
80
+ rev = metadata._rev
81
+ }
82
+ } catch (err) {
83
+ // don't need to error if it doesn't exist
84
+ }
85
+ if (id && rev) {
86
+ await db.remove(id, rev)
87
+ }
88
+ }
89
+
90
+ export function escapeDangerousCharacters(string: string) {
91
+ return string
92
+ .replace(/[\\]/g, "\\\\")
93
+ .replace(/[\b]/g, "\\b")
94
+ .replace(/[\f]/g, "\\f")
95
+ .replace(/[\n]/g, "\\n")
96
+ .replace(/[\r]/g, "\\r")
97
+ .replace(/[\t]/g, "\\t")
98
+ }
99
+
100
+ export function stringToReadStream(string: string) {
101
+ return new Readable({
102
+ read() {
103
+ this.push(string)
104
+ this.push(null)
105
+ },
106
+ })
107
+ }
108
+
109
+ export function formatBytes(bytes: string) {
110
+ const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
111
+ const byteIncrements = 1024
112
+ let unit = 0
113
+ let size = parseInt(bytes, 10) || 0
114
+ while (size >= byteIncrements && ++unit) {
115
+ size /= byteIncrements
116
+ }
117
+ return `${size.toFixed(size < 10 && unit > 0 ? 1 : 0)}${units[unit]}`
118
+ }
119
+
120
+ export function convertBookmark(bookmark: string) {
121
+ const IS_NUMBER = /^\d+\.?\d*$/
122
+ if (typeof bookmark === "string" && bookmark.match(IS_NUMBER)) {
123
+ return parseFloat(bookmark)
124
+ }
125
+ return bookmark
126
+ }
127
+
128
+ export function isQsTrue(param: string) {
129
+ if (typeof param === "string") {
130
+ return param.toLowerCase() === "true"
131
+ } else {
132
+ return param === true
133
+ }
134
+ }
@@ -0,0 +1,88 @@
1
+ import { redis } from "@budibase/backend-core"
2
+ import { getGlobalIDFromUserMetadataID } from "../db/utils"
3
+ import { ContextUser } from "@budibase/types"
4
+
5
+ const APP_DEV_LOCK_SECONDS = 600
6
+ const AUTOMATION_TEST_FLAG_SECONDS = 60
7
+ let devAppClient: any, debounceClient: any, flagClient: any
8
+
9
+ // we init this as we want to keep the connection open all the time
10
+ // reduces the performance hit
11
+ export async function init() {
12
+ devAppClient = new redis.Client(redis.utils.Databases.DEV_LOCKS)
13
+ debounceClient = new redis.Client(redis.utils.Databases.DEBOUNCE)
14
+ flagClient = new redis.Client(redis.utils.Databases.FLAGS)
15
+ await devAppClient.init()
16
+ await debounceClient.init()
17
+ await flagClient.init()
18
+ }
19
+
20
+ export async function shutdown() {
21
+ if (devAppClient) await devAppClient.finish()
22
+ if (debounceClient) await debounceClient.finish()
23
+ if (flagClient) await flagClient.finish()
24
+ // shutdown core clients
25
+ await redis.clients.shutdown()
26
+ console.log("Redis shutdown")
27
+ }
28
+
29
+ export async function doesUserHaveLock(devAppId: string, user: ContextUser) {
30
+ const value = await devAppClient.get(devAppId)
31
+ if (!value) {
32
+ return true
33
+ }
34
+ // make sure both IDs are global
35
+ const expected = getGlobalIDFromUserMetadataID(value._id)
36
+ const userId = getGlobalIDFromUserMetadataID(user._id!)
37
+ return expected === userId
38
+ }
39
+
40
+ export async function getLocksById(appIds: string[]) {
41
+ return await devAppClient.bulkGet(appIds)
42
+ }
43
+
44
+ export async function updateLock(devAppId: string, user: ContextUser) {
45
+ // make sure always global user ID
46
+ const globalId = getGlobalIDFromUserMetadataID(user._id!)
47
+ const inputUser = {
48
+ ...user,
49
+ userId: globalId,
50
+ _id: globalId,
51
+ lockedAt: new Date().getTime(),
52
+ }
53
+
54
+ await devAppClient.store(devAppId, inputUser, APP_DEV_LOCK_SECONDS)
55
+ }
56
+
57
+ export async function clearLock(devAppId: string, user: ContextUser) {
58
+ const value = await devAppClient.get(devAppId)
59
+ if (!value) {
60
+ return
61
+ }
62
+ const userId = getGlobalIDFromUserMetadataID(user._id!)
63
+ if (value._id !== userId) {
64
+ throw "User does not hold lock, cannot clear it."
65
+ }
66
+ await devAppClient.delete(devAppId)
67
+ }
68
+
69
+ export async function checkDebounce(id: string) {
70
+ return debounceClient.get(id)
71
+ }
72
+
73
+ export async function setDebounce(id: string, seconds: number) {
74
+ await debounceClient.store(id, "debouncing", seconds)
75
+ }
76
+
77
+ export async function setTestFlag(id: string) {
78
+ await flagClient.store(id, { testing: true }, AUTOMATION_TEST_FLAG_SECONDS)
79
+ }
80
+
81
+ export async function checkTestFlag(id: string) {
82
+ const flag = await flagClient.get(id)
83
+ return !!(flag && flag.testing)
84
+ }
85
+
86
+ export async function clearTestFlag(id: string) {
87
+ await devAppClient.delete(id)
88
+ }
@@ -0,0 +1,18 @@
1
+ export async function retry<T extends (...arg0: any[]) => any>(
2
+ fn: T,
3
+ maxTry: number = 5,
4
+ retryCount = 1
5
+ ): Promise<Awaited<ReturnType<T>>> {
6
+ const currRetry = typeof retryCount === "number" ? retryCount : 1
7
+ try {
8
+ const result = await fn()
9
+ return result
10
+ } catch (e) {
11
+ console.log(`Retry ${currRetry} failed.`)
12
+ if (currRetry > maxTry) {
13
+ console.log(`All ${maxTry} retry attempts exhausted`)
14
+ throw e
15
+ }
16
+ return retry(fn, maxTry, currRetry + 1)
17
+ }
18
+ }