@budibase/server 1.3.18 → 1.3.19-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 (302) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.1709d1b3.js +1005 -0
  3. package/builder/assets/index.8f621053.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +441 -388
  6. package/coverage/coverage-final.json +20 -20
  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 +5 -5
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +9 -6
  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 +37 -37
  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 +1 -1
  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 +1 -1
  156. package/coverage/lcov.info +780 -667
  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/tables.js +1 -1
  180. package/dist/api/routes/table.js +1 -1
  181. package/dist/api/routes/utils/validators.js +2 -1
  182. package/dist/app.js +11 -0
  183. package/dist/db/utils.js +10 -1
  184. package/dist/environment.js +1 -0
  185. package/dist/integrations/airtable.js +126 -129
  186. package/dist/integrations/arangodb.js +86 -89
  187. package/dist/integrations/base/query.js +2 -2
  188. package/dist/integrations/base/sqlTable.js +3 -1
  189. package/dist/integrations/couchdb.js +80 -83
  190. package/dist/integrations/dynamodb.js +161 -164
  191. package/dist/integrations/elasticsearch.js +135 -138
  192. package/dist/integrations/firebase.js +154 -157
  193. package/dist/integrations/googlesheets.js +323 -327
  194. package/dist/integrations/index.js +99 -51
  195. package/dist/integrations/microsoftSqlServer.js +240 -243
  196. package/dist/integrations/mongodb.js +239 -242
  197. package/dist/integrations/mysql.js +215 -219
  198. package/dist/integrations/oracle.js +318 -322
  199. package/dist/integrations/postgres.js +262 -265
  200. package/dist/integrations/redis.js +134 -139
  201. package/dist/integrations/rest.js +289 -292
  202. package/dist/integrations/s3.js +61 -64
  203. package/dist/integrations/snowflake.js +83 -86
  204. package/dist/middleware/currentapp.js +2 -0
  205. package/dist/migrations/functions/backfill/global.js +0 -3
  206. package/dist/migrations/index.js +0 -10
  207. package/dist/package.json +9 -6
  208. package/dist/tests/utilities/TestConfiguration.js +1 -1
  209. package/dist/threads/query.js +2 -2
  210. package/dist/tsconfig.build.tsbuildinfo +1 -1
  211. package/dist/utilities/fileSystem/index.js +110 -1
  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 +1 -0
  216. package/scripts/localdomain.js +3 -1
  217. package/specs/openapi.json +3 -3
  218. package/specs/openapi.yaml +3 -3
  219. package/specs/resources/query.js +1 -1
  220. package/src/api/controllers/application.ts +1 -2
  221. package/src/api/controllers/auth.js +11 -0
  222. package/src/api/controllers/component.js +21 -2
  223. package/src/api/controllers/datasource.js +21 -8
  224. package/src/api/controllers/deploy/index.ts +1 -6
  225. package/src/api/controllers/integration.js +4 -4
  226. package/src/api/controllers/plugin/file.ts +15 -0
  227. package/src/api/controllers/plugin/github.ts +75 -0
  228. package/src/api/controllers/plugin/index.ts +215 -0
  229. package/src/api/controllers/plugin/npm.ts +56 -0
  230. package/src/api/controllers/plugin/uploaders.ts +4 -0
  231. package/src/api/controllers/plugin/url.ts +12 -0
  232. package/src/api/controllers/plugin/utils.ts +19 -0
  233. package/src/api/controllers/row/external.js +1 -1
  234. package/src/api/controllers/screen.js +66 -1
  235. package/src/api/controllers/static/index.ts +1 -1
  236. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  237. package/src/api/controllers/static/templates/preview.hbs +5 -1
  238. package/src/api/index.js +1 -1
  239. package/src/api/routes/application.ts +13 -2
  240. package/src/api/routes/index.ts +2 -0
  241. package/src/api/routes/plugin.ts +14 -0
  242. package/src/api/routes/public/tables.ts +1 -1
  243. package/src/api/routes/table.js +1 -1
  244. package/src/api/routes/tests/query.spec.js +8 -25
  245. package/src/api/routes/tests/user.spec.js +0 -2
  246. package/src/api/routes/utils/validators.js +2 -1
  247. package/src/app.ts +14 -0
  248. package/src/db/utils.js +12 -0
  249. package/src/definitions/openapi.ts +3 -3
  250. package/src/environment.js +1 -0
  251. package/src/integrations/airtable.ts +116 -118
  252. package/src/integrations/arangodb.ts +87 -89
  253. package/src/integrations/base/query.ts +2 -2
  254. package/src/integrations/base/sqlTable.ts +3 -1
  255. package/src/integrations/couchdb.ts +83 -89
  256. package/src/integrations/dynamodb.ts +173 -175
  257. package/src/integrations/elasticsearch.ts +120 -122
  258. package/src/integrations/firebase.ts +157 -159
  259. package/src/integrations/googlesheets.ts +328 -338
  260. package/src/integrations/index.ts +64 -21
  261. package/src/integrations/microsoftSqlServer.ts +249 -251
  262. package/src/integrations/mongodb.ts +261 -258
  263. package/src/integrations/mysql.ts +229 -234
  264. package/src/integrations/oracle.ts +373 -380
  265. package/src/integrations/postgres.ts +264 -268
  266. package/src/integrations/redis.ts +128 -132
  267. package/src/integrations/rest.ts +324 -329
  268. package/src/integrations/s3.ts +68 -71
  269. package/src/integrations/snowflake.ts +80 -82
  270. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  271. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  272. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  273. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  274. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  275. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  276. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  277. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  278. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  279. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  280. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  281. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  282. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  283. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  284. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  285. package/src/middleware/currentapp.js +2 -0
  286. package/src/migrations/functions/backfill/global.ts +0 -3
  287. package/src/migrations/index.ts +0 -16
  288. package/src/module.d.ts +2 -0
  289. package/src/tests/utilities/TestConfiguration.js +1 -1
  290. package/src/threads/query.ts +2 -2
  291. package/src/utilities/fileSystem/index.js +129 -0
  292. package/src/watch.ts +38 -0
  293. package/src/websocket.ts +26 -0
  294. package/builder/assets/index.a70e216a.css +0 -6
  295. package/builder/assets/index.a934251d.js +0 -876
  296. package/builder/assets/vendor.5e1fe644.css +0 -1
  297. package/builder/assets/vendor.67dbd8fa.js +0 -248
  298. package/dist/migrations/functions/developerQuota.js +0 -49
  299. package/src/migrations/functions/developerQuota.ts +0 -15
  300. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  301. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  302. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
@@ -2,7 +2,7 @@ import { default as threadUtils } from "./utils"
2
2
  threadUtils.threadSetup()
3
3
  import { WorkerCallback, QueryEvent, QueryVariable } from "./definitions"
4
4
  const ScriptRunner = require("../utilities/scriptRunner")
5
- const { integrations } = require("../integrations")
5
+ const { getIntegration } = require("../integrations")
6
6
  const { processStringSync } = require("@budibase/string-templates")
7
7
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
8
8
  const {
@@ -62,7 +62,7 @@ class QueryRunner {
62
62
  let datasourceClone = cloneDeep(datasource)
63
63
  let fieldsClone = cloneDeep(fields)
64
64
 
65
- const Integration = integrations[datasourceClone.source]
65
+ const Integration = await getIntegration(datasourceClone.source)
66
66
  if (!Integration) {
67
67
  throw "Integration type does not exist."
68
68
  }
@@ -15,9 +15,11 @@ const {
15
15
  streamUpload,
16
16
  deleteFolder,
17
17
  downloadTarball,
18
+ downloadTarballDirect,
18
19
  deleteFiles,
19
20
  } = require("./utilities")
20
21
  const { updateClientLibrary } = require("./clientLibrary")
22
+ const { checkSlashesInUrl } = require("../")
21
23
  const env = require("../../environment")
22
24
  const {
23
25
  USER_METDATA_PREFIX,
@@ -26,9 +28,12 @@ const {
26
28
  } = require("../../db/utils")
27
29
  const MemoryStream = require("memorystream")
28
30
  const { getAppId } = require("@budibase/backend-core/context")
31
+ const tar = require("tar")
32
+ const fetch = require("node-fetch")
29
33
 
30
34
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
31
35
  const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules")
36
+ const DATASOURCE_PATH = join(budibaseTempDir(), "datasource")
32
37
 
33
38
  /**
34
39
  * The single stack system (Cloud and Builder) should not make use of the file system where possible,
@@ -107,6 +112,13 @@ exports.loadHandlebarsFile = path => {
107
112
  return fs.readFileSync(path, "utf8")
108
113
  }
109
114
 
115
+ /**
116
+ * Same as above just with a different name.
117
+ */
118
+ exports.loadJSFile = (directory, name) => {
119
+ return fs.readFileSync(join(directory, name), "utf8")
120
+ }
121
+
110
122
  /**
111
123
  * When return a file from the API need to write the file to the system temporarily so we
112
124
  * can create a read stream to send.
@@ -335,6 +347,122 @@ exports.cleanup = appIds => {
335
347
  }
336
348
  }
337
349
 
350
+ const createTempFolder = item => {
351
+ const path = join(budibaseTempDir(), item)
352
+ try {
353
+ // remove old tmp directories automatically - don't combine
354
+ if (fs.existsSync(path)) {
355
+ fs.rmSync(path, { recursive: true, force: true })
356
+ }
357
+ fs.mkdirSync(path)
358
+ } catch (err) {
359
+ throw new Error(`Path cannot be created: ${err.message}`)
360
+ }
361
+
362
+ return path
363
+ }
364
+ exports.createTempFolder = createTempFolder
365
+
366
+ const extractTarball = async (fromFilePath, toPath) => {
367
+ await tar.extract({
368
+ file: fromFilePath,
369
+ C: toPath,
370
+ })
371
+ }
372
+ exports.extractTarball = extractTarball
373
+
374
+ const getPluginMetadata = async path => {
375
+ let metadata = {}
376
+ try {
377
+ const pkg = fs.readFileSync(join(path, "package.json"), "utf8")
378
+ const schema = fs.readFileSync(join(path, "schema.json"), "utf8")
379
+
380
+ metadata.schema = JSON.parse(schema)
381
+ metadata.package = JSON.parse(pkg)
382
+
383
+ if (
384
+ !metadata.package.name ||
385
+ !metadata.package.version ||
386
+ !metadata.package.description
387
+ ) {
388
+ throw new Error(
389
+ "package.json is missing one of 'name', 'version' or 'description'."
390
+ )
391
+ }
392
+ } catch (err) {
393
+ throw new Error(
394
+ `Unable to process schema.json/package.json in plugin. ${err.message}`
395
+ )
396
+ }
397
+
398
+ return { metadata, directory: path }
399
+ }
400
+ exports.getPluginMetadata = getPluginMetadata
401
+
402
+ exports.getDatasourcePlugin = async (name, url, hash) => {
403
+ if (!fs.existsSync(DATASOURCE_PATH)) {
404
+ fs.mkdirSync(DATASOURCE_PATH)
405
+ }
406
+ const filename = join(DATASOURCE_PATH, name)
407
+ const metadataName = `${filename}.bbmetadata`
408
+ if (fs.existsSync(filename)) {
409
+ const currentHash = fs.readFileSync(metadataName, "utf8")
410
+ // if hash is the same return the file, otherwise remove it and re-download
411
+ if (currentHash === hash) {
412
+ return require(filename)
413
+ } else {
414
+ console.log(`Updating plugin: ${name}`)
415
+ fs.unlinkSync(filename)
416
+ }
417
+ }
418
+ const fullUrl = checkSlashesInUrl(
419
+ `${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`
420
+ )
421
+ const response = await fetch(fullUrl)
422
+ if (response.status === 200) {
423
+ const content = await response.text()
424
+ fs.writeFileSync(filename, content)
425
+ fs.writeFileSync(metadataName, hash)
426
+ return require(filename)
427
+ } else {
428
+ throw new Error(
429
+ `Unable to retrieve plugin - reason: ${await response.text()}`
430
+ )
431
+ }
432
+ }
433
+
434
+ /**
435
+ * Find for a file recursively from start path applying filter, return first match
436
+ */
437
+ exports.findFileRec = (startPath, filter) => {
438
+ if (!fs.existsSync(startPath)) {
439
+ return
440
+ }
441
+
442
+ const files = fs.readdirSync(startPath)
443
+ for (let i = 0, len = files.length; i < len; i++) {
444
+ const filename = join(startPath, files[i])
445
+ const stat = fs.lstatSync(filename)
446
+
447
+ if (stat.isDirectory()) {
448
+ return exports.findFileRec(filename, filter)
449
+ } else if (filename.endsWith(filter)) {
450
+ return filename
451
+ }
452
+ }
453
+ }
454
+
455
+ /**
456
+ * Remove a folder which is not empty from the file system
457
+ */
458
+ exports.deleteFolderFileSystem = path => {
459
+ if (!fs.existsSync(path)) {
460
+ return
461
+ }
462
+
463
+ fs.rmSync(path, { recursive: true, force: true })
464
+ }
465
+
338
466
  /**
339
467
  * Full function definition for below can be found in the utilities.
340
468
  */
@@ -342,5 +470,6 @@ exports.upload = upload
342
470
  exports.retrieve = retrieve
343
471
  exports.retrieveToTmp = retrieveToTmp
344
472
  exports.deleteFiles = deleteFiles
473
+ exports.downloadTarballDirect = downloadTarballDirect
345
474
  exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH
346
475
  exports.NODE_MODULES_PATH = NODE_MODULES_PATH
package/src/watch.ts ADDED
@@ -0,0 +1,38 @@
1
+ import path from "path"
2
+ import * as env from "./environment"
3
+ import chokidar from "chokidar"
4
+ import fs from "fs"
5
+ import { tenancy } from "@budibase/backend-core"
6
+ import { DEFAULT_TENANT_ID } from "@budibase/backend-core/constants"
7
+ import { processPlugin } from "./api/controllers/plugin"
8
+
9
+ export function watch() {
10
+ const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz")
11
+ chokidar
12
+ .watch(watchPath, {
13
+ ignored: "**/node_modules",
14
+ awaitWriteFinish: {
15
+ pollInterval: 100,
16
+ stabilityThreshold: 250,
17
+ },
18
+ usePolling: true,
19
+ interval: 250,
20
+ })
21
+ .on("all", async (event: string, path: string) => {
22
+ // Sanity checks
23
+ if (!path?.endsWith(".tar.gz") || !fs.existsSync(path)) {
24
+ return
25
+ }
26
+ await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => {
27
+ try {
28
+ const split = path.split("/")
29
+ const name = split[split.length - 1]
30
+ console.log("Importing plugin:", path)
31
+ await processPlugin({ name, path })
32
+ } catch (err: any) {
33
+ const message = err?.message ? err?.message : err
34
+ console.error("Failed to import plugin:", message)
35
+ }
36
+ })
37
+ })
38
+ }
@@ -0,0 +1,26 @@
1
+ import { Server } from "socket.io"
2
+ import http from "http"
3
+
4
+ class Websocket {
5
+ socketServer: Server
6
+
7
+ constructor(server: http.Server, path: string) {
8
+ this.socketServer = new Server(server, {
9
+ path,
10
+ })
11
+ }
12
+
13
+ // Emit an event to all sockets
14
+ emit(event: string, payload: any) {
15
+ this.socketServer.sockets.emit(event, payload)
16
+ }
17
+ }
18
+
19
+ // Likely to be more socket instances in future
20
+ let ClientAppSocket: Websocket
21
+
22
+ export const initialise = (server: http.Server) => {
23
+ ClientAppSocket = new Websocket(server, "/socket/client")
24
+ }
25
+
26
+ export { ClientAppSocket }