@budibase/server 1.3.20 → 1.3.21-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 (308) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.75653b72.js +1005 -0
  3. package/builder/assets/index.f1b70f52.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +451 -390
  6. package/coverage/coverage-final.json +21 -21
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +41 -8
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/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 +46 -46
  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 +13 -13
  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 +9 -9
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  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 +3 -3
  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 +46 -46
  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 +46 -40
  129. package/coverage/lcov-report/middleware/index.html +15 -15
  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 +15 -15
  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 +32 -8
  156. package/coverage/lcov.info +798 -672
  157. package/dist/api/controllers/application.js +5 -5
  158. package/dist/api/controllers/auth.js +9 -0
  159. package/dist/api/controllers/component.js +14 -1
  160. package/dist/api/controllers/datasource.js +21 -8
  161. package/dist/api/controllers/deploy/index.js +1 -8
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  164. package/dist/api/controllers/plugin/github.js +69 -0
  165. package/dist/api/controllers/plugin/index.js +200 -0
  166. package/dist/api/controllers/plugin/npm.js +58 -0
  167. package/dist/api/controllers/plugin/uploaders.js +11 -0
  168. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  169. package/dist/api/controllers/plugin/utils.js +26 -0
  170. package/dist/api/controllers/row/external.js +1 -1
  171. package/dist/api/controllers/screen.js +52 -2
  172. package/dist/api/controllers/static/index.js +1 -0
  173. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  174. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  175. package/dist/api/index.js +1 -1
  176. package/dist/api/routes/application.js +3 -2
  177. package/dist/api/routes/index.js +2 -0
  178. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  179. package/dist/api/routes/public/rows.js +1 -82
  180. package/dist/api/routes/public/tables.js +1 -1
  181. package/dist/api/routes/table.js +1 -1
  182. package/dist/api/routes/utils/validators.js +20 -2
  183. package/dist/app.js +16 -1
  184. package/dist/db/utils.js +10 -1
  185. package/dist/environment.js +1 -0
  186. package/dist/integrations/airtable.js +126 -129
  187. package/dist/integrations/arangodb.js +86 -89
  188. package/dist/integrations/base/query.js +2 -2
  189. package/dist/integrations/base/sqlTable.js +3 -1
  190. package/dist/integrations/couchdb.js +80 -83
  191. package/dist/integrations/dynamodb.js +161 -164
  192. package/dist/integrations/elasticsearch.js +135 -138
  193. package/dist/integrations/firebase.js +154 -157
  194. package/dist/integrations/googlesheets.js +323 -327
  195. package/dist/integrations/index.js +99 -51
  196. package/dist/integrations/microsoftSqlServer.js +240 -243
  197. package/dist/integrations/mongodb.js +239 -242
  198. package/dist/integrations/mysql.js +215 -219
  199. package/dist/integrations/oracle.js +318 -322
  200. package/dist/integrations/postgres.js +262 -265
  201. package/dist/integrations/redis.js +134 -139
  202. package/dist/integrations/rest.js +289 -292
  203. package/dist/integrations/s3.js +61 -64
  204. package/dist/integrations/snowflake.js +83 -86
  205. package/dist/middleware/currentapp.js +2 -0
  206. package/dist/migrations/functions/backfill/global.js +0 -3
  207. package/dist/migrations/index.js +0 -10
  208. package/dist/package.json +9 -6
  209. package/dist/tests/utilities/TestConfiguration.js +1 -1
  210. package/dist/threads/query.js +2 -2
  211. package/dist/tsconfig.build.tsbuildinfo +1 -1
  212. package/dist/utilities/fileSystem/index.js +111 -1
  213. package/dist/utilities/workerRequests.js +4 -0
  214. package/dist/watch.js +77 -0
  215. package/dist/websocket.js +22 -0
  216. package/package.json +10 -7
  217. package/scripts/dev/manage.js +4 -0
  218. package/scripts/localdomain.js +3 -1
  219. package/specs/openapi.json +115 -112
  220. package/specs/openapi.yaml +96 -94
  221. package/specs/resources/misc.js +116 -0
  222. package/specs/resources/query.js +1 -1
  223. package/src/api/controllers/application.ts +1 -2
  224. package/src/api/controllers/auth.js +11 -0
  225. package/src/api/controllers/component.js +21 -2
  226. package/src/api/controllers/datasource.js +21 -8
  227. package/src/api/controllers/deploy/index.ts +1 -6
  228. package/src/api/controllers/integration.js +4 -4
  229. package/src/api/controllers/plugin/file.ts +15 -0
  230. package/src/api/controllers/plugin/github.ts +75 -0
  231. package/src/api/controllers/plugin/index.ts +215 -0
  232. package/src/api/controllers/plugin/npm.ts +56 -0
  233. package/src/api/controllers/plugin/uploaders.ts +4 -0
  234. package/src/api/controllers/plugin/url.ts +12 -0
  235. package/src/api/controllers/plugin/utils.ts +19 -0
  236. package/src/api/controllers/public/mapping/types.ts +8 -0
  237. package/src/api/controllers/row/external.js +1 -1
  238. package/src/api/controllers/screen.js +66 -1
  239. package/src/api/controllers/static/index.ts +1 -1
  240. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  241. package/src/api/controllers/static/templates/preview.hbs +5 -1
  242. package/src/api/index.js +1 -1
  243. package/src/api/routes/application.ts +13 -2
  244. package/src/api/routes/index.ts +2 -0
  245. package/src/api/routes/plugin.ts +14 -0
  246. package/src/api/routes/public/rows.ts +1 -82
  247. package/src/api/routes/public/tables.ts +1 -1
  248. package/src/api/routes/table.js +1 -1
  249. package/src/api/routes/tests/query.spec.js +8 -25
  250. package/src/api/routes/tests/user.spec.js +0 -2
  251. package/src/api/routes/utils/validators.js +26 -5
  252. package/src/app.ts +25 -2
  253. package/src/db/utils.js +12 -0
  254. package/src/definitions/openapi.ts +56 -55
  255. package/src/environment.js +1 -0
  256. package/src/integrations/airtable.ts +116 -118
  257. package/src/integrations/arangodb.ts +87 -89
  258. package/src/integrations/base/query.ts +2 -2
  259. package/src/integrations/base/sqlTable.ts +3 -1
  260. package/src/integrations/couchdb.ts +83 -89
  261. package/src/integrations/dynamodb.ts +173 -175
  262. package/src/integrations/elasticsearch.ts +120 -122
  263. package/src/integrations/firebase.ts +157 -159
  264. package/src/integrations/googlesheets.ts +328 -338
  265. package/src/integrations/index.ts +64 -21
  266. package/src/integrations/microsoftSqlServer.ts +249 -251
  267. package/src/integrations/mongodb.ts +261 -258
  268. package/src/integrations/mysql.ts +229 -234
  269. package/src/integrations/oracle.ts +373 -380
  270. package/src/integrations/postgres.ts +264 -268
  271. package/src/integrations/redis.ts +128 -132
  272. package/src/integrations/rest.ts +324 -329
  273. package/src/integrations/s3.ts +68 -71
  274. package/src/integrations/snowflake.ts +80 -82
  275. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  276. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  277. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  278. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  279. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  280. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  281. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  282. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  283. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  284. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  285. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  286. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  287. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  288. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  289. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  290. package/src/middleware/currentapp.js +2 -0
  291. package/src/migrations/functions/backfill/global.ts +0 -3
  292. package/src/migrations/index.ts +0 -16
  293. package/src/module.d.ts +2 -0
  294. package/src/tests/utilities/TestConfiguration.js +1 -1
  295. package/src/threads/query.ts +2 -2
  296. package/src/utilities/fileSystem/index.js +130 -0
  297. package/src/utilities/workerRequests.js +8 -0
  298. package/src/watch.ts +38 -0
  299. package/src/websocket.ts +26 -0
  300. package/builder/assets/index.79165a2a.js +0 -876
  301. package/builder/assets/index.fbe5f97c.css +0 -6
  302. package/builder/assets/vendor.5e1fe644.css +0 -1
  303. package/builder/assets/vendor.67dbd8fa.js +0 -248
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/migrations/functions/developerQuota.ts +0 -15
  306. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  307. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  308. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
@@ -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
+ };