@budibase/server 1.3.12 → 1.3.15-alpha.0

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 (271) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.b266d29f.js +995 -0
  3. package/builder/assets/{index.e50bda9f.css → index.f5c54dd2.css} +2 -2
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +377 -313
  6. package/coverage/coverage-final.json +22 -22
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +8 -5
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +82 -13
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +32 -32
  16. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +204 -12
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +12 -12
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +24 -24
  79. package/coverage/lcov-report/automations/index.js.html +18 -9
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +126 -24
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +18 -18
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +56 -20
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +48 -48
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  128. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  129. package/coverage/lcov-report/middleware/index.html +1 -1
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  136. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +16 -16
  139. package/coverage/lcov-report/utilities/index.html +19 -19
  140. package/coverage/lcov-report/utilities/index.js.html +66 -42
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  142. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +5 -5
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +6 -3
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  156. package/coverage/lcov.info +692 -564
  157. package/dist/api/controllers/application.js +6 -9
  158. package/dist/api/controllers/backup.js +2 -1
  159. package/dist/api/controllers/component.js +18 -1
  160. package/dist/api/controllers/datasource.js +4 -4
  161. package/dist/api/controllers/deploy/index.js +17 -2
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/plugin.js +119 -0
  164. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  165. package/dist/api/controllers/screen.js +51 -2
  166. package/dist/api/controllers/static/index.js +1 -0
  167. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  168. package/dist/api/controllers/static/templates/preview.hbs +3 -1
  169. package/dist/api/routes/index.js +2 -0
  170. package/dist/api/routes/plugin.js +38 -0
  171. package/dist/app.js +9 -0
  172. package/dist/automations/index.js +10 -5
  173. package/dist/automations/triggers.js +39 -5
  174. package/dist/automations/utils.js +16 -7
  175. package/dist/db/utils.js +10 -1
  176. package/dist/environment.js +1 -0
  177. package/dist/integrations/airtable.js +126 -129
  178. package/dist/integrations/arangodb.js +86 -89
  179. package/dist/integrations/base/query.js +2 -2
  180. package/dist/integrations/couchdb.js +80 -83
  181. package/dist/integrations/dynamodb.js +161 -164
  182. package/dist/integrations/elasticsearch.js +135 -138
  183. package/dist/integrations/firebase.js +154 -157
  184. package/dist/integrations/googlesheets.js +323 -327
  185. package/dist/integrations/index.js +93 -51
  186. package/dist/integrations/microsoftSqlServer.js +240 -243
  187. package/dist/integrations/mongodb.js +239 -242
  188. package/dist/integrations/mysql.js +215 -219
  189. package/dist/integrations/oracle.js +318 -322
  190. package/dist/integrations/postgres.js +262 -265
  191. package/dist/integrations/redis.js +134 -139
  192. package/dist/integrations/rest.js +293 -281
  193. package/dist/integrations/s3.js +61 -64
  194. package/dist/integrations/snowflake.js +83 -86
  195. package/dist/package.json +8 -6
  196. package/dist/threads/automation.js +6 -0
  197. package/dist/threads/query.js +2 -2
  198. package/dist/tsconfig.build.tsbuildinfo +1 -1
  199. package/dist/utilities/fileSystem/index.js +71 -6
  200. package/dist/utilities/index.js +8 -0
  201. package/dist/utilities/rowProcessor/utils.js +1 -1
  202. package/dist/utilities/usageQuota/rows.js +2 -1
  203. package/dist/watch.js +77 -0
  204. package/package.json +9 -7
  205. package/scripts/dev/manage.js +1 -0
  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 +25 -2
  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/plugin.ts +110 -0
  213. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  214. package/src/api/controllers/screen.js +65 -1
  215. package/src/api/controllers/static/index.ts +1 -0
  216. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  217. package/src/api/controllers/static/templates/preview.hbs +3 -1
  218. package/src/api/routes/index.ts +2 -0
  219. package/src/api/routes/plugin.ts +13 -0
  220. package/src/api/routes/tests/query.spec.js +11 -28
  221. package/src/app.ts +12 -0
  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 +12 -0
  226. package/src/definitions/datasource.ts +1 -0
  227. package/src/environment.js +1 -0
  228. package/src/integrations/airtable.ts +116 -118
  229. package/src/integrations/arangodb.ts +87 -89
  230. package/src/integrations/base/query.ts +2 -2
  231. package/src/integrations/couchdb.ts +83 -89
  232. package/src/integrations/dynamodb.ts +173 -175
  233. package/src/integrations/elasticsearch.ts +120 -122
  234. package/src/integrations/firebase.ts +157 -159
  235. package/src/integrations/googlesheets.ts +328 -338
  236. package/src/integrations/index.ts +59 -21
  237. package/src/integrations/microsoftSqlServer.ts +249 -251
  238. package/src/integrations/mongodb.ts +261 -258
  239. package/src/integrations/mysql.ts +229 -234
  240. package/src/integrations/oracle.ts +373 -380
  241. package/src/integrations/postgres.ts +264 -268
  242. package/src/integrations/redis.ts +128 -132
  243. package/src/integrations/rest.ts +325 -317
  244. package/src/integrations/s3.ts +68 -71
  245. package/src/integrations/snowflake.ts +80 -82
  246. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  247. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  248. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  249. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  250. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  251. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  252. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  253. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  254. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  255. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  256. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  257. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  258. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +57 -14
  259. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  260. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  261. package/src/module.d.ts +1 -0
  262. package/src/threads/automation.ts +6 -0
  263. package/src/threads/query.ts +2 -2
  264. package/src/utilities/fileSystem/index.js +75 -6
  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/src/watch.ts +38 -0
  269. package/builder/assets/index.a4ba55ba.js +0 -875
  270. package/builder/assets/vendor.5e1fe644.css +0 -1
  271. package/builder/assets/vendor.67dbd8fa.js +0 -248
@@ -18,6 +18,7 @@ const {
18
18
  deleteFiles,
19
19
  } = require("./utilities")
20
20
  const { updateClientLibrary } = require("./clientLibrary")
21
+ const { checkSlashesInUrl } = require("../")
21
22
  const env = require("../../environment")
22
23
  const {
23
24
  USER_METDATA_PREFIX,
@@ -26,9 +27,12 @@ const {
26
27
  } = require("../../db/utils")
27
28
  const MemoryStream = require("memorystream")
28
29
  const { getAppId } = require("@budibase/backend-core/context")
30
+ const tar = require("tar")
31
+ const fetch = require("node-fetch")
29
32
 
30
33
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
31
34
  const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules")
35
+ const DATASOURCE_PATH = join(budibaseTempDir(), "datasource")
32
36
 
33
37
  /**
34
38
  * The single stack system (Cloud and Builder) should not make use of the file system where possible,
@@ -99,6 +103,13 @@ exports.loadHandlebarsFile = path => {
99
103
  return fs.readFileSync(path, "utf8")
100
104
  }
101
105
 
106
+ /**
107
+ * Same as above just with a different name.
108
+ */
109
+ exports.loadJSFile = (directory, name) => {
110
+ return fs.readFileSync(join(directory, name), "utf8")
111
+ }
112
+
102
113
  /**
103
114
  * When return a file from the API need to write the file to the system temporarily so we
104
115
  * can create a read stream to send.
@@ -125,13 +136,13 @@ exports.defineFilter = excludeRows => {
125
136
  * data or user relationships.
126
137
  * @param {string} appId The app to backup
127
138
  * @param {object} config Config to send to export DB
128
- * @param {boolean} includeRows Flag to state whether the export should include data.
139
+ * @param {boolean} excludeRows Flag to state whether the export should include data.
129
140
  * @returns {*} either a string or a stream of the backup
130
141
  */
131
- const backupAppData = async (appId, config, includeRows) => {
142
+ const backupAppData = async (appId, config, excludeRows) => {
132
143
  return await exports.exportDB(appId, {
133
144
  ...config,
134
- filter: exports.defineFilter(includeRows),
145
+ filter: exports.defineFilter(excludeRows),
135
146
  })
136
147
  }
137
148
 
@@ -148,11 +159,11 @@ exports.performBackup = async (appId, backupName) => {
148
159
  /**
149
160
  * Streams a backup of the database state for an app
150
161
  * @param {string} appId The ID of the app which is to be backed up.
151
- * @param {boolean} includeRows Flag to state whether the export should include data.
162
+ * @param {boolean} excludeRows Flag to state whether the export should include data.
152
163
  * @returns {*} a readable stream of the backup which is written in real time
153
164
  */
154
- exports.streamBackup = async (appId, includeRows) => {
155
- return await backupAppData(appId, { stream: true }, includeRows)
165
+ exports.streamBackup = async (appId, excludeRows) => {
166
+ return await backupAppData(appId, { stream: true }, excludeRows)
156
167
  }
157
168
 
158
169
  /**
@@ -327,6 +338,64 @@ exports.cleanup = appIds => {
327
338
  }
328
339
  }
329
340
 
341
+ exports.extractPluginTarball = async file => {
342
+ if (!file.name.endsWith(".tar.gz")) {
343
+ throw new Error("Plugin must be compressed into a gzipped tarball.")
344
+ }
345
+ const path = join(budibaseTempDir(), file.name.split(".tar.gz")[0])
346
+ // remove old tmp directories automatically - don't combine
347
+ if (fs.existsSync(path)) {
348
+ fs.rmSync(path, { recursive: true, force: true })
349
+ }
350
+ fs.mkdirSync(path)
351
+ await tar.extract({
352
+ file: file.path,
353
+ C: path,
354
+ })
355
+ let metadata = {}
356
+ try {
357
+ const pkg = fs.readFileSync(join(path, "package.json"), "utf8")
358
+ const schema = fs.readFileSync(join(path, "schema.json"), "utf8")
359
+ metadata.schema = JSON.parse(schema)
360
+ metadata.package = JSON.parse(pkg)
361
+ } catch (err) {
362
+ throw new Error("Unable to process schema.json/package.json in plugin.")
363
+ }
364
+ return { metadata, directory: path }
365
+ }
366
+
367
+ exports.getDatasourcePlugin = async (name, url, hash) => {
368
+ if (!fs.existsSync(DATASOURCE_PATH)) {
369
+ fs.mkdirSync(DATASOURCE_PATH)
370
+ }
371
+ const filename = join(DATASOURCE_PATH, name)
372
+ const metadataName = `${filename}.bbmetadata`
373
+ if (fs.existsSync(filename)) {
374
+ const currentHash = fs.readFileSync(metadataName, "utf8")
375
+ // if hash is the same return the file, otherwise remove it and re-download
376
+ if (currentHash === hash) {
377
+ return require(filename)
378
+ } else {
379
+ console.log(`Updating plugin: ${name}`)
380
+ fs.unlinkSync(filename)
381
+ }
382
+ }
383
+ const fullUrl = checkSlashesInUrl(
384
+ `${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`
385
+ )
386
+ const response = await fetch(fullUrl)
387
+ if (response.status === 200) {
388
+ const content = await response.text()
389
+ fs.writeFileSync(filename, content)
390
+ fs.writeFileSync(metadataName, hash)
391
+ require(filename)
392
+ } else {
393
+ throw new Error(
394
+ `Unable to retrieve plugin - reason: ${await response.text()}`
395
+ )
396
+ }
397
+ }
398
+
330
399
  /**
331
400
  * Full function definition for below can be found in the utilities.
332
401
  */
@@ -162,3 +162,11 @@ exports.convertBookmark = bookmark => {
162
162
  }
163
163
  return bookmark
164
164
  }
165
+
166
+ exports.isQsTrue = param => {
167
+ if (typeof param === "string") {
168
+ return param.toLowerCase() === "true"
169
+ } else {
170
+ return param === true
171
+ }
172
+ }
@@ -76,7 +76,7 @@ exports.processDates = (table, rows) => {
76
76
  if (schema.type !== FieldTypes.DATETIME) {
77
77
  continue
78
78
  }
79
- if (!schema.ignoreTimezones) {
79
+ if (!schema.timeOnly && !schema.ignoreTimezones) {
80
80
  datesWithTZ.push(column)
81
81
  }
82
82
  }
@@ -72,7 +72,8 @@ exports.getUniqueRows = async appIds => {
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
 
78
79
  return uniqueRows
package/src/watch.ts ADDED
@@ -0,0 +1,38 @@
1
+ import path from "path"
2
+ import * as env from "./environment"
3
+ import chokidar from "chokidar"
4
+ import fs from "fs"
5
+ import { tenancy } from "@budibase/backend-core"
6
+ import { DEFAULT_TENANT_ID } from "@budibase/backend-core/constants"
7
+ import { processPlugin } from "./api/controllers/plugin"
8
+
9
+ export function watch() {
10
+ const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz")
11
+ chokidar
12
+ .watch(watchPath, {
13
+ ignored: "**/node_modules",
14
+ awaitWriteFinish: {
15
+ pollInterval: 100,
16
+ stabilityThreshold: 250,
17
+ },
18
+ usePolling: true,
19
+ interval: 250,
20
+ })
21
+ .on("all", async (event: string, path: string) => {
22
+ // Sanity checks
23
+ if (!path?.endsWith(".tar.gz") || !fs.existsSync(path)) {
24
+ return
25
+ }
26
+ await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => {
27
+ try {
28
+ const split = path.split("/")
29
+ const name = split[split.length - 1]
30
+ console.log("Importing plugin:", path)
31
+ await processPlugin({ name, path })
32
+ } catch (err: any) {
33
+ const message = err?.message ? err?.message : err
34
+ console.error("Failed to import plugin:", message)
35
+ }
36
+ })
37
+ })
38
+ }