@budibase/server 1.0.27-alpha.13 → 1.0.27-alpha.17
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.
- package/builder/assets/{index.176f00e0.css → index.39e01193.css} +1 -1
- package/builder/assets/{index.5776ef20.js → index.4ba89e2d.js} +232 -232
- package/builder/index.html +2 -2
- package/coverage/clover.xml +155 -152
- package/coverage/coverage-final.json +4 -4
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/application.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +1 -1
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.js.html +7 -4
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/application.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/row.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/automations/utils.js.html +1 -1
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/client.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- package/coverage/lcov-report/db/newid.js.html +1 -1
- package/coverage/lcov-report/db/utils.js.html +1 -1
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +16 -16
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
- package/coverage/lcov-report/middleware/authorized.js.html +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +28 -28
- package/coverage/lcov-report/threads/index.js.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +181 -13
- package/coverage/lcov-report/threads/utils.js.html +11 -161
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +1 -1
- package/coverage/lcov-report/utilities/index.html +4 -4
- package/coverage/lcov-report/utilities/index.js.html +9 -9
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +1 -1
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +291 -284
- package/dist/api/controllers/query/index.js +3 -2
- package/dist/environment.js +1 -0
- package/dist/integrations/dynamodb.js +19 -0
- package/dist/integrations/rest.js +68 -19
- package/dist/integrations/s3.js +17 -8
- package/dist/integrations/utils.js +40 -37
- package/dist/package.json +4 -4
- package/dist/threads/query.js +52 -3
- package/dist/threads/utils.js +0 -44
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/index.js +1 -1
- package/package.json +5 -5
- package/src/api/controllers/query/index.js +3 -2
- package/src/definitions/datasource.ts +15 -0
- package/src/environment.js +1 -0
- package/src/integrations/dynamodb.ts +18 -0
- package/src/integrations/rest.ts +97 -17
- package/src/integrations/s3.ts +18 -7
- package/src/integrations/tests/rest.spec.js +287 -24
- package/src/integrations/utils.ts +8 -7
- package/src/threads/query.js +59 -3
- package/src/threads/utils.js +0 -50
- package/src/utilities/index.js +1 -1
package/dist/environment.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
174
|
-
|
|
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
|
-
|
|
180
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|
package/dist/integrations/s3.js
CHANGED
|
@@ -20,7 +20,7 @@ var S3Module;
|
|
|
20
20
|
datasource: {
|
|
21
21
|
region: {
|
|
22
22
|
type: "string",
|
|
23
|
-
required:
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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* () {
|
|
@@ -2,39 +2,39 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.finaliseExternalTables = exports.isIsoDateString = exports.isSQL = exports.getSqlQuery = exports.convertSqlType = exports.breakRowIdField = exports.convertRowId = exports.isRowId = exports.generateRowIdField = exports.breakExternalTableId = exports.buildExternalTableId = exports.isExternalTable = exports.SqlClients = void 0;
|
|
4
4
|
const datasource_1 = require("../definitions/datasource");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`;
|
|
5
|
+
const utils_1 = require("../db/utils");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
const DOUBLE_SEPARATOR = `${utils_1.SEPARATOR}${utils_1.SEPARATOR}`;
|
|
8
8
|
const ROW_ID_REGEX = /^\[.*]$/g;
|
|
9
9
|
const SQL_TYPE_MAP = {
|
|
10
|
-
text: FieldTypes.LONGFORM,
|
|
11
|
-
varchar: FieldTypes.STRING,
|
|
12
|
-
integer: FieldTypes.NUMBER,
|
|
13
|
-
bigint: FieldTypes.NUMBER,
|
|
14
|
-
decimal: FieldTypes.NUMBER,
|
|
15
|
-
smallint: FieldTypes.NUMBER,
|
|
16
|
-
real: FieldTypes.NUMBER,
|
|
17
|
-
"double precision": FieldTypes.NUMBER,
|
|
18
|
-
timestamp: FieldTypes.DATETIME,
|
|
19
|
-
time: FieldTypes.DATETIME,
|
|
20
|
-
boolean: FieldTypes.BOOLEAN,
|
|
21
|
-
json: FieldTypes.JSON,
|
|
22
|
-
date: FieldTypes.DATETIME,
|
|
23
|
-
blob: FieldTypes.LONGFORM,
|
|
24
|
-
enum: FieldTypes.STRING,
|
|
25
|
-
float: FieldTypes.NUMBER,
|
|
26
|
-
int: FieldTypes.NUMBER,
|
|
27
|
-
numeric: FieldTypes.NUMBER,
|
|
28
|
-
mediumint: FieldTypes.NUMBER,
|
|
29
|
-
dec: FieldTypes.NUMBER,
|
|
30
|
-
double: FieldTypes.NUMBER,
|
|
31
|
-
fixed: FieldTypes.NUMBER,
|
|
32
|
-
datetime: FieldTypes.DATETIME,
|
|
33
|
-
tinyint: FieldTypes.BOOLEAN,
|
|
34
|
-
long: FieldTypes.LONGFORM,
|
|
35
|
-
number: FieldTypes.NUMBER,
|
|
36
|
-
binary_float: FieldTypes.NUMBER,
|
|
37
|
-
binary_double: FieldTypes.NUMBER,
|
|
10
|
+
text: constants_1.FieldTypes.LONGFORM,
|
|
11
|
+
varchar: constants_1.FieldTypes.STRING,
|
|
12
|
+
integer: constants_1.FieldTypes.NUMBER,
|
|
13
|
+
bigint: constants_1.FieldTypes.NUMBER,
|
|
14
|
+
decimal: constants_1.FieldTypes.NUMBER,
|
|
15
|
+
smallint: constants_1.FieldTypes.NUMBER,
|
|
16
|
+
real: constants_1.FieldTypes.NUMBER,
|
|
17
|
+
"double precision": constants_1.FieldTypes.NUMBER,
|
|
18
|
+
timestamp: constants_1.FieldTypes.DATETIME,
|
|
19
|
+
time: constants_1.FieldTypes.DATETIME,
|
|
20
|
+
boolean: constants_1.FieldTypes.BOOLEAN,
|
|
21
|
+
json: constants_1.FieldTypes.JSON,
|
|
22
|
+
date: constants_1.FieldTypes.DATETIME,
|
|
23
|
+
blob: constants_1.FieldTypes.LONGFORM,
|
|
24
|
+
enum: constants_1.FieldTypes.STRING,
|
|
25
|
+
float: constants_1.FieldTypes.NUMBER,
|
|
26
|
+
int: constants_1.FieldTypes.NUMBER,
|
|
27
|
+
numeric: constants_1.FieldTypes.NUMBER,
|
|
28
|
+
mediumint: constants_1.FieldTypes.NUMBER,
|
|
29
|
+
dec: constants_1.FieldTypes.NUMBER,
|
|
30
|
+
double: constants_1.FieldTypes.NUMBER,
|
|
31
|
+
fixed: constants_1.FieldTypes.NUMBER,
|
|
32
|
+
datetime: constants_1.FieldTypes.DATETIME,
|
|
33
|
+
tinyint: constants_1.FieldTypes.BOOLEAN,
|
|
34
|
+
long: constants_1.FieldTypes.LONGFORM,
|
|
35
|
+
number: constants_1.FieldTypes.NUMBER,
|
|
36
|
+
binary_float: constants_1.FieldTypes.NUMBER,
|
|
37
|
+
binary_double: constants_1.FieldTypes.NUMBER,
|
|
38
38
|
};
|
|
39
39
|
var SqlClients;
|
|
40
40
|
(function (SqlClients) {
|
|
@@ -44,7 +44,7 @@ var SqlClients;
|
|
|
44
44
|
SqlClients["ORACLE"] = "oracledb";
|
|
45
45
|
})(SqlClients = exports.SqlClients || (exports.SqlClients = {}));
|
|
46
46
|
function isExternalTable(tableId) {
|
|
47
|
-
return tableId.includes(DocumentTypes.DATASOURCE);
|
|
47
|
+
return tableId.includes(utils_1.DocumentTypes.DATASOURCE);
|
|
48
48
|
}
|
|
49
49
|
exports.isExternalTable = isExternalTable;
|
|
50
50
|
function buildExternalTableId(datasourceId, tableName) {
|
|
@@ -109,7 +109,7 @@ function convertSqlType(type) {
|
|
|
109
109
|
return internal;
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
-
return FieldTypes.STRING;
|
|
112
|
+
return constants_1.FieldTypes.STRING;
|
|
113
113
|
}
|
|
114
114
|
exports.convertSqlType = convertSqlType;
|
|
115
115
|
function getSqlQuery(query) {
|
|
@@ -148,7 +148,10 @@ function copyExistingPropsOver(tableName, table, entities) {
|
|
|
148
148
|
if (!existingTableSchema.hasOwnProperty(key)) {
|
|
149
149
|
continue;
|
|
150
150
|
}
|
|
151
|
-
if (existingTableSchema[key].type ===
|
|
151
|
+
if (existingTableSchema[key].type === constants_1.FieldTypes.LINK ||
|
|
152
|
+
existingTableSchema[key].type === constants_1.FieldTypes.OPTIONS ||
|
|
153
|
+
((!table.schema[key] || table.schema[key].type === constants_1.FieldTypes.NUMBER) &&
|
|
154
|
+
existingTableSchema[key].type === constants_1.FieldTypes.BOOLEAN)) {
|
|
152
155
|
table.schema[key] = existingTableSchema[key];
|
|
153
156
|
}
|
|
154
157
|
}
|
|
@@ -156,18 +159,18 @@ function copyExistingPropsOver(tableName, table, entities) {
|
|
|
156
159
|
return table;
|
|
157
160
|
}
|
|
158
161
|
function finaliseExternalTables(tables, entities) {
|
|
159
|
-
const invalidColumns = Object.values(InvalidColumns);
|
|
162
|
+
const invalidColumns = Object.values(constants_1.InvalidColumns);
|
|
160
163
|
let finalTables = {};
|
|
161
164
|
const errors = {};
|
|
162
165
|
for (let [name, table] of Object.entries(tables)) {
|
|
163
166
|
const schemaFields = Object.keys(table.schema);
|
|
164
167
|
// make sure every table has a key
|
|
165
168
|
if (table.primary == null || table.primary.length === 0) {
|
|
166
|
-
errors[name] = BuildSchemaErrors.NO_KEY;
|
|
169
|
+
errors[name] = constants_1.BuildSchemaErrors.NO_KEY;
|
|
167
170
|
continue;
|
|
168
171
|
}
|
|
169
172
|
else if (schemaFields.find(field => invalidColumns.includes(field))) {
|
|
170
|
-
errors[name] = BuildSchemaErrors.INVALID_COLUMN;
|
|
173
|
+
errors[name] = constants_1.BuildSchemaErrors.INVALID_COLUMN;
|
|
171
174
|
continue;
|
|
172
175
|
}
|
|
173
176
|
// make sure all previous props have been added back
|
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.
|
|
4
|
+
"version": "1.0.27-alpha.16",
|
|
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.
|
|
74
|
-
"@budibase/client": "^1.0.27-alpha.
|
|
75
|
-
"@budibase/string-templates": "^1.0.27-alpha.
|
|
73
|
+
"@budibase/backend-core": "^1.0.27-alpha.16",
|
|
74
|
+
"@budibase/client": "^1.0.27-alpha.16",
|
|
75
|
+
"@budibase/string-templates": "^1.0.27-alpha.16",
|
|
76
76
|
"@bull-board/api": "^3.7.0",
|
|
77
77
|
"@bull-board/koa": "^3.7.0",
|
|
78
78
|
"@elastic/elasticsearch": "7.10.0",
|
package/dist/threads/query.js
CHANGED
|
@@ -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
|
-
|
|
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);
|
package/dist/threads/utils.js
CHANGED
|
@@ -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
|
-
};
|