@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
@@ -15,6 +15,11 @@ import {
15
15
  } from "../definitions/datasource"
16
16
  import { get } from "lodash"
17
17
  import qs from "querystring"
18
+ const fetch = require("node-fetch")
19
+ const { formatBytes } = require("../utilities")
20
+ const { performance } = require("perf_hooks")
21
+ const FormData = require("form-data")
22
+ const { URLSearchParams } = require("url")
18
23
 
19
24
  const BodyTypes = {
20
25
  NONE: "none",
@@ -51,375 +56,365 @@ const coreFields = {
51
56
  },
52
57
  }
53
58
 
54
- module RestModule {
55
- const fetch = require("node-fetch")
56
- const { formatBytes } = require("../utilities")
57
- const { performance } = require("perf_hooks")
58
- const FormData = require("form-data")
59
- const { URLSearchParams } = require("url")
60
- const {
61
- parseStringPromise: xmlParser,
62
- Builder: XmlBuilder,
63
- } = require("xml2js")
64
-
65
- const SCHEMA: Integration = {
66
- docs: "https://github.com/node-fetch/node-fetch",
67
- description:
68
- "With the REST API datasource, you can connect, query and pull data from multiple REST APIs. You can then use the retrieved data to build apps.",
69
- friendlyName: "REST API",
70
- type: "API",
71
- datasource: {
72
- url: {
73
- type: DatasourceFieldType.STRING,
74
- default: "",
75
- required: false,
76
- deprecated: true,
77
- },
78
- defaultHeaders: {
79
- type: DatasourceFieldType.OBJECT,
80
- required: false,
81
- default: {},
82
- },
83
- legacyHttpParser: {
84
- display: "Legacy HTTP Support",
85
- type: DatasourceFieldType.BOOLEAN,
86
- required: false,
87
- default: false,
88
- },
59
+ const { parseStringPromise: xmlParser, Builder: XmlBuilder } = require("xml2js")
60
+
61
+ const SCHEMA: Integration = {
62
+ docs: "https://github.com/node-fetch/node-fetch",
63
+ description:
64
+ "With the REST API datasource, you can connect, query and pull data from multiple REST APIs. You can then use the retrieved data to build apps.",
65
+ friendlyName: "REST API",
66
+ type: "API",
67
+ datasource: {
68
+ url: {
69
+ type: DatasourceFieldType.STRING,
70
+ default: "",
71
+ required: false,
72
+ deprecated: true,
89
73
  },
90
- query: {
91
- create: {
92
- readable: true,
93
- displayName: "POST",
94
- type: QueryType.FIELDS,
95
- fields: coreFields,
96
- },
97
- read: {
98
- displayName: "GET",
99
- readable: true,
100
- type: QueryType.FIELDS,
101
- fields: coreFields,
102
- },
103
- update: {
104
- displayName: "PUT",
105
- readable: true,
106
- type: QueryType.FIELDS,
107
- fields: coreFields,
108
- },
109
- patch: {
110
- displayName: "PATCH",
111
- readable: true,
112
- type: QueryType.FIELDS,
113
- fields: coreFields,
114
- },
115
- delete: {
116
- displayName: "DELETE",
117
- type: QueryType.FIELDS,
118
- fields: coreFields,
119
- },
74
+ defaultHeaders: {
75
+ type: DatasourceFieldType.OBJECT,
76
+ required: false,
77
+ default: {},
120
78
  },
121
- }
79
+ legacyHttpParser: {
80
+ display: "Legacy HTTP Support",
81
+ type: DatasourceFieldType.BOOLEAN,
82
+ required: false,
83
+ default: false,
84
+ },
85
+ },
86
+ query: {
87
+ create: {
88
+ readable: true,
89
+ displayName: "POST",
90
+ type: QueryType.FIELDS,
91
+ fields: coreFields,
92
+ },
93
+ read: {
94
+ displayName: "GET",
95
+ readable: true,
96
+ type: QueryType.FIELDS,
97
+ fields: coreFields,
98
+ },
99
+ update: {
100
+ displayName: "PUT",
101
+ readable: true,
102
+ type: QueryType.FIELDS,
103
+ fields: coreFields,
104
+ },
105
+ patch: {
106
+ displayName: "PATCH",
107
+ readable: true,
108
+ type: QueryType.FIELDS,
109
+ fields: coreFields,
110
+ },
111
+ delete: {
112
+ displayName: "DELETE",
113
+ type: QueryType.FIELDS,
114
+ fields: coreFields,
115
+ },
116
+ },
117
+ }
122
118
 
123
- class RestIntegration implements IntegrationBase {
124
- private config: RestConfig
125
- private headers: {
126
- [key: string]: string
127
- } = {}
128
- private startTimeMs: number = performance.now()
119
+ class RestIntegration implements IntegrationBase {
120
+ private config: RestConfig
121
+ private headers: {
122
+ [key: string]: string
123
+ } = {}
124
+ private startTimeMs: number = performance.now()
129
125
 
130
- constructor(config: RestConfig) {
131
- this.config = config
132
- }
126
+ constructor(config: RestConfig) {
127
+ this.config = config
128
+ }
133
129
 
134
- async parseResponse(response: any, pagination: PaginationConfig | null) {
135
- let data, raw, headers
136
- const contentType = response.headers.get("content-type") || ""
137
- try {
138
- if (contentType.includes("application/json")) {
139
- data = await response.json()
140
- raw = JSON.stringify(data)
141
- } else if (
142
- contentType.includes("text/xml") ||
143
- contentType.includes("application/xml")
144
- ) {
145
- const rawXml = await response.text()
146
- data =
147
- (await xmlParser(rawXml, {
148
- explicitArray: false,
149
- trim: true,
150
- explicitRoot: false,
151
- })) || {}
152
- // there is only one structure, its an array, return the array so it appears as rows
153
- const keys = Object.keys(data)
154
- if (keys.length === 1 && Array.isArray(data[keys[0]])) {
155
- data = data[keys[0]]
156
- }
157
- raw = rawXml
158
- } else {
159
- data = await response.text()
160
- raw = data
130
+ async parseResponse(response: any, pagination: PaginationConfig | null) {
131
+ let data, raw, headers
132
+ const contentType = response.headers.get("content-type") || ""
133
+ try {
134
+ if (contentType.includes("application/json")) {
135
+ data = await response.json()
136
+ raw = JSON.stringify(data)
137
+ } else if (
138
+ contentType.includes("text/xml") ||
139
+ contentType.includes("application/xml")
140
+ ) {
141
+ const rawXml = await response.text()
142
+ data =
143
+ (await xmlParser(rawXml, {
144
+ explicitArray: false,
145
+ trim: true,
146
+ explicitRoot: false,
147
+ })) || {}
148
+ // there is only one structure, its an array, return the array so it appears as rows
149
+ const keys = Object.keys(data)
150
+ if (keys.length === 1 && Array.isArray(data[keys[0]])) {
151
+ data = data[keys[0]]
161
152
  }
162
- } catch (err) {
163
- throw "Failed to parse response body."
153
+ raw = rawXml
154
+ } else {
155
+ data = await response.text()
156
+ raw = data
164
157
  }
165
- const size = formatBytes(
166
- response.headers.get("content-length") || Buffer.byteLength(raw, "utf8")
167
- )
168
- const time = `${Math.round(performance.now() - this.startTimeMs)}ms`
169
- headers = response.headers.raw()
170
- for (let [key, value] of Object.entries(headers)) {
171
- headers[key] = Array.isArray(value) ? value[0] : value
158
+ } catch (err) {
159
+ throw "Failed to parse response body."
160
+ }
161
+ const size = formatBytes(
162
+ response.headers.get("content-length") || Buffer.byteLength(raw, "utf8")
163
+ )
164
+ const time = `${Math.round(performance.now() - this.startTimeMs)}ms`
165
+ headers = response.headers.raw()
166
+ for (let [key, value] of Object.entries(headers)) {
167
+ headers[key] = Array.isArray(value) ? value[0] : value
168
+ }
169
+
170
+ // Check if a pagination cursor exists in the response
171
+ let nextCursor = null
172
+ if (pagination?.responseParam) {
173
+ nextCursor = get(data, pagination.responseParam)
174
+ }
175
+
176
+ return {
177
+ data,
178
+ info: {
179
+ code: response.status,
180
+ size,
181
+ time,
182
+ },
183
+ extra: {
184
+ raw,
185
+ headers,
186
+ },
187
+ pagination: {
188
+ cursor: nextCursor,
189
+ },
190
+ }
191
+ }
192
+
193
+ getUrl(
194
+ path: string,
195
+ queryString: string,
196
+ pagination: PaginationConfig | null,
197
+ paginationValues: PaginationValues | null
198
+ ): string {
199
+ // Add pagination params to query string if required
200
+ if (pagination?.location === "query" && paginationValues) {
201
+ const { pageParam, sizeParam } = pagination
202
+ const params = new URLSearchParams()
203
+
204
+ // Append page number or cursor param if configured
205
+ if (pageParam && paginationValues.page != null) {
206
+ params.append(pageParam, paginationValues.page)
172
207
  }
173
208
 
174
- // Check if a pagination cursor exists in the response
175
- let nextCursor = null
176
- if (pagination?.responseParam) {
177
- nextCursor = get(data, pagination.responseParam)
209
+ // Append page size param if configured
210
+ if (sizeParam && paginationValues.limit != null) {
211
+ params.append(sizeParam, paginationValues.limit)
178
212
  }
179
213
 
180
- return {
181
- data,
182
- info: {
183
- code: response.status,
184
- size,
185
- time,
186
- },
187
- extra: {
188
- raw,
189
- headers,
190
- },
191
- pagination: {
192
- cursor: nextCursor,
193
- },
214
+ // Prepend query string with pagination params
215
+ let paginationString = params.toString()
216
+ if (paginationString) {
217
+ queryString = `${paginationString}&${queryString}`
194
218
  }
195
219
  }
196
220
 
197
- getUrl(
198
- path: string,
199
- queryString: string,
200
- pagination: PaginationConfig | null,
201
- paginationValues: PaginationValues | null
202
- ): string {
203
- // Add pagination params to query string if required
204
- if (pagination?.location === "query" && paginationValues) {
205
- const { pageParam, sizeParam } = pagination
206
- const params = new URLSearchParams()
221
+ // make sure the query string is fully encoded
222
+ const main = `${path}?${qs.encode(qs.decode(queryString))}`
223
+ let complete = main
224
+ if (this.config.url && !main.startsWith("http")) {
225
+ complete = !this.config.url ? main : `${this.config.url}/${main}`
226
+ }
227
+ if (!complete.startsWith("http")) {
228
+ complete = `http://${complete}`
229
+ }
230
+ return complete
231
+ }
207
232
 
208
- // Append page number or cursor param if configured
209
- if (pageParam && paginationValues.page != null) {
210
- params.append(pageParam, paginationValues.page)
211
- }
233
+ addBody(
234
+ bodyType: string,
235
+ body: string | any,
236
+ input: any,
237
+ pagination: PaginationConfig | null,
238
+ paginationValues: PaginationValues | null
239
+ ) {
240
+ if (!input.headers) {
241
+ input.headers = {}
242
+ }
243
+ if (bodyType === BodyTypes.NONE) {
244
+ return input
245
+ }
246
+ let error,
247
+ object: any = {},
248
+ string = ""
249
+ try {
250
+ if (body) {
251
+ string = typeof body !== "string" ? JSON.stringify(body) : body
252
+ object = typeof body === "object" ? body : JSON.parse(body)
253
+ }
254
+ } catch (err) {
255
+ error = err
256
+ }
212
257
 
213
- // Append page size param if configured
214
- if (sizeParam && paginationValues.limit != null) {
215
- params.append(sizeParam, paginationValues.limit)
258
+ // Util to add pagination values to a certain body type
259
+ const addPaginationToBody = (insertFn: Function) => {
260
+ if (pagination?.location === "body") {
261
+ if (pagination?.pageParam && paginationValues?.page != null) {
262
+ insertFn(pagination.pageParam, paginationValues.page)
216
263
  }
217
-
218
- // Prepend query string with pagination params
219
- let paginationString = params.toString()
220
- if (paginationString) {
221
- queryString = `${paginationString}&${queryString}`
264
+ if (pagination?.sizeParam && paginationValues?.limit != null) {
265
+ insertFn(pagination.sizeParam, paginationValues.limit)
222
266
  }
223
267
  }
224
-
225
- // make sure the query string is fully encoded
226
- const main = `${path}?${qs.encode(qs.decode(queryString))}`
227
- let complete = main
228
- if (this.config.url && !main.startsWith("http")) {
229
- complete = !this.config.url ? main : `${this.config.url}/${main}`
230
- }
231
- if (!complete.startsWith("http")) {
232
- complete = `http://${complete}`
233
- }
234
- return complete
235
268
  }
236
269
 
237
- addBody(
238
- bodyType: string,
239
- body: string | any,
240
- input: any,
241
- pagination: PaginationConfig | null,
242
- paginationValues: PaginationValues | null
243
- ) {
244
- if (!input.headers) {
245
- input.headers = {}
246
- }
247
- if (bodyType === BodyTypes.NONE) {
248
- return input
249
- }
250
- let error,
251
- object: any = {},
252
- string = ""
253
- try {
254
- if (body) {
255
- string = typeof body !== "string" ? JSON.stringify(body) : body
256
- object = typeof body === "object" ? body : JSON.parse(body)
270
+ switch (bodyType) {
271
+ case BodyTypes.TEXT:
272
+ // content type defaults to plaintext
273
+ input.body = string
274
+ break
275
+ case BodyTypes.ENCODED:
276
+ const params = new URLSearchParams()
277
+ for (let [key, value] of Object.entries(object)) {
278
+ params.append(key, value)
257
279
  }
258
- } catch (err) {
259
- error = err
260
- }
261
-
262
- // Util to add pagination values to a certain body type
263
- const addPaginationToBody = (insertFn: Function) => {
264
- if (pagination?.location === "body") {
265
- if (pagination?.pageParam && paginationValues?.page != null) {
266
- insertFn(pagination.pageParam, paginationValues.page)
267
- }
268
- if (pagination?.sizeParam && paginationValues?.limit != null) {
269
- insertFn(pagination.sizeParam, paginationValues.limit)
270
- }
280
+ addPaginationToBody((key: string, value: any) => {
281
+ params.append(key, value)
282
+ })
283
+ input.body = params
284
+ break
285
+ case BodyTypes.FORM_DATA:
286
+ const form = new FormData()
287
+ for (let [key, value] of Object.entries(object)) {
288
+ form.append(key, value)
271
289
  }
272
- }
273
-
274
- switch (bodyType) {
275
- case BodyTypes.TEXT:
276
- // content type defaults to plaintext
277
- input.body = string
278
- break
279
- case BodyTypes.ENCODED:
280
- const params = new URLSearchParams()
281
- for (let [key, value] of Object.entries(object)) {
282
- params.append(key, value)
283
- }
284
- addPaginationToBody((key: string, value: any) => {
285
- params.append(key, value)
286
- })
287
- input.body = params
288
- break
289
- case BodyTypes.FORM_DATA:
290
- const form = new FormData()
291
- for (let [key, value] of Object.entries(object)) {
292
- form.append(key, value)
293
- }
294
- addPaginationToBody((key: string, value: any) => {
295
- form.append(key, value)
296
- })
297
- input.body = form
298
- break
299
- case BodyTypes.XML:
300
- if (object != null && Object.keys(object).length) {
301
- string = new XmlBuilder().buildObject(object)
302
- }
303
- input.body = string
304
- input.headers["Content-Type"] = "application/xml"
305
- break
306
- case BodyTypes.JSON:
307
- // if JSON error, throw it
308
- if (error) {
309
- throw "Invalid JSON for request body"
310
- }
311
- addPaginationToBody((key: string, value: any) => {
312
- object[key] = value
313
- })
314
- input.body = JSON.stringify(object)
315
- input.headers["Content-Type"] = "application/json"
316
- break
317
- }
318
- return input
290
+ addPaginationToBody((key: string, value: any) => {
291
+ form.append(key, value)
292
+ })
293
+ input.body = form
294
+ break
295
+ case BodyTypes.XML:
296
+ if (object != null && Object.keys(object).length) {
297
+ string = new XmlBuilder().buildObject(object)
298
+ }
299
+ input.body = string
300
+ input.headers["Content-Type"] = "application/xml"
301
+ break
302
+ case BodyTypes.JSON:
303
+ // if JSON error, throw it
304
+ if (error) {
305
+ throw "Invalid JSON for request body"
306
+ }
307
+ addPaginationToBody((key: string, value: any) => {
308
+ object[key] = value
309
+ })
310
+ input.body = JSON.stringify(object)
311
+ input.headers["Content-Type"] = "application/json"
312
+ break
319
313
  }
314
+ return input
315
+ }
320
316
 
321
- getAuthHeaders(authConfigId: string): { [key: string]: any } {
322
- let headers: any = {}
323
-
324
- if (this.config.authConfigs && authConfigId) {
325
- const authConfig = this.config.authConfigs.filter(
326
- c => c._id === authConfigId
327
- )[0]
328
- // check the config still exists before proceeding
329
- // if not - do nothing
330
- if (authConfig) {
331
- let config
332
- switch (authConfig.type) {
333
- case AuthType.BASIC:
334
- config = authConfig.config as BasicAuthConfig
335
- headers.Authorization = `Basic ${Buffer.from(
336
- `${config.username}:${config.password}`
337
- ).toString("base64")}`
338
- break
339
- case AuthType.BEARER:
340
- config = authConfig.config as BearerAuthConfig
341
- headers.Authorization = `Bearer ${config.token}`
342
- break
343
- }
317
+ getAuthHeaders(authConfigId: string): { [key: string]: any } {
318
+ let headers: any = {}
319
+
320
+ if (this.config.authConfigs && authConfigId) {
321
+ const authConfig = this.config.authConfigs.filter(
322
+ c => c._id === authConfigId
323
+ )[0]
324
+ // check the config still exists before proceeding
325
+ // if not - do nothing
326
+ if (authConfig) {
327
+ let config
328
+ switch (authConfig.type) {
329
+ case AuthType.BASIC:
330
+ config = authConfig.config as BasicAuthConfig
331
+ headers.Authorization = `Basic ${Buffer.from(
332
+ `${config.username}:${config.password}`
333
+ ).toString("base64")}`
334
+ break
335
+ case AuthType.BEARER:
336
+ config = authConfig.config as BearerAuthConfig
337
+ headers.Authorization = `Bearer ${config.token}`
338
+ break
344
339
  }
345
340
  }
346
-
347
- return headers
348
341
  }
349
342
 
350
- async _req(query: RestQuery) {
351
- const {
352
- path = "",
353
- queryString = "",
354
- headers = {},
355
- method = "GET",
356
- disabledHeaders,
357
- bodyType,
358
- requestBody,
359
- authConfigId,
360
- pagination,
361
- paginationValues,
362
- } = query
363
- const authHeaders = this.getAuthHeaders(authConfigId)
364
-
365
- this.headers = {
366
- ...this.config.defaultHeaders,
367
- ...headers,
368
- ...authHeaders,
369
- }
343
+ return headers
344
+ }
370
345
 
371
- if (disabledHeaders) {
372
- for (let headerKey of Object.keys(this.headers)) {
373
- if (disabledHeaders[headerKey]) {
374
- delete this.headers[headerKey]
375
- }
376
- }
377
- }
346
+ async _req(query: RestQuery) {
347
+ const {
348
+ path = "",
349
+ queryString = "",
350
+ headers = {},
351
+ method = "GET",
352
+ disabledHeaders,
353
+ bodyType,
354
+ requestBody,
355
+ authConfigId,
356
+ pagination,
357
+ paginationValues,
358
+ } = query
359
+ const authHeaders = this.getAuthHeaders(authConfigId)
360
+
361
+ this.headers = {
362
+ ...this.config.defaultHeaders,
363
+ ...headers,
364
+ ...authHeaders,
365
+ }
378
366
 
379
- let input: any = { method, headers: this.headers }
380
- input = this.addBody(
381
- bodyType,
382
- requestBody,
383
- input,
384
- pagination,
385
- paginationValues
386
- )
387
-
388
- if (this.config.legacyHttpParser) {
389
- // https://github.com/nodejs/node/issues/43798
390
- input.extraHttpOptions = { insecureHTTPParser: true }
367
+ if (disabledHeaders) {
368
+ for (let headerKey of Object.keys(this.headers)) {
369
+ if (disabledHeaders[headerKey]) {
370
+ delete this.headers[headerKey]
371
+ }
391
372
  }
392
-
393
- this.startTimeMs = performance.now()
394
- const url = this.getUrl(path, queryString, pagination, paginationValues)
395
- const response = await fetch(url, input)
396
- return await this.parseResponse(response, pagination)
397
373
  }
398
374
 
399
- async create(opts: RestQuery) {
400
- return this._req({ ...opts, method: "POST" })
375
+ let input: any = { method, headers: this.headers }
376
+ input = this.addBody(
377
+ bodyType,
378
+ requestBody,
379
+ input,
380
+ pagination,
381
+ paginationValues
382
+ )
383
+
384
+ if (this.config.legacyHttpParser) {
385
+ // https://github.com/nodejs/node/issues/43798
386
+ input.extraHttpOptions = { insecureHTTPParser: true }
401
387
  }
402
388
 
403
- async read(opts: RestQuery) {
404
- return this._req({ ...opts, method: "GET" })
405
- }
389
+ this.startTimeMs = performance.now()
390
+ const url = this.getUrl(path, queryString, pagination, paginationValues)
391
+ const response = await fetch(url, input)
392
+ return await this.parseResponse(response, pagination)
393
+ }
406
394
 
407
- async update(opts: RestQuery) {
408
- return this._req({ ...opts, method: "PUT" })
409
- }
395
+ async create(opts: RestQuery) {
396
+ return this._req({ ...opts, method: "POST" })
397
+ }
410
398
 
411
- async patch(opts: RestQuery) {
412
- return this._req({ ...opts, method: "PATCH" })
413
- }
399
+ async read(opts: RestQuery) {
400
+ return this._req({ ...opts, method: "GET" })
401
+ }
414
402
 
415
- async delete(opts: RestQuery) {
416
- return this._req({ ...opts, method: "DELETE" })
417
- }
403
+ async update(opts: RestQuery) {
404
+ return this._req({ ...opts, method: "PUT" })
418
405
  }
419
406
 
420
- module.exports = {
421
- schema: SCHEMA,
422
- integration: RestIntegration,
423
- AuthType,
407
+ async patch(opts: RestQuery) {
408
+ return this._req({ ...opts, method: "PATCH" })
424
409
  }
410
+
411
+ async delete(opts: RestQuery) {
412
+ return this._req({ ...opts, method: "DELETE" })
413
+ }
414
+ }
415
+
416
+ export default {
417
+ schema: SCHEMA,
418
+ integration: RestIntegration,
419
+ AuthType,
425
420
  }