@budibase/server 1.0.27-alpha.13 → 1.0.27-alpha.14

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 (189) hide show
  1. package/builder/assets/{index.176f00e0.css → index.39e01193.css} +1 -1
  2. package/builder/assets/{index.5776ef20.js → index.411e6960.js} +232 -232
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +155 -152
  5. package/coverage/coverage-final.json +4 -4
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  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/permission.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +7 -4
  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 +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.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 +1 -1
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  48. package/coverage/lcov-report/api/index.html +1 -1
  49. package/coverage/lcov-report/api/index.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/index.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  80. package/coverage/lcov-report/automations/actions.js.html +1 -1
  81. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  82. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  83. package/coverage/lcov-report/automations/index.html +1 -1
  84. package/coverage/lcov-report/automations/index.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/index.html +1 -1
  94. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  112. package/coverage/lcov-report/automations/utils.js.html +1 -1
  113. package/coverage/lcov-report/constants/index.html +1 -1
  114. package/coverage/lcov-report/constants/index.js.html +1 -1
  115. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  116. package/coverage/lcov-report/constants/screens.js.html +1 -1
  117. package/coverage/lcov-report/db/client.js.html +1 -1
  118. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  119. package/coverage/lcov-report/db/index.html +1 -1
  120. package/coverage/lcov-report/db/index.js.html +1 -1
  121. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  122. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  123. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  124. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  125. package/coverage/lcov-report/db/newid.js.html +1 -1
  126. package/coverage/lcov-report/db/utils.js.html +1 -1
  127. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  128. package/coverage/lcov-report/events/index.html +1 -1
  129. package/coverage/lcov-report/events/index.js.html +1 -1
  130. package/coverage/lcov-report/events/utils.js.html +1 -1
  131. package/coverage/lcov-report/index.html +16 -16
  132. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  133. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  134. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  135. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  136. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  137. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  138. package/coverage/lcov-report/middleware/index.html +1 -1
  139. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  140. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  141. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  142. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  143. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  144. package/coverage/lcov-report/threads/automation.js.html +1 -1
  145. package/coverage/lcov-report/threads/index.html +28 -28
  146. package/coverage/lcov-report/threads/index.js.html +1 -1
  147. package/coverage/lcov-report/threads/query.js.html +181 -13
  148. package/coverage/lcov-report/threads/utils.js.html +11 -161
  149. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  150. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  151. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  152. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  153. package/coverage/lcov-report/utilities/global.js.html +1 -1
  154. package/coverage/lcov-report/utilities/index.html +4 -4
  155. package/coverage/lcov-report/utilities/index.js.html +9 -9
  156. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  157. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  158. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  159. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  160. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  161. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  163. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  164. package/coverage/lcov-report/utilities/security.js.html +1 -1
  165. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  166. package/coverage/lcov-report/utilities/users.js.html +1 -1
  167. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  168. package/coverage/lcov.info +291 -284
  169. package/dist/api/controllers/query/index.js +3 -2
  170. package/dist/environment.js +1 -0
  171. package/dist/integrations/dynamodb.js +19 -0
  172. package/dist/integrations/rest.js +68 -19
  173. package/dist/integrations/s3.js +17 -8
  174. package/dist/package.json +4 -4
  175. package/dist/threads/query.js +52 -3
  176. package/dist/threads/utils.js +0 -44
  177. package/dist/tsconfig.tsbuildinfo +1 -1
  178. package/dist/utilities/index.js +1 -1
  179. package/package.json +5 -5
  180. package/src/api/controllers/query/index.js +3 -2
  181. package/src/definitions/datasource.ts +15 -0
  182. package/src/environment.js +1 -0
  183. package/src/integrations/dynamodb.ts +18 -0
  184. package/src/integrations/rest.ts +78 -17
  185. package/src/integrations/s3.ts +18 -7
  186. package/src/integrations/tests/rest.spec.js +287 -24
  187. package/src/threads/query.js +59 -3
  188. package/src/threads/utils.js +0 -50
  189. package/src/utilities/index.js +1 -1
@@ -38,7 +38,7 @@ exports.checkSlashesInUrl = url => {
38
38
  * @return {string} The base URL of the object store (MinIO or S3).
39
39
  */
40
40
  exports.objectStoreUrl = () => {
41
- if (env.SELF_HOSTED) {
41
+ if (env.SELF_HOSTED || env.MINIO_URL) {
42
42
  // can use a relative url for this as all goes through the proxy (this is hosted in minio)
43
43
  return OBJ_STORE_DIRECTORY;
44
44
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.27-alpha.13",
4
+ "version": "1.0.27-alpha.14",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -70,9 +70,9 @@
70
70
  "license": "GPL-3.0",
71
71
  "dependencies": {
72
72
  "@apidevtools/swagger-parser": "^10.0.3",
73
- "@budibase/backend-core": "^1.0.27-alpha.13",
74
- "@budibase/client": "^1.0.27-alpha.13",
75
- "@budibase/string-templates": "^1.0.27-alpha.13",
73
+ "@budibase/backend-core": "^1.0.27-alpha.14",
74
+ "@budibase/client": "^1.0.27-alpha.14",
75
+ "@budibase/string-templates": "^1.0.27-alpha.14",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -165,5 +165,5 @@
165
165
  "optionalDependencies": {
166
166
  "oracledb": "^5.3.0"
167
167
  },
168
- "gitHead": "e48e21ffb846288ce46883674626b79755617445"
168
+ "gitHead": "f9cd961be007bc9c360e15c3c09ec6889ed47b51"
169
169
  }
@@ -140,11 +140,12 @@ async function execute(ctx, opts = { rowsOnly: false }) {
140
140
 
141
141
  // call the relevant CRUD method on the integration class
142
142
  try {
143
- const { rows, extra } = await Runner.run({
143
+ const { rows, pagination, extra } = await Runner.run({
144
144
  appId: ctx.appId,
145
145
  datasource,
146
146
  queryVerb: query.queryVerb,
147
147
  fields: query.fields,
148
+ pagination: ctx.request.body.pagination,
148
149
  parameters: ctx.request.body.parameters,
149
150
  transformer: query.transformer,
150
151
  queryId: ctx.params.queryId,
@@ -152,7 +153,7 @@ async function execute(ctx, opts = { rowsOnly: false }) {
152
153
  if (opts && opts.rowsOnly) {
153
154
  ctx.body = rows
154
155
  } else {
155
- ctx.body = { data: rows, ...extra }
156
+ ctx.body = { data: rows, pagination, ...extra }
156
157
  }
157
158
  } catch (err) {
158
159
  ctx.throw(400, err)
@@ -232,6 +232,8 @@ export interface RestQueryFields {
232
232
  json: object
233
233
  method: string
234
234
  authConfigId: string
235
+ pagination: PaginationConfig | null
236
+ paginationValues: PaginationValues | null
235
237
  }
236
238
 
237
239
  export interface RestConfig {
@@ -252,6 +254,19 @@ export interface RestConfig {
252
254
  ]
253
255
  }
254
256
 
257
+ export interface PaginationConfig {
258
+ type: string
259
+ location: string
260
+ pageParam: string
261
+ sizeParam: string | null
262
+ responseParam: string | null
263
+ }
264
+
265
+ export interface PaginationValues {
266
+ page: string | number | null
267
+ limit: number | null
268
+ }
269
+
255
270
  export interface Query {
256
271
  _id?: string
257
272
  datasourceId: string
@@ -65,6 +65,7 @@ module.exports = {
65
65
  DEPLOYMENT_CREDENTIALS_URL: process.env.DEPLOYMENT_CREDENTIALS_URL,
66
66
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
67
67
  DISABLE_THREADING: process.env.DISABLE_THREADING,
68
+ QUERY_THREAD_TIMEOUT: process.env.QUERY_THREAD_TIMEOUT,
68
69
  _set(key, value) {
69
70
  process.env[key] = value
70
71
  module.exports[key] = value
@@ -80,6 +80,17 @@ module DynamoModule {
80
80
  },
81
81
  },
82
82
  },
83
+ describe: {
84
+ type: QueryTypes.FIELDS,
85
+ customisable: true,
86
+ readable: true,
87
+ fields: {
88
+ table: {
89
+ type: DatasourceFieldTypes.STRING,
90
+ required: true,
91
+ },
92
+ },
93
+ },
83
94
  get: {
84
95
  type: QueryTypes.FIELDS,
85
96
  customisable: true,
@@ -180,6 +191,13 @@ module DynamoModule {
180
191
  return response
181
192
  }
182
193
 
194
+ async describe(query: { table: string }) {
195
+ const params = {
196
+ TableName: query.table,
197
+ }
198
+ return new AWS.DynamoDB().describeTable(params).promise()
199
+ }
200
+
183
201
  async get(query: { table: string; json: object }) {
184
202
  const params = {
185
203
  TableName: query.table,
@@ -4,9 +4,11 @@ import {
4
4
  QueryTypes,
5
5
  RestConfig,
6
6
  RestQueryFields as RestQuery,
7
+ PaginationConfig,
7
8
  AuthType,
8
9
  BasicAuthConfig,
9
10
  BearerAuthConfig,
11
+ PaginationValues,
10
12
  } from "../definitions/datasource"
11
13
  import { IntegrationBase } from "./base/IntegrationBase"
12
14
 
@@ -40,6 +42,9 @@ const coreFields = {
40
42
  type: DatasourceFieldTypes.STRING,
41
43
  enum: Object.values(BodyTypes),
42
44
  },
45
+ pagination: {
46
+ type: DatasourceFieldTypes.OBJECT
47
+ }
43
48
  }
44
49
 
45
50
  module RestModule {
@@ -115,7 +120,7 @@ module RestModule {
115
120
  this.config = config
116
121
  }
117
122
 
118
- async parseResponse(response: any) {
123
+ async parseResponse(response: any, pagination: PaginationConfig | null) {
119
124
  let data, raw, headers
120
125
  const contentType = response.headers.get("content-type") || ""
121
126
  try {
@@ -154,6 +159,13 @@ module RestModule {
154
159
  for (let [key, value] of Object.entries(headers)) {
155
160
  headers[key] = Array.isArray(value) ? value[0] : value
156
161
  }
162
+
163
+ // Check if a pagination cursor exists in the response
164
+ let nextCursor = null
165
+ if (pagination?.responseParam) {
166
+ nextCursor = data?.[pagination.responseParam]
167
+ }
168
+
157
169
  return {
158
170
  data,
159
171
  info: {
@@ -165,10 +177,35 @@ module RestModule {
165
177
  raw,
166
178
  headers,
167
179
  },
180
+ pagination: {
181
+ cursor: nextCursor
182
+ }
168
183
  }
169
184
  }
170
185
 
171
- getUrl(path: string, queryString: string): string {
186
+ getUrl(path: string, queryString: string, pagination: PaginationConfig | null, paginationValues: PaginationValues | null): string {
187
+ // Add pagination params to query string if required
188
+ if (pagination?.location === "query" && paginationValues) {
189
+ const { pageParam, sizeParam } = pagination
190
+ const params = new URLSearchParams()
191
+
192
+ // Append page number or cursor param if configured
193
+ if (pageParam && paginationValues.page != null) {
194
+ params.append(pageParam, paginationValues.page)
195
+ }
196
+
197
+ // Append page size param if configured
198
+ if (sizeParam && paginationValues.limit != null) {
199
+ params.append(sizeParam, paginationValues.limit)
200
+ }
201
+
202
+ // Prepend query string with pagination params
203
+ let paginationString = params.toString()
204
+ if (paginationString) {
205
+ queryString = `${paginationString}&${queryString}`
206
+ }
207
+ }
208
+
172
209
  const main = `${path}?${queryString}`
173
210
  let complete = main
174
211
  if (this.config.url && !main.startsWith("http")) {
@@ -180,20 +217,36 @@ module RestModule {
180
217
  return complete
181
218
  }
182
219
 
183
- addBody(bodyType: string, body: string | any, input: any) {
184
- let error, object, string
220
+ addBody(bodyType: string, body: string | any, input: any, pagination: PaginationConfig | null, paginationValues: PaginationValues | null) {
221
+ if (!input.headers) {
222
+ input.headers = {}
223
+ }
224
+ if (bodyType === BodyTypes.NONE) {
225
+ return input
226
+ }
227
+ let error, object: any = {}, string = ""
185
228
  try {
186
- string = typeof body !== "string" ? JSON.stringify(body) : body
187
- object = typeof body === "object" ? body : JSON.parse(body)
229
+ if (body) {
230
+ string = typeof body !== "string" ? JSON.stringify(body) : body
231
+ object = typeof body === "object" ? body : JSON.parse(body)
232
+ }
188
233
  } catch (err) {
189
234
  error = err
190
235
  }
191
- if (!input.headers) {
192
- input.headers = {}
236
+
237
+ // Util to add pagination values to a certain body type
238
+ const addPaginationToBody = (insertFn: Function) => {
239
+ if (pagination?.location === "body") {
240
+ if (pagination?.pageParam && paginationValues?.page != null) {
241
+ insertFn(pagination.pageParam, paginationValues.page)
242
+ }
243
+ if (pagination?.sizeParam && paginationValues?.limit != null) {
244
+ insertFn(pagination.sizeParam, paginationValues.limit)
245
+ }
246
+ }
193
247
  }
248
+
194
249
  switch (bodyType) {
195
- case BodyTypes.NONE:
196
- break
197
250
  case BodyTypes.TEXT:
198
251
  // content type defaults to plaintext
199
252
  input.body = string
@@ -203,6 +256,9 @@ module RestModule {
203
256
  for (let [key, value] of Object.entries(object)) {
204
257
  params.append(key, value)
205
258
  }
259
+ addPaginationToBody((key: string, value: any) => {
260
+ params.append(key, value)
261
+ })
206
262
  input.body = params
207
263
  break
208
264
  case BodyTypes.FORM_DATA:
@@ -210,6 +266,9 @@ module RestModule {
210
266
  for (let [key, value] of Object.entries(object)) {
211
267
  form.append(key, value)
212
268
  }
269
+ addPaginationToBody((key: string, value: any) => {
270
+ form.append(key, value)
271
+ })
213
272
  input.body = form
214
273
  break
215
274
  case BodyTypes.XML:
@@ -219,13 +278,15 @@ module RestModule {
219
278
  input.body = string
220
279
  input.headers["Content-Type"] = "application/xml"
221
280
  break
222
- default:
223
281
  case BodyTypes.JSON:
224
282
  // if JSON error, throw it
225
283
  if (error) {
226
284
  throw "Invalid JSON for request body"
227
285
  }
228
- input.body = string
286
+ addPaginationToBody((key: string, value: any) => {
287
+ object[key] = value
288
+ })
289
+ input.body = JSON.stringify(object)
229
290
  input.headers["Content-Type"] = "application/json"
230
291
  break
231
292
  }
@@ -271,6 +332,8 @@ module RestModule {
271
332
  bodyType,
272
333
  requestBody,
273
334
  authConfigId,
335
+ pagination,
336
+ paginationValues
274
337
  } = query
275
338
  const authHeaders = this.getAuthHeaders(authConfigId)
276
339
 
@@ -289,14 +352,12 @@ module RestModule {
289
352
  }
290
353
 
291
354
  let input: any = { method, headers: this.headers }
292
- if (requestBody) {
293
- input = this.addBody(bodyType, requestBody, input)
294
- }
355
+ input = this.addBody(bodyType, requestBody, input, pagination, paginationValues)
295
356
 
296
357
  this.startTimeMs = performance.now()
297
- const url = this.getUrl(path, queryString)
358
+ const url = this.getUrl(path, queryString, pagination, paginationValues)
298
359
  const response = await fetch(url, input)
299
- return await this.parseResponse(response)
360
+ return await this.parseResponse(response, pagination)
300
361
  }
301
362
 
302
363
  async create(opts: RestQuery) {
@@ -8,6 +8,8 @@ module S3Module {
8
8
  region: string
9
9
  accessKeyId: string
10
10
  secretAccessKey: string
11
+ s3ForcePathStyle: boolean
12
+ endpoint?: string
11
13
  }
12
14
 
13
15
  const SCHEMA: Integration = {
@@ -18,7 +20,7 @@ module S3Module {
18
20
  datasource: {
19
21
  region: {
20
22
  type: "string",
21
- required: true,
23
+ required: false,
22
24
  default: "us-east-1",
23
25
  },
24
26
  accessKeyId: {
@@ -29,6 +31,15 @@ module S3Module {
29
31
  type: "password",
30
32
  required: true,
31
33
  },
34
+ endpoint: {
35
+ type: "string",
36
+ required: false,
37
+ },
38
+ signatureVersion: {
39
+ type: "string",
40
+ required: false,
41
+ default: "v4"
42
+ },
32
43
  },
33
44
  query: {
34
45
  read: {
@@ -46,16 +57,16 @@ module S3Module {
46
57
  class S3Integration implements IntegrationBase {
47
58
  private readonly config: S3Config
48
59
  private client: any
49
- private connectionPromise: Promise<any>
50
60
 
51
61
  constructor(config: S3Config) {
52
62
  this.config = config
53
- this.connectionPromise = this.connect()
54
- this.client = new AWS.S3()
55
- }
63
+ if (this.config.endpoint) {
64
+ this.config.s3ForcePathStyle = true
65
+ } else {
66
+ delete this.config.endpoint
67
+ }
56
68
 
57
- async connect() {
58
- AWS.config.update(this.config)
69
+ this.client = new AWS.S3(this.config)
59
70
  }
60
71
 
61
72
  async read(query: { bucket: string }) {