@budibase/server 1.3.19-alpha.2 → 1.3.19

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.9ce4f8c5.css +6 -0
  3. package/builder/assets/index.a1f7532b.js +876 -0
  4. package/builder/assets/vendor.5e1fe644.css +1 -0
  5. package/builder/assets/vendor.67dbd8fa.js +248 -0
  6. package/builder/index.html +4 -2
  7. package/coverage/clover.xml +388 -446
  8. package/coverage/coverage-final.json +20 -20
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +8 -41
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +11 -68
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +34 -73
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +46 -46
  18. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  28. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +12 -207
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  47. package/coverage/lcov-report/api/index.html +1 -1
  48. package/coverage/lcov-report/api/index.js.html +13 -13
  49. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.html +1 -1
  60. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  71. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  74. package/coverage/lcov-report/api/routes/utils/validators.js.html +12 -75
  75. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  77. package/coverage/lcov-report/automations/actions.js.html +1 -1
  78. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  79. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  80. package/coverage/lcov-report/automations/index.html +1 -1
  81. package/coverage/lcov-report/automations/index.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/index.html +1 -1
  89. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  108. package/coverage/lcov-report/constants/index.html +1 -1
  109. package/coverage/lcov-report/constants/index.js.html +1 -1
  110. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  111. package/coverage/lcov-report/constants/screens.js.html +1 -1
  112. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  113. package/coverage/lcov-report/db/index.html +18 -18
  114. package/coverage/lcov-report/db/index.js.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  119. package/coverage/lcov-report/db/newid.js.html +2 -2
  120. package/coverage/lcov-report/db/utils.js.html +20 -56
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  122. package/coverage/lcov-report/events/index.html +1 -1
  123. package/coverage/lcov-report/events/index.js.html +1 -1
  124. package/coverage/lcov-report/events/utils.js.html +1 -1
  125. package/coverage/lcov-report/index.html +39 -39
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  127. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  128. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  129. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  130. package/coverage/lcov-report/middleware/currentapp.js.html +40 -46
  131. package/coverage/lcov-report/middleware/index.html +15 -15
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  133. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  134. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  135. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  136. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  137. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  138. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  139. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  140. package/coverage/lcov-report/utilities/global.js.html +16 -16
  141. package/coverage/lcov-report/utilities/index.html +1 -1
  142. package/coverage/lcov-report/utilities/index.js.html +24 -24
  143. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  144. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  145. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  146. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  148. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  151. package/coverage/lcov-report/utilities/security.js.html +2 -2
  152. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  154. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +1 -1
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  158. package/coverage/lcov.info +669 -790
  159. package/dist/api/controllers/application.js +5 -5
  160. package/dist/api/controllers/auth.js +0 -9
  161. package/dist/api/controllers/component.js +1 -14
  162. package/dist/api/controllers/datasource.js +8 -21
  163. package/dist/api/controllers/deploy/index.js +8 -1
  164. package/dist/api/controllers/integration.js +4 -4
  165. package/dist/api/controllers/row/external.js +1 -1
  166. package/dist/api/controllers/screen.js +2 -52
  167. package/dist/api/controllers/static/index.js +0 -1
  168. package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  169. package/dist/api/controllers/static/templates/preview.hbs +1 -5
  170. package/dist/api/index.js +1 -1
  171. package/dist/api/routes/application.js +2 -3
  172. package/dist/api/routes/index.js +0 -2
  173. package/dist/api/routes/public/tables.js +1 -1
  174. package/dist/api/routes/table.js +1 -1
  175. package/dist/api/routes/utils/validators.js +2 -20
  176. package/dist/app.js +0 -11
  177. package/dist/db/utils.js +1 -10
  178. package/dist/environment.js +0 -1
  179. package/dist/integrations/airtable.js +129 -126
  180. package/dist/integrations/arangodb.js +89 -86
  181. package/dist/integrations/base/query.js +2 -2
  182. package/dist/integrations/base/sqlTable.js +1 -3
  183. package/dist/integrations/couchdb.js +83 -80
  184. package/dist/integrations/dynamodb.js +164 -161
  185. package/dist/integrations/elasticsearch.js +138 -135
  186. package/dist/integrations/firebase.js +157 -154
  187. package/dist/integrations/googlesheets.js +327 -323
  188. package/dist/integrations/index.js +51 -99
  189. package/dist/integrations/microsoftSqlServer.js +243 -240
  190. package/dist/integrations/mongodb.js +242 -239
  191. package/dist/integrations/mysql.js +219 -215
  192. package/dist/integrations/oracle.js +322 -318
  193. package/dist/integrations/postgres.js +265 -262
  194. package/dist/integrations/redis.js +139 -134
  195. package/dist/integrations/rest.js +292 -289
  196. package/dist/integrations/s3.js +64 -61
  197. package/dist/integrations/snowflake.js +86 -83
  198. package/dist/middleware/currentapp.js +0 -2
  199. package/dist/migrations/functions/backfill/global.js +3 -0
  200. package/dist/migrations/functions/developerQuota.js +49 -0
  201. package/dist/{api/routes/plugin.js → migrations/functions/publishedAppsQuota.js} +21 -13
  202. package/dist/{api/controllers/plugin/url.js → migrations/functions/usageQuotas/syncDevelopers.js} +13 -13
  203. package/dist/{api/controllers/plugin/file.js → migrations/functions/usageQuotas/syncPublishedApps.js} +15 -13
  204. package/dist/migrations/index.js +10 -0
  205. package/dist/package.json +6 -9
  206. package/dist/tests/utilities/TestConfiguration.js +1 -1
  207. package/dist/threads/query.js +2 -2
  208. package/dist/tsconfig.build.tsbuildinfo +1 -1
  209. package/dist/utilities/fileSystem/index.js +1 -110
  210. package/package.json +7 -10
  211. package/scripts/dev/manage.js +0 -1
  212. package/scripts/localdomain.js +1 -3
  213. package/specs/openapi.json +3 -3
  214. package/specs/openapi.yaml +3 -3
  215. package/specs/resources/query.js +1 -1
  216. package/src/api/controllers/application.ts +2 -1
  217. package/src/api/controllers/auth.js +0 -11
  218. package/src/api/controllers/component.js +2 -21
  219. package/src/api/controllers/datasource.js +8 -21
  220. package/src/api/controllers/deploy/index.ts +6 -1
  221. package/src/api/controllers/integration.js +4 -4
  222. package/src/api/controllers/row/external.js +1 -1
  223. package/src/api/controllers/screen.js +1 -66
  224. package/src/api/controllers/static/index.ts +1 -1
  225. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  226. package/src/api/controllers/static/templates/preview.hbs +1 -5
  227. package/src/api/index.js +1 -1
  228. package/src/api/routes/application.ts +2 -13
  229. package/src/api/routes/index.ts +0 -2
  230. package/src/api/routes/public/tables.ts +1 -1
  231. package/src/api/routes/table.js +1 -1
  232. package/src/api/routes/tests/query.spec.js +25 -8
  233. package/src/api/routes/tests/user.spec.js +2 -0
  234. package/src/api/routes/utils/validators.js +5 -26
  235. package/src/app.ts +0 -14
  236. package/src/db/utils.js +0 -12
  237. package/src/definitions/openapi.ts +3 -3
  238. package/src/environment.js +0 -1
  239. package/src/integrations/airtable.ts +118 -116
  240. package/src/integrations/arangodb.ts +89 -87
  241. package/src/integrations/base/query.ts +2 -2
  242. package/src/integrations/base/sqlTable.ts +1 -3
  243. package/src/integrations/couchdb.ts +89 -83
  244. package/src/integrations/dynamodb.ts +175 -173
  245. package/src/integrations/elasticsearch.ts +122 -120
  246. package/src/integrations/firebase.ts +159 -157
  247. package/src/integrations/googlesheets.ts +338 -328
  248. package/src/integrations/index.ts +21 -64
  249. package/src/integrations/microsoftSqlServer.ts +251 -249
  250. package/src/integrations/mongodb.ts +258 -261
  251. package/src/integrations/mysql.ts +234 -229
  252. package/src/integrations/oracle.ts +380 -373
  253. package/src/integrations/postgres.ts +268 -264
  254. package/src/integrations/redis.ts +132 -128
  255. package/src/integrations/rest.ts +329 -324
  256. package/src/integrations/s3.ts +71 -68
  257. package/src/integrations/snowflake.ts +82 -80
  258. package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
  259. package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
  260. package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
  261. package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
  262. package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
  263. package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
  264. package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
  265. package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
  266. package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
  267. package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
  268. package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
  269. package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
  270. package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +14 -22
  271. package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
  272. package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
  273. package/src/middleware/currentapp.js +0 -2
  274. package/src/migrations/functions/backfill/global.ts +3 -0
  275. package/src/migrations/functions/developerQuota.ts +15 -0
  276. package/src/migrations/functions/publishedAppsQuota.ts +13 -0
  277. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
  278. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
  279. package/src/migrations/index.ts +16 -0
  280. package/src/module.d.ts +0 -2
  281. package/src/tests/utilities/TestConfiguration.js +1 -1
  282. package/src/threads/query.ts +2 -2
  283. package/src/utilities/fileSystem/index.js +0 -129
  284. package/builder/assets/index.8f621053.css +0 -6
  285. package/builder/assets/index.bd4753ac.js +0 -1005
  286. package/dist/api/controllers/plugin/github.js +0 -69
  287. package/dist/api/controllers/plugin/index.js +0 -200
  288. package/dist/api/controllers/plugin/npm.js +0 -58
  289. package/dist/api/controllers/plugin/uploaders.js +0 -11
  290. package/dist/api/controllers/plugin/utils.js +0 -26
  291. package/dist/watch.js +0 -77
  292. package/dist/websocket.js +0 -22
  293. package/src/api/controllers/plugin/file.ts +0 -15
  294. package/src/api/controllers/plugin/github.ts +0 -75
  295. package/src/api/controllers/plugin/index.ts +0 -215
  296. package/src/api/controllers/plugin/npm.ts +0 -56
  297. package/src/api/controllers/plugin/uploaders.ts +0 -4
  298. package/src/api/controllers/plugin/url.ts +0 -12
  299. package/src/api/controllers/plugin/utils.ts +0 -19
  300. package/src/api/routes/plugin.ts +0 -14
  301. package/src/watch.ts +0 -38
  302. package/src/websocket.ts +0 -26
@@ -1,215 +0,0 @@
1
- import { ObjectStoreBuckets } from "../../../constants"
2
- import { loadJSFile } from "../../../utilities/fileSystem"
3
- import { npmUpload, urlUpload, githubUpload, fileUpload } from "./uploaders"
4
- import { getGlobalDB } from "@budibase/backend-core/tenancy"
5
- import { validate } from "@budibase/backend-core/plugins"
6
- import { generatePluginID, getPluginParams } from "../../../db/utils"
7
- import {
8
- uploadDirectory,
9
- deleteFolder,
10
- } from "@budibase/backend-core/objectStore"
11
- import { PluginType, FileType, PluginSource, Plugin } from "@budibase/types"
12
- import env from "../../../environment"
13
- import { ClientAppSocket } from "../../../websocket"
14
- import { events } from "@budibase/backend-core"
15
-
16
- export async function getPlugins(type?: PluginType) {
17
- const db = getGlobalDB()
18
- const response = await db.allDocs(
19
- getPluginParams(null, {
20
- include_docs: true,
21
- })
22
- )
23
- const plugins = response.rows.map((row: any) => row.doc)
24
- if (type) {
25
- return plugins.filter((plugin: any) => plugin.schema?.type === type)
26
- } else {
27
- return plugins
28
- }
29
- }
30
-
31
- export async function upload(ctx: any) {
32
- const plugins: FileType[] =
33
- ctx.request.files.file.length > 1
34
- ? Array.from(ctx.request.files.file)
35
- : [ctx.request.files.file]
36
- try {
37
- let docs = []
38
- // can do single or multiple plugins
39
- for (let plugin of plugins) {
40
- const doc = await processPlugin(plugin, PluginSource.FILE)
41
- docs.push(doc)
42
- }
43
- ctx.body = {
44
- message: "Plugin(s) uploaded successfully",
45
- plugins: docs,
46
- }
47
- } catch (err: any) {
48
- const errMsg = err?.message ? err?.message : err
49
-
50
- ctx.throw(400, `Failed to import plugin: ${errMsg}`)
51
- }
52
- }
53
-
54
- export async function create(ctx: any) {
55
- const { source, url, headers, githubToken } = ctx.request.body
56
-
57
- try {
58
- let metadata
59
- let directory
60
- // Generating random name as a backup and needed for url
61
- let name = "PLUGIN_" + Math.floor(100000 + Math.random() * 900000)
62
-
63
- switch (source) {
64
- case PluginSource.NPM:
65
- const { metadata: metadataNpm, directory: directoryNpm } =
66
- await npmUpload(url, name)
67
- metadata = metadataNpm
68
- directory = directoryNpm
69
- break
70
- case PluginSource.GITHUB:
71
- const { metadata: metadataGithub, directory: directoryGithub } =
72
- await githubUpload(url, name, githubToken)
73
- metadata = metadataGithub
74
- directory = directoryGithub
75
- break
76
- case PluginSource.URL:
77
- const headersObj = headers || {}
78
- const { metadata: metadataUrl, directory: directoryUrl } =
79
- await urlUpload(url, name, headersObj)
80
- metadata = metadataUrl
81
- directory = directoryUrl
82
- break
83
- }
84
-
85
- validate(metadata?.schema)
86
-
87
- // Only allow components in cloud
88
- if (!env.SELF_HOSTED && metadata?.schema?.type !== PluginType.COMPONENT) {
89
- throw new Error(
90
- "Only component plugins are supported outside of self-host"
91
- )
92
- }
93
-
94
- const doc = await storePlugin(metadata, directory, source)
95
-
96
- ctx.body = {
97
- message: "Plugin uploaded successfully",
98
- plugins: [doc],
99
- }
100
- } catch (err: any) {
101
- const errMsg = err?.message ? err?.message : err
102
-
103
- ctx.throw(400, `Failed to import plugin: ${errMsg}`)
104
- }
105
- ctx.status = 200
106
- }
107
-
108
- export async function fetch(ctx: any) {
109
- ctx.body = await getPlugins()
110
- }
111
-
112
- export async function destroy(ctx: any) {
113
- const db = getGlobalDB()
114
- const { pluginId } = ctx.params
115
-
116
- try {
117
- const plugin: Plugin = await db.get(pluginId)
118
- const bucketPath = `${plugin.name}/`
119
- await deleteFolder(ObjectStoreBuckets.PLUGINS, bucketPath)
120
-
121
- await db.remove(pluginId, plugin._rev)
122
- await events.plugin.deleted(plugin)
123
- } catch (err: any) {
124
- const errMsg = err?.message ? err?.message : err
125
-
126
- ctx.throw(400, `Failed to delete plugin: ${errMsg}`)
127
- }
128
-
129
- ctx.message = `Plugin ${ctx.params.pluginId} deleted.`
130
- ctx.status = 200
131
- }
132
-
133
- export async function storePlugin(
134
- metadata: any,
135
- directory: any,
136
- source?: PluginSource
137
- ) {
138
- const db = getGlobalDB()
139
- const version = metadata.package.version,
140
- name = metadata.package.name,
141
- description = metadata.package.description,
142
- hash = metadata.schema.hash
143
-
144
- // first open the tarball into tmp directory
145
- const bucketPath = `${name}/`
146
- const files = await uploadDirectory(
147
- ObjectStoreBuckets.PLUGINS,
148
- directory,
149
- bucketPath
150
- )
151
- const jsFile = files.find((file: any) => file.name.endsWith(".js"))
152
- if (!jsFile) {
153
- throw new Error(`Plugin missing .js file.`)
154
- }
155
- // validate the JS for a datasource
156
- if (metadata.schema.type === PluginType.DATASOURCE) {
157
- const js = loadJSFile(directory, jsFile.name)
158
- // TODO: this isn't safe - but we need full node environment
159
- // in future we should do this in a thread for safety
160
- try {
161
- eval(js)
162
- } catch (err: any) {
163
- const message = err?.message ? err.message : JSON.stringify(err)
164
- throw new Error(`JS invalid: ${message}`)
165
- }
166
- }
167
- const jsFileName = jsFile.name
168
- const pluginId = generatePluginID(name)
169
-
170
- // overwrite existing docs entirely if they exist
171
- let rev
172
- try {
173
- const existing = await db.get(pluginId)
174
- rev = existing._rev
175
- } catch (err) {
176
- rev = undefined
177
- }
178
- let doc: Plugin = {
179
- _id: pluginId,
180
- _rev: rev,
181
- ...metadata,
182
- name,
183
- version,
184
- hash,
185
- description,
186
- jsUrl: `${bucketPath}${jsFileName}`,
187
- }
188
-
189
- if (source) {
190
- doc = {
191
- ...doc,
192
- source,
193
- }
194
- }
195
-
196
- const response = await db.put(doc)
197
- await events.plugin.imported(doc)
198
- ClientAppSocket.emit("plugin-update", { name, hash })
199
- return {
200
- ...doc,
201
- _rev: response.rev,
202
- }
203
- }
204
-
205
- export async function processPlugin(plugin: FileType, source?: PluginSource) {
206
- const { metadata, directory } = await fileUpload(plugin)
207
- validate(metadata?.schema)
208
-
209
- // Only allow components in cloud
210
- if (!env.SELF_HOSTED && metadata?.schema?.type !== PluginType.COMPONENT) {
211
- throw new Error("Only component plugins are supported outside of self-host")
212
- }
213
-
214
- return await storePlugin(metadata, directory, source)
215
- }
@@ -1,56 +0,0 @@
1
- import {
2
- getPluginMetadata,
3
- findFileRec,
4
- extractTarball,
5
- deleteFolderFileSystem,
6
- } from "../../../utilities/fileSystem"
7
- import fetch from "node-fetch"
8
- import { join } from "path"
9
- import { downloadUnzipTarball } from "./utils"
10
-
11
- export async function npmUpload(url: string, name: string, headers = {}) {
12
- let npmTarballUrl = url
13
- let pluginName = name
14
-
15
- if (
16
- !npmTarballUrl.includes("https://www.npmjs.com") &&
17
- !npmTarballUrl.includes("https://registry.npmjs.org")
18
- ) {
19
- throw new Error("The plugin origin must be from NPM")
20
- }
21
-
22
- if (!npmTarballUrl.includes(".tgz")) {
23
- const npmPackageURl = url.replace(
24
- "https://www.npmjs.com/package/",
25
- "https://registry.npmjs.org/"
26
- )
27
- const response = await fetch(npmPackageURl)
28
- if (response.status !== 200) {
29
- throw new Error("NPM Package not found")
30
- }
31
-
32
- let npmDetails = await response.json()
33
- pluginName = npmDetails.name
34
- const npmVersion = npmDetails["dist-tags"].latest
35
- npmTarballUrl = npmDetails?.versions?.[npmVersion]?.dist?.tarball
36
-
37
- if (!npmTarballUrl) {
38
- throw new Error("NPM tarball url not found")
39
- }
40
- }
41
-
42
- const path = await downloadUnzipTarball(npmTarballUrl, pluginName, headers)
43
- const tarballPluginFile = findFileRec(path, ".tar.gz")
44
- if (!tarballPluginFile) {
45
- throw new Error("Tarball plugin file not found")
46
- }
47
-
48
- try {
49
- await extractTarball(tarballPluginFile, path)
50
- deleteFolderFileSystem(join(path, "package"))
51
- } catch (err: any) {
52
- throw new Error(err)
53
- }
54
-
55
- return await getPluginMetadata(path)
56
- }
@@ -1,4 +0,0 @@
1
- export { fileUpload } from "./file"
2
- export { githubUpload } from "./github"
3
- export { npmUpload } from "./npm"
4
- export { urlUpload } from "./url"
@@ -1,12 +0,0 @@
1
- import { downloadUnzipTarball } from "./utils"
2
- import { getPluginMetadata } from "../../../utilities/fileSystem"
3
-
4
- export async function urlUpload(url: string, name = "", headers = {}) {
5
- if (!url.includes(".tar.gz")) {
6
- throw new Error("Plugin must be compressed into a gzipped tarball.")
7
- }
8
-
9
- const path = await downloadUnzipTarball(url, name, headers)
10
-
11
- return await getPluginMetadata(path)
12
- }
@@ -1,19 +0,0 @@
1
- import {
2
- createTempFolder,
3
- downloadTarballDirect,
4
- } from "../../../utilities/fileSystem"
5
-
6
- export async function downloadUnzipTarball(
7
- url: string,
8
- name: string,
9
- headers = {}
10
- ) {
11
- try {
12
- const path = createTempFolder(name)
13
- await downloadTarballDirect(url, path, headers)
14
-
15
- return path
16
- } catch (e: any) {
17
- throw new Error(e.message)
18
- }
19
- }
@@ -1,14 +0,0 @@
1
- import Router from "@koa/router"
2
- import * as controller from "../controllers/plugin"
3
- import authorized from "../../middleware/authorized"
4
- import { BUILDER } from "@budibase/backend-core/permissions"
5
-
6
- const router = new Router()
7
-
8
- router
9
- .post("/api/plugin/upload", authorized(BUILDER), controller.upload)
10
- .post("/api/plugin", authorized(BUILDER), controller.create)
11
- .get("/api/plugin", authorized(BUILDER), controller.fetch)
12
- .delete("/api/plugin/:pluginId", authorized(BUILDER), controller.destroy)
13
-
14
- export default router
package/src/watch.ts DELETED
@@ -1,38 +0,0 @@
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
- }
package/src/websocket.ts DELETED
@@ -1,26 +0,0 @@
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 }