@budibase/server 1.3.12-alpha.3 → 1.3.14

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 (274) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/{index.7886c551.css → index.a70e216a.css} +2 -2
  3. package/builder/assets/index.d8428ac8.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 +335 -355
  8. package/coverage/coverage-final.json +22 -22
  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 +8 -5
  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 +32 -32
  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 -204
  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 +24 -24
  81. package/coverage/lcov-report/automations/index.js.html +18 -9
  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 +126 -24
  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 +48 -48
  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 +19 -19
  142. package/coverage/lcov-report/utilities/index.js.html +66 -42
  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 +5 -5
  148. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  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 +6 -3
  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 +604 -652
  159. package/dist/api/controllers/application.js +5 -10
  160. package/dist/api/controllers/backup.js +2 -1
  161. package/dist/api/controllers/component.js +1 -18
  162. package/dist/api/controllers/datasource.js +4 -4
  163. package/dist/api/controllers/deploy/index.js +17 -2
  164. package/dist/api/controllers/integration.js +4 -4
  165. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  166. package/dist/api/controllers/screen.js +2 -51
  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 -3
  170. package/dist/api/routes/index.js +0 -2
  171. package/dist/api/routes/static.js +1 -1
  172. package/dist/app.js +0 -9
  173. package/dist/automations/index.js +10 -5
  174. package/dist/automations/triggers.js +39 -5
  175. package/dist/automations/utils.js +16 -7
  176. package/dist/db/utils.js +1 -10
  177. package/dist/environment.js +0 -1
  178. package/dist/integrations/airtable.js +129 -126
  179. package/dist/integrations/arangodb.js +89 -86
  180. package/dist/integrations/base/query.js +2 -2
  181. package/dist/integrations/couchdb.js +83 -80
  182. package/dist/integrations/dynamodb.js +164 -161
  183. package/dist/integrations/elasticsearch.js +138 -135
  184. package/dist/integrations/firebase.js +157 -154
  185. package/dist/integrations/googlesheets.js +327 -323
  186. package/dist/integrations/index.js +51 -93
  187. package/dist/integrations/microsoftSqlServer.js +243 -240
  188. package/dist/integrations/mongodb.js +242 -239
  189. package/dist/integrations/mysql.js +219 -215
  190. package/dist/integrations/oracle.js +322 -318
  191. package/dist/integrations/postgres.js +265 -262
  192. package/dist/integrations/redis.js +139 -134
  193. package/dist/integrations/rest.js +296 -278
  194. package/dist/integrations/s3.js +64 -61
  195. package/dist/integrations/snowflake.js +86 -83
  196. package/dist/package.json +6 -8
  197. package/dist/threads/automation.js +6 -0
  198. package/dist/threads/query.js +2 -2
  199. package/dist/tsconfig.build.tsbuildinfo +1 -1
  200. package/dist/utilities/fileSystem/index.js +6 -71
  201. package/dist/utilities/index.js +8 -0
  202. package/dist/utilities/rowProcessor/utils.js +1 -1
  203. package/dist/utilities/usageQuota/rows.js +2 -1
  204. package/package.json +7 -9
  205. package/scripts/dev/manage.js +0 -1
  206. package/src/api/controllers/application.ts +2 -6
  207. package/src/api/controllers/backup.js +2 -1
  208. package/src/api/controllers/component.js +2 -25
  209. package/src/api/controllers/datasource.js +4 -4
  210. package/src/api/controllers/deploy/index.ts +17 -4
  211. package/src/api/controllers/integration.js +4 -4
  212. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  213. package/src/api/controllers/screen.js +1 -65
  214. package/src/api/controllers/static/index.ts +0 -1
  215. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  216. package/src/api/controllers/static/templates/preview.hbs +1 -3
  217. package/src/api/routes/index.ts +0 -2
  218. package/src/api/routes/static.ts +1 -1
  219. package/src/api/routes/tests/query.spec.js +28 -11
  220. package/src/api/routes/tests/static.spec.js +2 -2
  221. package/src/app.ts +0 -12
  222. package/src/automations/index.js +6 -3
  223. package/src/automations/triggers.js +44 -10
  224. package/src/automations/utils.ts +21 -9
  225. package/src/db/utils.js +0 -12
  226. package/src/definitions/datasource.ts +1 -0
  227. package/src/environment.js +0 -1
  228. package/src/integrations/airtable.ts +118 -116
  229. package/src/integrations/arangodb.ts +89 -87
  230. package/src/integrations/base/query.ts +2 -2
  231. package/src/integrations/couchdb.ts +89 -83
  232. package/src/integrations/dynamodb.ts +175 -173
  233. package/src/integrations/elasticsearch.ts +122 -120
  234. package/src/integrations/firebase.ts +159 -157
  235. package/src/integrations/googlesheets.ts +338 -328
  236. package/src/integrations/index.ts +21 -59
  237. package/src/integrations/microsoftSqlServer.ts +251 -249
  238. package/src/integrations/mongodb.ts +258 -261
  239. package/src/integrations/mysql.ts +234 -229
  240. package/src/integrations/oracle.ts +380 -373
  241. package/src/integrations/postgres.ts +268 -264
  242. package/src/integrations/redis.ts +132 -128
  243. package/src/integrations/rest.ts +330 -312
  244. package/src/integrations/s3.ts +71 -68
  245. package/src/integrations/snowflake.ts +82 -80
  246. package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
  247. package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
  248. package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
  249. package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
  250. package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
  251. package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
  252. package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
  253. package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
  254. package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
  255. package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
  256. package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
  257. package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
  258. package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +49 -22
  259. package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
  260. package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
  261. package/src/module.d.ts +0 -1
  262. package/src/threads/automation.ts +6 -0
  263. package/src/threads/query.ts +2 -2
  264. package/src/utilities/fileSystem/index.js +6 -75
  265. package/src/utilities/index.js +8 -0
  266. package/src/utilities/rowProcessor/utils.js +1 -1
  267. package/src/utilities/usageQuota/rows.js +2 -1
  268. package/builder/assets/index.e759397f.js +0 -994
  269. package/dist/api/controllers/plugin.js +0 -119
  270. package/dist/api/routes/plugin.js +0 -38
  271. package/dist/watch.js +0 -77
  272. package/src/api/controllers/plugin.ts +0 -110
  273. package/src/api/routes/plugin.ts +0 -13
  274. package/src/watch.ts +0 -38
@@ -16,16 +16,12 @@ const { doWithDB, dangerousGetDB, closeDB, } = require("@budibase/backend-core/d
16
16
  const { ObjectStoreBuckets } = require("../../constants");
17
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
@@ -91,12 +87,6 @@ exports.getTemplateStream = (template) => __awaiter(void 0, void 0, void 0, func
91
87
  exports.loadHandlebarsFile = path => {
92
88
  return fs.readFileSync(path, "utf8");
93
89
  };
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
90
  /**
101
91
  * When return a file from the API need to write the file to the system temporarily so we
102
92
  * can create a read stream to send.
@@ -120,11 +110,11 @@ exports.defineFilter = excludeRows => {
120
110
  * data or user relationships.
121
111
  * @param {string} appId The app to backup
122
112
  * @param {object} config Config to send to export DB
123
- * @param {boolean} includeRows Flag to state whether the export should include data.
113
+ * @param {boolean} excludeRows Flag to state whether the export should include data.
124
114
  * @returns {*} either a string or a stream of the backup
125
115
  */
126
- const backupAppData = (appId, config, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
127
- return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: exports.defineFilter(includeRows) }));
116
+ const backupAppData = (appId, config, excludeRows) => __awaiter(void 0, void 0, void 0, function* () {
117
+ return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: exports.defineFilter(excludeRows) }));
128
118
  });
129
119
  /**
130
120
  * Takes a copy of the database state for an app to the object store.
@@ -138,11 +128,11 @@ exports.performBackup = (appId, backupName) => __awaiter(void 0, void 0, void 0,
138
128
  /**
139
129
  * Streams a backup of the database state for an app
140
130
  * @param {string} appId The ID of the app which is to be backed up.
141
- * @param {boolean} includeRows Flag to state whether the export should include data.
131
+ * @param {boolean} excludeRows Flag to state whether the export should include data.
142
132
  * @returns {*} a readable stream of the backup which is written in real time
143
133
  */
144
- exports.streamBackup = (appId, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
145
- return yield backupAppData(appId, { stream: true }, includeRows);
134
+ exports.streamBackup = (appId, excludeRows) => __awaiter(void 0, void 0, void 0, function* () {
135
+ return yield backupAppData(appId, { stream: true }, excludeRows);
146
136
  });
147
137
  /**
148
138
  * Exports a DB to either file or a variable (memory).
@@ -295,61 +285,6 @@ exports.cleanup = appIds => {
295
285
  }
296
286
  }
297
287
  };
298
- exports.extractPluginTarball = (file) => __awaiter(void 0, void 0, void 0, function* () {
299
- if (!file.name.endsWith(".tar.gz")) {
300
- throw new Error("Plugin must be compressed into a gzipped tarball.");
301
- }
302
- const path = join(budibaseTempDir(), file.name.split(".tar.gz")[0]);
303
- // remove old tmp directories automatically - don't combine
304
- if (fs.existsSync(path)) {
305
- fs.rmSync(path, { recursive: true, force: true });
306
- }
307
- fs.mkdirSync(path);
308
- yield tar.extract({
309
- file: file.path,
310
- C: path,
311
- });
312
- let metadata = {};
313
- try {
314
- const pkg = fs.readFileSync(join(path, "package.json"), "utf8");
315
- const schema = fs.readFileSync(join(path, "schema.json"), "utf8");
316
- metadata.schema = JSON.parse(schema);
317
- metadata.package = JSON.parse(pkg);
318
- }
319
- catch (err) {
320
- throw new Error("Unable to process schema.json/package.json in plugin.");
321
- }
322
- return { metadata, directory: path };
323
- });
324
- exports.getDatasourcePlugin = (name, url, hash) => __awaiter(void 0, void 0, void 0, function* () {
325
- if (!fs.existsSync(DATASOURCE_PATH)) {
326
- fs.mkdirSync(DATASOURCE_PATH);
327
- }
328
- const filename = join(DATASOURCE_PATH, name);
329
- const metadataName = `${filename}.bbmetadata`;
330
- if (fs.existsSync(filename)) {
331
- const currentHash = fs.readFileSync(metadataName, "utf8");
332
- // if hash is the same return the file, otherwise remove it and re-download
333
- if (currentHash === hash) {
334
- return require(filename);
335
- }
336
- else {
337
- console.log(`Updating plugin: ${name}`);
338
- fs.unlinkSync(filename);
339
- }
340
- }
341
- const fullUrl = checkSlashesInUrl(`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`);
342
- const response = yield fetch(fullUrl);
343
- if (response.status === 200) {
344
- const content = yield response.text();
345
- fs.writeFileSync(filename, content);
346
- fs.writeFileSync(metadataName, hash);
347
- require(filename);
348
- }
349
- else {
350
- throw new Error(`Unable to retrieve plugin - reason: ${yield response.text()}`);
351
- }
352
- });
353
288
  /**
354
289
  * Full function definition for below can be found in the utilities.
355
290
  */
@@ -150,3 +150,11 @@ exports.convertBookmark = bookmark => {
150
150
  }
151
151
  return bookmark;
152
152
  };
153
+ exports.isQsTrue = param => {
154
+ if (typeof param === "string") {
155
+ return param.toLowerCase() === "true";
156
+ }
157
+ else {
158
+ return param === true;
159
+ }
160
+ };
@@ -64,7 +64,7 @@ exports.processDates = (table, rows) => {
64
64
  if (schema.type !== FieldTypes.DATETIME) {
65
65
  continue;
66
66
  }
67
- if (!schema.ignoreTimezones) {
67
+ if (!schema.timeOnly && !schema.ignoreTimezones) {
68
68
  datesWithTZ.push(column);
69
69
  }
70
70
  }
@@ -72,7 +72,8 @@ exports.getUniqueRows = (appIds) => __awaiter(void 0, void 0, void 0, function*
72
72
  // ensure uniqueness on a per app pair basis
73
73
  // this can't be done on all rows because app import results in
74
74
  // duplicate row ids across apps
75
- uniqueRows = uniqueRows.concat(...new Set(appRows));
75
+ // the array pre-concat is important to avoid stack overflow
76
+ uniqueRows = uniqueRows.concat([...new Set(appRows)]);
76
77
  }
77
78
  return uniqueRows;
78
79
  });
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.12-alpha.3",
4
+ "version": "1.3.14",
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.12-alpha.3",
81
- "@budibase/client": "1.3.12-alpha.3",
82
- "@budibase/pro": "1.3.12-alpha.2",
83
- "@budibase/string-templates": "1.3.12-alpha.3",
84
- "@budibase/types": "1.3.12-alpha.3",
80
+ "@budibase/backend-core": "^1.3.14",
81
+ "@budibase/client": "^1.3.14",
82
+ "@budibase/pro": "1.3.13",
83
+ "@budibase/string-templates": "^1.3.14",
84
+ "@budibase/types": "^1.3.14",
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",
@@ -141,7 +140,6 @@
141
140
  "snowflake-promise": "^4.5.0",
142
141
  "svelte": "3.49.0",
143
142
  "swagger-parser": "10.0.3",
144
- "tar": "^6.1.11",
145
143
  "to-json-schema": "0.2.5",
146
144
  "uuid": "3.3.2",
147
145
  "validate.js": "0.13.1",
@@ -198,5 +196,5 @@
198
196
  "optionalDependencies": {
199
197
  "oracledb": "5.3.0"
200
198
  },
201
- "gitHead": "ae578a3a01f5f2b190daa56f90836f3fe674d4e5"
199
+ "gitHead": "a38626cf662d66aa8c04fb1d42dc7bc353ce7c31"
202
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 => {
@@ -553,11 +553,7 @@ export const sync = async (ctx: any, next: any) => {
553
553
  })
554
554
  let error
555
555
  try {
556
- await replication.replicate({
557
- filter: function (doc: any) {
558
- return doc._id !== DocumentType.APP_METADATA
559
- },
560
- })
556
+ await replication.replicate(replication.appReplicateOpts())
561
557
  } catch (err) {
562
558
  error = err
563
559
  } finally {
@@ -576,7 +572,7 @@ export const sync = async (ctx: any, next: any) => {
576
572
  }
577
573
  }
578
574
 
579
- export const updateAppPackage = async (appPackage: any, appId: any) => {
575
+ const updateAppPackage = async (appPackage: any, appId: any) => {
580
576
  return context.doInAppContext(appId, async () => {
581
577
  const db = context.getAppDB()
582
578
  const application = await db.get(DocumentType.APP_METADATA)
@@ -1,11 +1,12 @@
1
1
  const { streamBackup } = require("../../utilities/fileSystem")
2
2
  const { events, context } = require("@budibase/backend-core")
3
3
  const { DocumentType } = require("../../db/utils")
4
+ const { isQsTrue } = require("../../utilities")
4
5
 
5
6
  exports.exportAppDump = async function (ctx) {
6
7
  let { appId, excludeRows } = ctx.query
7
8
  const appName = decodeURI(ctx.query.appname)
8
- excludeRows = excludeRows === "true"
9
+ excludeRows = isQsTrue(excludeRows)
9
10
  const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
10
11
  ctx.attachment(backupIdentifier)
11
12
  ctx.body = await streamBackup(appId, excludeRows)
@@ -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)
@@ -15,6 +15,7 @@ import {
15
15
  getAppId,
16
16
  getAppDB,
17
17
  getProdAppDB,
18
+ getDevAppDB,
18
19
  } from "@budibase/backend-core/context"
19
20
  import { quotas } from "@budibase/pro"
20
21
  import { events } from "@budibase/backend-core"
@@ -110,17 +111,29 @@ async function deployApp(deployment: any) {
110
111
  target: productionAppId,
111
112
  }
112
113
  replication = new Replication(config)
113
-
114
+ const devDb = getDevAppDB()
115
+ console.log("Compacting development DB")
116
+ await devDb.compact()
114
117
  console.log("Replication object created")
115
- await replication.replicate()
118
+ await replication.replicate(replication.appReplicateOpts())
116
119
  console.log("replication complete.. replacing app meta doc")
120
+ // app metadata is excluded as it is likely to be in conflict
121
+ // replicate the app metadata document manually
117
122
  const db = getProdAppDB()
118
- const appDoc = await db.get(DocumentType.APP_METADATA)
123
+ const appDoc = await devDb.get(DocumentType.APP_METADATA)
124
+ try {
125
+ const prodAppDoc = await db.get(DocumentType.APP_METADATA)
126
+ appDoc._rev = prodAppDoc._rev
127
+ } catch (err) {
128
+ delete appDoc._rev
129
+ }
119
130
 
131
+ // switch to production app ID
120
132
  deployment.appUrl = appDoc.url
121
-
122
133
  appDoc.appId = productionAppId
123
134
  appDoc.instance._id = productionAppId
135
+ // remove automation errors if they exist
136
+ delete appDoc.automationErrors
124
137
  await db.put(appDoc)
125
138
  await appCache.invalidateAppMetadata(productionAppId)
126
139
  console.log("New app doc written successfully.")
@@ -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
  }
@@ -534,7 +534,7 @@ module External {
534
534
  })
535
535
  // this is the response from knex if no rows found
536
536
  const rows = !response[0].read ? response : []
537
- const storeTo = isMany ? field.throughFrom || linkPrimaryKey : manyKey
537
+ const storeTo = isMany ? field.throughFrom || linkPrimaryKey : fieldName
538
538
  related[storeTo] = { rows, isMany, tableId }
539
539
  }
540
540
  return related
@@ -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,47 +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
- })
75
- }
76
- })
77
-
78
- if (pluginAdded) {
79
- await updateAppPackage({ usedPlugins }, ctx.appId)
80
- }
81
- }
82
-
83
35
  if (eventFn) {
84
36
  await eventFn(screen)
85
37
  }
@@ -88,7 +40,6 @@ exports.save = async ctx => {
88
40
  ...screen,
89
41
  _id: response.id,
90
42
  _rev: response.rev,
91
- pluginAdded,
92
43
  }
93
44
  }
94
45
 
@@ -105,18 +56,3 @@ exports.destroy = async ctx => {
105
56
  }
106
57
  ctx.status = 200
107
58
  }
108
-
109
- const findPlugins = (component, foundPlugins) => {
110
- if (!component) {
111
- return
112
- }
113
- if (component._component.startsWith("plugin")) {
114
- if (!foundPlugins.includes(component._component)) {
115
- foundPlugins.push(component._component)
116
- }
117
- }
118
- if (!component._children || !component._children.length) {
119
- return
120
- }
121
- component._children.forEach(child => findPlugins(child, foundPlugins))
122
- }
@@ -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,8 +66,7 @@
66
66
  customTheme,
67
67
  previewDevice,
68
68
  navigation,
69
- hiddenComponentIds,
70
- usedPlugins
69
+ hiddenComponentIds
71
70
  } = parsed
72
71
 
73
72
  // Set some flags so the app knows we're in the builder
@@ -82,7 +81,6 @@
82
81
  window["##BUDIBASE_PREVIEW_DEVICE##"] = previewDevice
83
82
  window["##BUDIBASE_PREVIEW_NAVIGATION##"] = navigation
84
83
  window["##BUDIBASE_HIDDEN_COMPONENT_IDS##"] = hiddenComponentIds
85
- window["##BUDIBASE_USED_PLUGINS##"] = usedPlugins
86
84
 
87
85
  // Initialise app
88
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
  ]
@@ -56,7 +56,7 @@ router
56
56
  authorized(PermissionTypes.TABLE, PermissionLevels.WRITE),
57
57
  controller.deleteObjects
58
58
  )
59
- .get("/preview", authorized(BUILDER), controller.serveBuilderPreview)
59
+ .get("/app/preview", authorized(BUILDER), controller.serveBuilderPreview)
60
60
  .get("/:appId/:path*", controller.serveApp)
61
61
  .get("/app/:appUrl/:path*", controller.serveApp)
62
62
  .post(
@@ -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
 
@@ -294,7 +311,7 @@ describe("/queries", () => {
294
311
  "url": "string",
295
312
  "value": "string"
296
313
  })
297
- expect(res.body.rows[0].url).toContain("doctype html")
314
+ expect(res.body.rows[0].url).toContain("doctype%20html")
298
315
  })
299
316
 
300
317
  it("check that it automatically retries on fail with cached dynamics", async () => {
@@ -379,7 +396,7 @@ describe("/queries", () => {
379
396
  "queryHdr": userDetails.firstName,
380
397
  "secondHdr" : "1234"
381
398
  })
382
- expect(res.body.rows[0].url).toEqual("http://www.google.com?email=" + userDetails.email)
399
+ expect(res.body.rows[0].url).toEqual("http://www.google.com?email=" + userDetails.email.replace("@", "%40"))
383
400
  })
384
401
 
385
402
  it("should bind the current user to query parameters", async () => {
@@ -396,7 +413,7 @@ describe("/queries", () => {
396
413
  "testParam" : "1234"
397
414
  })
398
415
 
399
- expect(res.body.rows[0].url).toEqual("http://www.google.com?test=" + userDetails.email +
416
+ expect(res.body.rows[0].url).toEqual("http://www.google.com?test=" + userDetails.email.replace("@", "%40") +
400
417
  "&testName=" + userDetails.firstName + "&testParam=1234")
401
418
  })
402
419
 
@@ -150,14 +150,14 @@ describe("/static", () => {
150
150
  })
151
151
  })
152
152
 
153
- describe("/preview", () => {
153
+ describe("/app/preview", () => {
154
154
  beforeEach(() => {
155
155
  jest.clearAllMocks()
156
156
  })
157
157
 
158
158
  it("should serve the builder preview", async () => {
159
159
  const headers = config.defaultHeaders()
160
- const res = await request.get(`/preview`).set(headers).expect(200)
160
+ const res = await request.get(`/app/preview`).set(headers).expect(200)
161
161
 
162
162
  expect(res.body.appId).toBe(config.appId)
163
163
  expect(res.body.builderPreview).toBe(true)