@budibase/server 1.3.19-alpha.2 → 1.3.19

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 (302) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.9ce4f8c5.css +6 -0
  3. package/builder/assets/index.a1f7532b.js +876 -0
  4. package/builder/assets/vendor.5e1fe644.css +1 -0
  5. package/builder/assets/vendor.67dbd8fa.js +248 -0
  6. package/builder/index.html +4 -2
  7. package/coverage/clover.xml +388 -446
  8. package/coverage/coverage-final.json +20 -20
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +8 -41
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +11 -68
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +34 -73
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +46 -46
  18. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  28. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +12 -207
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  47. package/coverage/lcov-report/api/index.html +1 -1
  48. package/coverage/lcov-report/api/index.js.html +13 -13
  49. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.html +1 -1
  60. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  71. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  74. package/coverage/lcov-report/api/routes/utils/validators.js.html +12 -75
  75. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  77. package/coverage/lcov-report/automations/actions.js.html +1 -1
  78. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  79. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  80. package/coverage/lcov-report/automations/index.html +1 -1
  81. package/coverage/lcov-report/automations/index.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/index.html +1 -1
  89. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  108. package/coverage/lcov-report/constants/index.html +1 -1
  109. package/coverage/lcov-report/constants/index.js.html +1 -1
  110. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  111. package/coverage/lcov-report/constants/screens.js.html +1 -1
  112. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  113. package/coverage/lcov-report/db/index.html +18 -18
  114. package/coverage/lcov-report/db/index.js.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  119. package/coverage/lcov-report/db/newid.js.html +2 -2
  120. package/coverage/lcov-report/db/utils.js.html +20 -56
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  122. package/coverage/lcov-report/events/index.html +1 -1
  123. package/coverage/lcov-report/events/index.js.html +1 -1
  124. package/coverage/lcov-report/events/utils.js.html +1 -1
  125. package/coverage/lcov-report/index.html +39 -39
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  127. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  128. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  129. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  130. package/coverage/lcov-report/middleware/currentapp.js.html +40 -46
  131. package/coverage/lcov-report/middleware/index.html +15 -15
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  133. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  134. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  135. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  136. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  137. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  138. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  139. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  140. package/coverage/lcov-report/utilities/global.js.html +16 -16
  141. package/coverage/lcov-report/utilities/index.html +1 -1
  142. package/coverage/lcov-report/utilities/index.js.html +24 -24
  143. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  144. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  145. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  146. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  148. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  151. package/coverage/lcov-report/utilities/security.js.html +2 -2
  152. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  154. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +1 -1
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  158. package/coverage/lcov.info +669 -790
  159. package/dist/api/controllers/application.js +5 -5
  160. package/dist/api/controllers/auth.js +0 -9
  161. package/dist/api/controllers/component.js +1 -14
  162. package/dist/api/controllers/datasource.js +8 -21
  163. package/dist/api/controllers/deploy/index.js +8 -1
  164. package/dist/api/controllers/integration.js +4 -4
  165. package/dist/api/controllers/row/external.js +1 -1
  166. package/dist/api/controllers/screen.js +2 -52
  167. package/dist/api/controllers/static/index.js +0 -1
  168. package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  169. package/dist/api/controllers/static/templates/preview.hbs +1 -5
  170. package/dist/api/index.js +1 -1
  171. package/dist/api/routes/application.js +2 -3
  172. package/dist/api/routes/index.js +0 -2
  173. package/dist/api/routes/public/tables.js +1 -1
  174. package/dist/api/routes/table.js +1 -1
  175. package/dist/api/routes/utils/validators.js +2 -20
  176. package/dist/app.js +0 -11
  177. package/dist/db/utils.js +1 -10
  178. package/dist/environment.js +0 -1
  179. package/dist/integrations/airtable.js +129 -126
  180. package/dist/integrations/arangodb.js +89 -86
  181. package/dist/integrations/base/query.js +2 -2
  182. package/dist/integrations/base/sqlTable.js +1 -3
  183. package/dist/integrations/couchdb.js +83 -80
  184. package/dist/integrations/dynamodb.js +164 -161
  185. package/dist/integrations/elasticsearch.js +138 -135
  186. package/dist/integrations/firebase.js +157 -154
  187. package/dist/integrations/googlesheets.js +327 -323
  188. package/dist/integrations/index.js +51 -99
  189. package/dist/integrations/microsoftSqlServer.js +243 -240
  190. package/dist/integrations/mongodb.js +242 -239
  191. package/dist/integrations/mysql.js +219 -215
  192. package/dist/integrations/oracle.js +322 -318
  193. package/dist/integrations/postgres.js +265 -262
  194. package/dist/integrations/redis.js +139 -134
  195. package/dist/integrations/rest.js +292 -289
  196. package/dist/integrations/s3.js +64 -61
  197. package/dist/integrations/snowflake.js +86 -83
  198. package/dist/middleware/currentapp.js +0 -2
  199. package/dist/migrations/functions/backfill/global.js +3 -0
  200. package/dist/migrations/functions/developerQuota.js +49 -0
  201. package/dist/{api/routes/plugin.js → migrations/functions/publishedAppsQuota.js} +21 -13
  202. package/dist/{api/controllers/plugin/url.js → migrations/functions/usageQuotas/syncDevelopers.js} +13 -13
  203. package/dist/{api/controllers/plugin/file.js → migrations/functions/usageQuotas/syncPublishedApps.js} +15 -13
  204. package/dist/migrations/index.js +10 -0
  205. package/dist/package.json +6 -9
  206. package/dist/tests/utilities/TestConfiguration.js +1 -1
  207. package/dist/threads/query.js +2 -2
  208. package/dist/tsconfig.build.tsbuildinfo +1 -1
  209. package/dist/utilities/fileSystem/index.js +1 -110
  210. package/package.json +7 -10
  211. package/scripts/dev/manage.js +0 -1
  212. package/scripts/localdomain.js +1 -3
  213. package/specs/openapi.json +3 -3
  214. package/specs/openapi.yaml +3 -3
  215. package/specs/resources/query.js +1 -1
  216. package/src/api/controllers/application.ts +2 -1
  217. package/src/api/controllers/auth.js +0 -11
  218. package/src/api/controllers/component.js +2 -21
  219. package/src/api/controllers/datasource.js +8 -21
  220. package/src/api/controllers/deploy/index.ts +6 -1
  221. package/src/api/controllers/integration.js +4 -4
  222. package/src/api/controllers/row/external.js +1 -1
  223. package/src/api/controllers/screen.js +1 -66
  224. package/src/api/controllers/static/index.ts +1 -1
  225. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  226. package/src/api/controllers/static/templates/preview.hbs +1 -5
  227. package/src/api/index.js +1 -1
  228. package/src/api/routes/application.ts +2 -13
  229. package/src/api/routes/index.ts +0 -2
  230. package/src/api/routes/public/tables.ts +1 -1
  231. package/src/api/routes/table.js +1 -1
  232. package/src/api/routes/tests/query.spec.js +25 -8
  233. package/src/api/routes/tests/user.spec.js +2 -0
  234. package/src/api/routes/utils/validators.js +5 -26
  235. package/src/app.ts +0 -14
  236. package/src/db/utils.js +0 -12
  237. package/src/definitions/openapi.ts +3 -3
  238. package/src/environment.js +0 -1
  239. package/src/integrations/airtable.ts +118 -116
  240. package/src/integrations/arangodb.ts +89 -87
  241. package/src/integrations/base/query.ts +2 -2
  242. package/src/integrations/base/sqlTable.ts +1 -3
  243. package/src/integrations/couchdb.ts +89 -83
  244. package/src/integrations/dynamodb.ts +175 -173
  245. package/src/integrations/elasticsearch.ts +122 -120
  246. package/src/integrations/firebase.ts +159 -157
  247. package/src/integrations/googlesheets.ts +338 -328
  248. package/src/integrations/index.ts +21 -64
  249. package/src/integrations/microsoftSqlServer.ts +251 -249
  250. package/src/integrations/mongodb.ts +258 -261
  251. package/src/integrations/mysql.ts +234 -229
  252. package/src/integrations/oracle.ts +380 -373
  253. package/src/integrations/postgres.ts +268 -264
  254. package/src/integrations/redis.ts +132 -128
  255. package/src/integrations/rest.ts +329 -324
  256. package/src/integrations/s3.ts +71 -68
  257. package/src/integrations/snowflake.ts +82 -80
  258. package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
  259. package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
  260. package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
  261. package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
  262. package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
  263. package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
  264. package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
  265. package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
  266. package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
  267. package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
  268. package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
  269. package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
  270. package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +14 -22
  271. package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
  272. package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
  273. package/src/middleware/currentapp.js +0 -2
  274. package/src/migrations/functions/backfill/global.ts +3 -0
  275. package/src/migrations/functions/developerQuota.ts +15 -0
  276. package/src/migrations/functions/publishedAppsQuota.ts +13 -0
  277. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
  278. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
  279. package/src/migrations/index.ts +16 -0
  280. package/src/module.d.ts +0 -2
  281. package/src/tests/utilities/TestConfiguration.js +1 -1
  282. package/src/threads/query.ts +2 -2
  283. package/src/utilities/fileSystem/index.js +0 -129
  284. package/builder/assets/index.8f621053.css +0 -6
  285. package/builder/assets/index.bd4753ac.js +0 -1005
  286. package/dist/api/controllers/plugin/github.js +0 -69
  287. package/dist/api/controllers/plugin/index.js +0 -200
  288. package/dist/api/controllers/plugin/npm.js +0 -58
  289. package/dist/api/controllers/plugin/uploaders.js +0 -11
  290. package/dist/api/controllers/plugin/utils.js +0 -26
  291. package/dist/watch.js +0 -77
  292. package/dist/websocket.js +0 -22
  293. package/src/api/controllers/plugin/file.ts +0 -15
  294. package/src/api/controllers/plugin/github.ts +0 -75
  295. package/src/api/controllers/plugin/index.ts +0 -215
  296. package/src/api/controllers/plugin/npm.ts +0 -56
  297. package/src/api/controllers/plugin/uploaders.ts +0 -4
  298. package/src/api/controllers/plugin/url.ts +0 -12
  299. package/src/api/controllers/plugin/utils.ts +0 -19
  300. package/src/api/routes/plugin.ts +0 -14
  301. package/src/watch.ts +0 -38
  302. package/src/websocket.ts +0 -26
@@ -15,316 +15,313 @@ import {
15
15
  CommonOptions,
16
16
  } from "mongodb"
17
17
 
18
- interface MongoDBConfig {
19
- connectionString: string
20
- db: string
21
- }
22
-
23
- interface MongoDBQuery {
24
- json: object | string
25
- extra: {
26
- [key: string]: string
18
+ module MongoDBModule {
19
+ interface MongoDBConfig {
20
+ connectionString: string
21
+ db: string
27
22
  }
28
- }
29
23
 
30
- const SCHEMA: Integration = {
31
- docs: "https://github.com/mongodb/node-mongodb-native",
32
- friendlyName: "MongoDB",
33
- type: "Non-relational",
34
- description:
35
- "MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
36
- datasource: {
37
- connectionString: {
38
- type: DatasourceFieldType.STRING,
39
- required: true,
40
- default: "mongodb://localhost:27017",
41
- },
42
- db: {
43
- type: DatasourceFieldType.STRING,
44
- required: true,
45
- },
46
- },
47
- query: {
48
- create: {
49
- type: QueryType.JSON,
50
- },
51
- read: {
52
- type: QueryType.JSON,
53
- },
54
- update: {
55
- type: QueryType.JSON,
56
- },
57
- delete: {
58
- type: QueryType.JSON,
24
+ const SCHEMA: Integration = {
25
+ docs: "https://github.com/mongodb/node-mongodb-native",
26
+ friendlyName: "MongoDB",
27
+ type: "Non-relational",
28
+ description:
29
+ "MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
30
+ datasource: {
31
+ connectionString: {
32
+ type: DatasourceFieldType.STRING,
33
+ required: true,
34
+ default: "mongodb://localhost:27017",
35
+ },
36
+ db: {
37
+ type: DatasourceFieldType.STRING,
38
+ required: true,
39
+ },
59
40
  },
60
- },
61
- extra: {
62
- collection: {
63
- displayName: "Collection",
64
- type: DatasourceFieldType.STRING,
65
- required: true,
41
+ query: {
42
+ create: {
43
+ type: QueryType.JSON,
44
+ },
45
+ read: {
46
+ type: QueryType.JSON,
47
+ },
48
+ update: {
49
+ type: QueryType.JSON,
50
+ },
51
+ delete: {
52
+ type: QueryType.JSON,
53
+ },
66
54
  },
67
- actionTypes: {
68
- displayName: "Action Types",
69
- type: DatasourceFieldType.LIST,
70
- required: true,
71
- data: {
72
- read: ["find", "findOne", "findOneAndUpdate", "count", "distinct"],
73
- create: ["insertOne", "insertMany"],
74
- update: ["updateOne", "updateMany"],
75
- delete: ["deleteOne", "deleteMany"],
55
+ extra: {
56
+ collection: {
57
+ displayName: "Collection",
58
+ type: DatasourceFieldType.STRING,
59
+ required: true,
60
+ },
61
+ actionTypes: {
62
+ displayName: "Action Types",
63
+ type: DatasourceFieldType.LIST,
64
+ required: true,
65
+ data: {
66
+ read: ["find", "findOne", "findOneAndUpdate", "count", "distinct"],
67
+ create: ["insertOne", "insertMany"],
68
+ update: ["updateOne", "updateMany"],
69
+ delete: ["deleteOne", "deleteMany"],
70
+ },
76
71
  },
77
72
  },
78
- },
79
- }
73
+ }
80
74
 
81
- class MongoIntegration implements IntegrationBase {
82
- private config: MongoDBConfig
83
- private client: any
75
+ class MongoIntegration implements IntegrationBase {
76
+ private config: MongoDBConfig
77
+ private client: any
84
78
 
85
- constructor(config: MongoDBConfig) {
86
- this.config = config
87
- this.client = new MongoClient(config.connectionString)
88
- }
79
+ constructor(config: MongoDBConfig) {
80
+ this.config = config
81
+ this.client = new MongoClient(config.connectionString)
82
+ }
89
83
 
90
- async connect() {
91
- return this.client.connect()
92
- }
84
+ async connect() {
85
+ return this.client.connect()
86
+ }
93
87
 
94
- createObjectIds(json: any): object {
95
- const self = this
96
- function interpolateObjectIds(json: any) {
97
- for (let field of Object.keys(json)) {
98
- if (json[field] instanceof Object) {
99
- json[field] = self.createObjectIds(json[field])
100
- }
101
- if (
102
- typeof json[field] === "string" &&
103
- json[field].toLowerCase().startsWith("objectid")
104
- ) {
105
- const id = json[field].match(/(?<=objectid\(['"]).*(?=['"]\))/gi)?.[0]
106
- if (id) {
107
- json[field] = ObjectID.createFromHexString(id)
88
+ createObjectIds(json: any): object {
89
+ const self = this
90
+ function interpolateObjectIds(json: any) {
91
+ for (let field of Object.keys(json)) {
92
+ if (json[field] instanceof Object) {
93
+ json[field] = self.createObjectIds(json[field])
94
+ }
95
+ if (
96
+ typeof json[field] === "string" &&
97
+ json[field].toLowerCase().startsWith("objectid")
98
+ ) {
99
+ const id = json[field].match(
100
+ /(?<=objectid\(['"]).*(?=['"]\))/gi
101
+ )?.[0]
102
+ if (id) {
103
+ json[field] = ObjectID.createFromHexString(id)
104
+ }
108
105
  }
109
106
  }
107
+ return json
110
108
  }
111
- return json
112
- }
113
109
 
114
- if (Array.isArray(json)) {
115
- for (let i = 0; i < json.length; i++) {
116
- json[i] = interpolateObjectIds(json[i])
110
+ if (Array.isArray(json)) {
111
+ for (let i = 0; i < json.length; i++) {
112
+ json[i] = interpolateObjectIds(json[i])
113
+ }
114
+ return json
117
115
  }
118
- return json
116
+ return interpolateObjectIds(json)
119
117
  }
120
- return interpolateObjectIds(json)
121
- }
122
118
 
123
- parseQueryParams(params: string, mode: string) {
124
- let queryParams = []
125
- let openCount = 0
126
- let inQuotes = false
127
- let i = 0
128
- let startIndex = 0
129
- for (let c of params) {
130
- if (c === '"' && i > 0 && params[i - 1] !== "\\") {
131
- inQuotes = !inQuotes
132
- }
133
- if (c === "{" && !inQuotes) {
134
- openCount++
135
- if (openCount === 1) {
136
- startIndex = i
119
+ parseQueryParams(params: string, mode: string) {
120
+ let queryParams = []
121
+ let openCount = 0
122
+ let inQuotes = false
123
+ let i = 0
124
+ let startIndex = 0
125
+ for (let c of params) {
126
+ if (c === '"' && i > 0 && params[i - 1] !== "\\") {
127
+ inQuotes = !inQuotes
137
128
  }
138
- } else if (c === "}" && !inQuotes) {
139
- if (openCount === 1) {
140
- queryParams.push(JSON.parse(params.substring(startIndex, i + 1)))
129
+ if (c === "{" && !inQuotes) {
130
+ openCount++
131
+ if (openCount === 1) {
132
+ startIndex = i
133
+ }
134
+ } else if (c === "}" && !inQuotes) {
135
+ if (openCount === 1) {
136
+ queryParams.push(JSON.parse(params.substring(startIndex, i + 1)))
137
+ }
138
+ openCount--
139
+ }
140
+ i++
141
+ }
142
+ let group1 = queryParams[0] ?? {}
143
+ let group2 = queryParams[1] ?? {}
144
+ let group3 = queryParams[2] ?? {}
145
+ if (mode === "update") {
146
+ return {
147
+ filter: group1,
148
+ update: group2,
149
+ options: group3,
141
150
  }
142
- openCount--
143
151
  }
144
- i++
145
- }
146
- let group1 = queryParams[0] ?? {}
147
- let group2 = queryParams[1] ?? {}
148
- let group3 = queryParams[2] ?? {}
149
- if (mode === "update") {
150
152
  return {
151
153
  filter: group1,
152
- update: group2,
153
- options: group3,
154
+ options: group2,
154
155
  }
155
156
  }
156
- return {
157
- filter: group1,
158
- options: group2,
159
- }
160
- }
161
157
 
162
- async create(query: MongoDBQuery) {
163
- try {
164
- await this.connect()
165
- const db = this.client.db(this.config.db)
166
- const collection = db.collection(query.extra.collection)
167
- let json = this.createObjectIds(query.json)
158
+ async create(query: { json: object; extra: { [key: string]: string } }) {
159
+ try {
160
+ await this.connect()
161
+ const db = this.client.db(this.config.db)
162
+ const collection = db.collection(query.extra.collection)
163
+ let json = this.createObjectIds(query.json)
168
164
 
169
- // For mongodb we add an extra actionType to specify
170
- // which method we want to call on the collection
171
- switch (query.extra.actionTypes) {
172
- case "insertOne": {
173
- return await collection.insertOne(json)
174
- }
175
- case "insertMany": {
176
- return await collection.insertMany(json)
177
- }
178
- default: {
179
- throw new Error(
180
- `actionType ${query.extra.actionTypes} does not exist on DB for create`
181
- )
165
+ // For mongodb we add an extra actionType to specify
166
+ // which method we want to call on the collection
167
+ switch (query.extra.actionTypes) {
168
+ case "insertOne": {
169
+ return await collection.insertOne(json)
170
+ }
171
+ case "insertMany": {
172
+ return await collection.insertMany(json)
173
+ }
174
+ default: {
175
+ throw new Error(
176
+ `actionType ${query.extra.actionTypes} does not exist on DB for create`
177
+ )
178
+ }
182
179
  }
180
+ } catch (err) {
181
+ console.error("Error writing to mongodb", err)
182
+ throw err
183
+ } finally {
184
+ await this.client.close()
183
185
  }
184
- } catch (err) {
185
- console.error("Error writing to mongodb", err)
186
- throw err
187
- } finally {
188
- await this.client.close()
189
186
  }
190
- }
191
187
 
192
- async read(query: MongoDBQuery) {
193
- try {
194
- await this.connect()
195
- const db = this.client.db(this.config.db)
196
- const collection = db.collection(query.extra.collection)
197
- let json = this.createObjectIds(query.json)
188
+ async read(query: { json: object; extra: { [key: string]: string } }) {
189
+ try {
190
+ await this.connect()
191
+ const db = this.client.db(this.config.db)
192
+ const collection = db.collection(query.extra.collection)
193
+ let json = this.createObjectIds(query.json)
198
194
 
199
- switch (query.extra.actionTypes) {
200
- case "find": {
201
- return await collection.find(json).toArray()
202
- }
203
- case "findOne": {
204
- return await collection.findOne(json)
205
- }
206
- case "findOneAndUpdate": {
207
- if (typeof query.json === "string") {
208
- json = this.parseQueryParams(query.json, "update")
195
+ switch (query.extra.actionTypes) {
196
+ case "find": {
197
+ return await collection.find(json).toArray()
209
198
  }
210
- let findAndUpdateJson = this.createObjectIds(json) as {
211
- filter: FilterQuery<any>
212
- update: UpdateQuery<any>
213
- options: FindOneAndUpdateOption<any>
199
+ case "findOne": {
200
+ return await collection.findOne(json)
201
+ }
202
+ case "findOneAndUpdate": {
203
+ if (typeof query.json === "string") {
204
+ json = this.parseQueryParams(query.json, "update")
205
+ }
206
+ let findAndUpdateJson = this.createObjectIds(json) as {
207
+ filter: FilterQuery<any>
208
+ update: UpdateQuery<any>
209
+ options: FindOneAndUpdateOption<any>
210
+ }
211
+ return await collection.findOneAndUpdate(
212
+ findAndUpdateJson.filter,
213
+ findAndUpdateJson.update,
214
+ findAndUpdateJson.options
215
+ )
216
+ }
217
+ case "count": {
218
+ return await collection.countDocuments(json)
219
+ }
220
+ case "distinct": {
221
+ return await collection.distinct(json)
222
+ }
223
+ default: {
224
+ throw new Error(
225
+ `actionType ${query.extra.actionTypes} does not exist on DB for read`
226
+ )
214
227
  }
215
- return await collection.findOneAndUpdate(
216
- findAndUpdateJson.filter,
217
- findAndUpdateJson.update,
218
- findAndUpdateJson.options
219
- )
220
- }
221
- case "count": {
222
- return await collection.countDocuments(json)
223
- }
224
- case "distinct": {
225
- return await collection.distinct(json)
226
- }
227
- default: {
228
- throw new Error(
229
- `actionType ${query.extra.actionTypes} does not exist on DB for read`
230
- )
231
228
  }
229
+ } catch (err) {
230
+ console.error("Error querying mongodb", err)
231
+ throw err
232
+ } finally {
233
+ await this.client.close()
232
234
  }
233
- } catch (err) {
234
- console.error("Error querying mongodb", err)
235
- throw err
236
- } finally {
237
- await this.client.close()
238
235
  }
239
- }
240
-
241
- async update(query: MongoDBQuery) {
242
- try {
243
- await this.connect()
244
- const db = this.client.db(this.config.db)
245
- const collection = db.collection(query.extra.collection)
246
- let queryJson = query.json
247
- if (typeof queryJson === "string") {
248
- queryJson = this.parseQueryParams(queryJson, "update")
249
- }
250
- let json = this.createObjectIds(queryJson) as {
251
- filter: FilterQuery<any>
252
- update: UpdateQuery<any>
253
- options: object
254
- }
255
236
 
256
- switch (query.extra.actionTypes) {
257
- case "updateOne": {
258
- return await collection.updateOne(
259
- json.filter,
260
- json.update,
261
- json.options as UpdateOneOptions
262
- )
237
+ async update(query: { json: object; extra: { [key: string]: string } }) {
238
+ try {
239
+ await this.connect()
240
+ const db = this.client.db(this.config.db)
241
+ const collection = db.collection(query.extra.collection)
242
+ let queryJson = query.json
243
+ if (typeof queryJson === "string") {
244
+ queryJson = this.parseQueryParams(queryJson, "update")
263
245
  }
264
- case "updateMany": {
265
- return await collection.updateMany(
266
- json.filter,
267
- json.update,
268
- json.options as UpdateManyOptions
269
- )
246
+ let json = this.createObjectIds(queryJson) as {
247
+ filter: FilterQuery<any>
248
+ update: UpdateQuery<any>
249
+ options: object
270
250
  }
271
- default: {
272
- throw new Error(
273
- `actionType ${query.extra.actionTypes} does not exist on DB for update`
274
- )
251
+
252
+ switch (query.extra.actionTypes) {
253
+ case "updateOne": {
254
+ return await collection.updateOne(
255
+ json.filter,
256
+ json.update,
257
+ json.options as UpdateOneOptions
258
+ )
259
+ }
260
+ case "updateMany": {
261
+ return await collection.updateMany(
262
+ json.filter,
263
+ json.update,
264
+ json.options as UpdateManyOptions
265
+ )
266
+ }
267
+ default: {
268
+ throw new Error(
269
+ `actionType ${query.extra.actionTypes} does not exist on DB for update`
270
+ )
271
+ }
275
272
  }
273
+ } catch (err) {
274
+ console.error("Error writing to mongodb", err)
275
+ throw err
276
+ } finally {
277
+ await this.client.close()
276
278
  }
277
- } catch (err) {
278
- console.error("Error writing to mongodb", err)
279
- throw err
280
- } finally {
281
- await this.client.close()
282
279
  }
283
- }
284
280
 
285
- async delete(query: MongoDBQuery) {
286
- try {
287
- await this.connect()
288
- const db = this.client.db(this.config.db)
289
- const collection = db.collection(query.extra.collection)
290
- let queryJson = query.json
291
- if (typeof queryJson === "string") {
292
- queryJson = this.parseQueryParams(queryJson, "delete")
293
- }
294
- let json = this.createObjectIds(queryJson) as {
295
- filter: FilterQuery<any>
296
- options: CommonOptions
297
- }
298
- if (!json.options) {
299
- json = {
300
- filter: json,
301
- options: {},
281
+ async delete(query: { json: object; extra: { [key: string]: string } }) {
282
+ try {
283
+ await this.connect()
284
+ const db = this.client.db(this.config.db)
285
+ const collection = db.collection(query.extra.collection)
286
+ let queryJson = query.json
287
+ if (typeof queryJson === "string") {
288
+ queryJson = this.parseQueryParams(queryJson, "delete")
302
289
  }
303
- }
304
-
305
- switch (query.extra.actionTypes) {
306
- case "deleteOne": {
307
- return await collection.deleteOne(json.filter, json.options)
290
+ let json = this.createObjectIds(queryJson) as {
291
+ filter: FilterQuery<any>
292
+ options: CommonOptions
308
293
  }
309
- case "deleteMany": {
310
- return await collection.deleteMany(json.filter, json.options)
294
+ if (!json.options) {
295
+ json = {
296
+ filter: json,
297
+ options: {},
298
+ }
311
299
  }
312
- default: {
313
- throw new Error(
314
- `actionType ${query.extra.actionTypes} does not exist on DB for delete`
315
- )
300
+
301
+ switch (query.extra.actionTypes) {
302
+ case "deleteOne": {
303
+ return await collection.deleteOne(json.filter, json.options)
304
+ }
305
+ case "deleteMany": {
306
+ return await collection.deleteMany(json.filter, json.options)
307
+ }
308
+ default: {
309
+ throw new Error(
310
+ `actionType ${query.extra.actionTypes} does not exist on DB for delete`
311
+ )
312
+ }
316
313
  }
314
+ } catch (err) {
315
+ console.error("Error writing to mongodb", err)
316
+ throw err
317
+ } finally {
318
+ await this.client.close()
317
319
  }
318
- } catch (err) {
319
- console.error("Error writing to mongodb", err)
320
- throw err
321
- } finally {
322
- await this.client.close()
323
320
  }
324
321
  }
325
- }
326
322
 
327
- export default {
328
- schema: SCHEMA,
329
- integration: MongoIntegration,
323
+ module.exports = {
324
+ schema: SCHEMA,
325
+ integration: MongoIntegration,
326
+ }
330
327
  }