@budibase/server 1.3.21-alpha.1 → 1.3.21

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