@budibase/server 1.3.15-alpha.3 → 1.3.17

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 (268) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.8f5f192a.js +876 -0
  3. package/builder/assets/{index.ecdac070.css → index.a70e216a.css} +2 -2
  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 +254 -296
  8. package/coverage/coverage-final.json +17 -17
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  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 +13 -82
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +30 -30
  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 +1 -1
  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 +12 -12
  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 +1 -1
  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 +1 -1
  74. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  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 +1 -1
  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 +28 -28
  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 +33 -33
  131. package/coverage/lcov-report/middleware/index.html +1 -1
  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 +445 -533
  159. package/dist/api/controllers/application.js +4 -5
  160. package/dist/api/controllers/component.js +1 -18
  161. package/dist/api/controllers/datasource.js +4 -4
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/row/ExternalRequest.js +3 -1
  164. package/dist/api/controllers/screen.js +2 -52
  165. package/dist/api/controllers/static/index.js +0 -1
  166. package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  167. package/dist/api/controllers/static/templates/preview.hbs +1 -5
  168. package/dist/api/routes/index.js +0 -2
  169. package/dist/app.js +0 -11
  170. package/dist/db/utils.js +1 -10
  171. package/dist/environment.js +2 -3
  172. package/dist/integrations/airtable.js +129 -126
  173. package/dist/integrations/arangodb.js +89 -86
  174. package/dist/integrations/base/query.js +2 -2
  175. package/dist/integrations/base/sqlTable.js +1 -3
  176. package/dist/integrations/couchdb.js +83 -80
  177. package/dist/integrations/dynamodb.js +164 -161
  178. package/dist/integrations/elasticsearch.js +138 -135
  179. package/dist/integrations/firebase.js +157 -154
  180. package/dist/integrations/googlesheets.js +327 -323
  181. package/dist/integrations/index.js +51 -93
  182. package/dist/integrations/microsoftSqlServer.js +243 -240
  183. package/dist/integrations/mongodb.js +242 -239
  184. package/dist/integrations/mysql.js +219 -215
  185. package/dist/integrations/oracle.js +322 -318
  186. package/dist/integrations/postgres.js +265 -262
  187. package/dist/integrations/redis.js +139 -134
  188. package/dist/integrations/rest.js +292 -289
  189. package/dist/integrations/s3.js +64 -61
  190. package/dist/integrations/snowflake.js +86 -83
  191. package/dist/package.json +6 -9
  192. package/dist/threads/query.js +2 -2
  193. package/dist/tsconfig.build.tsbuildinfo +1 -1
  194. package/dist/utilities/fileSystem/index.js +11 -111
  195. package/package.json +7 -10
  196. package/scripts/dev/manage.js +0 -1
  197. package/src/api/controllers/application.ts +1 -1
  198. package/src/api/controllers/component.js +2 -25
  199. package/src/api/controllers/datasource.js +4 -4
  200. package/src/api/controllers/integration.js +4 -4
  201. package/src/api/controllers/row/ExternalRequest.ts +4 -1
  202. package/src/api/controllers/screen.js +1 -66
  203. package/src/api/controllers/static/index.ts +0 -1
  204. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  205. package/src/api/controllers/static/templates/preview.hbs +1 -5
  206. package/src/api/routes/index.ts +0 -2
  207. package/src/api/routes/tests/query.spec.js +25 -8
  208. package/src/app.ts +0 -14
  209. package/src/db/utils.js +0 -12
  210. package/src/environment.js +2 -3
  211. package/src/integrations/airtable.ts +118 -116
  212. package/src/integrations/arangodb.ts +89 -87
  213. package/src/integrations/base/query.ts +2 -2
  214. package/src/integrations/base/sqlTable.ts +1 -3
  215. package/src/integrations/couchdb.ts +89 -83
  216. package/src/integrations/dynamodb.ts +175 -173
  217. package/src/integrations/elasticsearch.ts +122 -120
  218. package/src/integrations/firebase.ts +159 -157
  219. package/src/integrations/googlesheets.ts +338 -328
  220. package/src/integrations/index.ts +21 -59
  221. package/src/integrations/microsoftSqlServer.ts +251 -249
  222. package/src/integrations/mongodb.ts +258 -261
  223. package/src/integrations/mysql.ts +234 -229
  224. package/src/integrations/oracle.ts +380 -373
  225. package/src/integrations/postgres.ts +268 -264
  226. package/src/integrations/redis.ts +132 -128
  227. package/src/integrations/rest.ts +329 -324
  228. package/src/integrations/s3.ts +71 -68
  229. package/src/integrations/snowflake.ts +82 -80
  230. package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
  231. package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
  232. package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
  233. package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
  234. package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
  235. package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
  236. package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
  237. package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
  238. package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
  239. package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
  240. package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
  241. package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
  242. package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +14 -22
  243. package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
  244. package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
  245. package/src/module.d.ts +0 -2
  246. package/src/threads/query.ts +2 -2
  247. package/src/utilities/fileSystem/index.js +9 -130
  248. package/builder/assets/index.e1d89439.js +0 -995
  249. package/dist/api/controllers/plugin/file.js +0 -24
  250. package/dist/api/controllers/plugin/github.js +0 -69
  251. package/dist/api/controllers/plugin/index.js +0 -192
  252. package/dist/api/controllers/plugin/npm.js +0 -58
  253. package/dist/api/controllers/plugin/uploaders.js +0 -11
  254. package/dist/api/controllers/plugin/url.js +0 -24
  255. package/dist/api/controllers/plugin/utils.js +0 -26
  256. package/dist/api/routes/plugin.js +0 -39
  257. package/dist/watch.js +0 -77
  258. package/dist/websocket.js +0 -22
  259. package/src/api/controllers/plugin/file.ts +0 -15
  260. package/src/api/controllers/plugin/github.ts +0 -75
  261. package/src/api/controllers/plugin/index.ts +0 -206
  262. package/src/api/controllers/plugin/npm.ts +0 -56
  263. package/src/api/controllers/plugin/uploaders.ts +0 -4
  264. package/src/api/controllers/plugin/url.ts +0 -12
  265. package/src/api/controllers/plugin/utils.ts +0 -19
  266. package/src/api/routes/plugin.ts +0 -14
  267. package/src/watch.ts +0 -38
  268. 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
@@ -39,7 +35,16 @@ const DATASOURCE_PATH = join(budibaseTempDir(), "datasource");
39
35
  exports.init = () => {
40
36
  const tempDir = budibaseTempDir();
41
37
  if (!fs.existsSync(tempDir)) {
42
- fs.mkdirSync(tempDir);
38
+ // some test cases fire this quickly enough that
39
+ // synchronous cases can end up here at the same time
40
+ try {
41
+ fs.mkdirSync(tempDir);
42
+ }
43
+ catch (err) {
44
+ if (!err || err.code !== "EEXIST") {
45
+ throw err;
46
+ }
47
+ }
43
48
  }
44
49
  const clientLibPath = join(budibaseTempDir(), "budibase-client.js");
45
50
  if (env.isTest() && !fs.existsSync(clientLibPath)) {
@@ -91,12 +96,6 @@ exports.getTemplateStream = (template) => __awaiter(void 0, void 0, void 0, func
91
96
  exports.loadHandlebarsFile = path => {
92
97
  return fs.readFileSync(path, "utf8");
93
98
  };
94
- /**
95
- * Same as above just with a different name.
96
- */
97
- exports.loadJSFile = (directory, name) => {
98
- return fs.readFileSync(join(directory, name), "utf8");
99
- };
100
99
  /**
101
100
  * When return a file from the API need to write the file to the system temporarily so we
102
101
  * can create a read stream to send.
@@ -295,104 +294,6 @@ exports.cleanup = appIds => {
295
294
  }
296
295
  }
297
296
  };
298
- const createTempFolder = item => {
299
- const path = join(budibaseTempDir(), item);
300
- try {
301
- // remove old tmp directories automatically - don't combine
302
- if (fs.existsSync(path)) {
303
- fs.rmSync(path, { recursive: true, force: true });
304
- }
305
- fs.mkdirSync(path);
306
- }
307
- catch (err) {
308
- throw new Error(`Path cannot be created: ${err.message}`);
309
- }
310
- return path;
311
- };
312
- exports.createTempFolder = createTempFolder;
313
- const extractTarball = (fromFilePath, toPath) => __awaiter(void 0, void 0, void 0, function* () {
314
- yield tar.extract({
315
- file: fromFilePath,
316
- C: toPath,
317
- });
318
- });
319
- exports.extractTarball = extractTarball;
320
- const getPluginMetadata = (path) => __awaiter(void 0, void 0, void 0, function* () {
321
- let metadata = {};
322
- try {
323
- const pkg = fs.readFileSync(join(path, "package.json"), "utf8");
324
- const schema = fs.readFileSync(join(path, "schema.json"), "utf8");
325
- metadata.schema = JSON.parse(schema);
326
- metadata.package = JSON.parse(pkg);
327
- if (!metadata.package.name ||
328
- !metadata.package.version ||
329
- !metadata.package.description) {
330
- throw new Error("package.json is missing one of 'name', 'version' or 'description'.");
331
- }
332
- }
333
- catch (err) {
334
- throw new Error(`Unable to process schema.json/package.json in plugin. ${err.message}`);
335
- }
336
- return { metadata, directory: path };
337
- });
338
- exports.getPluginMetadata = getPluginMetadata;
339
- exports.getDatasourcePlugin = (name, url, hash) => __awaiter(void 0, void 0, void 0, function* () {
340
- if (!fs.existsSync(DATASOURCE_PATH)) {
341
- fs.mkdirSync(DATASOURCE_PATH);
342
- }
343
- const filename = join(DATASOURCE_PATH, name);
344
- const metadataName = `${filename}.bbmetadata`;
345
- if (fs.existsSync(filename)) {
346
- const currentHash = fs.readFileSync(metadataName, "utf8");
347
- // if hash is the same return the file, otherwise remove it and re-download
348
- if (currentHash === hash) {
349
- return require(filename);
350
- }
351
- else {
352
- console.log(`Updating plugin: ${name}`);
353
- fs.unlinkSync(filename);
354
- }
355
- }
356
- const fullUrl = checkSlashesInUrl(`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`);
357
- const response = yield fetch(fullUrl);
358
- if (response.status === 200) {
359
- const content = yield response.text();
360
- fs.writeFileSync(filename, content);
361
- fs.writeFileSync(metadataName, hash);
362
- require(filename);
363
- }
364
- else {
365
- throw new Error(`Unable to retrieve plugin - reason: ${yield response.text()}`);
366
- }
367
- });
368
- /**
369
- * Find for a file recursively from start path applying filter, return first match
370
- */
371
- exports.findFileRec = (startPath, filter) => {
372
- if (!fs.existsSync(startPath)) {
373
- return;
374
- }
375
- const files = fs.readdirSync(startPath);
376
- for (let i = 0, len = files.length; i < len; i++) {
377
- const filename = join(startPath, files[i]);
378
- const stat = fs.lstatSync(filename);
379
- if (stat.isDirectory()) {
380
- return exports.findFileRec(filename, filter);
381
- }
382
- else if (filename.endsWith(filter)) {
383
- return filename;
384
- }
385
- }
386
- };
387
- /**
388
- * Remove a folder which is not empty from the file system
389
- */
390
- exports.deleteFolderFileSystem = path => {
391
- if (!fs.existsSync(path)) {
392
- return;
393
- }
394
- fs.rmSync(path, { recursive: true, force: true });
395
- };
396
297
  /**
397
298
  * Full function definition for below can be found in the utilities.
398
299
  */
@@ -400,6 +301,5 @@ exports.upload = upload;
400
301
  exports.retrieve = retrieve;
401
302
  exports.retrieveToTmp = retrieveToTmp;
402
303
  exports.deleteFiles = deleteFiles;
403
- exports.downloadTarballDirect = downloadTarballDirect;
404
304
  exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH;
405
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.15-alpha.3",
4
+ "version": "1.3.17",
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.15-alpha.3",
81
- "@budibase/client": "1.3.15-alpha.3",
82
- "@budibase/pro": "1.3.15-alpha.2",
83
- "@budibase/string-templates": "1.3.15-alpha.3",
84
- "@budibase/types": "1.3.15-alpha.3",
80
+ "@budibase/backend-core": "^1.3.17",
81
+ "@budibase/client": "^1.3.17",
82
+ "@budibase/pro": "1.3.16",
83
+ "@budibase/string-templates": "^1.3.17",
84
+ "@budibase/types": "^1.3.17",
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": "a1eafcef980f6ed36933a6d2953e35b0de82be51"
199
+ "gitHead": "01d7c9d994aa66a1d08ab71acc9e6c8eab825a47"
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 => {
@@ -572,7 +572,7 @@ export const sync = async (ctx: any, next: any) => {
572
572
  }
573
573
  }
574
574
 
575
- export const updateAppPackage = async (appPackage: any, appId: any) => {
575
+ const updateAppPackage = async (appPackage: any, appId: any) => {
576
576
  return context.doInAppContext(appId, async () => {
577
577
  const db = context.getAppDB()
578
578
  const application = await db.get(DocumentType.APP_METADATA)
@@ -1,8 +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
- const env = require("../../environment")
6
4
 
7
5
  exports.fetchAppComponentDefinitions = async function (ctx) {
8
6
  try {
@@ -12,6 +10,7 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
12
10
  let componentManifests = await Promise.all(
13
11
  app.componentLibraries.map(async library => {
14
12
  let manifest = await getComponentLibraryManifest(library)
13
+
15
14
  return {
16
15
  manifest,
17
16
  library,
@@ -32,28 +31,6 @@ exports.fetchAppComponentDefinitions = async function (ctx) {
32
31
  }
33
32
  }
34
33
  }
35
-
36
- // for now custom components only supported in self-host
37
- if (env.SELF_HOSTED) {
38
- // Add custom components
39
- const globalDB = getGlobalDB()
40
- const response = await globalDB.allDocs(
41
- getPluginParams(null, {
42
- include_docs: true,
43
- })
44
- )
45
- response.rows
46
- .map(row => row.doc)
47
- .filter(plugin => plugin.schema.type === "component")
48
- .forEach(plugin => {
49
- const fullComponentName = `plugin/${plugin.name}`
50
- definitions[fullComponentName] = {
51
- component: fullComponentName,
52
- ...plugin.schema.schema,
53
- }
54
- })
55
- }
56
-
57
34
  ctx.body = definitions
58
35
  } catch (err) {
59
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")
@@ -114,7 +114,7 @@ exports.update = async function (ctx) {
114
114
 
115
115
  // Drain connection pools when configuration is changed
116
116
  if (datasource.source) {
117
- const source = await getIntegration(datasource.source)
117
+ const source = integrations[datasource.source]
118
118
  if (source && source.pool) {
119
119
  await source.pool.end()
120
120
  }
@@ -149,7 +149,7 @@ exports.save = async function (ctx) {
149
149
 
150
150
  // Drain connection pools when configuration is changed
151
151
  if (datasource.source) {
152
- const source = await getIntegration(datasource.source)
152
+ const source = integrations[datasource.source]
153
153
  if (source && source.pool) {
154
154
  await source.pool.end()
155
155
  }
@@ -218,7 +218,7 @@ function updateError(error, newError, tables) {
218
218
  }
219
219
 
220
220
  const buildSchemaHelper = async datasource => {
221
- const Connector = await getIntegration(datasource.source)
221
+ const Connector = integrations[datasource.source]
222
222
 
223
223
  // Connect to the DB and build the schema
224
224
  const connector = new Connector(datasource.config)
@@ -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
  }
@@ -371,7 +371,10 @@ module External {
371
371
  const toColumn = `${linkedTable.name}.${relationship.to}`
372
372
  // this is important when working with multiple relationships
373
373
  // between the same tables, don't want to overlap/multiply the relations
374
- if (!relationship.through && row[fromColumn] !== row[toColumn]) {
374
+ if (
375
+ !relationship.through &&
376
+ row[fromColumn]?.toString() !== row[toColumn]?.toString()
377
+ ) {
375
378
  continue
376
379
  }
377
380
  let linked = basicProcessing(row, linkedTable)
@@ -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
- }
@@ -113,7 +113,6 @@ export const serveApp = async function (ctx: any) {
113
113
  production: env.isProd(),
114
114
  appId,
115
115
  clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
116
- usedPlugins: appInfo.usedPlugins,
117
116
  })
118
117
 
119
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 {
@@ -24,7 +24,6 @@ import metadataRoutes from "./metadata"
24
24
  import devRoutes from "./dev"
25
25
  import cloudRoutes from "./cloud"
26
26
  import migrationRoutes from "./migrations"
27
- import pluginRoutes from "./plugin"
28
27
 
29
28
  export { default as staticRoutes } from "./static"
30
29
  export { default as publicRoutes } from "./public"
@@ -58,5 +57,4 @@ export const mainRoutes = [
58
57
  tableRoutes,
59
58
  rowRoutes,
60
59
  migrationRoutes,
61
- pluginRoutes,
62
60
  ]
@@ -231,6 +231,20 @@ describe("/queries", () => {
231
231
  url: `/api/queries/preview`,
232
232
  })
233
233
  })
234
+
235
+ it("should fail with invalid integration type", async () => {
236
+ const { datasource } = await createInvalidIntegration()
237
+ await request
238
+ .post(`/api/queries/preview`)
239
+ .send({
240
+ datasourceId: datasource._id,
241
+ parameters: {},
242
+ fields: {},
243
+ queryVerb: "read",
244
+ })
245
+ .set(config.defaultHeaders())
246
+ .expect(400)
247
+ })
234
248
  })
235
249
 
236
250
  describe("execute", () => {
@@ -247,14 +261,17 @@ describe("/queries", () => {
247
261
  })
248
262
 
249
263
  it("should fail with invalid integration type", async () => {
250
- let error
251
- try {
252
- await createInvalidIntegration()
253
- } catch (err) {
254
- error = err
255
- }
256
- expect(error).toBeDefined()
257
- expect(error.message).toBe("No datasource implementation found.")
264
+ const { query, datasource } = await createInvalidIntegration()
265
+ await request
266
+ .post(`/api/queries/${query._id}`)
267
+ .send({
268
+ datasourceId: datasource._id,
269
+ parameters: {},
270
+ fields: {},
271
+ queryVerb: "read",
272
+ })
273
+ .set(config.defaultHeaders())
274
+ .expect(400)
258
275
  })
259
276
  })
260
277
 
package/src/app.ts CHANGED
@@ -26,13 +26,10 @@ const bullboard = require("./automations/bullboard")
26
26
  const { logAlert } = require("@budibase/backend-core/logging")
27
27
  const { pinoSettings } = require("@budibase/backend-core")
28
28
  const { Thread } = require("./threads")
29
- const fs = require("fs")
30
29
  import redis from "./utilities/redis"
31
30
  import * as migrations from "./migrations"
32
31
  import { events, installation, tenancy } from "@budibase/backend-core"
33
32
  import { createAdminUser, getChecklist } from "./utilities/workerRequests"
34
- import { watch } from "./watch"
35
- import { initialise as initialiseWebsockets } from "./websocket"
36
33
 
37
34
  const app = new Koa()
38
35
 
@@ -77,7 +74,6 @@ if (env.isProd()) {
77
74
 
78
75
  const server = http.createServer(app.callback())
79
76
  destroyable(server)
80
- initialiseWebsockets(server)
81
77
 
82
78
  let shuttingDown = false,
83
79
  errCode = 0
@@ -143,16 +139,6 @@ module.exports = server.listen(env.PORT || 0, async () => {
143
139
  }
144
140
  }
145
141
 
146
- // monitor plugin directory if required
147
- if (
148
- env.SELF_HOSTED &&
149
- !env.MULTI_TENANCY &&
150
- env.PLUGINS_DIR &&
151
- fs.existsSync(env.PLUGINS_DIR)
152
- ) {
153
- watch()
154
- }
155
-
156
142
  // check for version updates
157
143
  await installation.checkInstallVersion()
158
144
 
package/src/db/utils.js CHANGED
@@ -42,7 +42,6 @@ const DocumentType = {
42
42
  MEM_VIEW: "view",
43
43
  USER_FLAG: "flag",
44
44
  AUTOMATION_METADATA: "meta_au",
45
- PLUGIN: "plg",
46
45
  }
47
46
 
48
47
  const InternalTables = {
@@ -371,10 +370,6 @@ exports.getMemoryViewParams = (otherProps = {}) => {
371
370
  return getDocParams(DocumentType.MEM_VIEW, null, otherProps)
372
371
  }
373
372
 
374
- exports.generatePluginID = name => {
375
- return `${DocumentType.PLUGIN}${SEPARATOR}${name}`
376
- }
377
-
378
373
  /**
379
374
  * This can be used with the db.allDocs to get a list of IDs
380
375
  */
@@ -384,10 +379,3 @@ exports.getMultiIDParams = ids => {
384
379
  include_docs: true,
385
380
  }
386
381
  }
387
-
388
- /**
389
- * Gets parameters for retrieving automations, this is a utility function for the getDocParams function.
390
- */
391
- exports.getPluginParams = (pluginId = null, otherProps = {}) => {
392
- return getDocParams(DocumentType.PLUGIN, pluginId, otherProps)
393
- }
@@ -37,8 +37,8 @@ function parseIntSafe(number) {
37
37
  let inThread = false
38
38
 
39
39
  module.exports = {
40
- // important
41
- PORT: process.env.PORT || process.env.APP_PORT,
40
+ // important - prefer app port to generic port
41
+ PORT: process.env.APP_PORT || process.env.PORT,
42
42
  JWT_SECRET: process.env.JWT_SECRET,
43
43
  COUCH_DB_URL: process.env.COUCH_DB_URL,
44
44
  MINIO_URL: process.env.MINIO_URL,
@@ -74,7 +74,6 @@ module.exports = {
74
74
  SQL_MAX_ROWS: process.env.SQL_MAX_ROWS,
75
75
  BB_ADMIN_USER_EMAIL: process.env.BB_ADMIN_USER_EMAIL,
76
76
  BB_ADMIN_USER_PASSWORD: process.env.BB_ADMIN_USER_PASSWORD,
77
- PLUGINS_DIR: process.env.PLUGINS_DIR || "/plugins",
78
77
  // flags
79
78
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
80
79
  DISABLE_THREADING: process.env.DISABLE_THREADING,