@budibase/server 1.3.13 → 1.3.15-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/{index.e50bda9f.css → index.ecdac070.css} +2 -2
  3. package/builder/assets/index.ed9ae6a1.js +995 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +377 -313
  6. package/coverage/coverage-final.json +22 -22
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +8 -5
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +82 -13
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +32 -32
  16. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +204 -12
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +12 -12
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +24 -24
  79. package/coverage/lcov-report/automations/index.js.html +18 -9
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +126 -24
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +18 -18
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +56 -20
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +48 -48
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  128. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  129. package/coverage/lcov-report/middleware/index.html +1 -1
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  136. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +16 -16
  139. package/coverage/lcov-report/utilities/index.html +19 -19
  140. package/coverage/lcov-report/utilities/index.js.html +66 -42
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  142. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +5 -5
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +6 -3
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  156. package/coverage/lcov.info +692 -564
  157. package/dist/api/controllers/application.js +6 -9
  158. package/dist/api/controllers/backup.js +2 -1
  159. package/dist/api/controllers/component.js +18 -1
  160. package/dist/api/controllers/datasource.js +4 -4
  161. package/dist/api/controllers/deploy/index.js +17 -2
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/plugin/file.js +24 -0
  164. package/dist/api/controllers/plugin/github.js +69 -0
  165. package/dist/api/controllers/plugin/index.js +189 -0
  166. package/dist/api/controllers/plugin/npm.js +58 -0
  167. package/dist/api/controllers/plugin/uploaders.js +11 -0
  168. package/dist/api/controllers/plugin/url.js +24 -0
  169. package/dist/api/controllers/plugin/utils.js +26 -0
  170. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  171. package/dist/api/controllers/screen.js +51 -2
  172. package/dist/api/controllers/static/index.js +1 -0
  173. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  174. package/dist/api/controllers/static/templates/preview.hbs +3 -1
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/api/routes/plugin.js +39 -0
  177. package/dist/app.js +9 -0
  178. package/dist/automations/index.js +10 -5
  179. package/dist/automations/triggers.js +39 -5
  180. package/dist/automations/utils.js +16 -7
  181. package/dist/db/utils.js +10 -1
  182. package/dist/environment.js +1 -0
  183. package/dist/integrations/airtable.js +126 -129
  184. package/dist/integrations/arangodb.js +86 -89
  185. package/dist/integrations/base/query.js +2 -2
  186. package/dist/integrations/couchdb.js +80 -83
  187. package/dist/integrations/dynamodb.js +161 -164
  188. package/dist/integrations/elasticsearch.js +135 -138
  189. package/dist/integrations/firebase.js +154 -157
  190. package/dist/integrations/googlesheets.js +323 -327
  191. package/dist/integrations/index.js +93 -51
  192. package/dist/integrations/microsoftSqlServer.js +240 -243
  193. package/dist/integrations/mongodb.js +239 -242
  194. package/dist/integrations/mysql.js +215 -219
  195. package/dist/integrations/oracle.js +318 -322
  196. package/dist/integrations/postgres.js +262 -265
  197. package/dist/integrations/redis.js +134 -139
  198. package/dist/integrations/rest.js +293 -281
  199. package/dist/integrations/s3.js +61 -64
  200. package/dist/integrations/snowflake.js +83 -86
  201. package/dist/package.json +8 -6
  202. package/dist/threads/automation.js +6 -0
  203. package/dist/threads/query.js +2 -2
  204. package/dist/tsconfig.build.tsbuildinfo +1 -1
  205. package/dist/utilities/fileSystem/index.js +116 -7
  206. package/dist/utilities/index.js +8 -0
  207. package/dist/utilities/rowProcessor/utils.js +1 -1
  208. package/dist/utilities/usageQuota/rows.js +2 -1
  209. package/dist/watch.js +77 -0
  210. package/package.json +9 -7
  211. package/scripts/dev/manage.js +1 -0
  212. package/src/api/controllers/application.ts +2 -6
  213. package/src/api/controllers/backup.js +2 -1
  214. package/src/api/controllers/component.js +25 -2
  215. package/src/api/controllers/datasource.js +4 -4
  216. package/src/api/controllers/deploy/index.ts +17 -4
  217. package/src/api/controllers/integration.js +4 -4
  218. package/src/api/controllers/plugin/file.ts +15 -0
  219. package/src/api/controllers/plugin/github.ts +75 -0
  220. package/src/api/controllers/plugin/index.ts +202 -0
  221. package/src/api/controllers/plugin/npm.ts +56 -0
  222. package/src/api/controllers/plugin/uploaders.ts +4 -0
  223. package/src/api/controllers/plugin/url.ts +12 -0
  224. package/src/api/controllers/plugin/utils.ts +19 -0
  225. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  226. package/src/api/controllers/screen.js +65 -1
  227. package/src/api/controllers/static/index.ts +1 -0
  228. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  229. package/src/api/controllers/static/templates/preview.hbs +3 -1
  230. package/src/api/routes/index.ts +2 -0
  231. package/src/api/routes/plugin.ts +14 -0
  232. package/src/api/routes/tests/query.spec.js +11 -28
  233. package/src/app.ts +12 -0
  234. package/src/automations/index.js +6 -3
  235. package/src/automations/triggers.js +44 -10
  236. package/src/automations/utils.ts +21 -9
  237. package/src/db/utils.js +12 -0
  238. package/src/definitions/datasource.ts +1 -0
  239. package/src/environment.js +1 -0
  240. package/src/integrations/airtable.ts +116 -118
  241. package/src/integrations/arangodb.ts +87 -89
  242. package/src/integrations/base/query.ts +2 -2
  243. package/src/integrations/couchdb.ts +83 -89
  244. package/src/integrations/dynamodb.ts +173 -175
  245. package/src/integrations/elasticsearch.ts +120 -122
  246. package/src/integrations/firebase.ts +157 -159
  247. package/src/integrations/googlesheets.ts +328 -338
  248. package/src/integrations/index.ts +59 -21
  249. package/src/integrations/microsoftSqlServer.ts +249 -251
  250. package/src/integrations/mongodb.ts +261 -258
  251. package/src/integrations/mysql.ts +229 -234
  252. package/src/integrations/oracle.ts +373 -380
  253. package/src/integrations/postgres.ts +264 -268
  254. package/src/integrations/redis.ts +128 -132
  255. package/src/integrations/rest.ts +325 -317
  256. package/src/integrations/s3.ts +68 -71
  257. package/src/integrations/snowflake.ts +80 -82
  258. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  259. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  260. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  261. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  262. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  263. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  264. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  265. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  266. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  267. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  268. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  269. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  270. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +57 -14
  271. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  272. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  273. package/src/module.d.ts +2 -0
  274. package/src/threads/automation.ts +6 -0
  275. package/src/threads/query.ts +2 -2
  276. package/src/utilities/fileSystem/index.js +135 -6
  277. package/src/utilities/index.js +8 -0
  278. package/src/utilities/rowProcessor/utils.js +1 -1
  279. package/src/utilities/usageQuota/rows.js +2 -1
  280. package/src/watch.ts +38 -0
  281. package/builder/assets/index.fb22f106.js +0 -875
  282. package/builder/assets/vendor.5e1fe644.css +0 -1
  283. package/builder/assets/vendor.67dbd8fa.js +0 -248
@@ -15,9 +15,11 @@ const {
15
15
  streamUpload,
16
16
  deleteFolder,
17
17
  downloadTarball,
18
+ downloadTarballDirect,
18
19
  deleteFiles,
19
20
  } = require("./utilities")
20
21
  const { updateClientLibrary } = require("./clientLibrary")
22
+ const { checkSlashesInUrl } = require("../")
21
23
  const env = require("../../environment")
22
24
  const {
23
25
  USER_METDATA_PREFIX,
@@ -26,9 +28,12 @@ const {
26
28
  } = require("../../db/utils")
27
29
  const MemoryStream = require("memorystream")
28
30
  const { getAppId } = require("@budibase/backend-core/context")
31
+ const tar = require("tar")
32
+ const fetch = require("node-fetch")
29
33
 
30
34
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
31
35
  const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules")
36
+ const DATASOURCE_PATH = join(budibaseTempDir(), "datasource")
32
37
 
33
38
  /**
34
39
  * The single stack system (Cloud and Builder) should not make use of the file system where possible,
@@ -99,6 +104,13 @@ exports.loadHandlebarsFile = path => {
99
104
  return fs.readFileSync(path, "utf8")
100
105
  }
101
106
 
107
+ /**
108
+ * Same as above just with a different name.
109
+ */
110
+ exports.loadJSFile = (directory, name) => {
111
+ return fs.readFileSync(join(directory, name), "utf8")
112
+ }
113
+
102
114
  /**
103
115
  * When return a file from the API need to write the file to the system temporarily so we
104
116
  * can create a read stream to send.
@@ -125,13 +137,13 @@ exports.defineFilter = excludeRows => {
125
137
  * data or user relationships.
126
138
  * @param {string} appId The app to backup
127
139
  * @param {object} config Config to send to export DB
128
- * @param {boolean} includeRows Flag to state whether the export should include data.
140
+ * @param {boolean} excludeRows Flag to state whether the export should include data.
129
141
  * @returns {*} either a string or a stream of the backup
130
142
  */
131
- const backupAppData = async (appId, config, includeRows) => {
143
+ const backupAppData = async (appId, config, excludeRows) => {
132
144
  return await exports.exportDB(appId, {
133
145
  ...config,
134
- filter: exports.defineFilter(includeRows),
146
+ filter: exports.defineFilter(excludeRows),
135
147
  })
136
148
  }
137
149
 
@@ -148,11 +160,11 @@ exports.performBackup = async (appId, backupName) => {
148
160
  /**
149
161
  * Streams a backup of the database state for an app
150
162
  * @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.
163
+ * @param {boolean} excludeRows Flag to state whether the export should include data.
152
164
  * @returns {*} a readable stream of the backup which is written in real time
153
165
  */
154
- exports.streamBackup = async (appId, includeRows) => {
155
- return await backupAppData(appId, { stream: true }, includeRows)
166
+ exports.streamBackup = async (appId, excludeRows) => {
167
+ return await backupAppData(appId, { stream: true }, excludeRows)
156
168
  }
157
169
 
158
170
  /**
@@ -327,6 +339,122 @@ exports.cleanup = appIds => {
327
339
  }
328
340
  }
329
341
 
342
+ const createTempFolder = item => {
343
+ const path = join(budibaseTempDir(), item)
344
+ try {
345
+ // remove old tmp directories automatically - don't combine
346
+ if (fs.existsSync(path)) {
347
+ fs.rmSync(path, { recursive: true, force: true })
348
+ }
349
+ fs.mkdirSync(path)
350
+ } catch (err) {
351
+ throw new Error(`Path cannot be created: ${err.message}`)
352
+ }
353
+
354
+ return path
355
+ }
356
+ exports.createTempFolder = createTempFolder
357
+
358
+ const extractTarball = async (fromFilePath, toPath) => {
359
+ await tar.extract({
360
+ file: fromFilePath,
361
+ C: toPath,
362
+ })
363
+ }
364
+ exports.extractTarball = extractTarball
365
+
366
+ const getPluginMetadata = async path => {
367
+ let metadata = {}
368
+ try {
369
+ const pkg = fs.readFileSync(join(path, "package.json"), "utf8")
370
+ const schema = fs.readFileSync(join(path, "schema.json"), "utf8")
371
+
372
+ metadata.schema = JSON.parse(schema)
373
+ metadata.package = JSON.parse(pkg)
374
+
375
+ if (
376
+ !metadata.package.name ||
377
+ !metadata.package.version ||
378
+ !metadata.package.description
379
+ ) {
380
+ throw new Error(
381
+ "package.json is missing one of 'name', 'version' or 'description'."
382
+ )
383
+ }
384
+ } catch (err) {
385
+ throw new Error(
386
+ `Unable to process schema.json/package.json in plugin. ${err.message}`
387
+ )
388
+ }
389
+
390
+ return { metadata, directory: path }
391
+ }
392
+ exports.getPluginMetadata = getPluginMetadata
393
+
394
+ exports.getDatasourcePlugin = async (name, url, hash) => {
395
+ if (!fs.existsSync(DATASOURCE_PATH)) {
396
+ fs.mkdirSync(DATASOURCE_PATH)
397
+ }
398
+ const filename = join(DATASOURCE_PATH, name)
399
+ const metadataName = `${filename}.bbmetadata`
400
+ if (fs.existsSync(filename)) {
401
+ const currentHash = fs.readFileSync(metadataName, "utf8")
402
+ // if hash is the same return the file, otherwise remove it and re-download
403
+ if (currentHash === hash) {
404
+ return require(filename)
405
+ } else {
406
+ console.log(`Updating plugin: ${name}`)
407
+ fs.unlinkSync(filename)
408
+ }
409
+ }
410
+ const fullUrl = checkSlashesInUrl(
411
+ `${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`
412
+ )
413
+ const response = await fetch(fullUrl)
414
+ if (response.status === 200) {
415
+ const content = await response.text()
416
+ fs.writeFileSync(filename, content)
417
+ fs.writeFileSync(metadataName, hash)
418
+ require(filename)
419
+ } else {
420
+ throw new Error(
421
+ `Unable to retrieve plugin - reason: ${await response.text()}`
422
+ )
423
+ }
424
+ }
425
+
426
+ /**
427
+ * Find for a file recursively from start path applying filter, return first match
428
+ */
429
+ exports.findFileRec = (startPath, filter) => {
430
+ if (!fs.existsSync(startPath)) {
431
+ return
432
+ }
433
+
434
+ const files = fs.readdirSync(startPath)
435
+ for (let i = 0, len = files.length; i < len; i++) {
436
+ const filename = join(startPath, files[i])
437
+ const stat = fs.lstatSync(filename)
438
+
439
+ if (stat.isDirectory()) {
440
+ return exports.findFileRec(filename, filter)
441
+ } else if (filename.endsWith(filter)) {
442
+ return filename
443
+ }
444
+ }
445
+ }
446
+
447
+ /**
448
+ * Remove a folder which is not empty from the file system
449
+ */
450
+ exports.deleteFolderFileSystem = path => {
451
+ if (!fs.existsSync(path)) {
452
+ return
453
+ }
454
+
455
+ fs.rmSync(path, { recursive: true, force: true })
456
+ }
457
+
330
458
  /**
331
459
  * Full function definition for below can be found in the utilities.
332
460
  */
@@ -334,5 +462,6 @@ exports.upload = upload
334
462
  exports.retrieve = retrieve
335
463
  exports.retrieveToTmp = retrieveToTmp
336
464
  exports.deleteFiles = deleteFiles
465
+ exports.downloadTarballDirect = downloadTarballDirect
337
466
  exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH
338
467
  exports.NODE_MODULES_PATH = NODE_MODULES_PATH
@@ -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
+ }