@budibase/server 1.3.19-alpha.1 → 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 -441
  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 +5 -5
  74. package/coverage/lcov-report/api/routes/utils/validators.js.html +6 -9
  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 +37 -37
  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 +667 -780
  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 +1 -2
  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 +1 -2
  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.1709d1b3.js +0 -1005
  285. package/builder/assets/index.8f621053.css +0 -6
  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
@@ -14,18 +14,14 @@ const { join } = require("path");
14
14
  const uuid = require("uuid/v4");
15
15
  const { doWithDB, dangerousGetDB, closeDB, } = require("@budibase/backend-core/db");
16
16
  const { ObjectStoreBuckets } = require("../../constants");
17
- const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, downloadTarballDirect, deleteFiles, } = require("./utilities");
17
+ const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, deleteFiles, } = require("./utilities");
18
18
  const { updateClientLibrary } = require("./clientLibrary");
19
- const { checkSlashesInUrl } = require("../");
20
19
  const env = require("../../environment");
21
20
  const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, TABLE_ROW_PREFIX, } = require("../../db/utils");
22
21
  const MemoryStream = require("memorystream");
23
22
  const { getAppId } = require("@budibase/backend-core/context");
24
- const tar = require("tar");
25
- const fetch = require("node-fetch");
26
23
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
27
24
  const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules");
28
- const DATASOURCE_PATH = join(budibaseTempDir(), "datasource");
29
25
  /**
30
26
  * The single stack system (Cloud and Builder) should not make use of the file system where possible,
31
27
  * this file handles all of the file access for the system with the intention of limiting it all to one
@@ -100,12 +96,6 @@ exports.getTemplateStream = (template) => __awaiter(void 0, void 0, void 0, func
100
96
  exports.loadHandlebarsFile = path => {
101
97
  return fs.readFileSync(path, "utf8");
102
98
  };
103
- /**
104
- * Same as above just with a different name.
105
- */
106
- exports.loadJSFile = (directory, name) => {
107
- return fs.readFileSync(join(directory, name), "utf8");
108
- };
109
99
  /**
110
100
  * When return a file from the API need to write the file to the system temporarily so we
111
101
  * can create a read stream to send.
@@ -304,104 +294,6 @@ exports.cleanup = appIds => {
304
294
  }
305
295
  }
306
296
  };
307
- const createTempFolder = item => {
308
- const path = join(budibaseTempDir(), item);
309
- try {
310
- // remove old tmp directories automatically - don't combine
311
- if (fs.existsSync(path)) {
312
- fs.rmSync(path, { recursive: true, force: true });
313
- }
314
- fs.mkdirSync(path);
315
- }
316
- catch (err) {
317
- throw new Error(`Path cannot be created: ${err.message}`);
318
- }
319
- return path;
320
- };
321
- exports.createTempFolder = createTempFolder;
322
- const extractTarball = (fromFilePath, toPath) => __awaiter(void 0, void 0, void 0, function* () {
323
- yield tar.extract({
324
- file: fromFilePath,
325
- C: toPath,
326
- });
327
- });
328
- exports.extractTarball = extractTarball;
329
- const getPluginMetadata = (path) => __awaiter(void 0, void 0, void 0, function* () {
330
- let metadata = {};
331
- try {
332
- const pkg = fs.readFileSync(join(path, "package.json"), "utf8");
333
- const schema = fs.readFileSync(join(path, "schema.json"), "utf8");
334
- metadata.schema = JSON.parse(schema);
335
- metadata.package = JSON.parse(pkg);
336
- if (!metadata.package.name ||
337
- !metadata.package.version ||
338
- !metadata.package.description) {
339
- throw new Error("package.json is missing one of 'name', 'version' or 'description'.");
340
- }
341
- }
342
- catch (err) {
343
- throw new Error(`Unable to process schema.json/package.json in plugin. ${err.message}`);
344
- }
345
- return { metadata, directory: path };
346
- });
347
- exports.getPluginMetadata = getPluginMetadata;
348
- exports.getDatasourcePlugin = (name, url, hash) => __awaiter(void 0, void 0, void 0, function* () {
349
- if (!fs.existsSync(DATASOURCE_PATH)) {
350
- fs.mkdirSync(DATASOURCE_PATH);
351
- }
352
- const filename = join(DATASOURCE_PATH, name);
353
- const metadataName = `${filename}.bbmetadata`;
354
- if (fs.existsSync(filename)) {
355
- const currentHash = fs.readFileSync(metadataName, "utf8");
356
- // if hash is the same return the file, otherwise remove it and re-download
357
- if (currentHash === hash) {
358
- return require(filename);
359
- }
360
- else {
361
- console.log(`Updating plugin: ${name}`);
362
- fs.unlinkSync(filename);
363
- }
364
- }
365
- const fullUrl = checkSlashesInUrl(`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`);
366
- const response = yield fetch(fullUrl);
367
- if (response.status === 200) {
368
- const content = yield response.text();
369
- fs.writeFileSync(filename, content);
370
- fs.writeFileSync(metadataName, hash);
371
- return require(filename);
372
- }
373
- else {
374
- throw new Error(`Unable to retrieve plugin - reason: ${yield response.text()}`);
375
- }
376
- });
377
- /**
378
- * Find for a file recursively from start path applying filter, return first match
379
- */
380
- exports.findFileRec = (startPath, filter) => {
381
- if (!fs.existsSync(startPath)) {
382
- return;
383
- }
384
- const files = fs.readdirSync(startPath);
385
- for (let i = 0, len = files.length; i < len; i++) {
386
- const filename = join(startPath, files[i]);
387
- const stat = fs.lstatSync(filename);
388
- if (stat.isDirectory()) {
389
- return exports.findFileRec(filename, filter);
390
- }
391
- else if (filename.endsWith(filter)) {
392
- return filename;
393
- }
394
- }
395
- };
396
- /**
397
- * Remove a folder which is not empty from the file system
398
- */
399
- exports.deleteFolderFileSystem = path => {
400
- if (!fs.existsSync(path)) {
401
- return;
402
- }
403
- fs.rmSync(path, { recursive: true, force: true });
404
- };
405
297
  /**
406
298
  * Full function definition for below can be found in the utilities.
407
299
  */
@@ -409,6 +301,5 @@ exports.upload = upload;
409
301
  exports.retrieve = retrieve;
410
302
  exports.retrieveToTmp = retrieveToTmp;
411
303
  exports.deleteFiles = deleteFiles;
412
- exports.downloadTarballDirect = downloadTarballDirect;
413
304
  exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH;
414
305
  exports.NODE_MODULES_PATH = NODE_MODULES_PATH;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.3.19-alpha.1",
4
+ "version": "1.3.19",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -77,11 +77,11 @@
77
77
  "license": "GPL-3.0",
78
78
  "dependencies": {
79
79
  "@apidevtools/swagger-parser": "10.0.3",
80
- "@budibase/backend-core": "1.3.19-alpha.1",
81
- "@budibase/client": "1.3.19-alpha.1",
82
- "@budibase/pro": "1.3.19-alpha.0",
83
- "@budibase/string-templates": "1.3.19-alpha.1",
84
- "@budibase/types": "1.3.19-alpha.1",
80
+ "@budibase/backend-core": "^1.3.19",
81
+ "@budibase/client": "^1.3.19",
82
+ "@budibase/pro": "1.3.18",
83
+ "@budibase/string-templates": "^1.3.19",
84
+ "@budibase/types": "^1.3.19",
85
85
  "@bull-board/api": "3.7.0",
86
86
  "@bull-board/koa": "3.9.4",
87
87
  "@elastic/elasticsearch": "7.10.0",
@@ -95,7 +95,6 @@
95
95
  "bcryptjs": "2.4.3",
96
96
  "bull": "4.8.5",
97
97
  "chmodr": "1.2.0",
98
- "chokidar": "3.5.3",
99
98
  "csvtojson": "2.0.10",
100
99
  "curlconverter": "3.21.0",
101
100
  "dotenv": "8.2.0",
@@ -139,10 +138,8 @@
139
138
  "redis": "4",
140
139
  "server-destroy": "1.0.1",
141
140
  "snowflake-promise": "^4.5.0",
142
- "socket.io": "^4.5.1",
143
141
  "svelte": "3.49.0",
144
142
  "swagger-parser": "10.0.3",
145
- "tar": "6.1.11",
146
143
  "to-json-schema": "0.2.5",
147
144
  "uuid": "3.3.2",
148
145
  "validate.js": "0.13.1",
@@ -199,5 +196,5 @@
199
196
  "optionalDependencies": {
200
197
  "oracledb": "5.3.0"
201
198
  },
202
- "gitHead": "9eb4995976ec00b40ba52df7d0bc357e8df6edce"
199
+ "gitHead": "1e621da16bad75ae6a2dfcd732e676cf0b56a2a4"
203
200
  }
@@ -58,7 +58,6 @@ async function init() {
58
58
  DEPLOYMENT_ENVIRONMENT: "development",
59
59
  BB_ADMIN_USER_EMAIL: "",
60
60
  BB_ADMIN_USER_PASSWORD: "",
61
- PLUGINS_DIR: "",
62
61
  }
63
62
  let envFile = ""
64
63
  Object.keys(envFileJson).forEach(key => {
@@ -17,8 +17,6 @@ const arg = process.argv.slice(2)[0]
17
17
  */
18
18
  updateDotEnv({
19
19
  ACCOUNT_PORTAL_URL:
20
- arg === "enable"
21
- ? "http://account.local.com:10001"
22
- : "http://localhost:10001",
20
+ arg === "enable" ? "http://local.com:10001" : "http://localhost:10001",
23
21
  COOKIE_DOMAIN: arg === "enable" ? ".local.com" : "",
24
22
  }).then(() => console.log("Updated worker!"))
@@ -1327,7 +1327,7 @@
1327
1327
  "type": "string"
1328
1328
  },
1329
1329
  "datasourceId": {
1330
- "description": "The ID of the datasource the query belongs to.",
1330
+ "description": "The ID of the data source the query belongs to.",
1331
1331
  "type": "string"
1332
1332
  },
1333
1333
  "parameters": {
@@ -1386,7 +1386,7 @@
1386
1386
  "type": "string"
1387
1387
  },
1388
1388
  "datasourceId": {
1389
- "description": "The ID of the datasource the query belongs to.",
1389
+ "description": "The ID of the data source the query belongs to.",
1390
1390
  "type": "string"
1391
1391
  },
1392
1392
  "parameters": {
@@ -2289,7 +2289,7 @@
2289
2289
  },
2290
2290
  "responses": {
2291
2291
  "200": {
2292
- "description": "Returns the created table, including the ID which has been generated for it. This can be internal or external datasources.",
2292
+ "description": "Returns the created table, including the ID which has been generated for it. This can be internal or external data sources.",
2293
2293
  "content": {
2294
2294
  "application/json": {
2295
2295
  "schema": {
@@ -1004,7 +1004,7 @@ components:
1004
1004
  description: The ID of the query.
1005
1005
  type: string
1006
1006
  datasourceId:
1007
- description: The ID of the datasource the query belongs to.
1007
+ description: The ID of the data source the query belongs to.
1008
1008
  type: string
1009
1009
  parameters:
1010
1010
  description: The bindings which are required to perform this query.
@@ -1051,7 +1051,7 @@ components:
1051
1051
  description: The ID of the query.
1052
1052
  type: string
1053
1053
  datasourceId:
1054
- description: The ID of the datasource the query belongs to.
1054
+ description: The ID of the data source the query belongs to.
1055
1055
  type: string
1056
1056
  parameters:
1057
1057
  description: The bindings which are required to perform this query.
@@ -1665,7 +1665,7 @@ paths:
1665
1665
  responses:
1666
1666
  "200":
1667
1667
  description: Returns the created table, including the ID which has been
1668
- generated for it. This can be internal or external datasources.
1668
+ generated for it. This can be internal or external data sources.
1669
1669
  content:
1670
1670
  application/json:
1671
1671
  schema:
@@ -82,7 +82,7 @@ const querySchema = object(
82
82
  type: "string",
83
83
  },
84
84
  datasourceId: {
85
- description: "The ID of the datasource the query belongs to.",
85
+ description: "The ID of the data source the query belongs to.",
86
86
  type: "string",
87
87
  },
88
88
  parameters: {
@@ -472,6 +472,7 @@ const destroyApp = async (ctx: any) => {
472
472
  const result = await db.destroy()
473
473
 
474
474
  if (isUnpublish) {
475
+ await quotas.removePublishedApp()
475
476
  await events.app.unpublished(app)
476
477
  } else {
477
478
  await quotas.removeApp()
@@ -571,7 +572,7 @@ export const sync = async (ctx: any, next: any) => {
571
572
  }
572
573
  }
573
574
 
574
- export const updateAppPackage = async (appPackage: any, appId: any) => {
575
+ const updateAppPackage = async (appPackage: any, appId: any) => {
575
576
  return context.doInAppContext(appId, async () => {
576
577
  const db = context.getAppDB()
577
578
  const application = await db.get(DocumentType.APP_METADATA)
@@ -4,15 +4,6 @@ const { getFullUser } = require("../../utilities/users")
4
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
5
  const { getAppDB, getAppId } = require("@budibase/backend-core/context")
6
6
 
7
- /**
8
- * Add the attributes that are session based to the current user.
9
- */
10
- const addSessionAttributesToUser = ctx => {
11
- if (ctx.user) {
12
- ctx.body.license = ctx.user.license
13
- }
14
- }
15
-
16
7
  exports.fetchSelf = async ctx => {
17
8
  let userId = ctx.user.userId || ctx.user._id
18
9
  /* istanbul ignore next */
@@ -64,6 +55,4 @@ exports.fetchSelf = async ctx => {
64
55
  } else {
65
56
  ctx.body = user
66
57
  }
67
-
68
- addSessionAttributesToUser(ctx)
69
58
  }
@@ -1,7 +1,6 @@
1
- const { DocumentType, getPluginParams } = require("../../db/utils")
1
+ const { DocumentType } = require("../../db/utils")
2
2
  const { getComponentLibraryManifest } = require("../../utilities/fileSystem")
3
3
  const { getAppDB } = require("@budibase/backend-core/context")
4
- const { getGlobalDB } = require("@budibase/backend-core/tenancy")
5
4
 
6
5
  exports.fetchAppComponentDefinitions = async function (ctx) {
7
6
  try {
@@ -11,6 +10,7 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
11
10
  let componentManifests = await Promise.all(
12
11
  app.componentLibraries.map(async library => {
13
12
  let manifest = await getComponentLibraryManifest(library)
13
+
14
14
  return {
15
15
  manifest,
16
16
  library,
@@ -31,25 +31,6 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
31
31
  }
32
32
  }
33
33
  }
34
-
35
- // Add custom components
36
- const globalDB = getGlobalDB()
37
- const response = await globalDB.allDocs(
38
- getPluginParams(null, {
39
- include_docs: true,
40
- })
41
- )
42
- response.rows
43
- .map(row => row.doc)
44
- .filter(plugin => plugin.schema.type === "component")
45
- .forEach(plugin => {
46
- const fullComponentName = `plugin/${plugin.name}`
47
- definitions[fullComponentName] = {
48
- component: fullComponentName,
49
- ...plugin.schema.schema,
50
- }
51
- })
52
-
53
34
  ctx.body = definitions
54
35
  } catch (err) {
55
36
  console.error(`component-definitions=failed`, err)
@@ -7,7 +7,7 @@ const {
7
7
  getTableParams,
8
8
  } = require("../../db/utils")
9
9
  const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
10
- const { getIntegration } = require("../../integrations")
10
+ const { integrations } = require("../../integrations")
11
11
  const { getDatasourceAndQuery } = require("./row/utils")
12
12
  const { invalidateDynamicVariables } = require("../../threads/utils")
13
13
  const { getAppDB } = require("@budibase/backend-core/context")
@@ -50,23 +50,9 @@ exports.fetch = async function (ctx) {
50
50
  exports.buildSchemaFromDb = async function (ctx) {
51
51
  const db = getAppDB()
52
52
  const datasource = await db.get(ctx.params.datasourceId)
53
- const tablesFilter = ctx.request.body.tablesFilter
54
53
 
55
- let { tables, error } = await buildSchemaHelper(datasource)
56
- if (tablesFilter) {
57
- if (!datasource.entities) {
58
- datasource.entities = {}
59
- }
60
- for (let key in tables) {
61
- if (
62
- tablesFilter.some(filter => filter.toLowerCase() === key.toLowerCase())
63
- ) {
64
- datasource.entities[key] = tables[key]
65
- }
66
- }
67
- } else {
68
- datasource.entities = tables
69
- }
54
+ const { tables, error } = await buildSchemaHelper(datasource)
55
+ datasource.entities = tables
70
56
 
71
57
  const dbResp = await db.put(datasource)
72
58
  datasource._rev = dbResp.rev
@@ -128,7 +114,7 @@ exports.update = async function (ctx) {
128
114
 
129
115
  // Drain connection pools when configuration is changed
130
116
  if (datasource.source) {
131
- const source = await getIntegration(datasource.source)
117
+ const source = integrations[datasource.source]
132
118
  if (source && source.pool) {
133
119
  await source.pool.end()
134
120
  }
@@ -163,7 +149,7 @@ exports.save = async function (ctx) {
163
149
 
164
150
  // Drain connection pools when configuration is changed
165
151
  if (datasource.source) {
166
- const source = await getIntegration(datasource.source)
152
+ const source = integrations[datasource.source]
167
153
  if (source && source.pool) {
168
154
  await source.pool.end()
169
155
  }
@@ -232,14 +218,15 @@ function updateError(error, newError, tables) {
232
218
  }
233
219
 
234
220
  const buildSchemaHelper = async datasource => {
235
- const Connector = await getIntegration(datasource.source)
221
+ const Connector = integrations[datasource.source]
236
222
 
237
223
  // Connect to the DB and build the schema
238
224
  const connector = new Connector(datasource.config)
239
225
  await connector.buildSchema(datasource._id, datasource.entities)
226
+ datasource.entities = connector.tables
240
227
 
241
228
  // make sure they all have a display name selected
242
- for (let entity of Object.values(datasource.entities ?? {})) {
229
+ for (let entity of Object.values(datasource.entities)) {
243
230
  if (entity.primaryDisplay) {
244
231
  continue
245
232
  }
@@ -206,7 +206,12 @@ const _deployApp = async function (ctx: any) {
206
206
 
207
207
  console.log("Deploying app...")
208
208
 
209
- let app = await deployApp(deployment)
209
+ let app
210
+ if (await isFirstDeploy()) {
211
+ app = await quotas.addPublishedApp(() => deployApp(deployment))
212
+ } else {
213
+ app = await deployApp(deployment)
214
+ }
210
215
 
211
216
  await events.app.published(app)
212
217
  ctx.body = deployment
@@ -1,11 +1,12 @@
1
- const { getDefinitions } = require("../../integrations")
1
+ const { cloneDeep } = require("lodash")
2
+ const { definitions } = require("../../integrations")
2
3
  const { SourceName } = require("@budibase/types")
3
4
  const googlesheets = require("../../integrations/googlesheets")
4
5
  const { featureFlags } = require("@budibase/backend-core")
5
6
 
6
7
  exports.fetch = async function (ctx) {
7
8
  ctx.status = 200
8
- const defs = await getDefinitions()
9
+ const defs = cloneDeep(definitions)
9
10
 
10
11
  // for google sheets integration google verification
11
12
  if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
@@ -16,7 +17,6 @@ exports.fetch = async function (ctx) {
16
17
  }
17
18
 
18
19
  exports.find = async function (ctx) {
19
- const defs = await getDefinitions()
20
20
  ctx.status = 200
21
- ctx.body = defs[ctx.params.type]
21
+ ctx.body = definitions[ctx.params.type]
22
22
  }
@@ -53,7 +53,7 @@ exports.save = async ctx => {
53
53
  }
54
54
 
55
55
  exports.fetchView = async ctx => {
56
- // there are no views in external datasources, shouldn't ever be called
56
+ // there are no views in external data sources, shouldn't ever be called
57
57
  // for now just fetch
58
58
  const split = ctx.params.viewName.split("all_")
59
59
  ctx.params.tableId = split[1] ? split[1] : split[0]
@@ -1,14 +1,7 @@
1
- const {
2
- getScreenParams,
3
- generateScreenID,
4
- getPluginParams,
5
- DocumentType,
6
- } = require("../../db/utils")
1
+ const { getScreenParams, generateScreenID } = require("../../db/utils")
7
2
  const { AccessController } = require("@budibase/backend-core/roles")
8
3
  const { getAppDB } = require("@budibase/backend-core/context")
9
4
  const { events } = require("@budibase/backend-core")
10
- const { getGlobalDB } = require("@budibase/backend-core/tenancy")
11
- const { updateAppPackage } = require("./application")
12
5
 
13
6
  exports.fetch = async ctx => {
14
7
  const db = getAppDB()
@@ -39,48 +32,6 @@ exports.save = async ctx => {
39
32
 
40
33
  const response = await db.put(screen)
41
34
 
42
- // Find any custom components being used
43
- let pluginNames = []
44
- let pluginAdded = false
45
- findPlugins(screen.props, pluginNames)
46
- if (pluginNames.length) {
47
- const globalDB = getGlobalDB()
48
- const pluginsResponse = await globalDB.allDocs(
49
- getPluginParams(null, {
50
- include_docs: true,
51
- })
52
- )
53
- const requiredPlugins = pluginsResponse.rows
54
- .map(row => row.doc)
55
- .filter(plugin => {
56
- return (
57
- plugin.schema.type === "component" &&
58
- pluginNames.includes(`plugin/${plugin.name}`)
59
- )
60
- })
61
-
62
- // Update the app metadata
63
- const application = await db.get(DocumentType.APP_METADATA)
64
- let usedPlugins = application.usedPlugins || []
65
-
66
- requiredPlugins.forEach(plugin => {
67
- if (!usedPlugins.find(x => x._id === plugin._id)) {
68
- pluginAdded = true
69
- usedPlugins.push({
70
- _id: plugin._id,
71
- name: plugin.name,
72
- version: plugin.version,
73
- jsUrl: plugin.jsUrl,
74
- hash: plugin.hash,
75
- })
76
- }
77
- })
78
-
79
- if (pluginAdded) {
80
- await updateAppPackage({ usedPlugins }, ctx.appId)
81
- }
82
- }
83
-
84
35
  if (eventFn) {
85
36
  await eventFn(screen)
86
37
  }
@@ -89,7 +40,6 @@ exports.save = async ctx => {
89
40
  ...screen,
90
41
  _id: response.id,
91
42
  _rev: response.rev,
92
- pluginAdded,
93
43
  }
94
44
  }
95
45
 
@@ -106,18 +56,3 @@ exports.destroy = async ctx => {
106
56
  }
107
57
  ctx.status = 200
108
58
  }
109
-
110
- const findPlugins = (component, foundPlugins) => {
111
- if (!component) {
112
- return
113
- }
114
- if (component._component.startsWith("plugin")) {
115
- if (!foundPlugins.includes(component._component)) {
116
- foundPlugins.push(component._component)
117
- }
118
- }
119
- if (!component._children || !component._children.length) {
120
- return
121
- }
122
- component._children.forEach(child => findPlugins(child, foundPlugins))
123
- }
@@ -18,6 +18,7 @@ const { DocumentType } = require("../../../db/utils")
18
18
  const { getAppDB, getAppId } = require("@budibase/backend-core/context")
19
19
  const { setCookie, clearCookie } = require("@budibase/backend-core/utils")
20
20
  const AWS = require("aws-sdk")
21
+
21
22
  const fs = require("fs")
22
23
  const {
23
24
  downloadTarballDirect,
@@ -112,7 +113,6 @@ export const serveApp = async function (ctx: any) {
112
113
  production: env.isProd(),
113
114
  appId,
114
115
  clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
115
- usedPlugins: appInfo.usedPlugins,
116
116
  })
117
117
 
118
118
  const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`)
@@ -3,7 +3,6 @@
3
3
  export let favicon = ""
4
4
 
5
5
  export let clientLibPath
6
- export let usedPlugins
7
6
  </script>
8
7
 
9
8
  <svelte:head>
@@ -84,15 +83,6 @@
84
83
  </script>
85
84
  <script type="application/javascript" src={clientLibPath}>
86
85
  </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}
96
86
  <script type="application/javascript">
97
87
  if (window.loadBudibase) {
98
88
  window.loadBudibase()
@@ -66,9 +66,7 @@
66
66
  customTheme,
67
67
  previewDevice,
68
68
  navigation,
69
- hiddenComponentIds,
70
- usedPlugins,
71
- location
69
+ hiddenComponentIds
72
70
  } = parsed
73
71
 
74
72
  // Set some flags so the app knows we're in the builder
@@ -83,8 +81,6 @@
83
81
  window["##BUDIBASE_PREVIEW_DEVICE##"] = previewDevice
84
82
  window["##BUDIBASE_PREVIEW_NAVIGATION##"] = navigation
85
83
  window["##BUDIBASE_HIDDEN_COMPONENT_IDS##"] = hiddenComponentIds
86
- window["##BUDIBASE_USED_PLUGINS##"] = usedPlugins
87
- window["##BUDIBASE_LOCATION##"] = location
88
84
 
89
85
  // Initialise app
90
86
  try {
package/src/api/index.js CHANGED
@@ -54,8 +54,8 @@ router
54
54
  noTenancyRequired: true,
55
55
  })
56
56
  )
57
- .use(pro.licensing())
58
57
  .use(currentApp)
58
+ .use(pro.licensing())
59
59
  .use(auditLog)
60
60
 
61
61
  // error handling middleware
@@ -2,27 +2,16 @@ import Router from "@koa/router"
2
2
  import * as controller from "../controllers/application"
3
3
  import authorized from "../../middleware/authorized"
4
4
  import { BUILDER } from "@budibase/backend-core/permissions"
5
- import { applicationValidator } from "./utils/validators"
6
5
 
7
6
  const router = new Router()
8
7
 
9
8
  router
10
9
  .post("/api/applications/:appId/sync", authorized(BUILDER), controller.sync)
11
- .post(
12
- "/api/applications",
13
- authorized(BUILDER),
14
- applicationValidator(),
15
- controller.create
16
- )
10
+ .post("/api/applications", authorized(BUILDER), controller.create)
17
11
  .get("/api/applications/:appId/definition", controller.fetchAppDefinition)
18
12
  .get("/api/applications", controller.fetch)
19
13
  .get("/api/applications/:appId/appPackage", controller.fetchAppPackage)
20
- .put(
21
- "/api/applications/:appId",
22
- authorized(BUILDER),
23
- applicationValidator(),
24
- controller.update
25
- )
14
+ .put("/api/applications/:appId", authorized(BUILDER), controller.update)
26
15
  .post(
27
16
  "/api/applications/:appId/client/update",
28
17
  authorized(BUILDER),