@budibase/server 1.3.21 → 1.3.22-alpha.1

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 (310) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.96c69636.js +1008 -0
  3. package/builder/assets/index.c167b5c3.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +308 -338
  6. package/coverage/coverage-final.json +19 -21
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +41 -8
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  13. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/index.html +27 -57
  15. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  43. package/coverage/lcov-report/api/index.html +1 -1
  44. package/coverage/lcov-report/api/index.js.html +13 -13
  45. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/index.html +1 -1
  56. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  70. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  71. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  73. package/coverage/lcov-report/automations/actions.js.html +1 -1
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  76. package/coverage/lcov-report/automations/index.html +1 -1
  77. package/coverage/lcov-report/automations/index.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/index.html +1 -1
  85. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  104. package/coverage/lcov-report/constants/index.html +1 -1
  105. package/coverage/lcov-report/constants/index.js.html +1 -1
  106. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  107. package/coverage/lcov-report/constants/screens.js.html +1 -1
  108. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  109. package/coverage/lcov-report/db/index.html +14 -14
  110. package/coverage/lcov-report/db/index.js.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  115. package/coverage/lcov-report/db/newid.js.html +2 -2
  116. package/coverage/lcov-report/db/utils.js.html +30 -18
  117. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  118. package/coverage/lcov-report/events/index.html +1 -1
  119. package/coverage/lcov-report/events/index.js.html +1 -1
  120. package/coverage/lcov-report/events/utils.js.html +1 -1
  121. package/coverage/lcov-report/index.html +44 -44
  122. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  123. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  124. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  125. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  126. package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
  127. package/coverage/lcov-report/middleware/index.html +15 -15
  128. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  129. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  130. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  131. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  132. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  133. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  134. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  135. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  136. package/coverage/lcov-report/utilities/global.js.html +16 -16
  137. package/coverage/lcov-report/utilities/index.html +15 -15
  138. package/coverage/lcov-report/utilities/index.js.html +24 -24
  139. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  140. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  141. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  142. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  143. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  144. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  146. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  147. package/coverage/lcov-report/utilities/security.js.html +2 -2
  148. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  149. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  150. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  152. package/coverage/lcov-report/utilities/users.js.html +1 -1
  153. package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
  154. package/coverage/lcov.info +521 -558
  155. package/dist/api/controllers/application.js +5 -5
  156. package/dist/api/controllers/auth.js +9 -0
  157. package/dist/api/controllers/component.js +19 -6
  158. package/dist/api/controllers/datasource.js +21 -8
  159. package/dist/api/controllers/deploy/index.js +1 -8
  160. package/dist/api/controllers/integration.js +4 -4
  161. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  162. package/dist/api/controllers/plugin/github.js +69 -0
  163. package/dist/api/controllers/plugin/index.js +144 -0
  164. package/dist/api/controllers/plugin/npm.js +58 -0
  165. package/dist/api/controllers/plugin/uploaders.js +11 -0
  166. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  167. package/dist/api/controllers/plugin/utils.js +26 -0
  168. package/dist/api/controllers/row/external.js +1 -1
  169. package/dist/api/controllers/screen.js +62 -14
  170. package/dist/api/controllers/static/index.js +1 -0
  171. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  172. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  173. package/dist/api/index.js +1 -1
  174. package/dist/api/routes/application.js +3 -2
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  177. package/dist/api/routes/public/rows.js +1 -82
  178. package/dist/api/routes/public/tables.js +1 -1
  179. package/dist/api/routes/table.js +1 -1
  180. package/dist/api/routes/utils/validators.js +20 -2
  181. package/dist/app.js +16 -1
  182. package/dist/db/utils.js +3 -0
  183. package/dist/environment.js +1 -0
  184. package/dist/integrations/airtable.js +126 -129
  185. package/dist/integrations/arangodb.js +86 -89
  186. package/dist/integrations/base/query.js +2 -2
  187. package/dist/integrations/base/sqlTable.js +3 -1
  188. package/dist/integrations/couchdb.js +80 -83
  189. package/dist/integrations/dynamodb.js +161 -164
  190. package/dist/integrations/elasticsearch.js +135 -138
  191. package/dist/integrations/firebase.js +154 -157
  192. package/dist/integrations/googlesheets.js +323 -327
  193. package/dist/integrations/index.js +99 -51
  194. package/dist/integrations/microsoftSqlServer.js +240 -243
  195. package/dist/integrations/mongodb.js +239 -242
  196. package/dist/integrations/mysql.js +215 -219
  197. package/dist/integrations/oracle.js +318 -322
  198. package/dist/integrations/postgres.js +262 -265
  199. package/dist/integrations/redis.js +134 -139
  200. package/dist/integrations/rest.js +289 -292
  201. package/dist/integrations/s3.js +61 -64
  202. package/dist/integrations/snowflake.js +83 -86
  203. package/dist/middleware/currentapp.js +2 -0
  204. package/dist/migrations/functions/backfill/global.js +0 -3
  205. package/dist/migrations/index.js +0 -10
  206. package/dist/package.json +9 -6
  207. package/dist/tests/utilities/TestConfiguration.js +1 -1
  208. package/dist/threads/query.js +2 -2
  209. package/dist/tsconfig.build.tsbuildinfo +1 -1
  210. package/dist/utilities/fileSystem/index.js +105 -1
  211. package/dist/utilities/workerRequests.js +4 -0
  212. package/dist/watch.js +77 -0
  213. package/dist/websocket.js +22 -0
  214. package/package.json +10 -7
  215. package/scripts/dev/manage.js +4 -0
  216. package/scripts/localdomain.js +3 -1
  217. package/specs/openapi.json +115 -112
  218. package/specs/openapi.yaml +96 -94
  219. package/specs/resources/misc.js +116 -0
  220. package/specs/resources/query.js +1 -1
  221. package/src/api/controllers/application.ts +1 -2
  222. package/src/api/controllers/auth.js +11 -0
  223. package/src/api/controllers/component.ts +57 -0
  224. package/src/api/controllers/datasource.js +21 -8
  225. package/src/api/controllers/deploy/index.ts +1 -6
  226. package/src/api/controllers/integration.js +4 -4
  227. package/src/api/controllers/plugin/file.ts +15 -0
  228. package/src/api/controllers/plugin/github.ts +75 -0
  229. package/src/api/controllers/plugin/index.ts +134 -0
  230. package/src/api/controllers/plugin/npm.ts +56 -0
  231. package/src/api/controllers/plugin/uploaders.ts +4 -0
  232. package/src/api/controllers/plugin/url.ts +12 -0
  233. package/src/api/controllers/plugin/utils.ts +19 -0
  234. package/src/api/controllers/public/mapping/types.ts +8 -0
  235. package/src/api/controllers/row/external.js +1 -1
  236. package/src/api/controllers/screen.ts +122 -0
  237. package/src/api/controllers/static/index.ts +1 -1
  238. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  239. package/src/api/controllers/static/templates/preview.hbs +5 -1
  240. package/src/api/index.js +1 -1
  241. package/src/api/routes/application.ts +13 -2
  242. package/src/api/routes/index.ts +2 -0
  243. package/src/api/routes/plugin.ts +14 -0
  244. package/src/api/routes/public/rows.ts +1 -82
  245. package/src/api/routes/public/tables.ts +1 -1
  246. package/src/api/routes/table.js +1 -1
  247. package/src/api/routes/tests/query.spec.js +8 -25
  248. package/src/api/routes/tests/user.spec.js +0 -2
  249. package/src/api/routes/utils/validators.js +26 -5
  250. package/src/app.ts +25 -2
  251. package/src/db/utils.js +4 -0
  252. package/src/definitions/openapi.ts +56 -55
  253. package/src/environment.js +1 -0
  254. package/src/integrations/airtable.ts +116 -118
  255. package/src/integrations/arangodb.ts +87 -89
  256. package/src/integrations/base/query.ts +2 -2
  257. package/src/integrations/base/sqlTable.ts +3 -1
  258. package/src/integrations/couchdb.ts +83 -89
  259. package/src/integrations/dynamodb.ts +173 -175
  260. package/src/integrations/elasticsearch.ts +120 -122
  261. package/src/integrations/firebase.ts +157 -159
  262. package/src/integrations/googlesheets.ts +328 -338
  263. package/src/integrations/index.ts +64 -21
  264. package/src/integrations/microsoftSqlServer.ts +249 -251
  265. package/src/integrations/mongodb.ts +261 -258
  266. package/src/integrations/mysql.ts +229 -234
  267. package/src/integrations/oracle.ts +373 -380
  268. package/src/integrations/postgres.ts +264 -268
  269. package/src/integrations/redis.ts +128 -132
  270. package/src/integrations/rest.ts +324 -329
  271. package/src/integrations/s3.ts +68 -71
  272. package/src/integrations/snowflake.ts +80 -82
  273. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  274. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  275. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  276. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  277. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  278. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  279. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  280. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  281. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  282. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  283. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  284. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  285. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  286. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  287. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  288. package/src/middleware/currentapp.js +2 -0
  289. package/src/migrations/functions/backfill/global.ts +0 -3
  290. package/src/migrations/index.ts +0 -16
  291. package/src/module.d.ts +2 -0
  292. package/src/tests/utilities/TestConfiguration.js +1 -1
  293. package/src/threads/query.ts +2 -2
  294. package/src/utilities/fileSystem/index.js +123 -0
  295. package/src/utilities/workerRequests.js +8 -0
  296. package/src/watch.ts +38 -0
  297. package/src/websocket.ts +26 -0
  298. package/builder/assets/index.8d12d461.css +0 -6
  299. package/builder/assets/index.d354271c.js +0 -879
  300. package/builder/assets/vendor.5e1fe644.css +0 -1
  301. package/builder/assets/vendor.67dbd8fa.js +0 -248
  302. package/coverage/lcov-report/api/controllers/component.js.html +0 -199
  303. package/coverage/lcov-report/api/controllers/screen.js.html +0 -259
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/api/controllers/component.js +0 -38
  306. package/src/api/controllers/screen.js +0 -58
  307. package/src/migrations/functions/developerQuota.ts +0 -15
  308. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  309. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  310. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
@@ -14,14 +14,18 @@ const { join } = require("path");
14
14
  const uuid = require("uuid/v4");
15
15
  const { doWithDB, dangerousGetDB, closeDB, } = require("@budibase/backend-core/db");
16
16
  const { ObjectStoreBuckets } = require("../../constants");
17
- const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, deleteFiles, } = require("./utilities");
17
+ const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, downloadTarballDirect, deleteFiles, } = require("./utilities");
18
18
  const { updateClientLibrary } = require("./clientLibrary");
19
+ const { checkSlashesInUrl } = require("../");
19
20
  const env = require("../../environment");
20
21
  const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, TABLE_ROW_PREFIX, } = require("../../db/utils");
21
22
  const MemoryStream = require("memorystream");
22
23
  const { getAppId } = require("@budibase/backend-core/context");
24
+ const tar = require("tar");
25
+ const fetch = require("node-fetch");
23
26
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
24
27
  const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules");
28
+ const DATASOURCE_PATH = join(budibaseTempDir(), "datasource");
25
29
  /**
26
30
  * The single stack system (Cloud and Builder) should not make use of the file system where possible,
27
31
  * this file handles all of the file access for the system with the intention of limiting it all to one
@@ -294,6 +298,105 @@ exports.cleanup = appIds => {
294
298
  }
295
299
  }
296
300
  };
301
+ const createTempFolder = item => {
302
+ const path = join(budibaseTempDir(), item);
303
+ try {
304
+ // remove old tmp directories automatically - don't combine
305
+ if (fs.existsSync(path)) {
306
+ fs.rmSync(path, { recursive: true, force: true });
307
+ }
308
+ fs.mkdirSync(path);
309
+ }
310
+ catch (err) {
311
+ throw new Error(`Path cannot be created: ${err.message}`);
312
+ }
313
+ return path;
314
+ };
315
+ exports.createTempFolder = createTempFolder;
316
+ const extractTarball = (fromFilePath, toPath) => __awaiter(void 0, void 0, void 0, function* () {
317
+ yield tar.extract({
318
+ file: fromFilePath,
319
+ C: toPath,
320
+ });
321
+ });
322
+ exports.extractTarball = extractTarball;
323
+ const getPluginMetadata = (path) => __awaiter(void 0, void 0, void 0, function* () {
324
+ let metadata = {};
325
+ try {
326
+ const pkg = fs.readFileSync(join(path, "package.json"), "utf8");
327
+ const schema = fs.readFileSync(join(path, "schema.json"), "utf8");
328
+ metadata.schema = JSON.parse(schema);
329
+ metadata.package = JSON.parse(pkg);
330
+ if (!metadata.package.name ||
331
+ !metadata.package.version ||
332
+ !metadata.package.description) {
333
+ throw new Error("package.json is missing one of 'name', 'version' or 'description'.");
334
+ }
335
+ }
336
+ catch (err) {
337
+ throw new Error(`Unable to process schema.json/package.json in plugin. ${err.message}`);
338
+ }
339
+ return { metadata, directory: path };
340
+ });
341
+ exports.getPluginMetadata = getPluginMetadata;
342
+ exports.getDatasourcePlugin = (name, url, hash) => __awaiter(void 0, void 0, void 0, function* () {
343
+ if (!fs.existsSync(DATASOURCE_PATH)) {
344
+ fs.mkdirSync(DATASOURCE_PATH);
345
+ }
346
+ const filename = join(DATASOURCE_PATH, name);
347
+ const metadataName = `${filename}.bbmetadata`;
348
+ if (fs.existsSync(filename)) {
349
+ const currentHash = fs.readFileSync(metadataName, "utf8");
350
+ // if hash is the same return the file, otherwise remove it and re-download
351
+ if (currentHash === hash) {
352
+ return require(filename);
353
+ }
354
+ else {
355
+ console.log(`Updating plugin: ${name}`);
356
+ delete require.cache[require.resolve(filename)];
357
+ fs.unlinkSync(filename);
358
+ }
359
+ }
360
+ const fullUrl = checkSlashesInUrl(`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`);
361
+ const response = yield fetch(fullUrl);
362
+ if (response.status === 200) {
363
+ const content = yield response.text();
364
+ fs.writeFileSync(filename, content);
365
+ fs.writeFileSync(metadataName, hash);
366
+ return require(filename);
367
+ }
368
+ else {
369
+ throw new Error(`Unable to retrieve plugin - reason: ${yield response.text()}`);
370
+ }
371
+ });
372
+ /**
373
+ * Find for a file recursively from start path applying filter, return first match
374
+ */
375
+ exports.findFileRec = (startPath, filter) => {
376
+ if (!fs.existsSync(startPath)) {
377
+ return;
378
+ }
379
+ const files = fs.readdirSync(startPath);
380
+ for (let i = 0, len = files.length; i < len; i++) {
381
+ const filename = join(startPath, files[i]);
382
+ const stat = fs.lstatSync(filename);
383
+ if (stat.isDirectory()) {
384
+ return exports.findFileRec(filename, filter);
385
+ }
386
+ else if (filename.endsWith(filter)) {
387
+ return filename;
388
+ }
389
+ }
390
+ };
391
+ /**
392
+ * Remove a folder which is not empty from the file system
393
+ */
394
+ exports.deleteFolderFileSystem = path => {
395
+ if (!fs.existsSync(path)) {
396
+ return;
397
+ }
398
+ fs.rmSync(path, { recursive: true, force: true });
399
+ };
297
400
  /**
298
401
  * Full function definition for below can be found in the utilities.
299
402
  */
@@ -301,5 +404,6 @@ exports.upload = upload;
301
404
  exports.retrieve = retrieve;
302
405
  exports.retrieveToTmp = retrieveToTmp;
303
406
  exports.deleteFiles = deleteFiles;
407
+ exports.downloadTarballDirect = downloadTarballDirect;
304
408
  exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH;
305
409
  exports.NODE_MODULES_PATH = NODE_MODULES_PATH;
@@ -128,3 +128,7 @@ exports.getChecklist = () => __awaiter(void 0, void 0, void 0, function* () {
128
128
  const response = yield fetch(checkSlashesInUrl(env.WORKER_URL + "/api/global/configs/checklist"), request(null, { method: "GET" }));
129
129
  return checkResponse(response, "get checklist");
130
130
  });
131
+ exports.generateApiKey = (userId) => __awaiter(void 0, void 0, void 0, function* () {
132
+ const response = yield fetch(checkSlashesInUrl(env.WORKER_URL + "/api/global/self/api_key"), request(null, { method: "POST", body: { userId } }));
133
+ return checkResponse(response, "generate API key");
134
+ });
package/dist/watch.js ADDED
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.watch = void 0;
39
+ const path_1 = __importDefault(require("path"));
40
+ const env = __importStar(require("./environment"));
41
+ const chokidar_1 = __importDefault(require("chokidar"));
42
+ const fs_1 = __importDefault(require("fs"));
43
+ const backend_core_1 = require("@budibase/backend-core");
44
+ const constants_1 = require("@budibase/backend-core/constants");
45
+ const plugin_1 = require("./api/controllers/plugin");
46
+ function watch() {
47
+ const watchPath = path_1.default.join(env.PLUGINS_DIR, "./**/*.tar.gz");
48
+ chokidar_1.default
49
+ .watch(watchPath, {
50
+ ignored: "**/node_modules",
51
+ awaitWriteFinish: {
52
+ pollInterval: 100,
53
+ stabilityThreshold: 250,
54
+ },
55
+ usePolling: true,
56
+ interval: 250,
57
+ })
58
+ .on("all", (event, path) => __awaiter(this, void 0, void 0, function* () {
59
+ // Sanity checks
60
+ if (!(path === null || path === void 0 ? void 0 : path.endsWith(".tar.gz")) || !fs_1.default.existsSync(path)) {
61
+ return;
62
+ }
63
+ yield backend_core_1.tenancy.doInTenant(constants_1.DEFAULT_TENANT_ID, () => __awaiter(this, void 0, void 0, function* () {
64
+ try {
65
+ const split = path.split("/");
66
+ const name = split[split.length - 1];
67
+ console.log("Importing plugin:", path);
68
+ yield (0, plugin_1.processUploadedPlugin)({ name, path });
69
+ }
70
+ catch (err) {
71
+ const message = (err === null || err === void 0 ? void 0 : err.message) ? err === null || err === void 0 ? void 0 : err.message : err;
72
+ console.error("Failed to import plugin:", message);
73
+ }
74
+ }));
75
+ }));
76
+ }
77
+ exports.watch = watch;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientAppSocket = exports.initialise = void 0;
4
+ const socket_io_1 = require("socket.io");
5
+ class Websocket {
6
+ constructor(server, path) {
7
+ this.socketServer = new socket_io_1.Server(server, {
8
+ path,
9
+ });
10
+ }
11
+ // Emit an event to all sockets
12
+ emit(event, payload) {
13
+ this.socketServer.sockets.emit(event, payload);
14
+ }
15
+ }
16
+ // Likely to be more socket instances in future
17
+ let ClientAppSocket;
18
+ exports.ClientAppSocket = ClientAppSocket;
19
+ const initialise = (server) => {
20
+ exports.ClientAppSocket = ClientAppSocket = new Websocket(server, "/socket/client");
21
+ };
22
+ exports.initialise = initialise;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.3.21",
4
+ "version": "1.3.22-alpha.1",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -77,11 +77,11 @@
77
77
  "license": "GPL-3.0",
78
78
  "dependencies": {
79
79
  "@apidevtools/swagger-parser": "10.0.3",
80
- "@budibase/backend-core": "^1.3.21",
81
- "@budibase/client": "^1.3.21",
82
- "@budibase/pro": "1.3.20",
83
- "@budibase/string-templates": "^1.3.21",
84
- "@budibase/types": "^1.3.21",
80
+ "@budibase/backend-core": "1.3.22-alpha.1",
81
+ "@budibase/client": "1.3.22-alpha.1",
82
+ "@budibase/pro": "1.3.22-alpha.0",
83
+ "@budibase/string-templates": "1.3.22-alpha.1",
84
+ "@budibase/types": "1.3.22-alpha.1",
85
85
  "@bull-board/api": "3.7.0",
86
86
  "@bull-board/koa": "3.9.4",
87
87
  "@elastic/elasticsearch": "7.10.0",
@@ -95,6 +95,7 @@
95
95
  "bcryptjs": "2.4.3",
96
96
  "bull": "4.8.5",
97
97
  "chmodr": "1.2.0",
98
+ "chokidar": "3.5.3",
98
99
  "csvtojson": "2.0.10",
99
100
  "curlconverter": "3.21.0",
100
101
  "dotenv": "8.2.0",
@@ -138,8 +139,10 @@
138
139
  "redis": "4",
139
140
  "server-destroy": "1.0.1",
140
141
  "snowflake-promise": "^4.5.0",
142
+ "socket.io": "^4.5.1",
141
143
  "svelte": "3.49.0",
142
144
  "swagger-parser": "10.0.3",
145
+ "tar": "6.1.11",
143
146
  "to-json-schema": "0.2.5",
144
147
  "uuid": "3.3.2",
145
148
  "validate.js": "0.13.1",
@@ -196,5 +199,5 @@
196
199
  "optionalDependencies": {
197
200
  "oracledb": "5.3.0"
198
201
  },
199
- "gitHead": "19ed43cb817a650c859e9d237c5053cd3ee54526"
202
+ "gitHead": "db762e7c2d25e6b39b73d0c99ce883bda863ed39"
200
203
  }
@@ -58,6 +58,7 @@ async function init() {
58
58
  DEPLOYMENT_ENVIRONMENT: "development",
59
59
  BB_ADMIN_USER_EMAIL: "",
60
60
  BB_ADMIN_USER_PASSWORD: "",
61
+ PLUGINS_DIR: "",
61
62
  }
62
63
  let envFile = ""
63
64
  Object.keys(envFileJson).forEach(key => {
@@ -71,6 +72,9 @@ async function up() {
71
72
  console.log("Spinning up your budibase dev environment... 🔧✨")
72
73
  await init()
73
74
  await compose.upAll(CONFIG)
75
+
76
+ // We always ensure to restart the proxy service in case of nginx conf changes
77
+ await compose.restartOne("proxy-service", CONFIG)
74
78
  }
75
79
 
76
80
  async function down() {
@@ -17,6 +17,8 @@ const arg = process.argv.slice(2)[0]
17
17
  */
18
18
  updateDotEnv({
19
19
  ACCOUNT_PORTAL_URL:
20
- arg === "enable" ? "http://local.com:10001" : "http://localhost:10001",
20
+ arg === "enable"
21
+ ? "http://account.local.com:10001"
22
+ : "http://localhost:10001",
21
23
  COOKIE_DOMAIN: arg === "enable" ? ".local.com" : "",
22
24
  }).then(() => console.log("Updated worker!"))
@@ -1327,7 +1327,7 @@
1327
1327
  "type": "string"
1328
1328
  },
1329
1329
  "datasourceId": {
1330
- "description": "The ID of the data source the query belongs to.",
1330
+ "description": "The ID of the datasource the query belongs to.",
1331
1331
  "type": "string"
1332
1332
  },
1333
1333
  "parameters": {
@@ -1386,7 +1386,7 @@
1386
1386
  "type": "string"
1387
1387
  },
1388
1388
  "datasourceId": {
1389
- "description": "The ID of the data source the query belongs to.",
1389
+ "description": "The ID of the datasource the query belongs to.",
1390
1390
  "type": "string"
1391
1391
  },
1392
1392
  "parameters": {
@@ -1659,6 +1659,117 @@
1659
1659
  "data"
1660
1660
  ]
1661
1661
  },
1662
+ "rowSearch": {
1663
+ "type": "object",
1664
+ "properties": {
1665
+ "query": {
1666
+ "type": "object",
1667
+ "properties": {
1668
+ "allOr": {
1669
+ "type": "boolean",
1670
+ "description": "Specifies that a row should be returned if it satisfies any of the specified options, rather than requiring it to fulfill all the search parameters. This defaults to false, meaning AND logic will be used."
1671
+ },
1672
+ "string": {
1673
+ "type": "object",
1674
+ "example": {
1675
+ "columnName1": "value",
1676
+ "columnName2": "value"
1677
+ },
1678
+ "description": "A map of field name to the string to search for, this will look for rows that have a value starting with the string value.",
1679
+ "additionalProperties": {
1680
+ "type": "string",
1681
+ "description": "The value to search for in the column."
1682
+ }
1683
+ },
1684
+ "fuzzy": {
1685
+ "type": "object",
1686
+ "description": "A fuzzy search, only supported by internal tables."
1687
+ },
1688
+ "range": {
1689
+ "type": "object",
1690
+ "description": "Searches within a range, the format of this must be in the format of an object with a \"low\" and \"high\" property.",
1691
+ "example": {
1692
+ "columnName1": {
1693
+ "low": 10,
1694
+ "high": 20
1695
+ }
1696
+ }
1697
+ },
1698
+ "equal": {
1699
+ "type": "object",
1700
+ "description": "Searches for rows that have a column value that is exactly the value set."
1701
+ },
1702
+ "notEqual": {
1703
+ "type": "object",
1704
+ "description": "Searches for any row which does not contain the specified column value."
1705
+ },
1706
+ "empty": {
1707
+ "type": "object",
1708
+ "description": "Searches for rows which do not contain the specified column. The object should simply contain keys of the column names, these can map to any value.",
1709
+ "example": {
1710
+ "columnName1": ""
1711
+ }
1712
+ },
1713
+ "notEmpty": {
1714
+ "type": "object",
1715
+ "description": "Searches for rows which have the specified column."
1716
+ },
1717
+ "oneOf": {
1718
+ "type": "object",
1719
+ "description": "Searches for rows which have a column value that is any of the specified values. The format of this must be columnName -> [value1, value2]."
1720
+ }
1721
+ }
1722
+ },
1723
+ "paginate": {
1724
+ "type": "boolean",
1725
+ "description": "Enables pagination, by default this is disabled."
1726
+ },
1727
+ "bookmark": {
1728
+ "oneOf": [
1729
+ {
1730
+ "type": "string"
1731
+ },
1732
+ {
1733
+ "type": "integer"
1734
+ }
1735
+ ],
1736
+ "description": "If retrieving another page, the bookmark from the previous request must be supplied."
1737
+ },
1738
+ "limit": {
1739
+ "type": "integer",
1740
+ "description": "The maximum number of rows to return, useful when paginating, for internal tables this will be limited to 1000, for SQL tables it will be 5000."
1741
+ },
1742
+ "sort": {
1743
+ "type": "object",
1744
+ "description": "A set of parameters describing the sort behaviour of the search.",
1745
+ "properties": {
1746
+ "order": {
1747
+ "type": "string",
1748
+ "enum": [
1749
+ "ascending",
1750
+ "descending"
1751
+ ],
1752
+ "description": "The order of the sort, by default this is ascending."
1753
+ },
1754
+ "column": {
1755
+ "type": "string",
1756
+ "description": "The name of the column by which the rows will be sorted."
1757
+ },
1758
+ "type": {
1759
+ "type": "string",
1760
+ "enum": [
1761
+ "string",
1762
+ "number"
1763
+ ],
1764
+ "description": "Defines whether the column should be treated as a string or as numbers when sorting."
1765
+ }
1766
+ }
1767
+ }
1768
+ },
1769
+ "required": [
1770
+ "query"
1771
+ ]
1772
+ },
1662
1773
  "nameSearch": {
1663
1774
  "type": "object",
1664
1775
  "properties": {
@@ -2129,115 +2240,7 @@
2129
2240
  "content": {
2130
2241
  "application/json": {
2131
2242
  "schema": {
2132
- "type": "object",
2133
- "required": [
2134
- "query"
2135
- ],
2136
- "properties": {
2137
- "query": {
2138
- "type": "object",
2139
- "properties": {
2140
- "allOr": {
2141
- "type": "boolean",
2142
- "description": "Specifies that a row should be returned if it satisfies any of the specified options, rather than requiring it to fulfill all the search parameters. This defaults to false, meaning AND logic will be used."
2143
- },
2144
- "string": {
2145
- "type": "object",
2146
- "example": {
2147
- "columnName1": "value",
2148
- "columnName2": "value"
2149
- },
2150
- "description": "A map of field name to the string to search for, this will look for rows that have a value starting with the string value.",
2151
- "additionalProperties": {
2152
- "type": "string",
2153
- "description": "The value to search for in the column."
2154
- }
2155
- },
2156
- "fuzzy": {
2157
- "type": "object",
2158
- "description": "A fuzzy search, only supported by internal tables."
2159
- },
2160
- "range": {
2161
- "type": "object",
2162
- "description": "Searches within a range, the format of this must be in the format of an object with a \"low\" and \"high\" property.",
2163
- "example": {
2164
- "columnName1": {
2165
- "low": 10,
2166
- "high": 20
2167
- }
2168
- }
2169
- },
2170
- "equal": {
2171
- "type": "object",
2172
- "description": "Searches for rows that have a column value that is exactly the value set."
2173
- },
2174
- "notEqual": {
2175
- "type": "object",
2176
- "description": "Searches for any row which does not contain the specified column value."
2177
- },
2178
- "empty": {
2179
- "type": "object",
2180
- "description": "Searches for rows which do not contain the specified column. The object should simply contain keys of the column names, these can map to any value.",
2181
- "example": {
2182
- "columnName1": ""
2183
- }
2184
- },
2185
- "notEmpty": {
2186
- "type": "object",
2187
- "description": "Searches for rows which have the specified column."
2188
- },
2189
- "oneOf": {
2190
- "type": "object",
2191
- "description": "Searches for rows which have a column value that is any of the specified values. The format of this must be columnName -> [value1, value2]."
2192
- }
2193
- }
2194
- },
2195
- "paginate": {
2196
- "type": "boolean",
2197
- "description": "Enables pagination, by default this is disabled."
2198
- },
2199
- "bookmark": {
2200
- "oneOf": [
2201
- {
2202
- "type": "string"
2203
- },
2204
- {
2205
- "type": "integer"
2206
- }
2207
- ],
2208
- "description": "If retrieving another page, the bookmark from the previous request must be supplied."
2209
- },
2210
- "limit": {
2211
- "type": "integer",
2212
- "description": "The maximum number of rows to return, useful when paginating, for internal tables this will be limited to 1000, for SQL tables it will be 5000."
2213
- },
2214
- "sort": {
2215
- "type": "object",
2216
- "description": "A set of parameters describing the sort behaviour of the search.",
2217
- "properties": {
2218
- "order": {
2219
- "type": "string",
2220
- "enum": [
2221
- "ascending",
2222
- "descending"
2223
- ],
2224
- "description": "The order of the sort, by default this is ascending."
2225
- },
2226
- "column": {
2227
- "type": "string",
2228
- "description": "The name of the column by which the rows will be sorted."
2229
- },
2230
- "type": {
2231
- "type": "string",
2232
- "enum": [
2233
- "string",
2234
- "number"
2235
- ],
2236
- "description": "Defines whether the column should be treated as a string or as numbers when sorting."
2237
- }
2238
- }
2239
- }
2240
- }
2243
+ "$ref": "#/components/schemas/rowSearch"
2241
2244
  }
2242
2245
  }
2243
2246
  }
@@ -2289,7 +2292,7 @@
2289
2292
  },
2290
2293
  "responses": {
2291
2294
  "200": {
2292
- "description": "Returns the created table, including the ID which has been generated for it. This can be internal or external data sources.",
2295
+ "description": "Returns the created table, including the ID which has been generated for it. This can be internal or external datasources.",
2293
2296
  "content": {
2294
2297
  "application/json": {
2295
2298
  "schema": {