@budibase/server 1.3.17 → 1.3.19-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 (282) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/{index.a70e216a.css → index.3850883f.css} +2 -2
  3. package/builder/assets/index.fdade753.js +995 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +409 -361
  6. package/coverage/coverage-final.json +18 -18
  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 +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/component.js.html +68 -11
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +38 -38
  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 +2 -2
  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 +207 -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 +2 -2
  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 +5 -5
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +9 -6
  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 +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  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 +1 -1
  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 +30 -30
  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 +1 -1
  140. package/coverage/lcov-report/utilities/index.js.html +24 -24
  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 +1 -1
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  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 +1 -1
  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 +725 -623
  157. package/dist/api/controllers/application.js +5 -4
  158. package/dist/api/controllers/component.js +14 -1
  159. package/dist/api/controllers/datasource.js +21 -8
  160. package/dist/api/controllers/integration.js +4 -4
  161. package/dist/api/controllers/plugin/file.js +24 -0
  162. package/dist/api/controllers/plugin/github.js +69 -0
  163. package/dist/api/controllers/plugin/index.js +197 -0
  164. package/dist/api/controllers/plugin/npm.js +58 -0
  165. package/dist/api/controllers/plugin/uploaders.js +11 -0
  166. package/dist/api/controllers/plugin/url.js +24 -0
  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 +52 -2
  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/routes/application.js +3 -2
  174. package/dist/api/routes/index.js +2 -0
  175. package/dist/api/routes/plugin.js +39 -0
  176. package/dist/api/routes/public/tables.js +1 -1
  177. package/dist/api/routes/table.js +1 -1
  178. package/dist/api/routes/utils/validators.js +2 -1
  179. package/dist/app.js +11 -0
  180. package/dist/db/utils.js +10 -1
  181. package/dist/environment.js +1 -0
  182. package/dist/integrations/airtable.js +126 -129
  183. package/dist/integrations/arangodb.js +86 -89
  184. package/dist/integrations/base/query.js +2 -2
  185. package/dist/integrations/base/sqlTable.js +3 -1
  186. package/dist/integrations/couchdb.js +80 -83
  187. package/dist/integrations/dynamodb.js +161 -164
  188. package/dist/integrations/elasticsearch.js +135 -138
  189. package/dist/integrations/firebase.js +154 -157
  190. package/dist/integrations/googlesheets.js +323 -327
  191. package/dist/integrations/index.js +99 -51
  192. package/dist/integrations/microsoftSqlServer.js +240 -243
  193. package/dist/integrations/mongodb.js +239 -242
  194. package/dist/integrations/mysql.js +215 -219
  195. package/dist/integrations/oracle.js +318 -322
  196. package/dist/integrations/postgres.js +262 -265
  197. package/dist/integrations/redis.js +134 -139
  198. package/dist/integrations/rest.js +289 -292
  199. package/dist/integrations/s3.js +61 -64
  200. package/dist/integrations/snowflake.js +83 -86
  201. package/dist/package.json +9 -6
  202. package/dist/tests/utilities/TestConfiguration.js +1 -1
  203. package/dist/threads/query.js +2 -2
  204. package/dist/tsconfig.build.tsbuildinfo +1 -1
  205. package/dist/utilities/fileSystem/index.js +110 -1
  206. package/dist/watch.js +77 -0
  207. package/dist/websocket.js +22 -0
  208. package/package.json +10 -7
  209. package/scripts/dev/manage.js +1 -0
  210. package/specs/openapi.json +3 -3
  211. package/specs/openapi.yaml +3 -3
  212. package/specs/resources/query.js +1 -1
  213. package/src/api/controllers/application.ts +1 -1
  214. package/src/api/controllers/component.js +21 -2
  215. package/src/api/controllers/datasource.js +21 -8
  216. package/src/api/controllers/integration.js +4 -4
  217. package/src/api/controllers/plugin/file.ts +15 -0
  218. package/src/api/controllers/plugin/github.ts +75 -0
  219. package/src/api/controllers/plugin/index.ts +212 -0
  220. package/src/api/controllers/plugin/npm.ts +56 -0
  221. package/src/api/controllers/plugin/uploaders.ts +4 -0
  222. package/src/api/controllers/plugin/url.ts +12 -0
  223. package/src/api/controllers/plugin/utils.ts +19 -0
  224. package/src/api/controllers/row/external.js +1 -1
  225. package/src/api/controllers/screen.js +66 -1
  226. package/src/api/controllers/static/index.ts +1 -0
  227. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  228. package/src/api/controllers/static/templates/preview.hbs +5 -1
  229. package/src/api/routes/application.ts +13 -2
  230. package/src/api/routes/index.ts +2 -0
  231. package/src/api/routes/plugin.ts +14 -0
  232. package/src/api/routes/public/tables.ts +1 -1
  233. package/src/api/routes/table.js +1 -1
  234. package/src/api/routes/tests/query.spec.js +8 -25
  235. package/src/api/routes/utils/validators.js +2 -1
  236. package/src/app.ts +14 -0
  237. package/src/db/utils.js +12 -0
  238. package/src/definitions/openapi.ts +3 -3
  239. package/src/environment.js +1 -0
  240. package/src/integrations/airtable.ts +116 -118
  241. package/src/integrations/arangodb.ts +87 -89
  242. package/src/integrations/base/query.ts +2 -2
  243. package/src/integrations/base/sqlTable.ts +3 -1
  244. package/src/integrations/couchdb.ts +83 -89
  245. package/src/integrations/dynamodb.ts +173 -175
  246. package/src/integrations/elasticsearch.ts +120 -122
  247. package/src/integrations/firebase.ts +157 -159
  248. package/src/integrations/googlesheets.ts +328 -338
  249. package/src/integrations/index.ts +64 -21
  250. package/src/integrations/microsoftSqlServer.ts +249 -251
  251. package/src/integrations/mongodb.ts +261 -258
  252. package/src/integrations/mysql.ts +229 -234
  253. package/src/integrations/oracle.ts +373 -380
  254. package/src/integrations/postgres.ts +264 -268
  255. package/src/integrations/redis.ts +128 -132
  256. package/src/integrations/rest.ts +324 -329
  257. package/src/integrations/s3.ts +68 -71
  258. package/src/integrations/snowflake.ts +80 -82
  259. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  260. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  261. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  262. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  263. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  264. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  265. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  266. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  267. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  268. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  269. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  270. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  271. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  272. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  273. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  274. package/src/module.d.ts +2 -0
  275. package/src/tests/utilities/TestConfiguration.js +1 -1
  276. package/src/threads/query.ts +2 -2
  277. package/src/utilities/fileSystem/index.js +129 -0
  278. package/src/watch.ts +38 -0
  279. package/src/websocket.ts +26 -0
  280. package/builder/assets/index.8f5f192a.js +0 -876
  281. package/builder/assets/vendor.5e1fe644.css +0 -1
  282. package/builder/assets/vendor.67dbd8fa.js +0 -248
@@ -16,6 +16,11 @@ const types_1 = require("@budibase/types");
16
16
  const datasource_1 = require("../definitions/datasource");
17
17
  const lodash_1 = require("lodash");
18
18
  const querystring_1 = __importDefault(require("querystring"));
19
+ const fetch = require("node-fetch");
20
+ const { formatBytes } = require("../utilities");
21
+ const { performance } = require("perf_hooks");
22
+ const FormData = require("form-data");
23
+ const { URLSearchParams } = require("url");
19
24
  const BodyTypes = {
20
25
  NONE: "none",
21
26
  FORM_DATA: "form",
@@ -49,316 +54,308 @@ const coreFields = {
49
54
  type: types_1.DatasourceFieldType.OBJECT,
50
55
  },
51
56
  };
52
- var RestModule;
53
- (function (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 { parseStringPromise: xmlParser, Builder: XmlBuilder, } = require("xml2js");
60
- const SCHEMA = {
61
- docs: "https://github.com/node-fetch/node-fetch",
62
- description: "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.",
63
- friendlyName: "REST API",
64
- type: "API",
65
- datasource: {
66
- url: {
67
- type: types_1.DatasourceFieldType.STRING,
68
- default: "",
69
- required: false,
70
- deprecated: true,
71
- },
72
- defaultHeaders: {
73
- type: types_1.DatasourceFieldType.OBJECT,
74
- required: false,
75
- default: {},
76
- },
77
- legacyHttpParser: {
78
- display: "Legacy HTTP Support",
79
- type: types_1.DatasourceFieldType.BOOLEAN,
80
- required: false,
81
- default: false,
82
- },
57
+ const { parseStringPromise: xmlParser, Builder: XmlBuilder } = require("xml2js");
58
+ const SCHEMA = {
59
+ docs: "https://github.com/node-fetch/node-fetch",
60
+ description: "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.",
61
+ friendlyName: "REST API",
62
+ type: "API",
63
+ datasource: {
64
+ url: {
65
+ type: types_1.DatasourceFieldType.STRING,
66
+ default: "",
67
+ required: false,
68
+ deprecated: true,
83
69
  },
84
- query: {
85
- create: {
86
- readable: true,
87
- displayName: "POST",
88
- type: types_1.QueryType.FIELDS,
89
- fields: coreFields,
90
- },
91
- read: {
92
- displayName: "GET",
93
- readable: true,
94
- type: types_1.QueryType.FIELDS,
95
- fields: coreFields,
96
- },
97
- update: {
98
- displayName: "PUT",
99
- readable: true,
100
- type: types_1.QueryType.FIELDS,
101
- fields: coreFields,
102
- },
103
- patch: {
104
- displayName: "PATCH",
105
- readable: true,
106
- type: types_1.QueryType.FIELDS,
107
- fields: coreFields,
108
- },
109
- delete: {
110
- displayName: "DELETE",
111
- type: types_1.QueryType.FIELDS,
112
- fields: coreFields,
113
- },
70
+ defaultHeaders: {
71
+ type: types_1.DatasourceFieldType.OBJECT,
72
+ required: false,
73
+ default: {},
114
74
  },
115
- };
116
- class RestIntegration {
117
- constructor(config) {
118
- this.headers = {};
119
- this.startTimeMs = performance.now();
120
- this.config = config;
121
- }
122
- parseResponse(response, pagination) {
123
- return __awaiter(this, void 0, void 0, function* () {
124
- let data, raw, headers;
125
- const contentType = response.headers.get("content-type") || "";
126
- try {
127
- if (contentType.includes("application/json")) {
128
- data = yield response.json();
129
- raw = JSON.stringify(data);
130
- }
131
- else if (contentType.includes("text/xml") ||
132
- contentType.includes("application/xml")) {
133
- const rawXml = yield response.text();
134
- data =
135
- (yield xmlParser(rawXml, {
136
- explicitArray: false,
137
- trim: true,
138
- explicitRoot: false,
139
- })) || {};
140
- // there is only one structure, its an array, return the array so it appears as rows
141
- const keys = Object.keys(data);
142
- if (keys.length === 1 && Array.isArray(data[keys[0]])) {
143
- data = data[keys[0]];
144
- }
145
- raw = rawXml;
146
- }
147
- else {
148
- data = yield response.text();
149
- raw = data;
150
- }
151
- }
152
- catch (err) {
153
- throw "Failed to parse response body.";
154
- }
155
- const size = formatBytes(response.headers.get("content-length") || Buffer.byteLength(raw, "utf8"));
156
- const time = `${Math.round(performance.now() - this.startTimeMs)}ms`;
157
- headers = response.headers.raw();
158
- for (let [key, value] of Object.entries(headers)) {
159
- headers[key] = Array.isArray(value) ? value[0] : value;
160
- }
161
- // Check if a pagination cursor exists in the response
162
- let nextCursor = null;
163
- if (pagination === null || pagination === void 0 ? void 0 : pagination.responseParam) {
164
- nextCursor = (0, lodash_1.get)(data, pagination.responseParam);
165
- }
166
- return {
167
- data,
168
- info: {
169
- code: response.status,
170
- size,
171
- time,
172
- },
173
- extra: {
174
- raw,
175
- headers,
176
- },
177
- pagination: {
178
- cursor: nextCursor,
179
- },
180
- };
181
- });
182
- }
183
- getUrl(path, queryString, pagination, paginationValues) {
184
- // Add pagination params to query string if required
185
- if ((pagination === null || pagination === void 0 ? void 0 : pagination.location) === "query" && paginationValues) {
186
- const { pageParam, sizeParam } = pagination;
187
- const params = new URLSearchParams();
188
- // Append page number or cursor param if configured
189
- if (pageParam && paginationValues.page != null) {
190
- params.append(pageParam, paginationValues.page);
75
+ legacyHttpParser: {
76
+ display: "Legacy HTTP Support",
77
+ type: types_1.DatasourceFieldType.BOOLEAN,
78
+ required: false,
79
+ default: false,
80
+ },
81
+ },
82
+ query: {
83
+ create: {
84
+ readable: true,
85
+ displayName: "POST",
86
+ type: types_1.QueryType.FIELDS,
87
+ fields: coreFields,
88
+ },
89
+ read: {
90
+ displayName: "GET",
91
+ readable: true,
92
+ type: types_1.QueryType.FIELDS,
93
+ fields: coreFields,
94
+ },
95
+ update: {
96
+ displayName: "PUT",
97
+ readable: true,
98
+ type: types_1.QueryType.FIELDS,
99
+ fields: coreFields,
100
+ },
101
+ patch: {
102
+ displayName: "PATCH",
103
+ readable: true,
104
+ type: types_1.QueryType.FIELDS,
105
+ fields: coreFields,
106
+ },
107
+ delete: {
108
+ displayName: "DELETE",
109
+ type: types_1.QueryType.FIELDS,
110
+ fields: coreFields,
111
+ },
112
+ },
113
+ };
114
+ class RestIntegration {
115
+ constructor(config) {
116
+ this.headers = {};
117
+ this.startTimeMs = performance.now();
118
+ this.config = config;
119
+ }
120
+ parseResponse(response, pagination) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ let data, raw, headers;
123
+ const contentType = response.headers.get("content-type") || "";
124
+ try {
125
+ if (contentType.includes("application/json")) {
126
+ data = yield response.json();
127
+ raw = JSON.stringify(data);
191
128
  }
192
- // Append page size param if configured
193
- if (sizeParam && paginationValues.limit != null) {
194
- params.append(sizeParam, paginationValues.limit);
129
+ else if (contentType.includes("text/xml") ||
130
+ contentType.includes("application/xml")) {
131
+ const rawXml = yield response.text();
132
+ data =
133
+ (yield xmlParser(rawXml, {
134
+ explicitArray: false,
135
+ trim: true,
136
+ explicitRoot: false,
137
+ })) || {};
138
+ // there is only one structure, its an array, return the array so it appears as rows
139
+ const keys = Object.keys(data);
140
+ if (keys.length === 1 && Array.isArray(data[keys[0]])) {
141
+ data = data[keys[0]];
142
+ }
143
+ raw = rawXml;
195
144
  }
196
- // Prepend query string with pagination params
197
- let paginationString = params.toString();
198
- if (paginationString) {
199
- queryString = `${paginationString}&${queryString}`;
145
+ else {
146
+ data = yield response.text();
147
+ raw = data;
200
148
  }
201
149
  }
202
- // make sure the query string is fully encoded
203
- const main = `${path}?${querystring_1.default.encode(querystring_1.default.decode(queryString))}`;
204
- let complete = main;
205
- if (this.config.url && !main.startsWith("http")) {
206
- complete = !this.config.url ? main : `${this.config.url}/${main}`;
150
+ catch (err) {
151
+ throw "Failed to parse response body.";
207
152
  }
208
- if (!complete.startsWith("http")) {
209
- complete = `http://${complete}`;
153
+ const size = formatBytes(response.headers.get("content-length") || Buffer.byteLength(raw, "utf8"));
154
+ const time = `${Math.round(performance.now() - this.startTimeMs)}ms`;
155
+ headers = response.headers.raw();
156
+ for (let [key, value] of Object.entries(headers)) {
157
+ headers[key] = Array.isArray(value) ? value[0] : value;
210
158
  }
211
- return complete;
212
- }
213
- addBody(bodyType, body, input, pagination, paginationValues) {
214
- if (!input.headers) {
215
- input.headers = {};
159
+ // Check if a pagination cursor exists in the response
160
+ let nextCursor = null;
161
+ if (pagination === null || pagination === void 0 ? void 0 : pagination.responseParam) {
162
+ nextCursor = (0, lodash_1.get)(data, pagination.responseParam);
216
163
  }
217
- if (bodyType === BodyTypes.NONE) {
218
- return input;
164
+ return {
165
+ data,
166
+ info: {
167
+ code: response.status,
168
+ size,
169
+ time,
170
+ },
171
+ extra: {
172
+ raw,
173
+ headers,
174
+ },
175
+ pagination: {
176
+ cursor: nextCursor,
177
+ },
178
+ };
179
+ });
180
+ }
181
+ getUrl(path, queryString, pagination, paginationValues) {
182
+ // Add pagination params to query string if required
183
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.location) === "query" && paginationValues) {
184
+ const { pageParam, sizeParam } = pagination;
185
+ const params = new URLSearchParams();
186
+ // Append page number or cursor param if configured
187
+ if (pageParam && paginationValues.page != null) {
188
+ params.append(pageParam, paginationValues.page);
219
189
  }
220
- let error, object = {}, string = "";
221
- try {
222
- if (body) {
223
- string = typeof body !== "string" ? JSON.stringify(body) : body;
224
- object = typeof body === "object" ? body : JSON.parse(body);
225
- }
190
+ // Append page size param if configured
191
+ if (sizeParam && paginationValues.limit != null) {
192
+ params.append(sizeParam, paginationValues.limit);
226
193
  }
227
- catch (err) {
228
- error = err;
194
+ // Prepend query string with pagination params
195
+ let paginationString = params.toString();
196
+ if (paginationString) {
197
+ queryString = `${paginationString}&${queryString}`;
229
198
  }
230
- // Util to add pagination values to a certain body type
231
- const addPaginationToBody = (insertFn) => {
232
- if ((pagination === null || pagination === void 0 ? void 0 : pagination.location) === "body") {
233
- if ((pagination === null || pagination === void 0 ? void 0 : pagination.pageParam) && (paginationValues === null || paginationValues === void 0 ? void 0 : paginationValues.page) != null) {
234
- insertFn(pagination.pageParam, paginationValues.page);
235
- }
236
- if ((pagination === null || pagination === void 0 ? void 0 : pagination.sizeParam) && (paginationValues === null || paginationValues === void 0 ? void 0 : paginationValues.limit) != null) {
237
- insertFn(pagination.sizeParam, paginationValues.limit);
238
- }
239
- }
240
- };
241
- switch (bodyType) {
242
- case BodyTypes.TEXT:
243
- // content type defaults to plaintext
244
- input.body = string;
245
- break;
246
- case BodyTypes.ENCODED:
247
- const params = new URLSearchParams();
248
- for (let [key, value] of Object.entries(object)) {
249
- params.append(key, value);
250
- }
251
- addPaginationToBody((key, value) => {
252
- params.append(key, value);
253
- });
254
- input.body = params;
255
- break;
256
- case BodyTypes.FORM_DATA:
257
- const form = new FormData();
258
- for (let [key, value] of Object.entries(object)) {
259
- form.append(key, value);
260
- }
261
- addPaginationToBody((key, value) => {
262
- form.append(key, value);
263
- });
264
- input.body = form;
265
- break;
266
- case BodyTypes.XML:
267
- if (object != null && Object.keys(object).length) {
268
- string = new XmlBuilder().buildObject(object);
269
- }
270
- input.body = string;
271
- input.headers["Content-Type"] = "application/xml";
272
- break;
273
- case BodyTypes.JSON:
274
- // if JSON error, throw it
275
- if (error) {
276
- throw "Invalid JSON for request body";
277
- }
278
- addPaginationToBody((key, value) => {
279
- object[key] = value;
280
- });
281
- input.body = JSON.stringify(object);
282
- input.headers["Content-Type"] = "application/json";
283
- break;
284
- }
285
- return input;
286
199
  }
287
- getAuthHeaders(authConfigId) {
288
- let headers = {};
289
- if (this.config.authConfigs && authConfigId) {
290
- const authConfig = this.config.authConfigs.filter(c => c._id === authConfigId)[0];
291
- // check the config still exists before proceeding
292
- // if not - do nothing
293
- if (authConfig) {
294
- let config;
295
- switch (authConfig.type) {
296
- case datasource_1.AuthType.BASIC:
297
- config = authConfig.config;
298
- headers.Authorization = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString("base64")}`;
299
- break;
300
- case datasource_1.AuthType.BEARER:
301
- config = authConfig.config;
302
- headers.Authorization = `Bearer ${config.token}`;
303
- break;
304
- }
305
- }
306
- }
307
- return headers;
200
+ // make sure the query string is fully encoded
201
+ const main = `${path}?${querystring_1.default.encode(querystring_1.default.decode(queryString))}`;
202
+ let complete = main;
203
+ if (this.config.url && !main.startsWith("http")) {
204
+ complete = !this.config.url ? main : `${this.config.url}/${main}`;
308
205
  }
309
- _req(query) {
310
- return __awaiter(this, void 0, void 0, function* () {
311
- const { path = "", queryString = "", headers = {}, method = "GET", disabledHeaders, bodyType, requestBody, authConfigId, pagination, paginationValues, } = query;
312
- const authHeaders = this.getAuthHeaders(authConfigId);
313
- this.headers = Object.assign(Object.assign(Object.assign({}, this.config.defaultHeaders), headers), authHeaders);
314
- if (disabledHeaders) {
315
- for (let headerKey of Object.keys(this.headers)) {
316
- if (disabledHeaders[headerKey]) {
317
- delete this.headers[headerKey];
318
- }
319
- }
320
- }
321
- let input = { method, headers: this.headers };
322
- input = this.addBody(bodyType, requestBody, input, pagination, paginationValues);
323
- if (this.config.legacyHttpParser) {
324
- // https://github.com/nodejs/node/issues/43798
325
- input.extraHttpOptions = { insecureHTTPParser: true };
326
- }
327
- this.startTimeMs = performance.now();
328
- const url = this.getUrl(path, queryString, pagination, paginationValues);
329
- const response = yield fetch(url, input);
330
- return yield this.parseResponse(response, pagination);
331
- });
206
+ if (!complete.startsWith("http")) {
207
+ complete = `http://${complete}`;
332
208
  }
333
- create(opts) {
334
- return __awaiter(this, void 0, void 0, function* () {
335
- return this._req(Object.assign(Object.assign({}, opts), { method: "POST" }));
336
- });
209
+ return complete;
210
+ }
211
+ addBody(bodyType, body, input, pagination, paginationValues) {
212
+ if (!input.headers) {
213
+ input.headers = {};
337
214
  }
338
- read(opts) {
339
- return __awaiter(this, void 0, void 0, function* () {
340
- return this._req(Object.assign(Object.assign({}, opts), { method: "GET" }));
341
- });
215
+ if (bodyType === BodyTypes.NONE) {
216
+ return input;
342
217
  }
343
- update(opts) {
344
- return __awaiter(this, void 0, void 0, function* () {
345
- return this._req(Object.assign(Object.assign({}, opts), { method: "PUT" }));
346
- });
218
+ let error, object = {}, string = "";
219
+ try {
220
+ if (body) {
221
+ string = typeof body !== "string" ? JSON.stringify(body) : body;
222
+ object = typeof body === "object" ? body : JSON.parse(body);
223
+ }
347
224
  }
348
- patch(opts) {
349
- return __awaiter(this, void 0, void 0, function* () {
350
- return this._req(Object.assign(Object.assign({}, opts), { method: "PATCH" }));
351
- });
225
+ catch (err) {
226
+ error = err;
227
+ }
228
+ // Util to add pagination values to a certain body type
229
+ const addPaginationToBody = (insertFn) => {
230
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.location) === "body") {
231
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.pageParam) && (paginationValues === null || paginationValues === void 0 ? void 0 : paginationValues.page) != null) {
232
+ insertFn(pagination.pageParam, paginationValues.page);
233
+ }
234
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.sizeParam) && (paginationValues === null || paginationValues === void 0 ? void 0 : paginationValues.limit) != null) {
235
+ insertFn(pagination.sizeParam, paginationValues.limit);
236
+ }
237
+ }
238
+ };
239
+ switch (bodyType) {
240
+ case BodyTypes.TEXT:
241
+ // content type defaults to plaintext
242
+ input.body = string;
243
+ break;
244
+ case BodyTypes.ENCODED:
245
+ const params = new URLSearchParams();
246
+ for (let [key, value] of Object.entries(object)) {
247
+ params.append(key, value);
248
+ }
249
+ addPaginationToBody((key, value) => {
250
+ params.append(key, value);
251
+ });
252
+ input.body = params;
253
+ break;
254
+ case BodyTypes.FORM_DATA:
255
+ const form = new FormData();
256
+ for (let [key, value] of Object.entries(object)) {
257
+ form.append(key, value);
258
+ }
259
+ addPaginationToBody((key, value) => {
260
+ form.append(key, value);
261
+ });
262
+ input.body = form;
263
+ break;
264
+ case BodyTypes.XML:
265
+ if (object != null && Object.keys(object).length) {
266
+ string = new XmlBuilder().buildObject(object);
267
+ }
268
+ input.body = string;
269
+ input.headers["Content-Type"] = "application/xml";
270
+ break;
271
+ case BodyTypes.JSON:
272
+ // if JSON error, throw it
273
+ if (error) {
274
+ throw "Invalid JSON for request body";
275
+ }
276
+ addPaginationToBody((key, value) => {
277
+ object[key] = value;
278
+ });
279
+ input.body = JSON.stringify(object);
280
+ input.headers["Content-Type"] = "application/json";
281
+ break;
352
282
  }
353
- delete(opts) {
354
- return __awaiter(this, void 0, void 0, function* () {
355
- return this._req(Object.assign(Object.assign({}, opts), { method: "DELETE" }));
356
- });
283
+ return input;
284
+ }
285
+ getAuthHeaders(authConfigId) {
286
+ let headers = {};
287
+ if (this.config.authConfigs && authConfigId) {
288
+ const authConfig = this.config.authConfigs.filter(c => c._id === authConfigId)[0];
289
+ // check the config still exists before proceeding
290
+ // if not - do nothing
291
+ if (authConfig) {
292
+ let config;
293
+ switch (authConfig.type) {
294
+ case datasource_1.AuthType.BASIC:
295
+ config = authConfig.config;
296
+ headers.Authorization = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString("base64")}`;
297
+ break;
298
+ case datasource_1.AuthType.BEARER:
299
+ config = authConfig.config;
300
+ headers.Authorization = `Bearer ${config.token}`;
301
+ break;
302
+ }
303
+ }
357
304
  }
305
+ return headers;
306
+ }
307
+ _req(query) {
308
+ return __awaiter(this, void 0, void 0, function* () {
309
+ const { path = "", queryString = "", headers = {}, method = "GET", disabledHeaders, bodyType, requestBody, authConfigId, pagination, paginationValues, } = query;
310
+ const authHeaders = this.getAuthHeaders(authConfigId);
311
+ this.headers = Object.assign(Object.assign(Object.assign({}, this.config.defaultHeaders), headers), authHeaders);
312
+ if (disabledHeaders) {
313
+ for (let headerKey of Object.keys(this.headers)) {
314
+ if (disabledHeaders[headerKey]) {
315
+ delete this.headers[headerKey];
316
+ }
317
+ }
318
+ }
319
+ let input = { method, headers: this.headers };
320
+ input = this.addBody(bodyType, requestBody, input, pagination, paginationValues);
321
+ if (this.config.legacyHttpParser) {
322
+ // https://github.com/nodejs/node/issues/43798
323
+ input.extraHttpOptions = { insecureHTTPParser: true };
324
+ }
325
+ this.startTimeMs = performance.now();
326
+ const url = this.getUrl(path, queryString, pagination, paginationValues);
327
+ const response = yield fetch(url, input);
328
+ return yield this.parseResponse(response, pagination);
329
+ });
330
+ }
331
+ create(opts) {
332
+ return __awaiter(this, void 0, void 0, function* () {
333
+ return this._req(Object.assign(Object.assign({}, opts), { method: "POST" }));
334
+ });
335
+ }
336
+ read(opts) {
337
+ return __awaiter(this, void 0, void 0, function* () {
338
+ return this._req(Object.assign(Object.assign({}, opts), { method: "GET" }));
339
+ });
358
340
  }
359
- module.exports = {
360
- schema: SCHEMA,
361
- integration: RestIntegration,
362
- AuthType: datasource_1.AuthType,
363
- };
364
- })(RestModule || (RestModule = {}));
341
+ update(opts) {
342
+ return __awaiter(this, void 0, void 0, function* () {
343
+ return this._req(Object.assign(Object.assign({}, opts), { method: "PUT" }));
344
+ });
345
+ }
346
+ patch(opts) {
347
+ return __awaiter(this, void 0, void 0, function* () {
348
+ return this._req(Object.assign(Object.assign({}, opts), { method: "PATCH" }));
349
+ });
350
+ }
351
+ delete(opts) {
352
+ return __awaiter(this, void 0, void 0, function* () {
353
+ return this._req(Object.assign(Object.assign({}, opts), { method: "DELETE" }));
354
+ });
355
+ }
356
+ }
357
+ exports.default = {
358
+ schema: SCHEMA,
359
+ integration: RestIntegration,
360
+ AuthType: datasource_1.AuthType,
361
+ };