@budibase/server 1.3.13 → 1.3.15-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 (283) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/{index.e50bda9f.css → index.ecdac070.css} +2 -2
  3. package/builder/assets/index.ed9ae6a1.js +995 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +377 -313
  6. package/coverage/coverage-final.json +22 -22
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +8 -5
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +82 -13
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +32 -32
  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 +1 -1
  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 +204 -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 +12 -12
  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 +1 -1
  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 +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  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 +24 -24
  79. package/coverage/lcov-report/automations/index.js.html +18 -9
  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 +126 -24
  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 +1 -1
  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 +48 -48
  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 +33 -33
  129. package/coverage/lcov-report/middleware/index.html +1 -1
  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 +19 -19
  140. package/coverage/lcov-report/utilities/index.js.html +66 -42
  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 +5 -5
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  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 +6 -3
  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 +692 -564
  157. package/dist/api/controllers/application.js +6 -9
  158. package/dist/api/controllers/backup.js +2 -1
  159. package/dist/api/controllers/component.js +18 -1
  160. package/dist/api/controllers/datasource.js +4 -4
  161. package/dist/api/controllers/deploy/index.js +17 -2
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/plugin/file.js +24 -0
  164. package/dist/api/controllers/plugin/github.js +69 -0
  165. package/dist/api/controllers/plugin/index.js +189 -0
  166. package/dist/api/controllers/plugin/npm.js +58 -0
  167. package/dist/api/controllers/plugin/uploaders.js +11 -0
  168. package/dist/api/controllers/plugin/url.js +24 -0
  169. package/dist/api/controllers/plugin/utils.js +26 -0
  170. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  171. package/dist/api/controllers/screen.js +51 -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 +3 -1
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/api/routes/plugin.js +39 -0
  177. package/dist/app.js +9 -0
  178. package/dist/automations/index.js +10 -5
  179. package/dist/automations/triggers.js +39 -5
  180. package/dist/automations/utils.js +16 -7
  181. package/dist/db/utils.js +10 -1
  182. package/dist/environment.js +1 -0
  183. package/dist/integrations/airtable.js +126 -129
  184. package/dist/integrations/arangodb.js +86 -89
  185. package/dist/integrations/base/query.js +2 -2
  186. package/dist/integrations/couchdb.js +80 -83
  187. package/dist/integrations/dynamodb.js +161 -164
  188. package/dist/integrations/elasticsearch.js +135 -138
  189. package/dist/integrations/firebase.js +154 -157
  190. package/dist/integrations/googlesheets.js +323 -327
  191. package/dist/integrations/index.js +93 -51
  192. package/dist/integrations/microsoftSqlServer.js +240 -243
  193. package/dist/integrations/mongodb.js +239 -242
  194. package/dist/integrations/mysql.js +215 -219
  195. package/dist/integrations/oracle.js +318 -322
  196. package/dist/integrations/postgres.js +262 -265
  197. package/dist/integrations/redis.js +134 -139
  198. package/dist/integrations/rest.js +293 -281
  199. package/dist/integrations/s3.js +61 -64
  200. package/dist/integrations/snowflake.js +83 -86
  201. package/dist/package.json +8 -6
  202. package/dist/threads/automation.js +6 -0
  203. package/dist/threads/query.js +2 -2
  204. package/dist/tsconfig.build.tsbuildinfo +1 -1
  205. package/dist/utilities/fileSystem/index.js +116 -7
  206. package/dist/utilities/index.js +8 -0
  207. package/dist/utilities/rowProcessor/utils.js +1 -1
  208. package/dist/utilities/usageQuota/rows.js +2 -1
  209. package/dist/watch.js +77 -0
  210. package/package.json +9 -7
  211. package/scripts/dev/manage.js +1 -0
  212. package/src/api/controllers/application.ts +2 -6
  213. package/src/api/controllers/backup.js +2 -1
  214. package/src/api/controllers/component.js +25 -2
  215. package/src/api/controllers/datasource.js +4 -4
  216. package/src/api/controllers/deploy/index.ts +17 -4
  217. package/src/api/controllers/integration.js +4 -4
  218. package/src/api/controllers/plugin/file.ts +15 -0
  219. package/src/api/controllers/plugin/github.ts +75 -0
  220. package/src/api/controllers/plugin/index.ts +202 -0
  221. package/src/api/controllers/plugin/npm.ts +56 -0
  222. package/src/api/controllers/plugin/uploaders.ts +4 -0
  223. package/src/api/controllers/plugin/url.ts +12 -0
  224. package/src/api/controllers/plugin/utils.ts +19 -0
  225. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  226. package/src/api/controllers/screen.js +65 -1
  227. package/src/api/controllers/static/index.ts +1 -0
  228. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  229. package/src/api/controllers/static/templates/preview.hbs +3 -1
  230. package/src/api/routes/index.ts +2 -0
  231. package/src/api/routes/plugin.ts +14 -0
  232. package/src/api/routes/tests/query.spec.js +11 -28
  233. package/src/app.ts +12 -0
  234. package/src/automations/index.js +6 -3
  235. package/src/automations/triggers.js +44 -10
  236. package/src/automations/utils.ts +21 -9
  237. package/src/db/utils.js +12 -0
  238. package/src/definitions/datasource.ts +1 -0
  239. package/src/environment.js +1 -0
  240. package/src/integrations/airtable.ts +116 -118
  241. package/src/integrations/arangodb.ts +87 -89
  242. package/src/integrations/base/query.ts +2 -2
  243. package/src/integrations/couchdb.ts +83 -89
  244. package/src/integrations/dynamodb.ts +173 -175
  245. package/src/integrations/elasticsearch.ts +120 -122
  246. package/src/integrations/firebase.ts +157 -159
  247. package/src/integrations/googlesheets.ts +328 -338
  248. package/src/integrations/index.ts +59 -21
  249. package/src/integrations/microsoftSqlServer.ts +249 -251
  250. package/src/integrations/mongodb.ts +261 -258
  251. package/src/integrations/mysql.ts +229 -234
  252. package/src/integrations/oracle.ts +373 -380
  253. package/src/integrations/postgres.ts +264 -268
  254. package/src/integrations/redis.ts +128 -132
  255. package/src/integrations/rest.ts +325 -317
  256. package/src/integrations/s3.ts +68 -71
  257. package/src/integrations/snowflake.ts +80 -82
  258. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  259. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  260. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  261. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  262. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  263. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  264. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  265. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  266. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  267. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  268. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  269. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  270. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +57 -14
  271. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  272. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  273. package/src/module.d.ts +2 -0
  274. package/src/threads/automation.ts +6 -0
  275. package/src/threads/query.ts +2 -2
  276. package/src/utilities/fileSystem/index.js +135 -6
  277. package/src/utilities/index.js +8 -0
  278. package/src/utilities/rowProcessor/utils.js +1 -1
  279. package/src/utilities/usageQuota/rows.js +2 -1
  280. package/src/watch.ts +38 -0
  281. package/builder/assets/index.fb22f106.js +0 -875
  282. package/builder/assets/vendor.5e1fe644.css +0 -1
  283. package/builder/assets/vendor.67dbd8fa.js +0 -248
@@ -8,10 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- const { getScreenParams, generateScreenID } = require("../../db/utils");
11
+ const { getScreenParams, generateScreenID, getPluginParams, DocumentType, } = require("../../db/utils");
12
12
  const { AccessController } = require("@budibase/backend-core/roles");
13
13
  const { getAppDB } = require("@budibase/backend-core/context");
14
14
  const { events } = require("@budibase/backend-core");
15
+ const { getGlobalDB } = require("@budibase/backend-core/tenancy");
16
+ const { updateAppPackage } = require("./application");
15
17
  exports.fetch = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
16
18
  const db = getAppDB();
17
19
  const screens = (yield db.allDocs(getScreenParams(null, {
@@ -28,11 +30,44 @@ exports.save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
28
30
  eventFn = events.screen.created;
29
31
  }
30
32
  const response = yield db.put(screen);
33
+ // Find any custom components being used
34
+ let pluginNames = [];
35
+ let pluginAdded = false;
36
+ findPlugins(screen.props, pluginNames);
37
+ if (pluginNames.length) {
38
+ const globalDB = getGlobalDB();
39
+ const pluginsResponse = yield globalDB.allDocs(getPluginParams(null, {
40
+ include_docs: true,
41
+ }));
42
+ const requiredPlugins = pluginsResponse.rows
43
+ .map(row => row.doc)
44
+ .filter(plugin => {
45
+ return (plugin.schema.type === "component" &&
46
+ pluginNames.includes(`plugin/${plugin.name}`));
47
+ });
48
+ // Update the app metadata
49
+ const application = yield db.get(DocumentType.APP_METADATA);
50
+ let usedPlugins = application.usedPlugins || [];
51
+ requiredPlugins.forEach(plugin => {
52
+ if (!usedPlugins.find(x => x._id === plugin._id)) {
53
+ pluginAdded = true;
54
+ usedPlugins.push({
55
+ _id: plugin._id,
56
+ name: plugin.name,
57
+ version: plugin.version,
58
+ jsUrl: plugin.jsUrl,
59
+ });
60
+ }
61
+ });
62
+ if (pluginAdded) {
63
+ yield updateAppPackage({ usedPlugins }, ctx.appId);
64
+ }
65
+ }
31
66
  if (eventFn) {
32
67
  yield eventFn(screen);
33
68
  }
34
69
  ctx.message = `Screen ${screen.name} saved.`;
35
- ctx.body = Object.assign(Object.assign({}, screen), { _id: response.id, _rev: response.rev });
70
+ ctx.body = Object.assign(Object.assign({}, screen), { _id: response.id, _rev: response.rev, pluginAdded });
36
71
  });
37
72
  exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
38
73
  const db = getAppDB();
@@ -45,3 +80,17 @@ exports.destroy = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
45
80
  };
46
81
  ctx.status = 200;
47
82
  });
83
+ const findPlugins = (component, foundPlugins) => {
84
+ if (!component) {
85
+ return;
86
+ }
87
+ if (component._component.startsWith("plugin")) {
88
+ if (!foundPlugins.includes(component._component)) {
89
+ foundPlugins.push(component._component);
90
+ }
91
+ }
92
+ if (!component._children || !component._children.length) {
93
+ return;
94
+ }
95
+ component._children.forEach(child => findPlugins(child, foundPlugins));
96
+ };
@@ -113,6 +113,7 @@ const serveApp = function (ctx) {
113
113
  production: env.isProd(),
114
114
  appId,
115
115
  clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
116
+ usedPlugins: appInfo.usedPlugins,
116
117
  });
117
118
  const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`);
118
119
  ctx.body = yield processString(appHbs, {
@@ -3,6 +3,7 @@
3
3
  export let favicon = ""
4
4
 
5
5
  export let clientLibPath
6
+ export let usedPlugins
6
7
  </script>
7
8
 
8
9
  <svelte:head>
@@ -83,6 +84,15 @@
83
84
  </script>
84
85
  <script type="application/javascript" src={clientLibPath}>
85
86
  </script>
87
+ <!-- Custom components need inserted after the core client library -->
88
+ <!-- But before loadBudibase is called -->
89
+ {#if usedPlugins?.length}
90
+ {#each usedPlugins as plugin}
91
+ <script
92
+ type="application/javascript"
93
+ src={`/plugins/${plugin.jsUrl}`}></script>
94
+ {/each}
95
+ {/if}
86
96
  <script type="application/javascript">
87
97
  if (window.loadBudibase) {
88
98
  window.loadBudibase()
@@ -66,7 +66,8 @@
66
66
  customTheme,
67
67
  previewDevice,
68
68
  navigation,
69
- hiddenComponentIds
69
+ hiddenComponentIds,
70
+ usedPlugins
70
71
  } = parsed
71
72
 
72
73
  // Set some flags so the app knows we're in the builder
@@ -81,6 +82,7 @@
81
82
  window["##BUDIBASE_PREVIEW_DEVICE##"] = previewDevice
82
83
  window["##BUDIBASE_PREVIEW_NAVIGATION##"] = navigation
83
84
  window["##BUDIBASE_HIDDEN_COMPONENT_IDS##"] = hiddenComponentIds
85
+ window["##BUDIBASE_USED_PLUGINS##"] = usedPlugins
84
86
 
85
87
  // Initialise app
86
88
  try {
@@ -30,6 +30,7 @@ const metadata_1 = __importDefault(require("./metadata"));
30
30
  const dev_1 = __importDefault(require("./dev"));
31
31
  const cloud_1 = __importDefault(require("./cloud"));
32
32
  const migrations_1 = __importDefault(require("./migrations"));
33
+ const plugin_1 = __importDefault(require("./plugin"));
33
34
  var static_1 = require("./static");
34
35
  Object.defineProperty(exports, "staticRoutes", { enumerable: true, get: function () { return __importDefault(static_1).default; } });
35
36
  var public_1 = require("./public");
@@ -63,4 +64,5 @@ exports.mainRoutes = [
63
64
  table_1.default,
64
65
  row_1.default,
65
66
  migrations_1.default,
67
+ plugin_1.default,
66
68
  ];
@@ -0,0 +1,39 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const router_1 = __importDefault(require("@koa/router"));
30
+ const controller = __importStar(require("../controllers/plugin"));
31
+ const authorized_1 = __importDefault(require("../../middleware/authorized"));
32
+ const permissions_1 = require("@budibase/backend-core/permissions");
33
+ const router = new router_1.default();
34
+ router
35
+ .post("/api/plugin/upload", (0, authorized_1.default)(permissions_1.BUILDER), controller.upload)
36
+ .post("/api/plugin", (0, authorized_1.default)(permissions_1.BUILDER), controller.create)
37
+ .get("/api/plugin", (0, authorized_1.default)(permissions_1.BUILDER), controller.fetch)
38
+ .delete("/api/plugin/:pluginId", (0, authorized_1.default)(permissions_1.BUILDER), controller.destroy);
39
+ exports.default = router;
package/dist/app.js CHANGED
@@ -60,10 +60,12 @@ const bullboard = require("./automations/bullboard");
60
60
  const { logAlert } = require("@budibase/backend-core/logging");
61
61
  const { pinoSettings } = require("@budibase/backend-core");
62
62
  const { Thread } = require("./threads");
63
+ const fs = require("fs");
63
64
  const redis_1 = __importDefault(require("./utilities/redis"));
64
65
  const migrations = __importStar(require("./migrations"));
65
66
  const backend_core_1 = require("@budibase/backend-core");
66
67
  const workerRequests_1 = require("./utilities/workerRequests");
68
+ const watch_1 = require("./watch");
67
69
  const app = new Koa();
68
70
  // set up top level koa middleware
69
71
  app.use(koaBody({
@@ -150,6 +152,13 @@ module.exports = server.listen(env.PORT || 0, () => __awaiter(void 0, void 0, vo
150
152
  }
151
153
  }
152
154
  }
155
+ // monitor plugin directory if required
156
+ if (env.SELF_HOSTED &&
157
+ !env.MULTI_TENANCY &&
158
+ env.PLUGINS_DIR &&
159
+ fs.existsSync(env.PLUGINS_DIR)) {
160
+ (0, watch_1.watch)();
161
+ }
153
162
  // check for version updates
154
163
  yield backend_core_1.installation.checkInstallVersion();
155
164
  // done last - this will never complete
@@ -10,16 +10,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  const { processEvent } = require("./utils");
12
12
  const { queue, shutdown } = require("./bullboard");
13
- const { TRIGGER_DEFINITIONS } = require("./triggers");
13
+ const { TRIGGER_DEFINITIONS, rebootTrigger } = require("./triggers");
14
14
  const { ACTION_DEFINITIONS } = require("./actions");
15
15
  /**
16
16
  * This module is built purely to kick off the worker farm and manage the inputs/outputs
17
17
  */
18
18
  exports.init = function () {
19
- // this promise will not complete
20
- return queue.process((job) => __awaiter(this, void 0, void 0, function* () {
21
- yield processEvent(job);
22
- }));
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ // this promise will not complete
21
+ const promise = queue.process((job) => __awaiter(this, void 0, void 0, function* () {
22
+ yield processEvent(job);
23
+ }));
24
+ // on init we need to trigger any reboot automations
25
+ yield rebootTrigger();
26
+ return promise;
27
+ });
23
28
  };
24
29
  exports.getQueues = () => {
25
30
  return [queue];
@@ -19,23 +19,28 @@ const { checkTestFlag } = require("../utilities/redis");
19
19
  const utils = require("./utils");
20
20
  const env = require("../environment");
21
21
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
22
+ const { getAllApps } = require("@budibase/backend-core/db");
22
23
  const TRIGGER_DEFINITIONS = definitions;
23
24
  const JOB_OPTS = {
24
25
  removeOnComplete: true,
25
26
  removeOnFail: true,
26
27
  };
28
+ function getAllAutomations() {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ const db = getAppDB();
31
+ let automations = yield db.allDocs(getAutomationParams(null, { include_docs: true }));
32
+ return automations.rows.map(row => row.doc);
33
+ });
34
+ }
27
35
  function queueRelevantRowAutomations(event, eventType) {
28
36
  return __awaiter(this, void 0, void 0, function* () {
29
37
  if (event.appId == null) {
30
38
  throw `No appId specified for ${eventType} - check event emitters.`;
31
39
  }
32
40
  doInAppContext(event.appId, () => __awaiter(this, void 0, void 0, function* () {
33
- const db = getAppDB();
34
- let automations = yield db.allDocs(getAutomationParams(null, { include_docs: true }));
41
+ let automations = yield getAllAutomations();
35
42
  // filter down to the correct event type
36
- automations = automations.rows
37
- .map(automation => automation.doc)
38
- .filter(automation => {
43
+ automations = automations.filter(automation => {
39
44
  const trigger = automation.definition.trigger;
40
45
  return trigger && trigger.event === eventType;
41
46
  });
@@ -109,4 +114,33 @@ exports.externalTrigger = function (automation, params, { getResponses } = {}) {
109
114
  }
110
115
  });
111
116
  };
117
+ exports.rebootTrigger = () => __awaiter(void 0, void 0, void 0, function* () {
118
+ // reboot cron option is only available on the main thread at
119
+ // startup and only usable in self host
120
+ if (env.isInThread() || !env.SELF_HOSTED) {
121
+ return;
122
+ }
123
+ // iterate through all production apps, find the reboot crons
124
+ // and trigger events for them
125
+ const appIds = yield getAllApps({ dev: false, idsOnly: true });
126
+ for (let prodAppId of appIds) {
127
+ yield doInAppContext(prodAppId, () => __awaiter(void 0, void 0, void 0, function* () {
128
+ let automations = yield getAllAutomations();
129
+ let rebootEvents = [];
130
+ for (let automation of automations) {
131
+ if (utils.isRebootTrigger(automation)) {
132
+ const job = {
133
+ automation,
134
+ event: {
135
+ appId: prodAppId,
136
+ timestamp: Date.now(),
137
+ },
138
+ };
139
+ rebootEvents.push(queue.add(job, JOB_OPTS));
140
+ }
141
+ }
142
+ yield Promise.all(rebootEvents);
143
+ }));
144
+ }
145
+ });
112
146
  exports.TRIGGER_DEFINITIONS = TRIGGER_DEFINITIONS;
@@ -35,7 +35,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
35
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.isErrorInOutput = exports.isRecurring = exports.cleanupAutomations = exports.checkForWebhooks = exports.enableCronTrigger = exports.clearMetadata = exports.disableCron = exports.disableAllCrons = exports.removeDeprecated = exports.updateTestHistory = exports.processEvent = void 0;
38
+ exports.isErrorInOutput = exports.isRecurring = exports.cleanupAutomations = exports.checkForWebhooks = exports.enableCronTrigger = exports.isRebootTrigger = exports.isCronTrigger = exports.clearMetadata = exports.disableCron = exports.disableAllCrons = exports.removeDeprecated = exports.updateTestHistory = exports.processEvent = void 0;
39
39
  const threads_1 = require("../threads");
40
40
  const triggerInfo_1 = require("./triggerInfo");
41
41
  const webhooks = __importStar(require("../api/controllers/webhook"));
@@ -49,6 +49,7 @@ const fp_1 = require("lodash/fp");
49
49
  const context_1 = require("@budibase/backend-core/context");
50
50
  const backend_core_1 = require("@budibase/backend-core");
51
51
  const pro_1 = require("@budibase/pro");
52
+ const REBOOT_CRON = "@reboot";
52
53
  const WH_STEP_ID = triggerInfo_1.definitions.WEBHOOK.stepId;
53
54
  const CRON_STEP_ID = triggerInfo_1.definitions.CRON.stepId;
54
55
  const Runner = new threads_1.Thread(threads_1.ThreadType.AUTOMATION);
@@ -139,6 +140,17 @@ function clearMetadata() {
139
140
  });
140
141
  }
141
142
  exports.clearMetadata = clearMetadata;
143
+ function isCronTrigger(auto) {
144
+ return (auto &&
145
+ auto.definition.trigger &&
146
+ auto.definition.trigger.stepId === CRON_STEP_ID);
147
+ }
148
+ exports.isCronTrigger = isCronTrigger;
149
+ function isRebootTrigger(auto) {
150
+ const trigger = auto ? auto.definition.trigger : null;
151
+ return isCronTrigger(auto) && (trigger === null || trigger === void 0 ? void 0 : trigger.inputs.cron) === REBOOT_CRON;
152
+ }
153
+ exports.isRebootTrigger = isRebootTrigger;
142
154
  /**
143
155
  * This function handles checking of any cron jobs that need to be enabled/updated.
144
156
  * @param {string} appId The ID of the app in which we are checking for webhooks
@@ -147,13 +159,10 @@ exports.clearMetadata = clearMetadata;
147
159
  function enableCronTrigger(appId, automation) {
148
160
  return __awaiter(this, void 0, void 0, function* () {
149
161
  const trigger = automation ? automation.definition.trigger : null;
150
- function isCronTrigger(auto) {
151
- return (auto &&
152
- auto.definition.trigger &&
153
- auto.definition.trigger.stepId === CRON_STEP_ID);
154
- }
155
162
  // need to create cron job
156
- if (isCronTrigger(automation) && (trigger === null || trigger === void 0 ? void 0 : trigger.inputs.cron)) {
163
+ if (isCronTrigger(automation) &&
164
+ !isRebootTrigger(automation) &&
165
+ (trigger === null || trigger === void 0 ? void 0 : trigger.inputs.cron)) {
157
166
  // make a job id rather than letting Bull decide, makes it easier to handle on way out
158
167
  const jobId = `${appId}_cron_${(0, newid_1.default)()}`;
159
168
  const job = yield bullboard_1.queue.add({
package/dist/db/utils.js CHANGED
@@ -7,7 +7,7 @@ const AppStatus = {
7
7
  ALL: "all",
8
8
  DEPLOYED: "published",
9
9
  };
10
- const DocumentType = Object.assign(Object.assign({}, CoreDocTypes), { TABLE: "ta", ROW: "ro", USER: "us", AUTOMATION: "au", LINK: "li", WEBHOOK: "wh", INSTANCE: "inst", LAYOUT: "layout", SCREEN: "screen", DATASOURCE: "datasource", DATASOURCE_PLUS: "datasource_plus", QUERY: "query", DEPLOYMENTS: "deployments", METADATA: "metadata", MEM_VIEW: "view", USER_FLAG: "flag", AUTOMATION_METADATA: "meta_au" });
10
+ const DocumentType = Object.assign(Object.assign({}, CoreDocTypes), { TABLE: "ta", ROW: "ro", USER: "us", AUTOMATION: "au", LINK: "li", WEBHOOK: "wh", INSTANCE: "inst", LAYOUT: "layout", SCREEN: "screen", DATASOURCE: "datasource", DATASOURCE_PLUS: "datasource_plus", QUERY: "query", DEPLOYMENTS: "deployments", METADATA: "metadata", MEM_VIEW: "view", USER_FLAG: "flag", AUTOMATION_METADATA: "meta_au", PLUGIN: "plg" });
11
11
  const InternalTables = {
12
12
  USER_METADATA: "ta_users",
13
13
  };
@@ -274,6 +274,9 @@ exports.generateMemoryViewID = viewName => {
274
274
  exports.getMemoryViewParams = (otherProps = {}) => {
275
275
  return getDocParams(DocumentType.MEM_VIEW, null, otherProps);
276
276
  };
277
+ exports.generatePluginID = name => {
278
+ return `${DocumentType.PLUGIN}${SEPARATOR}${name}`;
279
+ };
277
280
  /**
278
281
  * This can be used with the db.allDocs to get a list of IDs
279
282
  */
@@ -283,3 +286,9 @@ exports.getMultiIDParams = ids => {
283
286
  include_docs: true,
284
287
  };
285
288
  };
289
+ /**
290
+ * Gets parameters for retrieving automations, this is a utility function for the getDocParams function.
291
+ */
292
+ exports.getPluginParams = (pluginId = null, otherProps = {}) => {
293
+ return getDocParams(DocumentType.PLUGIN, pluginId, otherProps);
294
+ };
@@ -64,6 +64,7 @@ module.exports = {
64
64
  SQL_MAX_ROWS: process.env.SQL_MAX_ROWS,
65
65
  BB_ADMIN_USER_EMAIL: process.env.BB_ADMIN_USER_EMAIL,
66
66
  BB_ADMIN_USER_PASSWORD: process.env.BB_ADMIN_USER_PASSWORD,
67
+ PLUGINS_DIR: process.env.PLUGINS_DIR || "/plugins",
67
68
  // flags
68
69
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
69
70
  DISABLE_THREADING: process.env.DISABLE_THREADING,