@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
@@ -57,6 +57,7 @@ module.exports = {
57
57
  DEPLOYMENT_CREDENTIALS_URL: process.env.DEPLOYMENT_CREDENTIALS_URL,
58
58
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
59
59
  DISABLE_THREADING: process.env.DISABLE_THREADING,
60
+ QUERY_THREAD_TIMEOUT: process.env.QUERY_THREAD_TIMEOUT,
60
61
  _set(key, value) {
61
62
  process.env[key] = value;
62
63
  module.exports[key] = value;
@@ -77,6 +77,17 @@ var DynamoModule;
77
77
  },
78
78
  },
79
79
  },
80
+ describe: {
81
+ type: datasource_1.QueryTypes.FIELDS,
82
+ customisable: true,
83
+ readable: true,
84
+ fields: {
85
+ table: {
86
+ type: datasource_1.DatasourceFieldTypes.STRING,
87
+ required: true,
88
+ },
89
+ },
90
+ },
80
91
  get: {
81
92
  type: datasource_1.QueryTypes.FIELDS,
82
93
  customisable: true,
@@ -161,6 +172,14 @@ var DynamoModule;
161
172
  return response;
162
173
  });
163
174
  }
175
+ describe(query) {
176
+ return __awaiter(this, void 0, void 0, function* () {
177
+ const params = {
178
+ TableName: query.table,
179
+ };
180
+ return new AWS.DynamoDB().describeTable(params).promise();
181
+ });
182
+ }
164
183
  get(query) {
165
184
  return __awaiter(this, void 0, void 0, function* () {
166
185
  const params = Object.assign({ TableName: query.table }, query.json);
@@ -39,6 +39,9 @@ const coreFields = {
39
39
  type: datasource_1.DatasourceFieldTypes.STRING,
40
40
  enum: Object.values(BodyTypes),
41
41
  },
42
+ pagination: {
43
+ type: datasource_1.DatasourceFieldTypes.OBJECT
44
+ }
42
45
  };
43
46
  var RestModule;
44
47
  (function (RestModule) {
@@ -103,7 +106,7 @@ var RestModule;
103
106
  this.startTimeMs = performance.now();
104
107
  this.config = config;
105
108
  }
106
- parseResponse(response) {
109
+ parseResponse(response, pagination) {
107
110
  return __awaiter(this, void 0, void 0, function* () {
108
111
  let data, raw, headers;
109
112
  const contentType = response.headers.get("content-type") || "";
@@ -142,6 +145,11 @@ var RestModule;
142
145
  for (let [key, value] of Object.entries(headers)) {
143
146
  headers[key] = Array.isArray(value) ? value[0] : value;
144
147
  }
148
+ // Check if a pagination cursor exists in the response
149
+ let nextCursor = null;
150
+ if (pagination === null || pagination === void 0 ? void 0 : pagination.responseParam) {
151
+ nextCursor = data === null || data === void 0 ? void 0 : data[pagination.responseParam];
152
+ }
145
153
  return {
146
154
  data,
147
155
  info: {
@@ -153,10 +161,31 @@ var RestModule;
153
161
  raw,
154
162
  headers,
155
163
  },
164
+ pagination: {
165
+ cursor: nextCursor
166
+ }
156
167
  };
157
168
  });
158
169
  }
159
- getUrl(path, queryString) {
170
+ getUrl(path, queryString, pagination, paginationValues) {
171
+ // Add pagination params to query string if required
172
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.location) === "query" && paginationValues) {
173
+ const { pageParam, sizeParam } = pagination;
174
+ const params = new URLSearchParams();
175
+ // Append page number or cursor param if configured
176
+ if (pageParam && paginationValues.page != null) {
177
+ params.append(pageParam, paginationValues.page);
178
+ }
179
+ // Append page size param if configured
180
+ if (sizeParam && paginationValues.limit != null) {
181
+ params.append(sizeParam, paginationValues.limit);
182
+ }
183
+ // Prepend query string with pagination params
184
+ let paginationString = params.toString();
185
+ if (paginationString) {
186
+ queryString = `${paginationString}&${queryString}`;
187
+ }
188
+ }
160
189
  const main = `${path}?${queryString}`;
161
190
  let complete = main;
162
191
  if (this.config.url && !main.startsWith("http")) {
@@ -167,21 +196,35 @@ var RestModule;
167
196
  }
168
197
  return complete;
169
198
  }
170
- addBody(bodyType, body, input) {
171
- let error, object, string;
199
+ addBody(bodyType, body, input, pagination, paginationValues) {
200
+ if (!input.headers) {
201
+ input.headers = {};
202
+ }
203
+ if (bodyType === BodyTypes.NONE) {
204
+ return input;
205
+ }
206
+ let error, object = {}, string = "";
172
207
  try {
173
- string = typeof body !== "string" ? JSON.stringify(body) : body;
174
- object = typeof body === "object" ? body : JSON.parse(body);
208
+ if (body) {
209
+ string = typeof body !== "string" ? JSON.stringify(body) : body;
210
+ object = typeof body === "object" ? body : JSON.parse(body);
211
+ }
175
212
  }
176
213
  catch (err) {
177
214
  error = err;
178
215
  }
179
- if (!input.headers) {
180
- input.headers = {};
181
- }
216
+ // Util to add pagination values to a certain body type
217
+ const addPaginationToBody = (insertFn) => {
218
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.location) === "body") {
219
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.pageParam) && (paginationValues === null || paginationValues === void 0 ? void 0 : paginationValues.page) != null) {
220
+ insertFn(pagination.pageParam, paginationValues.page);
221
+ }
222
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination.sizeParam) && (paginationValues === null || paginationValues === void 0 ? void 0 : paginationValues.limit) != null) {
223
+ insertFn(pagination.sizeParam, paginationValues.limit);
224
+ }
225
+ }
226
+ };
182
227
  switch (bodyType) {
183
- case BodyTypes.NONE:
184
- break;
185
228
  case BodyTypes.TEXT:
186
229
  // content type defaults to plaintext
187
230
  input.body = string;
@@ -191,6 +234,9 @@ var RestModule;
191
234
  for (let [key, value] of Object.entries(object)) {
192
235
  params.append(key, value);
193
236
  }
237
+ addPaginationToBody((key, value) => {
238
+ params.append(key, value);
239
+ });
194
240
  input.body = params;
195
241
  break;
196
242
  case BodyTypes.FORM_DATA:
@@ -198,6 +244,9 @@ var RestModule;
198
244
  for (let [key, value] of Object.entries(object)) {
199
245
  form.append(key, value);
200
246
  }
247
+ addPaginationToBody((key, value) => {
248
+ form.append(key, value);
249
+ });
201
250
  input.body = form;
202
251
  break;
203
252
  case BodyTypes.XML:
@@ -207,13 +256,15 @@ var RestModule;
207
256
  input.body = string;
208
257
  input.headers["Content-Type"] = "application/xml";
209
258
  break;
210
- default:
211
259
  case BodyTypes.JSON:
212
260
  // if JSON error, throw it
213
261
  if (error) {
214
262
  throw "Invalid JSON for request body";
215
263
  }
216
- input.body = string;
264
+ addPaginationToBody((key, value) => {
265
+ object[key] = value;
266
+ });
267
+ input.body = JSON.stringify(object);
217
268
  input.headers["Content-Type"] = "application/json";
218
269
  break;
219
270
  }
@@ -243,7 +294,7 @@ var RestModule;
243
294
  }
244
295
  _req(query) {
245
296
  return __awaiter(this, void 0, void 0, function* () {
246
- const { path = "", queryString = "", headers = {}, method = "GET", disabledHeaders, bodyType, requestBody, authConfigId, } = query;
297
+ const { path = "", queryString = "", headers = {}, method = "GET", disabledHeaders, bodyType, requestBody, authConfigId, pagination, paginationValues } = query;
247
298
  const authHeaders = this.getAuthHeaders(authConfigId);
248
299
  this.headers = Object.assign(Object.assign(Object.assign({}, this.config.defaultHeaders), headers), authHeaders);
249
300
  if (disabledHeaders) {
@@ -254,13 +305,11 @@ var RestModule;
254
305
  }
255
306
  }
256
307
  let input = { method, headers: this.headers };
257
- if (requestBody) {
258
- input = this.addBody(bodyType, requestBody, input);
259
- }
308
+ input = this.addBody(bodyType, requestBody, input, pagination, paginationValues);
260
309
  this.startTimeMs = performance.now();
261
- const url = this.getUrl(path, queryString);
310
+ const url = this.getUrl(path, queryString, pagination, paginationValues);
262
311
  const response = yield fetch(url, input);
263
- return yield this.parseResponse(response);
312
+ return yield this.parseResponse(response, pagination);
264
313
  });
265
314
  }
266
315
  create(opts) {
@@ -20,7 +20,7 @@ var S3Module;
20
20
  datasource: {
21
21
  region: {
22
22
  type: "string",
23
- required: true,
23
+ required: false,
24
24
  default: "us-east-1",
25
25
  },
26
26
  accessKeyId: {
@@ -31,6 +31,15 @@ var S3Module;
31
31
  type: "password",
32
32
  required: true,
33
33
  },
34
+ endpoint: {
35
+ type: "string",
36
+ required: false,
37
+ },
38
+ signatureVersion: {
39
+ type: "string",
40
+ required: false,
41
+ default: "v4"
42
+ },
34
43
  },
35
44
  query: {
36
45
  read: {
@@ -47,13 +56,13 @@ var S3Module;
47
56
  class S3Integration {
48
57
  constructor(config) {
49
58
  this.config = config;
50
- this.connectionPromise = this.connect();
51
- this.client = new AWS.S3();
52
- }
53
- connect() {
54
- return __awaiter(this, void 0, void 0, function* () {
55
- AWS.config.update(this.config);
56
- });
59
+ if (this.config.endpoint) {
60
+ this.config.s3ForcePathStyle = true;
61
+ }
62
+ else {
63
+ delete this.config.endpoint;
64
+ }
65
+ this.client = new AWS.S3(this.config);
57
66
  }
58
67
  read(query) {
59
68
  return __awaiter(this, void 0, void 0, function* () {
package/dist/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.12",
4
+ "version": "1.0.27-alpha.13",
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.12",
74
- "@budibase/client": "^1.0.27-alpha.12",
75
- "@budibase/string-templates": "^1.0.27-alpha.12",
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",
76
76
  "@bull-board/api": "^3.7.0",
77
77
  "@bull-board/koa": "^3.7.0",
78
78
  "@elastic/elasticsearch": "7.10.0",
@@ -14,6 +14,8 @@ const ScriptRunner = require("../utilities/scriptRunner");
14
14
  const { integrations } = require("../integrations");
15
15
  const { processStringSync } = require("@budibase/string-templates");
16
16
  const CouchDB = require("../db");
17
+ const IS_TRIPLE_BRACE = new RegExp(/^{{3}.*}{3}$/);
18
+ const IS_HANDLEBARS = new RegExp(/^{{2}.*}{2}$/);
17
19
  class QueryRunner {
18
20
  constructor(input, flags = { noRecursiveQuery: false }) {
19
21
  this.appId = input.appId;
@@ -21,6 +23,7 @@ class QueryRunner {
21
23
  this.queryVerb = input.queryVerb;
22
24
  this.fields = input.fields;
23
25
  this.parameters = input.parameters;
26
+ this.pagination = input.pagination;
24
27
  this.transformer = input.transformer;
25
28
  this.queryId = input.queryId;
26
29
  this.noRecursiveQuery = flags.noRecursiveQuery;
@@ -36,18 +39,23 @@ class QueryRunner {
36
39
  let { datasource, fields, queryVerb, transformer } = this;
37
40
  // pre-query, make sure datasource variables are added to parameters
38
41
  const parameters = yield this.addDatasourceVariables();
39
- const query = threadUtils.enrichQueryFields(fields, parameters);
42
+ let query = this.enrichQueryFields(fields, parameters);
43
+ // Add pagination values for REST queries
44
+ if (this.pagination) {
45
+ query.paginationValues = this.pagination;
46
+ }
40
47
  const Integration = integrations[datasource.source];
41
48
  if (!Integration) {
42
49
  throw "Integration type does not exist.";
43
50
  }
44
51
  const integration = new Integration(datasource.config);
45
52
  let output = threadUtils.formatResponse(yield integration[queryVerb](query));
46
- let rows = output, info = undefined, extra = undefined;
53
+ let rows = output, info = undefined, extra = undefined, pagination = undefined;
47
54
  if (threadUtils.hasExtraData(output)) {
48
55
  rows = output.data;
49
56
  info = output.info;
50
57
  extra = output.extra;
58
+ pagination = output.pagination;
51
59
  }
52
60
  // transform as required
53
61
  if (transformer) {
@@ -80,7 +88,7 @@ class QueryRunner {
80
88
  if (integration.end) {
81
89
  integration.end();
82
90
  }
83
- return { rows, keys, info, extra };
91
+ return { rows, keys, info, extra, pagination };
84
92
  });
85
93
  }
86
94
  runAnotherQuery(queryId, parameters) {
@@ -157,6 +165,47 @@ class QueryRunner {
157
165
  return parameters;
158
166
  });
159
167
  }
168
+ enrichQueryFields(fields, parameters = {}) {
169
+ const enrichedQuery = {};
170
+ // enrich the fields with dynamic parameters
171
+ for (let key of Object.keys(fields)) {
172
+ if (fields[key] == null) {
173
+ continue;
174
+ }
175
+ if (typeof fields[key] === "object") {
176
+ // enrich nested fields object
177
+ enrichedQuery[key] = this.enrichQueryFields(fields[key], parameters);
178
+ }
179
+ else if (typeof fields[key] === "string") {
180
+ // enrich string value as normal
181
+ let value = fields[key];
182
+ // add triple brace to avoid escaping e.g. '=' in cookie header
183
+ if (IS_HANDLEBARS.test(value) && !IS_TRIPLE_BRACE.test(value)) {
184
+ value = `{${value}}`;
185
+ }
186
+ enrichedQuery[key] = processStringSync(value, parameters, {
187
+ noHelpers: true,
188
+ });
189
+ }
190
+ else {
191
+ enrichedQuery[key] = fields[key];
192
+ }
193
+ }
194
+ if (enrichedQuery.json ||
195
+ enrichedQuery.customData ||
196
+ enrichedQuery.requestBody) {
197
+ try {
198
+ enrichedQuery.json = JSON.parse(enrichedQuery.json ||
199
+ enrichedQuery.customData ||
200
+ enrichedQuery.requestBody);
201
+ }
202
+ catch (err) {
203
+ // no json found, ignore
204
+ }
205
+ delete enrichedQuery.customData;
206
+ }
207
+ return enrichedQuery;
208
+ }
160
209
  }
161
210
  module.exports = (input, callback) => {
162
211
  const Runner = new QueryRunner(input);
@@ -13,11 +13,8 @@ const CouchDB = require("../db");
13
13
  const { init } = require("@budibase/backend-core");
14
14
  const redis = require("@budibase/backend-core/redis");
15
15
  const { SEPARATOR } = require("@budibase/backend-core/db");
16
- const { processStringSync } = require("@budibase/string-templates");
17
16
  const VARIABLE_TTL_SECONDS = 3600;
18
17
  let client;
19
- const IS_TRIPLE_BRACE = new RegExp(/^{{3}.*}{3}$/);
20
- const IS_HANDLEBARS = new RegExp(/^{{2}.*}{2}$/);
21
18
  function getClient() {
22
19
  return __awaiter(this, void 0, void 0, function* () {
23
20
  if (!client) {
@@ -75,44 +72,3 @@ exports.hasExtraData = response => {
75
72
  response.data != null &&
76
73
  response.info != null);
77
74
  };
78
- exports.enrichQueryFields = (fields, parameters = {}) => {
79
- const enrichedQuery = {};
80
- // enrich the fields with dynamic parameters
81
- for (let key of Object.keys(fields)) {
82
- if (fields[key] == null) {
83
- continue;
84
- }
85
- if (typeof fields[key] === "object") {
86
- // enrich nested fields object
87
- enrichedQuery[key] = this.enrichQueryFields(fields[key], parameters);
88
- }
89
- else if (typeof fields[key] === "string") {
90
- // enrich string value as normal
91
- let value = fields[key];
92
- // add triple brace to avoid escaping e.g. '=' in cookie header
93
- if (IS_HANDLEBARS.test(value) && !IS_TRIPLE_BRACE.test(value)) {
94
- value = `{${value}}`;
95
- }
96
- enrichedQuery[key] = processStringSync(value, parameters, {
97
- noHelpers: true,
98
- });
99
- }
100
- else {
101
- enrichedQuery[key] = fields[key];
102
- }
103
- }
104
- if (enrichedQuery.json ||
105
- enrichedQuery.customData ||
106
- enrichedQuery.requestBody) {
107
- try {
108
- enrichedQuery.json = JSON.parse(enrichedQuery.json ||
109
- enrichedQuery.customData ||
110
- enrichedQuery.requestBody);
111
- }
112
- catch (err) {
113
- // no json found, ignore
114
- }
115
- delete enrichedQuery.customData;
116
- }
117
- return enrichedQuery;
118
- };