@budibase/server 1.3.21 → 1.3.22-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 (310) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.96c69636.js +1008 -0
  3. package/builder/assets/index.c167b5c3.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +308 -338
  6. package/coverage/coverage-final.json +19 -21
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +41 -8
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  13. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/index.html +27 -57
  15. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  43. package/coverage/lcov-report/api/index.html +1 -1
  44. package/coverage/lcov-report/api/index.js.html +13 -13
  45. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/index.html +1 -1
  56. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  70. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  71. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  73. package/coverage/lcov-report/automations/actions.js.html +1 -1
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  76. package/coverage/lcov-report/automations/index.html +1 -1
  77. package/coverage/lcov-report/automations/index.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/index.html +1 -1
  85. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  104. package/coverage/lcov-report/constants/index.html +1 -1
  105. package/coverage/lcov-report/constants/index.js.html +1 -1
  106. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  107. package/coverage/lcov-report/constants/screens.js.html +1 -1
  108. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  109. package/coverage/lcov-report/db/index.html +14 -14
  110. package/coverage/lcov-report/db/index.js.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  115. package/coverage/lcov-report/db/newid.js.html +2 -2
  116. package/coverage/lcov-report/db/utils.js.html +30 -18
  117. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  118. package/coverage/lcov-report/events/index.html +1 -1
  119. package/coverage/lcov-report/events/index.js.html +1 -1
  120. package/coverage/lcov-report/events/utils.js.html +1 -1
  121. package/coverage/lcov-report/index.html +44 -44
  122. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  123. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  124. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  125. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  126. package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
  127. package/coverage/lcov-report/middleware/index.html +15 -15
  128. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  129. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  130. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  131. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  132. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  133. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  134. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  135. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  136. package/coverage/lcov-report/utilities/global.js.html +16 -16
  137. package/coverage/lcov-report/utilities/index.html +15 -15
  138. package/coverage/lcov-report/utilities/index.js.html +24 -24
  139. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  140. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  141. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  142. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  143. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  144. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  146. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  147. package/coverage/lcov-report/utilities/security.js.html +2 -2
  148. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  149. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  150. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  152. package/coverage/lcov-report/utilities/users.js.html +1 -1
  153. package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
  154. package/coverage/lcov.info +521 -558
  155. package/dist/api/controllers/application.js +5 -5
  156. package/dist/api/controllers/auth.js +9 -0
  157. package/dist/api/controllers/component.js +19 -6
  158. package/dist/api/controllers/datasource.js +21 -8
  159. package/dist/api/controllers/deploy/index.js +1 -8
  160. package/dist/api/controllers/integration.js +4 -4
  161. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  162. package/dist/api/controllers/plugin/github.js +69 -0
  163. package/dist/api/controllers/plugin/index.js +144 -0
  164. package/dist/api/controllers/plugin/npm.js +58 -0
  165. package/dist/api/controllers/plugin/uploaders.js +11 -0
  166. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  167. package/dist/api/controllers/plugin/utils.js +26 -0
  168. package/dist/api/controllers/row/external.js +1 -1
  169. package/dist/api/controllers/screen.js +62 -14
  170. package/dist/api/controllers/static/index.js +1 -0
  171. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  172. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  173. package/dist/api/index.js +1 -1
  174. package/dist/api/routes/application.js +3 -2
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  177. package/dist/api/routes/public/rows.js +1 -82
  178. package/dist/api/routes/public/tables.js +1 -1
  179. package/dist/api/routes/table.js +1 -1
  180. package/dist/api/routes/utils/validators.js +20 -2
  181. package/dist/app.js +16 -1
  182. package/dist/db/utils.js +3 -0
  183. package/dist/environment.js +1 -0
  184. package/dist/integrations/airtable.js +126 -129
  185. package/dist/integrations/arangodb.js +86 -89
  186. package/dist/integrations/base/query.js +2 -2
  187. package/dist/integrations/base/sqlTable.js +3 -1
  188. package/dist/integrations/couchdb.js +80 -83
  189. package/dist/integrations/dynamodb.js +161 -164
  190. package/dist/integrations/elasticsearch.js +135 -138
  191. package/dist/integrations/firebase.js +154 -157
  192. package/dist/integrations/googlesheets.js +323 -327
  193. package/dist/integrations/index.js +99 -51
  194. package/dist/integrations/microsoftSqlServer.js +240 -243
  195. package/dist/integrations/mongodb.js +239 -242
  196. package/dist/integrations/mysql.js +215 -219
  197. package/dist/integrations/oracle.js +318 -322
  198. package/dist/integrations/postgres.js +262 -265
  199. package/dist/integrations/redis.js +134 -139
  200. package/dist/integrations/rest.js +289 -292
  201. package/dist/integrations/s3.js +61 -64
  202. package/dist/integrations/snowflake.js +83 -86
  203. package/dist/middleware/currentapp.js +2 -0
  204. package/dist/migrations/functions/backfill/global.js +0 -3
  205. package/dist/migrations/index.js +0 -10
  206. package/dist/package.json +9 -6
  207. package/dist/tests/utilities/TestConfiguration.js +1 -1
  208. package/dist/threads/query.js +2 -2
  209. package/dist/tsconfig.build.tsbuildinfo +1 -1
  210. package/dist/utilities/fileSystem/index.js +105 -1
  211. package/dist/utilities/workerRequests.js +4 -0
  212. package/dist/watch.js +77 -0
  213. package/dist/websocket.js +22 -0
  214. package/package.json +10 -7
  215. package/scripts/dev/manage.js +4 -0
  216. package/scripts/localdomain.js +3 -1
  217. package/specs/openapi.json +115 -112
  218. package/specs/openapi.yaml +96 -94
  219. package/specs/resources/misc.js +116 -0
  220. package/specs/resources/query.js +1 -1
  221. package/src/api/controllers/application.ts +1 -2
  222. package/src/api/controllers/auth.js +11 -0
  223. package/src/api/controllers/component.ts +57 -0
  224. package/src/api/controllers/datasource.js +21 -8
  225. package/src/api/controllers/deploy/index.ts +1 -6
  226. package/src/api/controllers/integration.js +4 -4
  227. package/src/api/controllers/plugin/file.ts +15 -0
  228. package/src/api/controllers/plugin/github.ts +75 -0
  229. package/src/api/controllers/plugin/index.ts +134 -0
  230. package/src/api/controllers/plugin/npm.ts +56 -0
  231. package/src/api/controllers/plugin/uploaders.ts +4 -0
  232. package/src/api/controllers/plugin/url.ts +12 -0
  233. package/src/api/controllers/plugin/utils.ts +19 -0
  234. package/src/api/controllers/public/mapping/types.ts +8 -0
  235. package/src/api/controllers/row/external.js +1 -1
  236. package/src/api/controllers/screen.ts +122 -0
  237. package/src/api/controllers/static/index.ts +1 -1
  238. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  239. package/src/api/controllers/static/templates/preview.hbs +5 -1
  240. package/src/api/index.js +1 -1
  241. package/src/api/routes/application.ts +13 -2
  242. package/src/api/routes/index.ts +2 -0
  243. package/src/api/routes/plugin.ts +14 -0
  244. package/src/api/routes/public/rows.ts +1 -82
  245. package/src/api/routes/public/tables.ts +1 -1
  246. package/src/api/routes/table.js +1 -1
  247. package/src/api/routes/tests/query.spec.js +8 -25
  248. package/src/api/routes/tests/user.spec.js +0 -2
  249. package/src/api/routes/utils/validators.js +26 -5
  250. package/src/app.ts +25 -2
  251. package/src/db/utils.js +4 -0
  252. package/src/definitions/openapi.ts +56 -55
  253. package/src/environment.js +1 -0
  254. package/src/integrations/airtable.ts +116 -118
  255. package/src/integrations/arangodb.ts +87 -89
  256. package/src/integrations/base/query.ts +2 -2
  257. package/src/integrations/base/sqlTable.ts +3 -1
  258. package/src/integrations/couchdb.ts +83 -89
  259. package/src/integrations/dynamodb.ts +173 -175
  260. package/src/integrations/elasticsearch.ts +120 -122
  261. package/src/integrations/firebase.ts +157 -159
  262. package/src/integrations/googlesheets.ts +328 -338
  263. package/src/integrations/index.ts +64 -21
  264. package/src/integrations/microsoftSqlServer.ts +249 -251
  265. package/src/integrations/mongodb.ts +261 -258
  266. package/src/integrations/mysql.ts +229 -234
  267. package/src/integrations/oracle.ts +373 -380
  268. package/src/integrations/postgres.ts +264 -268
  269. package/src/integrations/redis.ts +128 -132
  270. package/src/integrations/rest.ts +324 -329
  271. package/src/integrations/s3.ts +68 -71
  272. package/src/integrations/snowflake.ts +80 -82
  273. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  274. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  275. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  276. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  277. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  278. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  279. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  280. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  281. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  282. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  283. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  284. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  285. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  286. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  287. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  288. package/src/middleware/currentapp.js +2 -0
  289. package/src/migrations/functions/backfill/global.ts +0 -3
  290. package/src/migrations/index.ts +0 -16
  291. package/src/module.d.ts +2 -0
  292. package/src/tests/utilities/TestConfiguration.js +1 -1
  293. package/src/threads/query.ts +2 -2
  294. package/src/utilities/fileSystem/index.js +123 -0
  295. package/src/utilities/workerRequests.js +8 -0
  296. package/src/watch.ts +38 -0
  297. package/src/websocket.ts +26 -0
  298. package/builder/assets/index.8d12d461.css +0 -6
  299. package/builder/assets/index.d354271c.js +0 -879
  300. package/builder/assets/vendor.5e1fe644.css +0 -1
  301. package/builder/assets/vendor.67dbd8fa.js +0 -248
  302. package/coverage/lcov-report/api/controllers/component.js.html +0 -199
  303. package/coverage/lcov-report/api/controllers/screen.js.html +0 -259
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/api/controllers/component.js +0 -38
  306. package/src/api/controllers/screen.js +0 -58
  307. package/src/migrations/functions/developerQuota.ts +0 -15
  308. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  309. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  310. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
@@ -1004,7 +1004,7 @@ components:
1004
1004
  description: The ID of the query.
1005
1005
  type: string
1006
1006
  datasourceId:
1007
- description: The ID of the data source the query belongs to.
1007
+ description: The ID of the datasource the query belongs to.
1008
1008
  type: string
1009
1009
  parameters:
1010
1010
  description: The bindings which are required to perform this query.
@@ -1051,7 +1051,7 @@ components:
1051
1051
  description: The ID of the query.
1052
1052
  type: string
1053
1053
  datasourceId:
1054
- description: The ID of the data source the query belongs to.
1054
+ description: The ID of the datasource the query belongs to.
1055
1055
  type: string
1056
1056
  parameters:
1057
1057
  description: The bindings which are required to perform this query.
@@ -1264,6 +1264,98 @@ components:
1264
1264
  - _id
1265
1265
  required:
1266
1266
  - data
1267
+ rowSearch:
1268
+ type: object
1269
+ properties:
1270
+ query:
1271
+ type: object
1272
+ properties:
1273
+ allOr:
1274
+ type: boolean
1275
+ description: Specifies that a row should be returned if it satisfies any of the
1276
+ specified options, rather than requiring it to fulfill all the
1277
+ search parameters. This defaults to false, meaning AND logic
1278
+ will be used.
1279
+ string:
1280
+ type: object
1281
+ example:
1282
+ columnName1: value
1283
+ columnName2: value
1284
+ description: A map of field name to the string to search for, this will look for
1285
+ rows that have a value starting with the string value.
1286
+ additionalProperties:
1287
+ type: string
1288
+ description: The value to search for in the column.
1289
+ fuzzy:
1290
+ type: object
1291
+ description: A fuzzy search, only supported by internal tables.
1292
+ range:
1293
+ type: object
1294
+ description: Searches within a range, the format of this must be in the format
1295
+ of an object with a "low" and "high" property.
1296
+ example:
1297
+ columnName1:
1298
+ low: 10
1299
+ high: 20
1300
+ equal:
1301
+ type: object
1302
+ description: Searches for rows that have a column value that is exactly the
1303
+ value set.
1304
+ notEqual:
1305
+ type: object
1306
+ description: Searches for any row which does not contain the specified column
1307
+ value.
1308
+ empty:
1309
+ type: object
1310
+ description: Searches for rows which do not contain the specified column. The
1311
+ object should simply contain keys of the column names, these can
1312
+ map to any value.
1313
+ example:
1314
+ columnName1: ""
1315
+ notEmpty:
1316
+ type: object
1317
+ description: Searches for rows which have the specified column.
1318
+ oneOf:
1319
+ type: object
1320
+ description: Searches for rows which have a column value that is any of the
1321
+ specified values. The format of this must be columnName ->
1322
+ [value1, value2].
1323
+ paginate:
1324
+ type: boolean
1325
+ description: Enables pagination, by default this is disabled.
1326
+ bookmark:
1327
+ oneOf:
1328
+ - type: string
1329
+ - type: integer
1330
+ description: If retrieving another page, the bookmark from the previous request
1331
+ must be supplied.
1332
+ limit:
1333
+ type: integer
1334
+ description: The maximum number of rows to return, useful when paginating, for
1335
+ internal tables this will be limited to 1000, for SQL tables it will
1336
+ be 5000.
1337
+ sort:
1338
+ type: object
1339
+ description: A set of parameters describing the sort behaviour of the search.
1340
+ properties:
1341
+ order:
1342
+ type: string
1343
+ enum:
1344
+ - ascending
1345
+ - descending
1346
+ description: The order of the sort, by default this is ascending.
1347
+ column:
1348
+ type: string
1349
+ description: The name of the column by which the rows will be sorted.
1350
+ type:
1351
+ type: string
1352
+ enum:
1353
+ - string
1354
+ - number
1355
+ description: Defines whether the column should be treated as a string or as
1356
+ numbers when sorting.
1357
+ required:
1358
+ - query
1267
1359
  nameSearch:
1268
1360
  type: object
1269
1361
  properties:
@@ -1544,97 +1636,7 @@ paths:
1544
1636
  content:
1545
1637
  application/json:
1546
1638
  schema:
1547
- type: object
1548
- required:
1549
- - query
1550
- properties:
1551
- query:
1552
- type: object
1553
- properties:
1554
- allOr:
1555
- type: boolean
1556
- description: Specifies that a row should be returned if it satisfies any of the
1557
- specified options, rather than requiring it to fulfill
1558
- all the search parameters. This defaults to false,
1559
- meaning AND logic will be used.
1560
- string:
1561
- type: object
1562
- example:
1563
- columnName1: value
1564
- columnName2: value
1565
- description: A map of field name to the string to search for, this will look for
1566
- rows that have a value starting with the string value.
1567
- additionalProperties:
1568
- type: string
1569
- description: The value to search for in the column.
1570
- fuzzy:
1571
- type: object
1572
- description: A fuzzy search, only supported by internal tables.
1573
- range:
1574
- type: object
1575
- description: Searches within a range, the format of this must be in the format
1576
- of an object with a "low" and "high" property.
1577
- example:
1578
- columnName1:
1579
- low: 10
1580
- high: 20
1581
- equal:
1582
- type: object
1583
- description: Searches for rows that have a column value that is exactly the
1584
- value set.
1585
- notEqual:
1586
- type: object
1587
- description: Searches for any row which does not contain the specified column
1588
- value.
1589
- empty:
1590
- type: object
1591
- description: Searches for rows which do not contain the specified column. The
1592
- object should simply contain keys of the column names,
1593
- these can map to any value.
1594
- example:
1595
- columnName1: ""
1596
- notEmpty:
1597
- type: object
1598
- description: Searches for rows which have the specified column.
1599
- oneOf:
1600
- type: object
1601
- description: Searches for rows which have a column value that is any of the
1602
- specified values. The format of this must be columnName
1603
- -> [value1, value2].
1604
- paginate:
1605
- type: boolean
1606
- description: Enables pagination, by default this is disabled.
1607
- bookmark:
1608
- oneOf:
1609
- - type: string
1610
- - type: integer
1611
- description: If retrieving another page, the bookmark from the previous request
1612
- must be supplied.
1613
- limit:
1614
- type: integer
1615
- description: The maximum number of rows to return, useful when paginating, for
1616
- internal tables this will be limited to 1000, for SQL tables
1617
- it will be 5000.
1618
- sort:
1619
- type: object
1620
- description: A set of parameters describing the sort behaviour of the search.
1621
- properties:
1622
- order:
1623
- type: string
1624
- enum:
1625
- - ascending
1626
- - descending
1627
- description: The order of the sort, by default this is ascending.
1628
- column:
1629
- type: string
1630
- description: The name of the column by which the rows will be sorted.
1631
- type:
1632
- type: string
1633
- enum:
1634
- - string
1635
- - number
1636
- description: Defines whether the column should be treated as a string or as
1637
- numbers when sorting.
1639
+ $ref: "#/components/schemas/rowSearch"
1638
1640
  responses:
1639
1641
  "200":
1640
1642
  description: The response will contain an array of rows that match the search
@@ -1665,7 +1667,7 @@ paths:
1665
1667
  responses:
1666
1668
  "200":
1667
1669
  description: Returns the created table, including the ID which has been
1668
- generated for it. This can be internal or external data sources.
1670
+ generated for it. This can be internal or external datasources.
1669
1671
  content:
1670
1672
  application/json:
1671
1673
  schema:
@@ -2,6 +2,122 @@ const { object } = require("./utils")
2
2
  const Resource = require("./utils/Resource")
3
3
 
4
4
  module.exports = new Resource().setSchemas({
5
+ rowSearch: object(
6
+ {
7
+ query: {
8
+ type: "object",
9
+ properties: {
10
+ allOr: {
11
+ type: "boolean",
12
+ description:
13
+ "Specifies that a row should be returned if it satisfies any of the specified options, rather than requiring it to fulfill all the search parameters. This defaults to false, meaning AND logic will be used.",
14
+ },
15
+ string: {
16
+ type: "object",
17
+ example: {
18
+ columnName1: "value",
19
+ columnName2: "value",
20
+ },
21
+ description:
22
+ "A map of field name to the string to search for, this will look for rows that have a value starting with the string value.",
23
+ additionalProperties: {
24
+ type: "string",
25
+ description: "The value to search for in the column.",
26
+ },
27
+ },
28
+ fuzzy: {
29
+ type: "object",
30
+ description: "A fuzzy search, only supported by internal tables.",
31
+ },
32
+ range: {
33
+ type: "object",
34
+ description:
35
+ 'Searches within a range, the format of this must be in the format of an object with a "low" and "high" property.',
36
+ example: {
37
+ columnName1: {
38
+ low: 10,
39
+ high: 20,
40
+ },
41
+ },
42
+ },
43
+ equal: {
44
+ type: "object",
45
+ description:
46
+ "Searches for rows that have a column value that is exactly the value set.",
47
+ },
48
+ notEqual: {
49
+ type: "object",
50
+ description:
51
+ "Searches for any row which does not contain the specified column value.",
52
+ },
53
+ empty: {
54
+ type: "object",
55
+ description:
56
+ "Searches for rows which do not contain the specified column. The object should simply contain keys of the column names, these can map to any value.",
57
+ example: {
58
+ columnName1: "",
59
+ },
60
+ },
61
+ notEmpty: {
62
+ type: "object",
63
+ description: "Searches for rows which have the specified column.",
64
+ },
65
+ oneOf: {
66
+ type: "object",
67
+ description:
68
+ "Searches for rows which have a column value that is any of the specified values. The format of this must be columnName -> [value1, value2].",
69
+ },
70
+ },
71
+ },
72
+ paginate: {
73
+ type: "boolean",
74
+ description: "Enables pagination, by default this is disabled.",
75
+ },
76
+ bookmark: {
77
+ oneOf: [
78
+ {
79
+ type: "string",
80
+ },
81
+ {
82
+ type: "integer",
83
+ },
84
+ ],
85
+ description:
86
+ "If retrieving another page, the bookmark from the previous request must be supplied.",
87
+ },
88
+ limit: {
89
+ type: "integer",
90
+ description:
91
+ "The maximum number of rows to return, useful when paginating, for internal tables this will be limited to 1000, for SQL tables it will be 5000.",
92
+ },
93
+ sort: {
94
+ type: "object",
95
+ description:
96
+ "A set of parameters describing the sort behaviour of the search.",
97
+ properties: {
98
+ order: {
99
+ type: "string",
100
+ enum: ["ascending", "descending"],
101
+ description: "The order of the sort, by default this is ascending.",
102
+ },
103
+ column: {
104
+ type: "string",
105
+ description:
106
+ "The name of the column by which the rows will be sorted.",
107
+ },
108
+ type: {
109
+ type: "string",
110
+ enum: ["string", "number"],
111
+ description:
112
+ "Defines whether the column should be treated as a string or as numbers when sorting.",
113
+ },
114
+ },
115
+ },
116
+ },
117
+ {
118
+ required: ["query"],
119
+ }
120
+ ),
5
121
  nameSearch: object({
6
122
  name: {
7
123
  type: "string",
@@ -82,7 +82,7 @@ const querySchema = object(
82
82
  type: "string",
83
83
  },
84
84
  datasourceId: {
85
- description: "The ID of the data source the query belongs to.",
85
+ description: "The ID of the datasource the query belongs to.",
86
86
  type: "string",
87
87
  },
88
88
  parameters: {
@@ -472,7 +472,6 @@ const destroyApp = async (ctx: any) => {
472
472
  const result = await db.destroy()
473
473
 
474
474
  if (isUnpublish) {
475
- await quotas.removePublishedApp()
476
475
  await events.app.unpublished(app)
477
476
  } else {
478
477
  await quotas.removeApp()
@@ -572,7 +571,7 @@ export const sync = async (ctx: any, next: any) => {
572
571
  }
573
572
  }
574
573
 
575
- const updateAppPackage = async (appPackage: any, appId: any) => {
574
+ export const updateAppPackage = async (appPackage: any, appId: any) => {
576
575
  return context.doInAppContext(appId, async () => {
577
576
  const db = context.getAppDB()
578
577
  const application = await db.get(DocumentType.APP_METADATA)
@@ -4,6 +4,15 @@ const { getFullUser } = require("../../utilities/users")
4
4
  const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
5
5
  const { getAppDB, getAppId } = require("@budibase/backend-core/context")
6
6
 
7
+ /**
8
+ * Add the attributes that are session based to the current user.
9
+ */
10
+ const addSessionAttributesToUser = ctx => {
11
+ if (ctx.user) {
12
+ ctx.body.license = ctx.user.license
13
+ }
14
+ }
15
+
7
16
  exports.fetchSelf = async ctx => {
8
17
  let userId = ctx.user.userId || ctx.user._id
9
18
  /* istanbul ignore next */
@@ -55,4 +64,6 @@ exports.fetchSelf = async ctx => {
55
64
  } else {
56
65
  ctx.body = user
57
66
  }
67
+
68
+ addSessionAttributesToUser(ctx)
58
69
  }
@@ -0,0 +1,57 @@
1
+ import { DocumentType } from "../../db/utils"
2
+ import { Plugin } from "@budibase/types"
3
+ import { db as dbCore, context, tenancy } from "@budibase/backend-core"
4
+ import { getComponentLibraryManifest } from "../../utilities/fileSystem"
5
+
6
+ exports.fetchAppComponentDefinitions = async function (ctx: any) {
7
+ try {
8
+ const db = context.getAppDB()
9
+ const app = await db.get(DocumentType.APP_METADATA)
10
+
11
+ let componentManifests = await Promise.all(
12
+ app.componentLibraries.map(async (library: any) => {
13
+ let manifest = await getComponentLibraryManifest(library)
14
+ return {
15
+ manifest,
16
+ library,
17
+ }
18
+ })
19
+ )
20
+ const definitions: { [key: string]: any } = {}
21
+ for (let { manifest, library } of componentManifests) {
22
+ for (let key of Object.keys(manifest)) {
23
+ if (key === "features") {
24
+ definitions[key] = manifest[key]
25
+ } else {
26
+ const fullComponentName = `${library}/${key}`.toLowerCase()
27
+ definitions[fullComponentName] = {
28
+ component: fullComponentName,
29
+ ...manifest[key],
30
+ }
31
+ }
32
+ }
33
+ }
34
+
35
+ // Add custom components
36
+ const globalDB = tenancy.getGlobalDB()
37
+ const response = await globalDB.allDocs(
38
+ dbCore.getPluginParams(null, {
39
+ include_docs: true,
40
+ })
41
+ )
42
+ response.rows
43
+ .map((row: any) => row.doc)
44
+ .filter((plugin: Plugin) => plugin.schema.type === "component")
45
+ .forEach((plugin: Plugin) => {
46
+ const fullComponentName = `plugin/${plugin.name}`
47
+ definitions[fullComponentName] = {
48
+ component: fullComponentName,
49
+ ...plugin.schema.schema,
50
+ }
51
+ })
52
+
53
+ ctx.body = definitions
54
+ } catch (err) {
55
+ console.error(`component-definitions=failed`, err)
56
+ }
57
+ }
@@ -7,7 +7,7 @@ const {
7
7
  getTableParams,
8
8
  } = require("../../db/utils")
9
9
  const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
10
- const { integrations } = require("../../integrations")
10
+ const { getIntegration } = require("../../integrations")
11
11
  const { getDatasourceAndQuery } = require("./row/utils")
12
12
  const { invalidateDynamicVariables } = require("../../threads/utils")
13
13
  const { getAppDB } = require("@budibase/backend-core/context")
@@ -50,9 +50,23 @@ exports.fetch = async function (ctx) {
50
50
  exports.buildSchemaFromDb = async function (ctx) {
51
51
  const db = getAppDB()
52
52
  const datasource = await db.get(ctx.params.datasourceId)
53
+ const tablesFilter = ctx.request.body.tablesFilter
53
54
 
54
- const { tables, error } = await buildSchemaHelper(datasource)
55
- datasource.entities = tables
55
+ let { tables, error } = await buildSchemaHelper(datasource)
56
+ if (tablesFilter) {
57
+ if (!datasource.entities) {
58
+ datasource.entities = {}
59
+ }
60
+ for (let key in tables) {
61
+ if (
62
+ tablesFilter.some(filter => filter.toLowerCase() === key.toLowerCase())
63
+ ) {
64
+ datasource.entities[key] = tables[key]
65
+ }
66
+ }
67
+ } else {
68
+ datasource.entities = tables
69
+ }
56
70
 
57
71
  const dbResp = await db.put(datasource)
58
72
  datasource._rev = dbResp.rev
@@ -114,7 +128,7 @@ exports.update = async function (ctx) {
114
128
 
115
129
  // Drain connection pools when configuration is changed
116
130
  if (datasource.source) {
117
- const source = integrations[datasource.source]
131
+ const source = await getIntegration(datasource.source)
118
132
  if (source && source.pool) {
119
133
  await source.pool.end()
120
134
  }
@@ -149,7 +163,7 @@ exports.save = async function (ctx) {
149
163
 
150
164
  // Drain connection pools when configuration is changed
151
165
  if (datasource.source) {
152
- const source = integrations[datasource.source]
166
+ const source = await getIntegration(datasource.source)
153
167
  if (source && source.pool) {
154
168
  await source.pool.end()
155
169
  }
@@ -218,15 +232,14 @@ function updateError(error, newError, tables) {
218
232
  }
219
233
 
220
234
  const buildSchemaHelper = async datasource => {
221
- const Connector = integrations[datasource.source]
235
+ const Connector = await getIntegration(datasource.source)
222
236
 
223
237
  // Connect to the DB and build the schema
224
238
  const connector = new Connector(datasource.config)
225
239
  await connector.buildSchema(datasource._id, datasource.entities)
226
- datasource.entities = connector.tables
227
240
 
228
241
  // make sure they all have a display name selected
229
- for (let entity of Object.values(datasource.entities)) {
242
+ for (let entity of Object.values(datasource.entities ?? {})) {
230
243
  if (entity.primaryDisplay) {
231
244
  continue
232
245
  }
@@ -206,12 +206,7 @@ const _deployApp = async function (ctx: any) {
206
206
 
207
207
  console.log("Deploying app...")
208
208
 
209
- let app
210
- if (await isFirstDeploy()) {
211
- app = await quotas.addPublishedApp(() => deployApp(deployment))
212
- } else {
213
- app = await deployApp(deployment)
214
- }
209
+ let app = await deployApp(deployment)
215
210
 
216
211
  await events.app.published(app)
217
212
  ctx.body = deployment
@@ -1,12 +1,11 @@
1
- const { cloneDeep } = require("lodash")
2
- const { definitions } = require("../../integrations")
1
+ const { getDefinitions } = require("../../integrations")
3
2
  const { SourceName } = require("@budibase/types")
4
3
  const googlesheets = require("../../integrations/googlesheets")
5
4
  const { featureFlags } = require("@budibase/backend-core")
6
5
 
7
6
  exports.fetch = async function (ctx) {
8
7
  ctx.status = 200
9
- const defs = cloneDeep(definitions)
8
+ const defs = await getDefinitions()
10
9
 
11
10
  // for google sheets integration google verification
12
11
  if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
@@ -17,6 +16,7 @@ exports.fetch = async function (ctx) {
17
16
  }
18
17
 
19
18
  exports.find = async function (ctx) {
19
+ const defs = await getDefinitions()
20
20
  ctx.status = 200
21
- ctx.body = definitions[ctx.params.type]
21
+ ctx.body = defs[ctx.params.type]
22
22
  }
@@ -0,0 +1,15 @@
1
+ import {
2
+ createTempFolder,
3
+ getPluginMetadata,
4
+ extractTarball,
5
+ } from "../../../utilities/fileSystem"
6
+
7
+ export async function fileUpload(file: { name: string; path: string }) {
8
+ if (!file.name.endsWith(".tar.gz")) {
9
+ throw new Error("Plugin must be compressed into a gzipped tarball.")
10
+ }
11
+ const path = createTempFolder(file.name.split(".tar.gz")[0])
12
+ await extractTarball(file.path, path)
13
+
14
+ return await getPluginMetadata(path)
15
+ }
@@ -0,0 +1,75 @@
1
+ import { getPluginMetadata } from "../../../utilities/fileSystem"
2
+ import fetch from "node-fetch"
3
+ import { downloadUnzipTarball } from "./utils"
4
+
5
+ export async function request(
6
+ url: string,
7
+ headers: { [key: string]: string },
8
+ err: string
9
+ ) {
10
+ const response = await fetch(url, { headers })
11
+ if (response.status >= 300) {
12
+ const respErr = await response.text()
13
+ throw new Error(`Error: ${err} - ${respErr}`)
14
+ }
15
+ return response.json()
16
+ }
17
+
18
+ export async function githubUpload(url: string, name = "", token = "") {
19
+ let githubUrl = url
20
+
21
+ if (!githubUrl.includes("https://github.com/")) {
22
+ throw new Error("The plugin origin must be from Github")
23
+ }
24
+
25
+ if (url.includes(".git")) {
26
+ githubUrl = url.replace(".git", "")
27
+ }
28
+
29
+ const githubApiUrl = githubUrl.replace(
30
+ "https://github.com/",
31
+ "https://api.github.com/repos/"
32
+ )
33
+ const headers: any = token ? { Authorization: `Bearer ${token}` } : {}
34
+ const pluginDetails = await request(
35
+ githubApiUrl,
36
+ headers,
37
+ "Repository not found"
38
+ )
39
+ const pluginName = pluginDetails.name || name
40
+ const pluginLatestReleaseUrl = pluginDetails?.["releases_url"]
41
+ ? pluginDetails?.["releases_url"].replace("{/id}", "/latest")
42
+ : undefined
43
+ if (!pluginLatestReleaseUrl) {
44
+ throw new Error("Github release not found")
45
+ }
46
+
47
+ const pluginReleaseDetails = await request(
48
+ pluginLatestReleaseUrl,
49
+ headers,
50
+ "Github latest release not found"
51
+ )
52
+ const pluginReleaseTarballAsset = pluginReleaseDetails?.assets?.find(
53
+ (x: any) => x?.["content_type"] === "application/gzip"
54
+ )
55
+ const pluginLastReleaseTarballUrl =
56
+ pluginReleaseTarballAsset?.["browser_download_url"]
57
+ if (!pluginLastReleaseTarballUrl) {
58
+ throw new Error("Github latest release url not found")
59
+ }
60
+
61
+ try {
62
+ const path = await downloadUnzipTarball(
63
+ pluginLastReleaseTarballUrl,
64
+ pluginName,
65
+ headers
66
+ )
67
+ return await getPluginMetadata(path)
68
+ } catch (err: any) {
69
+ let errMsg = err?.message || err
70
+ if (errMsg === "unexpected response Not Found") {
71
+ errMsg = "Github release tarball not found"
72
+ }
73
+ throw new Error(errMsg)
74
+ }
75
+ }