@budibase/server 1.0.26 → 1.0.27-alpha.11

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 (258) hide show
  1. package/__mocks__/node-fetch.ts +21 -0
  2. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  3. package/builder/assets/{index.4fb3f887.css → index.0dce895b.css} +1 -1
  4. package/builder/assets/index.b98dd7ca.js +1348 -0
  5. package/builder/assets/{vendor.470042a4.js → vendor.f9faf6ab.js} +88 -88
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +1364 -1121
  8. package/coverage/coverage-final.json +37 -36
  9. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/application.js.html +59 -59
  12. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/automation.js.html +22 -10
  14. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  17. package/coverage/lcov-report/api/controllers/datasource.js.html +170 -68
  18. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/index.html +39 -54
  21. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.html +126 -0
  26. package/coverage/lcov-report/api/controllers/{query.js.html → query/index.js.html} +225 -114
  27. package/coverage/lcov-report/api/controllers/query/validation.js.html +206 -0
  28. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/index.html +22 -22
  32. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/internal.js.html +38 -11
  34. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +7 -4
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -20
  36. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +108 -9
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +18 -6
  51. package/coverage/lcov-report/api/index.html +1 -1
  52. package/coverage/lcov-report/api/index.js.html +5 -5
  53. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.html +9 -9
  66. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +19 -85
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +32 -2
  81. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  83. package/coverage/lcov-report/automations/actions.js.html +1 -1
  84. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  85. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  86. package/coverage/lcov-report/automations/index.html +20 -20
  87. package/coverage/lcov-report/automations/index.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/executeQuery.js.html +31 -7
  94. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/index.html +11 -11
  97. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +5 -8
  99. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  115. package/coverage/lcov-report/automations/utils.js.html +48 -15
  116. package/coverage/lcov-report/constants/index.html +1 -1
  117. package/coverage/lcov-report/constants/index.js.html +22 -22
  118. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  119. package/coverage/lcov-report/constants/screens.js.html +1 -1
  120. package/coverage/lcov-report/db/client.js.html +18 -18
  121. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  122. package/coverage/lcov-report/db/index.html +15 -15
  123. package/coverage/lcov-report/db/index.js.html +3 -3
  124. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  128. package/coverage/lcov-report/db/newid.js.html +4 -4
  129. package/coverage/lcov-report/db/utils.js.html +107 -80
  130. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  131. package/coverage/lcov-report/events/index.html +1 -1
  132. package/coverage/lcov-report/events/index.js.html +1 -1
  133. package/coverage/lcov-report/events/utils.js.html +1 -1
  134. package/coverage/lcov-report/index.html +99 -84
  135. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  136. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  137. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  138. package/coverage/lcov-report/middleware/authorized.js.html +10 -10
  139. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  140. package/coverage/lcov-report/middleware/currentapp.js.html +28 -28
  141. package/coverage/lcov-report/middleware/index.html +1 -1
  142. package/coverage/lcov-report/middleware/joi-validator.js.html +11 -11
  143. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  144. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  145. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  146. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  147. package/coverage/lcov-report/threads/automation.js.html +1 -1
  148. package/coverage/lcov-report/threads/index.html +31 -31
  149. package/coverage/lcov-report/threads/index.js.html +12 -12
  150. package/coverage/lcov-report/threads/query.js.html +396 -69
  151. package/coverage/lcov-report/threads/utils.js.html +358 -13
  152. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  153. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  154. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  155. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  156. package/coverage/lcov-report/utilities/global.js.html +13 -13
  157. package/coverage/lcov-report/utilities/index.html +19 -19
  158. package/coverage/lcov-report/utilities/index.js.html +69 -36
  159. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  160. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  161. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  163. package/coverage/lcov-report/utilities/rowProcessor/index.html +19 -19
  164. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +235 -10
  165. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  166. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  167. package/coverage/lcov-report/utilities/security.js.html +2 -2
  168. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  169. package/coverage/lcov-report/utilities/users.js.html +1 -1
  170. package/coverage/lcov-report/utilities/workerRequests.js.html +19 -19
  171. package/coverage/lcov.info +2294 -1874
  172. package/dist/api/controllers/automation.js +7 -5
  173. package/dist/api/controllers/datasource.js +29 -0
  174. package/dist/api/controllers/query/import/index.js +79 -0
  175. package/dist/api/controllers/query/import/sources/base/index.js +64 -0
  176. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  177. package/dist/api/controllers/query/import/sources/curl.js +96 -0
  178. package/dist/api/controllers/query/import/sources/openapi2.js +142 -0
  179. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  180. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  181. package/dist/api/controllers/{query.js → query/index.js} +86 -52
  182. package/dist/api/controllers/query/validation.js +38 -0
  183. package/dist/api/controllers/row/internal.js +14 -6
  184. package/dist/api/controllers/row/internalSearch.js +2 -1
  185. package/dist/api/controllers/row/utils.js +13 -6
  186. package/dist/api/controllers/user.js +37 -1
  187. package/dist/api/controllers/webhook.js +4 -0
  188. package/dist/api/routes/query.js +5 -33
  189. package/dist/api/routes/user.js +3 -1
  190. package/dist/automations/steps/executeQuery.js +8 -1
  191. package/dist/automations/steps/outgoingWebhook.js +2 -3
  192. package/dist/automations/utils.js +10 -0
  193. package/dist/db/utils.js +8 -0
  194. package/dist/definitions/datasource.js +6 -1
  195. package/dist/integrations/base/sqlTable.js +1 -1
  196. package/dist/integrations/rest.js +207 -117
  197. package/dist/package.json +11 -4
  198. package/dist/tests/utilities/TestConfiguration.js +47 -0
  199. package/dist/threads/query.js +148 -40
  200. package/dist/threads/utils.js +105 -0
  201. package/dist/tsconfig.tsbuildinfo +1 -1
  202. package/dist/utilities/fileSystem/utilities.js +2 -1
  203. package/dist/utilities/index.js +10 -0
  204. package/dist/utilities/rowProcessor/index.js +76 -0
  205. package/package.json +12 -5
  206. package/src/api/controllers/automation.js +8 -4
  207. package/src/api/controllers/datasource.js +34 -0
  208. package/src/api/controllers/query/import/index.ts +85 -0
  209. package/src/api/controllers/query/import/sources/base/index.ts +87 -0
  210. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  211. package/src/api/controllers/query/import/sources/curl.ts +102 -0
  212. package/src/api/controllers/query/import/sources/openapi2.ts +163 -0
  213. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  214. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  215. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  216. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  217. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  218. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  219. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  220. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  221. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  222. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  223. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  224. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  225. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  226. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  227. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  228. package/src/api/controllers/query/import/tests/index.spec.js +109 -0
  229. package/src/api/controllers/query/index.js +195 -0
  230. package/src/api/controllers/query/validation.js +42 -0
  231. package/src/api/controllers/row/internal.js +14 -5
  232. package/src/api/controllers/row/internalSearch.js +2 -1
  233. package/src/api/controllers/row/utils.js +11 -8
  234. package/src/api/controllers/user.js +33 -0
  235. package/src/api/controllers/webhook.js +4 -0
  236. package/src/api/routes/query.js +13 -35
  237. package/src/api/routes/tests/datasource.spec.js +45 -0
  238. package/src/api/routes/tests/query.spec.js +69 -0
  239. package/src/api/routes/user.js +10 -0
  240. package/src/automations/steps/executeQuery.js +9 -1
  241. package/src/automations/steps/outgoingWebhook.js +2 -3
  242. package/src/automations/utils.js +11 -0
  243. package/src/db/utils.js +9 -0
  244. package/src/definitions/common.ts +2 -16
  245. package/src/definitions/datasource.ts +83 -1
  246. package/src/integrations/base/IntegrationBase.ts +4 -4
  247. package/src/integrations/base/sqlTable.ts +1 -1
  248. package/src/integrations/oracle.ts +1 -1
  249. package/src/integrations/rest.ts +230 -137
  250. package/src/integrations/tests/rest.spec.js +167 -19
  251. package/src/tests/utilities/TestConfiguration.js +57 -0
  252. package/src/threads/query.js +149 -40
  253. package/src/threads/utils.js +115 -0
  254. package/src/utilities/fileSystem/utilities.js +2 -0
  255. package/src/utilities/index.js +11 -0
  256. package/src/utilities/rowProcessor/index.js +75 -0
  257. package/builder/assets/index.8adef83f.js +0 -1316
  258. package/src/api/controllers/query.js +0 -158
@@ -2,29 +2,68 @@ import {
2
2
  Integration,
3
3
  DatasourceFieldTypes,
4
4
  QueryTypes,
5
+ RestConfig,
6
+ RestQueryFields as RestQuery,
7
+ AuthType,
8
+ BasicAuthConfig,
9
+ BearerAuthConfig,
5
10
  } from "../definitions/datasource"
6
11
  import { IntegrationBase } from "./base/IntegrationBase"
7
12
 
13
+ const BodyTypes = {
14
+ NONE: "none",
15
+ FORM_DATA: "form",
16
+ XML: "xml",
17
+ ENCODED: "encoded",
18
+ JSON: "json",
19
+ TEXT: "text",
20
+ }
21
+
22
+ const coreFields = {
23
+ path: {
24
+ type: DatasourceFieldTypes.STRING,
25
+ display: "URL",
26
+ },
27
+ queryString: {
28
+ type: DatasourceFieldTypes.STRING,
29
+ },
30
+ headers: {
31
+ type: DatasourceFieldTypes.OBJECT,
32
+ },
33
+ enabledHeaders: {
34
+ type: DatasourceFieldTypes.OBJECT,
35
+ },
36
+ requestBody: {
37
+ type: DatasourceFieldTypes.JSON,
38
+ },
39
+ bodyType: {
40
+ type: DatasourceFieldTypes.STRING,
41
+ enum: Object.values(BodyTypes),
42
+ },
43
+ }
44
+
8
45
  module RestModule {
9
46
  const fetch = require("node-fetch")
10
-
11
- interface RestConfig {
12
- url: string
13
- defaultHeaders: {
14
- [key: string]: any
15
- }
16
- }
47
+ const { formatBytes } = require("../utilities")
48
+ const { performance } = require("perf_hooks")
49
+ const FormData = require("form-data")
50
+ const { URLSearchParams } = require("url")
51
+ const {
52
+ parseStringPromise: xmlParser,
53
+ Builder: XmlBuilder,
54
+ } = require("xml2js")
17
55
 
18
56
  const SCHEMA: Integration = {
19
57
  docs: "https://github.com/node-fetch/node-fetch",
20
58
  description:
21
- "Representational state transfer (REST) is a de-facto standard for a software architecture for interactive applications that typically use multiple Web services. ",
59
+ "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.",
22
60
  friendlyName: "REST API",
23
61
  datasource: {
24
62
  url: {
25
63
  type: DatasourceFieldTypes.STRING,
26
- default: "localhost",
27
- required: true,
64
+ default: "",
65
+ required: false,
66
+ deprecated: true,
28
67
  },
29
68
  defaultHeaders: {
30
69
  type: DatasourceFieldTypes.OBJECT,
@@ -37,97 +76,30 @@ module RestModule {
37
76
  readable: true,
38
77
  displayName: "POST",
39
78
  type: QueryTypes.FIELDS,
40
- urlDisplay: true,
41
- fields: {
42
- path: {
43
- type: DatasourceFieldTypes.STRING,
44
- },
45
- queryString: {
46
- type: DatasourceFieldTypes.STRING,
47
- },
48
- headers: {
49
- type: DatasourceFieldTypes.OBJECT,
50
- },
51
- requestBody: {
52
- type: DatasourceFieldTypes.JSON,
53
- },
54
- },
79
+ fields: coreFields,
55
80
  },
56
81
  read: {
57
82
  displayName: "GET",
58
83
  readable: true,
59
84
  type: QueryTypes.FIELDS,
60
- urlDisplay: true,
61
- fields: {
62
- path: {
63
- type: DatasourceFieldTypes.STRING,
64
- },
65
- queryString: {
66
- type: DatasourceFieldTypes.STRING,
67
- },
68
- headers: {
69
- type: DatasourceFieldTypes.OBJECT,
70
- },
71
- },
85
+ fields: coreFields,
72
86
  },
73
87
  update: {
74
88
  displayName: "PUT",
75
89
  readable: true,
76
90
  type: QueryTypes.FIELDS,
77
- urlDisplay: true,
78
- fields: {
79
- path: {
80
- type: DatasourceFieldTypes.STRING,
81
- },
82
- queryString: {
83
- type: DatasourceFieldTypes.STRING,
84
- },
85
- headers: {
86
- type: DatasourceFieldTypes.OBJECT,
87
- },
88
- requestBody: {
89
- type: DatasourceFieldTypes.JSON,
90
- },
91
- },
91
+ fields: coreFields,
92
92
  },
93
93
  patch: {
94
94
  displayName: "PATCH",
95
95
  readable: true,
96
96
  type: QueryTypes.FIELDS,
97
- urlDisplay: true,
98
- fields: {
99
- path: {
100
- type: DatasourceFieldTypes.STRING,
101
- },
102
- queryString: {
103
- type: DatasourceFieldTypes.STRING,
104
- },
105
- headers: {
106
- type: DatasourceFieldTypes.OBJECT,
107
- },
108
- requestBody: {
109
- type: DatasourceFieldTypes.JSON,
110
- },
111
- },
97
+ fields: coreFields,
112
98
  },
113
99
  delete: {
114
100
  displayName: "DELETE",
115
101
  type: QueryTypes.FIELDS,
116
- urlDisplay: true,
117
- fields: {
118
- path: {
119
- type: DatasourceFieldTypes.STRING,
120
- },
121
- queryString: {
122
- type: DatasourceFieldTypes.STRING,
123
- },
124
- headers: {
125
- type: DatasourceFieldTypes.OBJECT,
126
- },
127
- requestBody: {
128
- type: DatasourceFieldTypes.JSON,
129
- },
130
- },
102
+ fields: coreFields,
131
103
  },
132
104
  },
133
105
  }
@@ -137,99 +109,220 @@ module RestModule {
137
109
  private headers: {
138
110
  [key: string]: string
139
111
  } = {}
112
+ private startTimeMs: number = performance.now()
140
113
 
141
114
  constructor(config: RestConfig) {
142
115
  this.config = config
143
116
  }
144
117
 
145
118
  async parseResponse(response: any) {
146
- const contentType = response.headers.get("content-type")
147
- if (contentType && contentType.indexOf("application/json") !== -1) {
148
- return await response.json()
149
- } else {
150
- return await response.text()
119
+ let data, raw, headers
120
+ const contentType = response.headers.get("content-type") || ""
121
+ try {
122
+ if (contentType.includes("application/json")) {
123
+ data = await response.json()
124
+ raw = JSON.stringify(data)
125
+ } else if (
126
+ contentType.includes("text/xml") ||
127
+ contentType.includes("application/xml")
128
+ ) {
129
+ const rawXml = await response.text()
130
+ data =
131
+ (await xmlParser(rawXml, {
132
+ explicitArray: false,
133
+ trim: true,
134
+ explicitRoot: false,
135
+ })) || {}
136
+ // there is only one structure, its an array, return the array so it appears as rows
137
+ const keys = Object.keys(data)
138
+ if (keys.length === 1 && Array.isArray(data[keys[0]])) {
139
+ data = data[keys[0]]
140
+ }
141
+ raw = rawXml
142
+ } else {
143
+ data = await response.text()
144
+ raw = data
145
+ }
146
+ } catch (err) {
147
+ throw "Failed to parse response body."
148
+ }
149
+ const size = formatBytes(
150
+ response.headers.get("content-length") || Buffer.byteLength(raw, "utf8")
151
+ )
152
+ const time = `${Math.round(performance.now() - this.startTimeMs)}ms`
153
+ headers = response.headers.raw()
154
+ for (let [key, value] of Object.entries(headers)) {
155
+ headers[key] = Array.isArray(value) ? value[0] : value
156
+ }
157
+ return {
158
+ data,
159
+ info: {
160
+ code: response.status,
161
+ size,
162
+ time,
163
+ },
164
+ extra: {
165
+ raw,
166
+ headers,
167
+ },
151
168
  }
152
169
  }
153
170
 
154
171
  getUrl(path: string, queryString: string): string {
155
- return `${this.config.url}/${path}?${queryString}`
172
+ const main = `${path}?${queryString}`
173
+ let complete = main
174
+ if (this.config.url && !main.startsWith("http")) {
175
+ complete = !this.config.url ? main : `${this.config.url}/${main}`
176
+ }
177
+ if (!complete.startsWith("http")) {
178
+ complete = `http://${complete}`
179
+ }
180
+ return complete
156
181
  }
157
182
 
158
- async create({ path = "", queryString = "", headers = {}, json = {} }) {
159
- this.headers = {
160
- ...this.config.defaultHeaders,
161
- ...headers,
183
+ addBody(bodyType: string, body: string | any, input: any) {
184
+ let error, object, string
185
+ try {
186
+ string = typeof body !== "string" ? JSON.stringify(body) : body
187
+ object = typeof body === "object" ? body : JSON.parse(body)
188
+ } catch (err) {
189
+ error = err
162
190
  }
163
-
164
- const response = await fetch(this.getUrl(path, queryString), {
165
- method: "POST",
166
- headers: this.headers,
167
- body: JSON.stringify(json),
168
- })
169
-
170
- return await this.parseResponse(response)
191
+ if (!input.headers) {
192
+ input.headers = {}
193
+ }
194
+ switch (bodyType) {
195
+ case BodyTypes.NONE:
196
+ break
197
+ case BodyTypes.TEXT:
198
+ // content type defaults to plaintext
199
+ input.body = string
200
+ break
201
+ case BodyTypes.ENCODED:
202
+ const params = new URLSearchParams()
203
+ for (let [key, value] of Object.entries(object)) {
204
+ params.append(key, value)
205
+ }
206
+ input.body = params
207
+ break
208
+ case BodyTypes.FORM_DATA:
209
+ const form = new FormData()
210
+ for (let [key, value] of Object.entries(object)) {
211
+ form.append(key, value)
212
+ }
213
+ input.body = form
214
+ break
215
+ case BodyTypes.XML:
216
+ if (object != null) {
217
+ string = new XmlBuilder().buildObject(object)
218
+ }
219
+ input.body = string
220
+ input.headers["Content-Type"] = "application/xml"
221
+ break
222
+ default:
223
+ case BodyTypes.JSON:
224
+ // if JSON error, throw it
225
+ if (error) {
226
+ throw "Invalid JSON for request body"
227
+ }
228
+ input.body = string
229
+ input.headers["Content-Type"] = "application/json"
230
+ break
231
+ }
232
+ return input
171
233
  }
172
234
 
173
- async read({ path = "", queryString = "", headers = {} }) {
174
- this.headers = {
175
- ...this.config.defaultHeaders,
176
- ...headers,
177
- }
235
+ getAuthHeaders(authConfigId: string): { [key: string]: any } {
236
+ let headers: any = {}
178
237
 
179
- const response = await fetch(this.getUrl(path, queryString), {
180
- headers: this.headers,
181
- })
238
+ if (this.config.authConfigs && authConfigId) {
239
+ const authConfig = this.config.authConfigs.filter(
240
+ c => c._id === authConfigId
241
+ )[0]
242
+ // check the config still exists before proceeding
243
+ // if not - do nothing
244
+ if (authConfig) {
245
+ let config
246
+ switch (authConfig.type) {
247
+ case AuthType.BASIC:
248
+ config = authConfig.config as BasicAuthConfig
249
+ headers.Authorization = `Basic ${Buffer.from(
250
+ `${config.username}:${config.password}`
251
+ ).toString("base64")}`
252
+ break
253
+ case AuthType.BEARER:
254
+ config = authConfig.config as BearerAuthConfig
255
+ headers.Authorization = `Bearer ${config.token}`
256
+ break
257
+ }
258
+ }
259
+ }
182
260
 
183
- return await this.parseResponse(response)
261
+ return headers
184
262
  }
185
263
 
186
- async update({ path = "", queryString = "", headers = {}, json = {} }) {
264
+ async _req(query: RestQuery) {
265
+ const {
266
+ path = "",
267
+ queryString = "",
268
+ headers = {},
269
+ method = "GET",
270
+ disabledHeaders,
271
+ bodyType,
272
+ requestBody,
273
+ authConfigId,
274
+ } = query
275
+ const authHeaders = this.getAuthHeaders(authConfigId)
276
+
187
277
  this.headers = {
188
278
  ...this.config.defaultHeaders,
189
279
  ...headers,
280
+ ...authHeaders,
281
+ }
282
+
283
+ if (disabledHeaders) {
284
+ for (let headerKey of Object.keys(this.headers)) {
285
+ if (disabledHeaders[headerKey]) {
286
+ delete this.headers[headerKey]
287
+ }
288
+ }
190
289
  }
191
290
 
192
- const response = await fetch(this.getUrl(path, queryString), {
193
- method: "PUT",
194
- headers: this.headers,
195
- body: JSON.stringify(json),
196
- })
291
+ let input: any = { method, headers: this.headers }
292
+ if (requestBody) {
293
+ input = this.addBody(bodyType, requestBody, input)
294
+ }
197
295
 
296
+ this.startTimeMs = performance.now()
297
+ const url = this.getUrl(path, queryString)
298
+ const response = await fetch(url, input)
198
299
  return await this.parseResponse(response)
199
300
  }
200
301
 
201
- async patch({ path = "", queryString = "", headers = {}, json = {} }) {
202
- this.headers = {
203
- ...this.config.defaultHeaders,
204
- ...headers,
205
- }
206
-
207
- const response = await fetch(this.getUrl(path, queryString), {
208
- method: "PATCH",
209
- headers: this.headers,
210
- body: JSON.stringify(json),
211
- })
302
+ async create(opts: RestQuery) {
303
+ return this._req({ ...opts, method: "POST" })
304
+ }
212
305
 
213
- return await this.parseResponse(response)
306
+ async read(opts: RestQuery) {
307
+ return this._req({ ...opts, method: "GET" })
214
308
  }
215
309
 
216
- async delete({ path = "", queryString = "", headers = {} }) {
217
- this.headers = {
218
- ...this.config.defaultHeaders,
219
- ...headers,
220
- }
310
+ async update(opts: RestQuery) {
311
+ return this._req({ ...opts, method: "PUT" })
312
+ }
221
313
 
222
- const response = await fetch(this.getUrl(path, queryString), {
223
- method: "DELETE",
224
- headers: this.headers,
225
- })
314
+ async patch(opts: RestQuery) {
315
+ return this._req({ ...opts, method: "PATCH" })
316
+ }
226
317
 
227
- return await this.parseResponse(response)
318
+ async delete(opts: RestQuery) {
319
+ return this._req({ ...opts, method: "DELETE" })
228
320
  }
229
321
  }
230
322
 
231
323
  module.exports = {
232
324
  schema: SCHEMA,
233
325
  integration: RestIntegration,
326
+ AuthType,
234
327
  }
235
328
  }