@budibase/server 1.3.19 → 1.3.21-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.75653b72.js +1005 -0
  3. package/builder/assets/index.f1b70f52.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +451 -390
  6. package/coverage/coverage-final.json +21 -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/component.js.html +68 -11
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +46 -46
  16. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +207 -12
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +13 -13
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +18 -18
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +56 -20
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +46 -46
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  128. package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
  129. package/coverage/lcov-report/middleware/index.html +15 -15
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  136. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +16 -16
  139. package/coverage/lcov-report/utilities/index.html +15 -15
  140. package/coverage/lcov-report/utilities/index.js.html +24 -24
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  142. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
  156. package/coverage/lcov.info +798 -672
  157. package/dist/api/controllers/application.js +5 -5
  158. package/dist/api/controllers/auth.js +9 -0
  159. package/dist/api/controllers/component.js +14 -1
  160. package/dist/api/controllers/datasource.js +21 -8
  161. package/dist/api/controllers/deploy/index.js +1 -8
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  164. package/dist/api/controllers/plugin/github.js +69 -0
  165. package/dist/api/controllers/plugin/index.js +200 -0
  166. package/dist/api/controllers/plugin/npm.js +58 -0
  167. package/dist/api/controllers/plugin/uploaders.js +11 -0
  168. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  169. package/dist/api/controllers/plugin/utils.js +26 -0
  170. package/dist/api/controllers/row/external.js +1 -1
  171. package/dist/api/controllers/screen.js +52 -2
  172. package/dist/api/controllers/static/index.js +1 -0
  173. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  174. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  175. package/dist/api/index.js +1 -1
  176. package/dist/api/routes/application.js +3 -2
  177. package/dist/api/routes/index.js +2 -0
  178. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  179. package/dist/api/routes/public/rows.js +1 -82
  180. package/dist/api/routes/public/tables.js +1 -1
  181. package/dist/api/routes/table.js +1 -1
  182. package/dist/api/routes/utils/validators.js +20 -2
  183. package/dist/app.js +16 -1
  184. package/dist/db/utils.js +10 -1
  185. package/dist/environment.js +1 -0
  186. package/dist/integrations/airtable.js +126 -129
  187. package/dist/integrations/arangodb.js +86 -89
  188. package/dist/integrations/base/query.js +2 -2
  189. package/dist/integrations/base/sqlTable.js +3 -1
  190. package/dist/integrations/couchdb.js +80 -83
  191. package/dist/integrations/dynamodb.js +161 -164
  192. package/dist/integrations/elasticsearch.js +135 -138
  193. package/dist/integrations/firebase.js +154 -157
  194. package/dist/integrations/googlesheets.js +323 -327
  195. package/dist/integrations/index.js +99 -51
  196. package/dist/integrations/microsoftSqlServer.js +240 -243
  197. package/dist/integrations/mongodb.js +239 -242
  198. package/dist/integrations/mysql.js +215 -219
  199. package/dist/integrations/oracle.js +318 -322
  200. package/dist/integrations/postgres.js +262 -265
  201. package/dist/integrations/redis.js +134 -139
  202. package/dist/integrations/rest.js +289 -292
  203. package/dist/integrations/s3.js +61 -64
  204. package/dist/integrations/snowflake.js +83 -86
  205. package/dist/middleware/currentapp.js +2 -0
  206. package/dist/migrations/functions/backfill/global.js +0 -3
  207. package/dist/migrations/index.js +0 -10
  208. package/dist/package.json +9 -6
  209. package/dist/tests/utilities/TestConfiguration.js +1 -1
  210. package/dist/threads/query.js +2 -2
  211. package/dist/tsconfig.build.tsbuildinfo +1 -1
  212. package/dist/utilities/fileSystem/index.js +111 -1
  213. package/dist/utilities/workerRequests.js +4 -0
  214. package/dist/watch.js +77 -0
  215. package/dist/websocket.js +22 -0
  216. package/package.json +10 -7
  217. package/scripts/dev/manage.js +4 -0
  218. package/scripts/localdomain.js +3 -1
  219. package/specs/openapi.json +115 -112
  220. package/specs/openapi.yaml +96 -94
  221. package/specs/resources/misc.js +116 -0
  222. package/specs/resources/query.js +1 -1
  223. package/src/api/controllers/application.ts +1 -2
  224. package/src/api/controllers/auth.js +11 -0
  225. package/src/api/controllers/component.js +21 -2
  226. package/src/api/controllers/datasource.js +21 -8
  227. package/src/api/controllers/deploy/index.ts +1 -6
  228. package/src/api/controllers/integration.js +4 -4
  229. package/src/api/controllers/plugin/file.ts +15 -0
  230. package/src/api/controllers/plugin/github.ts +75 -0
  231. package/src/api/controllers/plugin/index.ts +215 -0
  232. package/src/api/controllers/plugin/npm.ts +56 -0
  233. package/src/api/controllers/plugin/uploaders.ts +4 -0
  234. package/src/api/controllers/plugin/url.ts +12 -0
  235. package/src/api/controllers/plugin/utils.ts +19 -0
  236. package/src/api/controllers/public/mapping/types.ts +8 -0
  237. package/src/api/controllers/row/external.js +1 -1
  238. package/src/api/controllers/screen.js +66 -1
  239. package/src/api/controllers/static/index.ts +1 -1
  240. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  241. package/src/api/controllers/static/templates/preview.hbs +5 -1
  242. package/src/api/index.js +1 -1
  243. package/src/api/routes/application.ts +13 -2
  244. package/src/api/routes/index.ts +2 -0
  245. package/src/api/routes/plugin.ts +14 -0
  246. package/src/api/routes/public/rows.ts +1 -82
  247. package/src/api/routes/public/tables.ts +1 -1
  248. package/src/api/routes/table.js +1 -1
  249. package/src/api/routes/tests/query.spec.js +8 -25
  250. package/src/api/routes/tests/user.spec.js +0 -2
  251. package/src/api/routes/utils/validators.js +26 -5
  252. package/src/app.ts +25 -2
  253. package/src/db/utils.js +12 -0
  254. package/src/definitions/openapi.ts +56 -55
  255. package/src/environment.js +1 -0
  256. package/src/integrations/airtable.ts +116 -118
  257. package/src/integrations/arangodb.ts +87 -89
  258. package/src/integrations/base/query.ts +2 -2
  259. package/src/integrations/base/sqlTable.ts +3 -1
  260. package/src/integrations/couchdb.ts +83 -89
  261. package/src/integrations/dynamodb.ts +173 -175
  262. package/src/integrations/elasticsearch.ts +120 -122
  263. package/src/integrations/firebase.ts +157 -159
  264. package/src/integrations/googlesheets.ts +328 -338
  265. package/src/integrations/index.ts +64 -21
  266. package/src/integrations/microsoftSqlServer.ts +249 -251
  267. package/src/integrations/mongodb.ts +261 -258
  268. package/src/integrations/mysql.ts +229 -234
  269. package/src/integrations/oracle.ts +373 -380
  270. package/src/integrations/postgres.ts +264 -268
  271. package/src/integrations/redis.ts +128 -132
  272. package/src/integrations/rest.ts +324 -329
  273. package/src/integrations/s3.ts +68 -71
  274. package/src/integrations/snowflake.ts +80 -82
  275. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  276. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  277. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  278. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  279. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  280. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  281. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  282. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  283. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  284. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  285. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  286. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  287. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  288. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  289. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  290. package/src/middleware/currentapp.js +2 -0
  291. package/src/migrations/functions/backfill/global.ts +0 -3
  292. package/src/migrations/index.ts +0 -16
  293. package/src/module.d.ts +2 -0
  294. package/src/tests/utilities/TestConfiguration.js +1 -1
  295. package/src/threads/query.ts +2 -2
  296. package/src/utilities/fileSystem/index.js +130 -0
  297. package/src/utilities/workerRequests.js +8 -0
  298. package/src/watch.ts +38 -0
  299. package/src/websocket.ts +26 -0
  300. package/builder/assets/index.9ce4f8c5.css +0 -6
  301. package/builder/assets/index.a1f7532b.js +0 -876
  302. package/builder/assets/vendor.5e1fe644.css +0 -1
  303. package/builder/assets/vendor.67dbd8fa.js +0 -248
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/migrations/functions/developerQuota.ts +0 -15
  306. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  307. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  308. 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
@@ -96,6 +100,12 @@ exports.getTemplateStream = (template) => __awaiter(void 0, void 0, void 0, func
96
100
  exports.loadHandlebarsFile = path => {
97
101
  return fs.readFileSync(path, "utf8");
98
102
  };
103
+ /**
104
+ * Same as above just with a different name.
105
+ */
106
+ exports.loadJSFile = (directory, name) => {
107
+ return fs.readFileSync(join(directory, name), "utf8");
108
+ };
99
109
  /**
100
110
  * When return a file from the API need to write the file to the system temporarily so we
101
111
  * can create a read stream to send.
@@ -294,6 +304,105 @@ exports.cleanup = appIds => {
294
304
  }
295
305
  }
296
306
  };
307
+ const createTempFolder = item => {
308
+ const path = join(budibaseTempDir(), item);
309
+ try {
310
+ // remove old tmp directories automatically - don't combine
311
+ if (fs.existsSync(path)) {
312
+ fs.rmSync(path, { recursive: true, force: true });
313
+ }
314
+ fs.mkdirSync(path);
315
+ }
316
+ catch (err) {
317
+ throw new Error(`Path cannot be created: ${err.message}`);
318
+ }
319
+ return path;
320
+ };
321
+ exports.createTempFolder = createTempFolder;
322
+ const extractTarball = (fromFilePath, toPath) => __awaiter(void 0, void 0, void 0, function* () {
323
+ yield tar.extract({
324
+ file: fromFilePath,
325
+ C: toPath,
326
+ });
327
+ });
328
+ exports.extractTarball = extractTarball;
329
+ const getPluginMetadata = (path) => __awaiter(void 0, void 0, void 0, function* () {
330
+ let metadata = {};
331
+ try {
332
+ const pkg = fs.readFileSync(join(path, "package.json"), "utf8");
333
+ const schema = fs.readFileSync(join(path, "schema.json"), "utf8");
334
+ metadata.schema = JSON.parse(schema);
335
+ metadata.package = JSON.parse(pkg);
336
+ if (!metadata.package.name ||
337
+ !metadata.package.version ||
338
+ !metadata.package.description) {
339
+ throw new Error("package.json is missing one of 'name', 'version' or 'description'.");
340
+ }
341
+ }
342
+ catch (err) {
343
+ throw new Error(`Unable to process schema.json/package.json in plugin. ${err.message}`);
344
+ }
345
+ return { metadata, directory: path };
346
+ });
347
+ exports.getPluginMetadata = getPluginMetadata;
348
+ exports.getDatasourcePlugin = (name, url, hash) => __awaiter(void 0, void 0, void 0, function* () {
349
+ if (!fs.existsSync(DATASOURCE_PATH)) {
350
+ fs.mkdirSync(DATASOURCE_PATH);
351
+ }
352
+ const filename = join(DATASOURCE_PATH, name);
353
+ const metadataName = `${filename}.bbmetadata`;
354
+ if (fs.existsSync(filename)) {
355
+ const currentHash = fs.readFileSync(metadataName, "utf8");
356
+ // if hash is the same return the file, otherwise remove it and re-download
357
+ if (currentHash === hash) {
358
+ return require(filename);
359
+ }
360
+ else {
361
+ console.log(`Updating plugin: ${name}`);
362
+ delete require.cache[require.resolve(filename)];
363
+ fs.unlinkSync(filename);
364
+ }
365
+ }
366
+ const fullUrl = checkSlashesInUrl(`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`);
367
+ const response = yield fetch(fullUrl);
368
+ if (response.status === 200) {
369
+ const content = yield response.text();
370
+ fs.writeFileSync(filename, content);
371
+ fs.writeFileSync(metadataName, hash);
372
+ return require(filename);
373
+ }
374
+ else {
375
+ throw new Error(`Unable to retrieve plugin - reason: ${yield response.text()}`);
376
+ }
377
+ });
378
+ /**
379
+ * Find for a file recursively from start path applying filter, return first match
380
+ */
381
+ exports.findFileRec = (startPath, filter) => {
382
+ if (!fs.existsSync(startPath)) {
383
+ return;
384
+ }
385
+ const files = fs.readdirSync(startPath);
386
+ for (let i = 0, len = files.length; i < len; i++) {
387
+ const filename = join(startPath, files[i]);
388
+ const stat = fs.lstatSync(filename);
389
+ if (stat.isDirectory()) {
390
+ return exports.findFileRec(filename, filter);
391
+ }
392
+ else if (filename.endsWith(filter)) {
393
+ return filename;
394
+ }
395
+ }
396
+ };
397
+ /**
398
+ * Remove a folder which is not empty from the file system
399
+ */
400
+ exports.deleteFolderFileSystem = path => {
401
+ if (!fs.existsSync(path)) {
402
+ return;
403
+ }
404
+ fs.rmSync(path, { recursive: true, force: true });
405
+ };
297
406
  /**
298
407
  * Full function definition for below can be found in the utilities.
299
408
  */
@@ -301,5 +410,6 @@ exports.upload = upload;
301
410
  exports.retrieve = retrieve;
302
411
  exports.retrieveToTmp = retrieveToTmp;
303
412
  exports.deleteFiles = deleteFiles;
413
+ exports.downloadTarballDirect = downloadTarballDirect;
304
414
  exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH;
305
415
  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.processPlugin)({ 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.19",
4
+ "version": "1.3.21-alpha.0",
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.19",
81
- "@budibase/client": "^1.3.19",
82
- "@budibase/pro": "1.3.18",
83
- "@budibase/string-templates": "^1.3.19",
84
- "@budibase/types": "^1.3.19",
80
+ "@budibase/backend-core": "1.3.21-alpha.0",
81
+ "@budibase/client": "1.3.21-alpha.0",
82
+ "@budibase/pro": "1.3.20",
83
+ "@budibase/string-templates": "1.3.21-alpha.0",
84
+ "@budibase/types": "1.3.21-alpha.0",
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": "1e621da16bad75ae6a2dfcd732e676cf0b56a2a4"
202
+ "gitHead": "95d427cdf7f197a1da5cb8029d3906e46b96f100"
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": {