@budibase/server 1.3.21 → 1.3.22-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.96c69636.js +1008 -0
  3. package/builder/assets/index.c167b5c3.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +308 -338
  6. package/coverage/coverage-final.json +19 -21
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +41 -8
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  13. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/index.html +27 -57
  15. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  43. package/coverage/lcov-report/api/index.html +1 -1
  44. package/coverage/lcov-report/api/index.js.html +13 -13
  45. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/index.html +1 -1
  56. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  70. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  71. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  73. package/coverage/lcov-report/automations/actions.js.html +1 -1
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  76. package/coverage/lcov-report/automations/index.html +1 -1
  77. package/coverage/lcov-report/automations/index.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/index.html +1 -1
  85. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  104. package/coverage/lcov-report/constants/index.html +1 -1
  105. package/coverage/lcov-report/constants/index.js.html +1 -1
  106. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  107. package/coverage/lcov-report/constants/screens.js.html +1 -1
  108. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  109. package/coverage/lcov-report/db/index.html +14 -14
  110. package/coverage/lcov-report/db/index.js.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  115. package/coverage/lcov-report/db/newid.js.html +2 -2
  116. package/coverage/lcov-report/db/utils.js.html +30 -18
  117. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  118. package/coverage/lcov-report/events/index.html +1 -1
  119. package/coverage/lcov-report/events/index.js.html +1 -1
  120. package/coverage/lcov-report/events/utils.js.html +1 -1
  121. package/coverage/lcov-report/index.html +44 -44
  122. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  123. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  124. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  125. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  126. package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
  127. package/coverage/lcov-report/middleware/index.html +15 -15
  128. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  129. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  130. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  131. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  132. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  133. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  134. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  135. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  136. package/coverage/lcov-report/utilities/global.js.html +16 -16
  137. package/coverage/lcov-report/utilities/index.html +15 -15
  138. package/coverage/lcov-report/utilities/index.js.html +24 -24
  139. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  140. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  141. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  142. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  143. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  144. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  146. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  147. package/coverage/lcov-report/utilities/security.js.html +2 -2
  148. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  149. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  150. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  152. package/coverage/lcov-report/utilities/users.js.html +1 -1
  153. package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
  154. package/coverage/lcov.info +521 -558
  155. package/dist/api/controllers/application.js +5 -5
  156. package/dist/api/controllers/auth.js +9 -0
  157. package/dist/api/controllers/component.js +19 -6
  158. package/dist/api/controllers/datasource.js +21 -8
  159. package/dist/api/controllers/deploy/index.js +1 -8
  160. package/dist/api/controllers/integration.js +4 -4
  161. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  162. package/dist/api/controllers/plugin/github.js +69 -0
  163. package/dist/api/controllers/plugin/index.js +144 -0
  164. package/dist/api/controllers/plugin/npm.js +58 -0
  165. package/dist/api/controllers/plugin/uploaders.js +11 -0
  166. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  167. package/dist/api/controllers/plugin/utils.js +26 -0
  168. package/dist/api/controllers/row/external.js +1 -1
  169. package/dist/api/controllers/screen.js +62 -14
  170. package/dist/api/controllers/static/index.js +1 -0
  171. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  172. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  173. package/dist/api/index.js +1 -1
  174. package/dist/api/routes/application.js +3 -2
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  177. package/dist/api/routes/public/rows.js +1 -82
  178. package/dist/api/routes/public/tables.js +1 -1
  179. package/dist/api/routes/table.js +1 -1
  180. package/dist/api/routes/utils/validators.js +20 -2
  181. package/dist/app.js +16 -1
  182. package/dist/db/utils.js +3 -0
  183. package/dist/environment.js +1 -0
  184. package/dist/integrations/airtable.js +126 -129
  185. package/dist/integrations/arangodb.js +86 -89
  186. package/dist/integrations/base/query.js +2 -2
  187. package/dist/integrations/base/sqlTable.js +3 -1
  188. package/dist/integrations/couchdb.js +80 -83
  189. package/dist/integrations/dynamodb.js +161 -164
  190. package/dist/integrations/elasticsearch.js +135 -138
  191. package/dist/integrations/firebase.js +154 -157
  192. package/dist/integrations/googlesheets.js +323 -327
  193. package/dist/integrations/index.js +99 -51
  194. package/dist/integrations/microsoftSqlServer.js +240 -243
  195. package/dist/integrations/mongodb.js +239 -242
  196. package/dist/integrations/mysql.js +215 -219
  197. package/dist/integrations/oracle.js +318 -322
  198. package/dist/integrations/postgres.js +262 -265
  199. package/dist/integrations/redis.js +134 -139
  200. package/dist/integrations/rest.js +289 -292
  201. package/dist/integrations/s3.js +61 -64
  202. package/dist/integrations/snowflake.js +83 -86
  203. package/dist/middleware/currentapp.js +2 -0
  204. package/dist/migrations/functions/backfill/global.js +0 -3
  205. package/dist/migrations/index.js +0 -10
  206. package/dist/package.json +9 -6
  207. package/dist/tests/utilities/TestConfiguration.js +1 -1
  208. package/dist/threads/query.js +2 -2
  209. package/dist/tsconfig.build.tsbuildinfo +1 -1
  210. package/dist/utilities/fileSystem/index.js +105 -1
  211. package/dist/utilities/workerRequests.js +4 -0
  212. package/dist/watch.js +77 -0
  213. package/dist/websocket.js +22 -0
  214. package/package.json +10 -7
  215. package/scripts/dev/manage.js +4 -0
  216. package/scripts/localdomain.js +3 -1
  217. package/specs/openapi.json +115 -112
  218. package/specs/openapi.yaml +96 -94
  219. package/specs/resources/misc.js +116 -0
  220. package/specs/resources/query.js +1 -1
  221. package/src/api/controllers/application.ts +1 -2
  222. package/src/api/controllers/auth.js +11 -0
  223. package/src/api/controllers/component.ts +57 -0
  224. package/src/api/controllers/datasource.js +21 -8
  225. package/src/api/controllers/deploy/index.ts +1 -6
  226. package/src/api/controllers/integration.js +4 -4
  227. package/src/api/controllers/plugin/file.ts +15 -0
  228. package/src/api/controllers/plugin/github.ts +75 -0
  229. package/src/api/controllers/plugin/index.ts +134 -0
  230. package/src/api/controllers/plugin/npm.ts +56 -0
  231. package/src/api/controllers/plugin/uploaders.ts +4 -0
  232. package/src/api/controllers/plugin/url.ts +12 -0
  233. package/src/api/controllers/plugin/utils.ts +19 -0
  234. package/src/api/controllers/public/mapping/types.ts +8 -0
  235. package/src/api/controllers/row/external.js +1 -1
  236. package/src/api/controllers/screen.ts +122 -0
  237. package/src/api/controllers/static/index.ts +1 -1
  238. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  239. package/src/api/controllers/static/templates/preview.hbs +5 -1
  240. package/src/api/index.js +1 -1
  241. package/src/api/routes/application.ts +13 -2
  242. package/src/api/routes/index.ts +2 -0
  243. package/src/api/routes/plugin.ts +14 -0
  244. package/src/api/routes/public/rows.ts +1 -82
  245. package/src/api/routes/public/tables.ts +1 -1
  246. package/src/api/routes/table.js +1 -1
  247. package/src/api/routes/tests/query.spec.js +8 -25
  248. package/src/api/routes/tests/user.spec.js +0 -2
  249. package/src/api/routes/utils/validators.js +26 -5
  250. package/src/app.ts +25 -2
  251. package/src/db/utils.js +4 -0
  252. package/src/definitions/openapi.ts +56 -55
  253. package/src/environment.js +1 -0
  254. package/src/integrations/airtable.ts +116 -118
  255. package/src/integrations/arangodb.ts +87 -89
  256. package/src/integrations/base/query.ts +2 -2
  257. package/src/integrations/base/sqlTable.ts +3 -1
  258. package/src/integrations/couchdb.ts +83 -89
  259. package/src/integrations/dynamodb.ts +173 -175
  260. package/src/integrations/elasticsearch.ts +120 -122
  261. package/src/integrations/firebase.ts +157 -159
  262. package/src/integrations/googlesheets.ts +328 -338
  263. package/src/integrations/index.ts +64 -21
  264. package/src/integrations/microsoftSqlServer.ts +249 -251
  265. package/src/integrations/mongodb.ts +261 -258
  266. package/src/integrations/mysql.ts +229 -234
  267. package/src/integrations/oracle.ts +373 -380
  268. package/src/integrations/postgres.ts +264 -268
  269. package/src/integrations/redis.ts +128 -132
  270. package/src/integrations/rest.ts +324 -329
  271. package/src/integrations/s3.ts +68 -71
  272. package/src/integrations/snowflake.ts +80 -82
  273. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  274. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  275. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  276. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  277. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  278. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  279. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  280. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  281. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  282. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  283. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  284. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  285. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  286. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  287. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  288. package/src/middleware/currentapp.js +2 -0
  289. package/src/migrations/functions/backfill/global.ts +0 -3
  290. package/src/migrations/index.ts +0 -16
  291. package/src/module.d.ts +2 -0
  292. package/src/tests/utilities/TestConfiguration.js +1 -1
  293. package/src/threads/query.ts +2 -2
  294. package/src/utilities/fileSystem/index.js +123 -0
  295. package/src/utilities/workerRequests.js +8 -0
  296. package/src/watch.ts +38 -0
  297. package/src/websocket.ts +26 -0
  298. package/builder/assets/index.8d12d461.css +0 -6
  299. package/builder/assets/index.d354271c.js +0 -879
  300. package/builder/assets/vendor.5e1fe644.css +0 -1
  301. package/builder/assets/vendor.67dbd8fa.js +0 -248
  302. package/coverage/lcov-report/api/controllers/component.js.html +0 -199
  303. package/coverage/lcov-report/api/controllers/screen.js.html +0 -259
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/api/controllers/component.js +0 -38
  306. package/src/api/controllers/screen.js +0 -58
  307. package/src/migrations/functions/developerQuota.ts +0 -15
  308. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  309. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  310. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
@@ -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
+ };