@budibase/server 1.3.12 → 1.3.15-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.b266d29f.js +995 -0
  3. package/builder/assets/{index.e50bda9f.css → index.f5c54dd2.css} +2 -2
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +377 -313
  6. package/coverage/coverage-final.json +22 -22
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +8 -5
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +82 -13
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +32 -32
  16. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +204 -12
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +12 -12
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +24 -24
  79. package/coverage/lcov-report/automations/index.js.html +18 -9
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +126 -24
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +18 -18
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +56 -20
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +48 -48
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  128. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  129. package/coverage/lcov-report/middleware/index.html +1 -1
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  136. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +16 -16
  139. package/coverage/lcov-report/utilities/index.html +19 -19
  140. package/coverage/lcov-report/utilities/index.js.html +66 -42
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  142. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +5 -5
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +6 -3
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  156. package/coverage/lcov.info +692 -564
  157. package/dist/api/controllers/application.js +6 -9
  158. package/dist/api/controllers/backup.js +2 -1
  159. package/dist/api/controllers/component.js +18 -1
  160. package/dist/api/controllers/datasource.js +4 -4
  161. package/dist/api/controllers/deploy/index.js +17 -2
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/plugin.js +119 -0
  164. package/dist/api/controllers/row/ExternalRequest.js +1 -1
  165. package/dist/api/controllers/screen.js +51 -2
  166. package/dist/api/controllers/static/index.js +1 -0
  167. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  168. package/dist/api/controllers/static/templates/preview.hbs +3 -1
  169. package/dist/api/routes/index.js +2 -0
  170. package/dist/api/routes/plugin.js +38 -0
  171. package/dist/app.js +9 -0
  172. package/dist/automations/index.js +10 -5
  173. package/dist/automations/triggers.js +39 -5
  174. package/dist/automations/utils.js +16 -7
  175. package/dist/db/utils.js +10 -1
  176. package/dist/environment.js +1 -0
  177. package/dist/integrations/airtable.js +126 -129
  178. package/dist/integrations/arangodb.js +86 -89
  179. package/dist/integrations/base/query.js +2 -2
  180. package/dist/integrations/couchdb.js +80 -83
  181. package/dist/integrations/dynamodb.js +161 -164
  182. package/dist/integrations/elasticsearch.js +135 -138
  183. package/dist/integrations/firebase.js +154 -157
  184. package/dist/integrations/googlesheets.js +323 -327
  185. package/dist/integrations/index.js +93 -51
  186. package/dist/integrations/microsoftSqlServer.js +240 -243
  187. package/dist/integrations/mongodb.js +239 -242
  188. package/dist/integrations/mysql.js +215 -219
  189. package/dist/integrations/oracle.js +318 -322
  190. package/dist/integrations/postgres.js +262 -265
  191. package/dist/integrations/redis.js +134 -139
  192. package/dist/integrations/rest.js +293 -281
  193. package/dist/integrations/s3.js +61 -64
  194. package/dist/integrations/snowflake.js +83 -86
  195. package/dist/package.json +8 -6
  196. package/dist/threads/automation.js +6 -0
  197. package/dist/threads/query.js +2 -2
  198. package/dist/tsconfig.build.tsbuildinfo +1 -1
  199. package/dist/utilities/fileSystem/index.js +71 -6
  200. package/dist/utilities/index.js +8 -0
  201. package/dist/utilities/rowProcessor/utils.js +1 -1
  202. package/dist/utilities/usageQuota/rows.js +2 -1
  203. package/dist/watch.js +77 -0
  204. package/package.json +9 -7
  205. package/scripts/dev/manage.js +1 -0
  206. package/src/api/controllers/application.ts +2 -6
  207. package/src/api/controllers/backup.js +2 -1
  208. package/src/api/controllers/component.js +25 -2
  209. package/src/api/controllers/datasource.js +4 -4
  210. package/src/api/controllers/deploy/index.ts +17 -4
  211. package/src/api/controllers/integration.js +4 -4
  212. package/src/api/controllers/plugin.ts +110 -0
  213. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  214. package/src/api/controllers/screen.js +65 -1
  215. package/src/api/controllers/static/index.ts +1 -0
  216. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  217. package/src/api/controllers/static/templates/preview.hbs +3 -1
  218. package/src/api/routes/index.ts +2 -0
  219. package/src/api/routes/plugin.ts +13 -0
  220. package/src/api/routes/tests/query.spec.js +11 -28
  221. package/src/app.ts +12 -0
  222. package/src/automations/index.js +6 -3
  223. package/src/automations/triggers.js +44 -10
  224. package/src/automations/utils.ts +21 -9
  225. package/src/db/utils.js +12 -0
  226. package/src/definitions/datasource.ts +1 -0
  227. package/src/environment.js +1 -0
  228. package/src/integrations/airtable.ts +116 -118
  229. package/src/integrations/arangodb.ts +87 -89
  230. package/src/integrations/base/query.ts +2 -2
  231. package/src/integrations/couchdb.ts +83 -89
  232. package/src/integrations/dynamodb.ts +173 -175
  233. package/src/integrations/elasticsearch.ts +120 -122
  234. package/src/integrations/firebase.ts +157 -159
  235. package/src/integrations/googlesheets.ts +328 -338
  236. package/src/integrations/index.ts +59 -21
  237. package/src/integrations/microsoftSqlServer.ts +249 -251
  238. package/src/integrations/mongodb.ts +261 -258
  239. package/src/integrations/mysql.ts +229 -234
  240. package/src/integrations/oracle.ts +373 -380
  241. package/src/integrations/postgres.ts +264 -268
  242. package/src/integrations/redis.ts +128 -132
  243. package/src/integrations/rest.ts +325 -317
  244. package/src/integrations/s3.ts +68 -71
  245. package/src/integrations/snowflake.ts +80 -82
  246. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  247. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  248. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  249. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  250. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  251. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  252. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  253. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  254. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  255. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  256. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  257. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  258. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +57 -14
  259. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  260. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  261. package/src/module.d.ts +1 -0
  262. package/src/threads/automation.ts +6 -0
  263. package/src/threads/query.ts +2 -2
  264. package/src/utilities/fileSystem/index.js +75 -6
  265. package/src/utilities/index.js +8 -0
  266. package/src/utilities/rowProcessor/utils.js +1 -1
  267. package/src/utilities/usageQuota/rows.js +2 -1
  268. package/src/watch.ts +38 -0
  269. package/builder/assets/index.a4ba55ba.js +0 -875
  270. package/builder/assets/vendor.5e1fe644.css +0 -1
  271. package/builder/assets/vendor.67dbd8fa.js +0 -248
@@ -14,6 +14,12 @@ import {
14
14
  BearerAuthConfig,
15
15
  } from "../definitions/datasource"
16
16
  import { get } from "lodash"
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")
17
23
 
18
24
  const BodyTypes = {
19
25
  NONE: "none",
@@ -50,363 +56,365 @@ const coreFields = {
50
56
  },
51
57
  }
52
58
 
53
- module RestModule {
54
- const fetch = require("node-fetch")
55
- const { formatBytes } = require("../utilities")
56
- const { performance } = require("perf_hooks")
57
- const FormData = require("form-data")
58
- const { URLSearchParams } = require("url")
59
- const {
60
- parseStringPromise: xmlParser,
61
- Builder: XmlBuilder,
62
- } = require("xml2js")
63
-
64
- const SCHEMA: Integration = {
65
- docs: "https://github.com/node-fetch/node-fetch",
66
- description:
67
- "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.",
68
- friendlyName: "REST API",
69
- type: "API",
70
- datasource: {
71
- url: {
72
- type: DatasourceFieldType.STRING,
73
- default: "",
74
- required: false,
75
- deprecated: true,
76
- },
77
- defaultHeaders: {
78
- type: DatasourceFieldType.OBJECT,
79
- required: false,
80
- default: {},
81
- },
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,
82
73
  },
83
- query: {
84
- create: {
85
- readable: true,
86
- displayName: "POST",
87
- type: QueryType.FIELDS,
88
- fields: coreFields,
89
- },
90
- read: {
91
- displayName: "GET",
92
- readable: true,
93
- type: QueryType.FIELDS,
94
- fields: coreFields,
95
- },
96
- update: {
97
- displayName: "PUT",
98
- readable: true,
99
- type: QueryType.FIELDS,
100
- fields: coreFields,
101
- },
102
- patch: {
103
- displayName: "PATCH",
104
- readable: true,
105
- type: QueryType.FIELDS,
106
- fields: coreFields,
107
- },
108
- delete: {
109
- displayName: "DELETE",
110
- type: QueryType.FIELDS,
111
- fields: coreFields,
112
- },
74
+ defaultHeaders: {
75
+ type: DatasourceFieldType.OBJECT,
76
+ required: false,
77
+ default: {},
113
78
  },
114
- }
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
+ }
115
118
 
116
- class RestIntegration implements IntegrationBase {
117
- private config: RestConfig
118
- private headers: {
119
- [key: string]: string
120
- } = {}
121
- 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()
122
125
 
123
- constructor(config: RestConfig) {
124
- this.config = config
125
- }
126
+ constructor(config: RestConfig) {
127
+ this.config = config
128
+ }
126
129
 
127
- async parseResponse(response: any, pagination: PaginationConfig | null) {
128
- let data, raw, headers
129
- const contentType = response.headers.get("content-type") || ""
130
- try {
131
- if (contentType.includes("application/json")) {
132
- data = await response.json()
133
- raw = JSON.stringify(data)
134
- } else if (
135
- contentType.includes("text/xml") ||
136
- contentType.includes("application/xml")
137
- ) {
138
- const rawXml = await response.text()
139
- data =
140
- (await xmlParser(rawXml, {
141
- explicitArray: false,
142
- trim: true,
143
- explicitRoot: false,
144
- })) || {}
145
- // there is only one structure, its an array, return the array so it appears as rows
146
- const keys = Object.keys(data)
147
- if (keys.length === 1 && Array.isArray(data[keys[0]])) {
148
- data = data[keys[0]]
149
- }
150
- raw = rawXml
151
- } else {
152
- data = await response.text()
153
- 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]]
154
152
  }
155
- } catch (err) {
156
- throw "Failed to parse response body."
157
- }
158
- const size = formatBytes(
159
- response.headers.get("content-length") || Buffer.byteLength(raw, "utf8")
160
- )
161
- const time = `${Math.round(performance.now() - this.startTimeMs)}ms`
162
- headers = response.headers.raw()
163
- for (let [key, value] of Object.entries(headers)) {
164
- headers[key] = Array.isArray(value) ? value[0] : value
165
- }
166
-
167
- // Check if a pagination cursor exists in the response
168
- let nextCursor = null
169
- if (pagination?.responseParam) {
170
- nextCursor = get(data, pagination.responseParam)
171
- }
172
-
173
- return {
174
- data,
175
- info: {
176
- code: response.status,
177
- size,
178
- time,
179
- },
180
- extra: {
181
- raw,
182
- headers,
183
- },
184
- pagination: {
185
- cursor: nextCursor,
186
- },
153
+ raw = rawXml
154
+ } else {
155
+ data = await response.text()
156
+ raw = data
187
157
  }
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
188
168
  }
189
169
 
190
- getUrl(
191
- path: string,
192
- queryString: string,
193
- pagination: PaginationConfig | null,
194
- paginationValues: PaginationValues | null
195
- ): string {
196
- // Add pagination params to query string if required
197
- if (pagination?.location === "query" && paginationValues) {
198
- const { pageParam, sizeParam } = pagination
199
- const params = new URLSearchParams()
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
+ }
200
175
 
201
- // Append page number or cursor param if configured
202
- if (pageParam && paginationValues.page != null) {
203
- params.append(pageParam, paginationValues.page)
204
- }
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
+ }
205
192
 
206
- // Append page size param if configured
207
- if (sizeParam && paginationValues.limit != null) {
208
- params.append(sizeParam, paginationValues.limit)
209
- }
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()
210
203
 
211
- // Prepend query string with pagination params
212
- let paginationString = params.toString()
213
- if (paginationString) {
214
- queryString = `${paginationString}&${queryString}`
215
- }
204
+ // Append page number or cursor param if configured
205
+ if (pageParam && paginationValues.page != null) {
206
+ params.append(pageParam, paginationValues.page)
216
207
  }
217
208
 
218
- const main = `${path}?${queryString}`
219
- let complete = main
220
- if (this.config.url && !main.startsWith("http")) {
221
- complete = !this.config.url ? main : `${this.config.url}/${main}`
222
- }
223
- if (!complete.startsWith("http")) {
224
- complete = `http://${complete}`
209
+ // Append page size param if configured
210
+ if (sizeParam && paginationValues.limit != null) {
211
+ params.append(sizeParam, paginationValues.limit)
225
212
  }
226
- return complete
227
- }
228
213
 
229
- addBody(
230
- bodyType: string,
231
- body: string | any,
232
- input: any,
233
- pagination: PaginationConfig | null,
234
- paginationValues: PaginationValues | null
235
- ) {
236
- if (!input.headers) {
237
- input.headers = {}
238
- }
239
- if (bodyType === BodyTypes.NONE) {
240
- return input
241
- }
242
- let error,
243
- object: any = {},
244
- string = ""
245
- try {
246
- if (body) {
247
- string = typeof body !== "string" ? JSON.stringify(body) : body
248
- object = typeof body === "object" ? body : JSON.parse(body)
249
- }
250
- } catch (err) {
251
- error = err
214
+ // Prepend query string with pagination params
215
+ let paginationString = params.toString()
216
+ if (paginationString) {
217
+ queryString = `${paginationString}&${queryString}`
252
218
  }
219
+ }
253
220
 
254
- // Util to add pagination values to a certain body type
255
- const addPaginationToBody = (insertFn: Function) => {
256
- if (pagination?.location === "body") {
257
- if (pagination?.pageParam && paginationValues?.page != null) {
258
- insertFn(pagination.pageParam, paginationValues.page)
259
- }
260
- if (pagination?.sizeParam && paginationValues?.limit != null) {
261
- insertFn(pagination.sizeParam, paginationValues.limit)
262
- }
263
- }
264
- }
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
+ }
265
232
 
266
- switch (bodyType) {
267
- case BodyTypes.TEXT:
268
- // content type defaults to plaintext
269
- input.body = string
270
- break
271
- case BodyTypes.ENCODED:
272
- const params = new URLSearchParams()
273
- for (let [key, value] of Object.entries(object)) {
274
- params.append(key, value)
275
- }
276
- addPaginationToBody((key: string, value: any) => {
277
- params.append(key, value)
278
- })
279
- input.body = params
280
- break
281
- case BodyTypes.FORM_DATA:
282
- const form = new FormData()
283
- for (let [key, value] of Object.entries(object)) {
284
- form.append(key, value)
285
- }
286
- addPaginationToBody((key: string, value: any) => {
287
- form.append(key, value)
288
- })
289
- input.body = form
290
- break
291
- case BodyTypes.XML:
292
- if (object != null && Object.keys(object).length) {
293
- string = new XmlBuilder().buildObject(object)
294
- }
295
- input.body = string
296
- input.headers["Content-Type"] = "application/xml"
297
- break
298
- case BodyTypes.JSON:
299
- // if JSON error, throw it
300
- if (error) {
301
- throw "Invalid JSON for request body"
302
- }
303
- addPaginationToBody((key: string, value: any) => {
304
- object[key] = value
305
- })
306
- input.body = JSON.stringify(object)
307
- input.headers["Content-Type"] = "application/json"
308
- break
309
- }
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) {
310
244
  return input
311
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
+ }
312
257
 
313
- getAuthHeaders(authConfigId: string): { [key: string]: any } {
314
- let headers: any = {}
315
-
316
- if (this.config.authConfigs && authConfigId) {
317
- const authConfig = this.config.authConfigs.filter(
318
- c => c._id === authConfigId
319
- )[0]
320
- // check the config still exists before proceeding
321
- // if not - do nothing
322
- if (authConfig) {
323
- let config
324
- switch (authConfig.type) {
325
- case AuthType.BASIC:
326
- config = authConfig.config as BasicAuthConfig
327
- headers.Authorization = `Basic ${Buffer.from(
328
- `${config.username}:${config.password}`
329
- ).toString("base64")}`
330
- break
331
- case AuthType.BEARER:
332
- config = authConfig.config as BearerAuthConfig
333
- headers.Authorization = `Bearer ${config.token}`
334
- break
335
- }
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)
263
+ }
264
+ if (pagination?.sizeParam && paginationValues?.limit != null) {
265
+ insertFn(pagination.sizeParam, paginationValues.limit)
336
266
  }
337
267
  }
268
+ }
338
269
 
339
- return headers
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)
279
+ }
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)
289
+ }
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
340
313
  }
314
+ return input
315
+ }
341
316
 
342
- async _req(query: RestQuery) {
343
- const {
344
- path = "",
345
- queryString = "",
346
- headers = {},
347
- method = "GET",
348
- disabledHeaders,
349
- bodyType,
350
- requestBody,
351
- authConfigId,
352
- pagination,
353
- paginationValues,
354
- } = query
355
- const authHeaders = this.getAuthHeaders(authConfigId)
356
-
357
- this.headers = {
358
- ...this.config.defaultHeaders,
359
- ...headers,
360
- ...authHeaders,
361
- }
317
+ getAuthHeaders(authConfigId: string): { [key: string]: any } {
318
+ let headers: any = {}
362
319
 
363
- if (disabledHeaders) {
364
- for (let headerKey of Object.keys(this.headers)) {
365
- if (disabledHeaders[headerKey]) {
366
- delete this.headers[headerKey]
367
- }
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
368
339
  }
369
340
  }
370
-
371
- let input: any = { method, headers: this.headers }
372
- input = this.addBody(
373
- bodyType,
374
- requestBody,
375
- input,
376
- pagination,
377
- paginationValues
378
- )
379
-
380
- this.startTimeMs = performance.now()
381
- const url = this.getUrl(path, queryString, pagination, paginationValues)
382
- const response = await fetch(url, input)
383
- return await this.parseResponse(response, pagination)
384
341
  }
385
342
 
386
- async create(opts: RestQuery) {
387
- return this._req({ ...opts, method: "POST" })
388
- }
343
+ return headers
344
+ }
389
345
 
390
- async read(opts: RestQuery) {
391
- return this._req({ ...opts, method: "GET" })
392
- }
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)
393
360
 
394
- async update(opts: RestQuery) {
395
- return this._req({ ...opts, method: "PUT" })
361
+ this.headers = {
362
+ ...this.config.defaultHeaders,
363
+ ...headers,
364
+ ...authHeaders,
396
365
  }
397
366
 
398
- async patch(opts: RestQuery) {
399
- return this._req({ ...opts, method: "PATCH" })
367
+ if (disabledHeaders) {
368
+ for (let headerKey of Object.keys(this.headers)) {
369
+ if (disabledHeaders[headerKey]) {
370
+ delete this.headers[headerKey]
371
+ }
372
+ }
400
373
  }
401
374
 
402
- async delete(opts: RestQuery) {
403
- return this._req({ ...opts, method: "DELETE" })
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 }
404
387
  }
388
+
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
+ }
394
+
395
+ async create(opts: RestQuery) {
396
+ return this._req({ ...opts, method: "POST" })
405
397
  }
406
398
 
407
- module.exports = {
408
- schema: SCHEMA,
409
- integration: RestIntegration,
410
- AuthType,
399
+ async read(opts: RestQuery) {
400
+ return this._req({ ...opts, method: "GET" })
411
401
  }
402
+
403
+ async update(opts: RestQuery) {
404
+ return this._req({ ...opts, method: "PUT" })
405
+ }
406
+
407
+ async patch(opts: RestQuery) {
408
+ return this._req({ ...opts, method: "PATCH" })
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,
412
420
  }