@wavemaker-ai/variables 1.0.0-rc.647469
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/index.d.ts +14 -0
- package/index.js +15 -0
- package/index.js.map +1 -0
- package/npm-shrinkwrap.json +1967 -0
- package/package-lock.json +1967 -0
- package/package.json +48 -0
- package/scripts/build.d.ts +1 -0
- package/scripts/build.js +183 -0
- package/scripts/build.js.map +1 -0
- package/src/advanced-options.d.ts +4 -0
- package/src/advanced-options.js +2 -0
- package/src/advanced-options.js.map +1 -0
- package/src/constants/variables.constants.d.ts +307 -0
- package/src/constants/variables.constants.js +334 -0
- package/src/constants/variables.constants.js.map +1 -0
- package/src/factory/variable-manager.factory.d.ts +3 -0
- package/src/factory/variable-manager.factory.js +26 -0
- package/src/factory/variable-manager.factory.js.map +1 -0
- package/src/manager/action/timer-action.manager.d.ts +4 -0
- package/src/manager/action/timer-action.manager.js +38 -0
- package/src/manager/action/timer-action.manager.js.map +1 -0
- package/src/manager/variable/base-variable.manager.d.ts +24 -0
- package/src/manager/variable/base-variable.manager.js +79 -0
- package/src/manager/variable/base-variable.manager.js.map +1 -0
- package/src/manager/variable/crud-variable.manager.d.ts +85 -0
- package/src/manager/variable/crud-variable.manager.js +415 -0
- package/src/manager/variable/crud-variable.manager.js.map +1 -0
- package/src/manager/variable/live-variable.manager.d.ts +154 -0
- package/src/manager/variable/live-variable.manager.js +1078 -0
- package/src/manager/variable/live-variable.manager.js.map +1 -0
- package/src/manager/variable/model-variable.manager.d.ts +4 -0
- package/src/manager/variable/model-variable.manager.js +56 -0
- package/src/manager/variable/model-variable.manager.js.map +1 -0
- package/src/manager/variable/service-variable.manager.d.ts +113 -0
- package/src/manager/variable/service-variable.manager.js +713 -0
- package/src/manager/variable/service-variable.manager.js.map +1 -0
- package/src/model/action/timer-action.d.ts +12 -0
- package/src/model/action/timer-action.js +60 -0
- package/src/model/action/timer-action.js.map +1 -0
- package/src/model/base-action.d.ts +32 -0
- package/src/model/base-action.js +89 -0
- package/src/model/base-action.js.map +1 -0
- package/src/model/base-variable.d.ts +58 -0
- package/src/model/base-variable.js +180 -0
- package/src/model/base-variable.js.map +1 -0
- package/src/model/crud-create.d.ts +8 -0
- package/src/model/crud-create.js +17 -0
- package/src/model/crud-create.js.map +1 -0
- package/src/model/crud-delete.d.ts +8 -0
- package/src/model/crud-delete.js +17 -0
- package/src/model/crud-delete.js.map +1 -0
- package/src/model/crud-list.d.ts +8 -0
- package/src/model/crud-list.js +17 -0
- package/src/model/crud-list.js.map +1 -0
- package/src/model/crud-update.d.ts +8 -0
- package/src/model/crud-update.js +17 -0
- package/src/model/crud-update.js.map +1 -0
- package/src/model/variable/api-aware-variable.d.ts +23 -0
- package/src/model/variable/api-aware-variable.js +25 -0
- package/src/model/variable/api-aware-variable.js.map +1 -0
- package/src/model/variable/crud-variable.d.ts +30 -0
- package/src/model/variable/crud-variable.js +181 -0
- package/src/model/variable/crud-variable.js.map +1 -0
- package/src/model/variable/live-variable.d.ts +40 -0
- package/src/model/variable/live-variable.js +262 -0
- package/src/model/variable/live-variable.js.map +1 -0
- package/src/model/variable/model-variable.d.ts +11 -0
- package/src/model/variable/model-variable.js +83 -0
- package/src/model/variable/model-variable.js.map +1 -0
- package/src/model/variable/service-variable.d.ts +35 -0
- package/src/model/variable/service-variable.js +147 -0
- package/src/model/variable/service-variable.js.map +1 -0
- package/src/types/date-formatter.d.ts +3 -0
- package/src/types/date-formatter.js +2 -0
- package/src/types/date-formatter.js.map +1 -0
- package/src/types/event-notifier.d.ts +9 -0
- package/src/types/event-notifier.js +25 -0
- package/src/types/event-notifier.js.map +1 -0
- package/src/types/http-client.service.d.ts +8 -0
- package/src/types/http-client.service.js +2 -0
- package/src/types/http-client.service.js.map +1 -0
- package/src/types/types.d.ts +50 -0
- package/src/types/types.js +54 -0
- package/src/types/types.js.map +1 -0
- package/src/util/dataset-util.d.ts +27 -0
- package/src/util/dataset-util.js +147 -0
- package/src/util/dataset-util.js.map +1 -0
- package/src/util/file-upload.util.d.ts +11 -0
- package/src/util/file-upload.util.js +183 -0
- package/src/util/file-upload.util.js.map +1 -0
- package/src/util/inflight-queue.d.ts +35 -0
- package/src/util/inflight-queue.js +102 -0
- package/src/util/inflight-queue.js.map +1 -0
- package/src/util/notify-promise.d.ts +3 -0
- package/src/util/notify-promise.js +37 -0
- package/src/util/notify-promise.js.map +1 -0
- package/src/util/oAuth.utils.d.ts +3 -0
- package/src/util/oAuth.utils.js +11 -0
- package/src/util/oAuth.utils.js.map +1 -0
- package/src/util/utils.d.ts +69 -0
- package/src/util/utils.js +364 -0
- package/src/util/utils.js.map +1 -0
- package/src/util/variable/live-variable.http.utils.d.ts +21 -0
- package/src/util/variable/live-variable.http.utils.js +212 -0
- package/src/util/variable/live-variable.http.utils.js.map +1 -0
- package/src/util/variable/live-variable.utils.d.ts +72 -0
- package/src/util/variable/live-variable.utils.js +667 -0
- package/src/util/variable/live-variable.utils.js.map +1 -0
- package/src/util/variable/pagination.utils.d.ts +91 -0
- package/src/util/variable/pagination.utils.js +493 -0
- package/src/util/variable/pagination.utils.js.map +1 -0
- package/src/util/variable/service-variable.utils.d.ts +17 -0
- package/src/util/variable/service-variable.utils.js +394 -0
- package/src/util/variable/service-variable.utils.js.map +1 -0
- package/src/util/variable/variables.utils.d.ts +120 -0
- package/src/util/variable/variables.utils.js +544 -0
- package/src/util/variable/variables.utils.js.map +1 -0
- package/src/wm-namespace.d.ts +11 -0
- package/src/wm-namespace.js +13 -0
- package/src/wm-namespace.js.map +1 -0
- package/webpack.config.d.ts +21 -0
- package/webpack.config.js +28 -0
- package/webpack.config.js.map +1 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
import { jmespath } from '@metrichor/jmespath';
|
|
2
|
+
import { startsWith, find, set, result, get } from 'lodash-es';
|
|
3
|
+
import { getValidJSON } from '../utils';
|
|
4
|
+
import { VARIABLE_CONSTANTS } from '../../constants/variables.constants';
|
|
5
|
+
var PaginationUtils = /** @class */ (function () {
|
|
6
|
+
function PaginationUtils() {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Modifies the query values with the pagination info which is retrieved from the previous API response.
|
|
10
|
+
* @param variable withholds variable information
|
|
11
|
+
* @param operationInfo has metadata of the variable
|
|
12
|
+
* @param paginationInfo has metadata of the variable pagination data
|
|
13
|
+
* @returns {void} This method does not return anything
|
|
14
|
+
*/
|
|
15
|
+
PaginationUtils.setPaginationQueryParams = function (variable, operationInfo, paginationInfo) {
|
|
16
|
+
operationInfo.parameters.forEach(function (element) {
|
|
17
|
+
// pagination input information varies based on the type
|
|
18
|
+
var inputParam;
|
|
19
|
+
if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {
|
|
20
|
+
inputParam = 'offset';
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
inputParam = 'page';
|
|
24
|
+
}
|
|
25
|
+
// modifies query values based on the pagination of variable
|
|
26
|
+
// compare parameter name with the input parameter's starting naming key (ex: channelcontext in channelcontext.pagination)
|
|
27
|
+
if (element.name === paginationInfo.input[inputParam].split('.')[0]) {
|
|
28
|
+
element.sampleValue = variable.pagination['page'];
|
|
29
|
+
}
|
|
30
|
+
else if (element.name === paginationInfo.input.size.split('.')[0]) {
|
|
31
|
+
element.sampleValue = variable.pagination['size'];
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Sets pagination on the variable based on the response of the triggered api call.
|
|
37
|
+
* @param variable withholds variable information
|
|
38
|
+
* @param response has data of the api call's response
|
|
39
|
+
* @param options has info of the api's query params
|
|
40
|
+
* @returns {void} This method does not return anything
|
|
41
|
+
*/
|
|
42
|
+
PaginationUtils.setVariablePagination = function (variable, response, options) {
|
|
43
|
+
if (!variable.pagination) {
|
|
44
|
+
variable.pagination = {
|
|
45
|
+
empty: false
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
variable.pagination['size'] = response.size;
|
|
49
|
+
variable.pagination['page'] = response.page || 0;
|
|
50
|
+
variable.pagination['totalElements'] = response.totalElements;
|
|
51
|
+
variable.pagination['numberOfElements'] = variable.pagination['size'];
|
|
52
|
+
variable.pagination['number'] = options['page'] ? options['page'] - 1 : 0;
|
|
53
|
+
/**
|
|
54
|
+
* Deduce totalPages from totalElements by size.
|
|
55
|
+
* If the total elements are evenly split among the pages, assign the same to totalPages
|
|
56
|
+
* Else assign totalPages + 1
|
|
57
|
+
*/
|
|
58
|
+
variable.pagination['totalPages'] = variable.pagination['totalElements'] / variable.pagination['size'];
|
|
59
|
+
if (variable.pagination['totalElements'] % variable.pagination['size'] === 0) {
|
|
60
|
+
variable.pagination['totalPages'] = parseInt(variable.pagination['totalPages']);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
variable.pagination['totalPages'] = parseInt(variable.pagination['totalPages']) + 1;
|
|
64
|
+
}
|
|
65
|
+
// If pagination type is cursor, fill next & prev
|
|
66
|
+
if (response.next) {
|
|
67
|
+
variable.pagination['next'] = response.next;
|
|
68
|
+
variable.pagination['prev'] = response.prev;
|
|
69
|
+
variable.pagination['last'] = response.next ? false : true;
|
|
70
|
+
variable.pagination['first'] = response.prev ? false : true;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
variable.pagination['first'] = variable.pagination['page'] <= 1 ? true : false;
|
|
74
|
+
// calculate last based on current page index against total pages
|
|
75
|
+
variable.pagination['last'] = response.hasMoreItems === '' ? !(variable.pagination['page'] < variable.pagination['totalPages']) : !response.hasMoreItems;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Resolves the expression given in pagination metadata's output
|
|
80
|
+
* @param item has value of each key which is inside output pagination metadata
|
|
81
|
+
* @param response has data of the api call's response
|
|
82
|
+
* @param resHeaders has data of the api call's response headers
|
|
83
|
+
* @param res holds the information of pagination which has to be stored on the variable
|
|
84
|
+
* @param key has key name against which data has to be stored in pagination
|
|
85
|
+
* @returns {void} This method does not return anything
|
|
86
|
+
*/
|
|
87
|
+
PaginationUtils.setPaginationItems = function (item, response, res, key, resHeaders) {
|
|
88
|
+
var _a;
|
|
89
|
+
// if the item has body, resolve the expression against the response
|
|
90
|
+
if (startsWith(item, '$body')) {
|
|
91
|
+
var bodyKey = item.replace('$body.', '');
|
|
92
|
+
try {
|
|
93
|
+
res[key] = jmespath.search(response, bodyKey);
|
|
94
|
+
}
|
|
95
|
+
catch (_b) {
|
|
96
|
+
console.warn("".concat(item, " expression needs to be corrected as per JMES guidelines"));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (startsWith(item, '$header')) { // if the item has header, resolve the expression against the response headers
|
|
100
|
+
var headerKey = item.replace('$header.', '');
|
|
101
|
+
var headers = Object.fromEntries((resHeaders === null || resHeaders === void 0 ? void 0 : resHeaders.headers) || resHeaders);
|
|
102
|
+
var headerParams = headerKey.split('.');
|
|
103
|
+
var headerRootKey = headerParams[0].toLowerCase();
|
|
104
|
+
var cloakPrefix = VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY.toLowerCase();
|
|
105
|
+
// Pagination metadata may provide header names with quotes (e.g. "X-Total-Count").
|
|
106
|
+
// Remove surrounding quotes before prefix checks / cloaked-key composition.
|
|
107
|
+
var unquotedHeaderRootKey = headerRootKey.replace(/^["']|["']$/g, '');
|
|
108
|
+
var cloakedHeaderLookupKey = cloakPrefix + unquotedHeaderRootKey;
|
|
109
|
+
var getHeaderExpr = function (headerName) {
|
|
110
|
+
// Normalize once so caller can pass bare names or pre-quoted names.
|
|
111
|
+
var normalizedHeaderName = headerName.replace(/^["']|["']$/g, '');
|
|
112
|
+
// Hyphenated header names are not valid bare identifiers in JMESPath.
|
|
113
|
+
if (/^[a-z_][a-z0-9_]*$/i.test(normalizedHeaderName)) {
|
|
114
|
+
return normalizedHeaderName;
|
|
115
|
+
}
|
|
116
|
+
// Quote and escape to produce a valid JMESPath identifier for headers like x-wm-x-total-count.
|
|
117
|
+
return "\"".concat(normalizedHeaderName.replace(/\\/g, '\\\\').replace(/"/g, '\\"'), "\"");
|
|
118
|
+
};
|
|
119
|
+
var headerRootExpr = getHeaderExpr(headerRootKey);
|
|
120
|
+
var cloakedHeaderRootExpr = getHeaderExpr(cloakedHeaderLookupKey);
|
|
121
|
+
try {
|
|
122
|
+
res[key] = jmespath.search(headers, headerRootExpr);
|
|
123
|
+
// For proxied calls response headers may be cloaked as x-wm-<header-name>.
|
|
124
|
+
if (!res[key] && !unquotedHeaderRootKey.startsWith(cloakPrefix)) {
|
|
125
|
+
res[key] = jmespath.search(headers, cloakedHeaderRootExpr);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (_c) {
|
|
129
|
+
console.warn("".concat(item, " expression needs to be corrected as per JMES guidelines"));
|
|
130
|
+
}
|
|
131
|
+
if ((_a = res[key]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
132
|
+
var headerVal = res[key].join();
|
|
133
|
+
if (headerParams.length === 1) {
|
|
134
|
+
/**
|
|
135
|
+
* If the headerParams has only 1 key (which is not an object) name assing headerVal to the res[key]
|
|
136
|
+
*/
|
|
137
|
+
res[key] = headerVal;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
/**
|
|
141
|
+
* If the headerParams has more than 1 key (an object), parse the stringified headerVal which is an object
|
|
142
|
+
* Resolve the expression against headerVal object amd assign it to res[key]
|
|
143
|
+
*/
|
|
144
|
+
var keyName = headerParams.slice(1).join('.');
|
|
145
|
+
var headerResp = JSON.parse(headerVal);
|
|
146
|
+
var specialChar = /[!@#$%^&*()+\=\[\]{};':"\\|,<>\/?]+/;
|
|
147
|
+
if (specialChar.test(keyName)) {
|
|
148
|
+
// If key name has expression (ex: comparission expression)
|
|
149
|
+
// add root key name to keyName for JMES to resolve the expression
|
|
150
|
+
keyName = 'headerResp.' + keyName;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
res[key] = jmespath.search(headerResp, keyName);
|
|
154
|
+
}
|
|
155
|
+
catch (_d) {
|
|
156
|
+
console.warn("".concat(item, " expression needs to be corrected as per JMES guidelines"));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Return the pagination information of the service based on its existence on swagger or on the variable
|
|
164
|
+
* @param variable withholds variable information
|
|
165
|
+
* @param operationInfo has metadata of the variable
|
|
166
|
+
* @returns {object} This method return pagination metadata
|
|
167
|
+
*/
|
|
168
|
+
PaginationUtils.getPaginationInfo = function (operationInfo, variable) {
|
|
169
|
+
if (operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.paginationInfo) {
|
|
170
|
+
return operationInfo.paginationInfo;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
return variable._paginationConfig;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Set query params with the pagination info, if pagination metadata is present in query params
|
|
178
|
+
* @param variable withholds variable information
|
|
179
|
+
* @param operationInfo has metadata of the variable
|
|
180
|
+
* @param options has info of the api's query params
|
|
181
|
+
* @returns {void} This method does not return anything
|
|
182
|
+
*/
|
|
183
|
+
PaginationUtils.checkPaginationAtQuery = function (operationInfo, variable, options) {
|
|
184
|
+
var _a, _b;
|
|
185
|
+
var paginationInfo = this.getPaginationInfo(operationInfo, variable);
|
|
186
|
+
// If page is not first, pagination is present on the variable and paginationInfo's input meta has size set pagination in query params
|
|
187
|
+
var hasPagination = options && options['page'] && (paginationInfo === null || paginationInfo === void 0 ? void 0 : paginationInfo.input.size) && variable.pagination;
|
|
188
|
+
if (!hasPagination) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
var inputParam, sizeParam;
|
|
192
|
+
// if pagination type is offset, asssign inputParam to offset else page
|
|
193
|
+
if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {
|
|
194
|
+
inputParam = 'offset';
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
inputParam = 'page';
|
|
198
|
+
}
|
|
199
|
+
if (["page", "offset", "cursor"].includes(paginationInfo.type)) {
|
|
200
|
+
sizeParam = 'size';
|
|
201
|
+
}
|
|
202
|
+
if (sizeParam) {
|
|
203
|
+
var sizeParamName_1 = paginationInfo.input[sizeParam].split('.')[0];
|
|
204
|
+
var sizeParamObj = find(operationInfo.parameters, function (obj) { return obj.name === sizeParamName_1; });
|
|
205
|
+
if (sizeParamObj && sizeParamObj.parameterType === 'query' && ["page", "offset", "cursor"].includes(paginationInfo.type)) {
|
|
206
|
+
variable.pagination['size'] = options['size'] || variable.pagination['size'];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
var paramName = paginationInfo.input[inputParam].split('.')[0];
|
|
210
|
+
var paramObj = find(operationInfo.parameters, function (obj) { return obj.name === paramName; });
|
|
211
|
+
// check if the variable has query params and they are not empty
|
|
212
|
+
if (paramObj && paramObj.parameterType === 'query') {
|
|
213
|
+
/**
|
|
214
|
+
* For pagination type other than offset, assign page which is recieved from options
|
|
215
|
+
* For offset type, calculate page from size and options[page]
|
|
216
|
+
*/
|
|
217
|
+
if (!((_a = paginationInfo.output) === null || _a === void 0 ? void 0 : _a.page) && paginationInfo.type !== 'offset') {
|
|
218
|
+
variable.pagination['page'] = options['page'];
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
variable.pagination['page'] = this.getOffsetInfo(variable, options);
|
|
222
|
+
}
|
|
223
|
+
this.setPaginationQueryParams(variable, operationInfo, paginationInfo);
|
|
224
|
+
}
|
|
225
|
+
else if (paginationInfo.type === 'cursor') {
|
|
226
|
+
var sParam_1 = (((_b = paginationInfo.input) === null || _b === void 0 ? void 0 : _b.size) && paginationInfo.input['size'].split('.')[0]) || "";
|
|
227
|
+
if (sParam_1) {
|
|
228
|
+
var sParamObj = find(operationInfo.parameters, function (obj) { return obj.name === sParam_1 && obj.parameterType === 'path'; });
|
|
229
|
+
if (sParamObj) {
|
|
230
|
+
sParamObj.sampleValue = options['size'] || variable.pagination['size'] || sParamObj.sampleValue;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* Deduces the offset information from the size and page params
|
|
237
|
+
* @param variable withholds variable information
|
|
238
|
+
* @param options has info of the api's query params
|
|
239
|
+
* @returns {object} Returns the next offset number
|
|
240
|
+
*/
|
|
241
|
+
PaginationUtils.getOffsetInfo = function (variable, options) {
|
|
242
|
+
return variable.pagination['size'] * (options['page'] ? (options['page'] - 1) : 0);
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Sets Pagination data on the request information
|
|
246
|
+
* @param variable withholds variable information
|
|
247
|
+
* @param operationInfo has metadata of the variable
|
|
248
|
+
* @param options has info of the api's query params
|
|
249
|
+
* @param paginationInfo has pagination information of the variable
|
|
250
|
+
* @param headers has request headers
|
|
251
|
+
* @param requestBody has request body
|
|
252
|
+
* @param url has request url
|
|
253
|
+
* @returns {object} Returns the request object which has pagination info
|
|
254
|
+
*/
|
|
255
|
+
PaginationUtils.setPaginationAtReq = function (paginationInfo, operationInfo, variable, headers, requestBody, url, options) {
|
|
256
|
+
var reqObj = {};
|
|
257
|
+
var inputParam;
|
|
258
|
+
var resObj = {};
|
|
259
|
+
// pagination input information varies based on the type
|
|
260
|
+
if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {
|
|
261
|
+
inputParam = 'offset';
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
inputParam = 'page';
|
|
265
|
+
}
|
|
266
|
+
var paramName = paginationInfo.input[inputParam].split('.')[0];
|
|
267
|
+
// check if paramName is present in parameters of operation info
|
|
268
|
+
var paramObj = find(operationInfo.parameters, function (obj) {
|
|
269
|
+
if (obj.parameterType === 'body' && inputParam === 'page') {
|
|
270
|
+
return obj.sampleValue.hasOwnProperty(paramName);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
return obj.name === paramName;
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
// set page/offset and size from pagination if matched parameter's type is header
|
|
277
|
+
if ((paramObj === null || paramObj === void 0 ? void 0 : paramObj.parameterType) === 'header') {
|
|
278
|
+
var inputBodyParam = VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY + paginationInfo.input[inputParam];
|
|
279
|
+
if (inputParam !== 'offset') {
|
|
280
|
+
set(reqObj, inputBodyParam, variable.pagination['page']);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
set(reqObj, inputBodyParam, this.getOffsetInfo(variable, options));
|
|
284
|
+
}
|
|
285
|
+
set(reqObj, VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY + paginationInfo.input.size, variable.pagination['size']);
|
|
286
|
+
var headerKey = VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY + paramName;
|
|
287
|
+
headers[headerKey] = typeof reqObj[headerKey] === 'object' ? JSON.stringify(reqObj[headerKey]) : reqObj[headerKey];
|
|
288
|
+
resObj['headers'] = headers;
|
|
289
|
+
}
|
|
290
|
+
else if ((paramObj === null || paramObj === void 0 ? void 0 : paramObj.parameterType) === 'body') {
|
|
291
|
+
// set page/offset and size from pagination if matched parameter's type is body
|
|
292
|
+
// assign bodyVal to updated pagination info object
|
|
293
|
+
var bodyVal = void 0;
|
|
294
|
+
try {
|
|
295
|
+
bodyVal = typeof paramObj.sampleValue === 'string' ? JSON.parse(paramObj.sampleValue) : paramObj.sampleValue;
|
|
296
|
+
}
|
|
297
|
+
catch (e) {
|
|
298
|
+
bodyVal = paramObj.sampleValue;
|
|
299
|
+
}
|
|
300
|
+
var bodyParam = inputParam === 'page' ? paginationInfo.input[inputParam] : paginationInfo.input[inputParam].split('.')[1];
|
|
301
|
+
if (bodyVal && bodyVal[bodyParam]) {
|
|
302
|
+
var inputBodyParam = paginationInfo.input[inputParam].split('.').splice(1).join('.');
|
|
303
|
+
if (inputParam !== 'offset') {
|
|
304
|
+
inputBodyParam = paginationInfo.input[inputParam];
|
|
305
|
+
set(reqObj, inputBodyParam, options.page ? options.page : 1);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
set(reqObj, inputBodyParam, this.getOffsetInfo(variable, options));
|
|
309
|
+
}
|
|
310
|
+
set(reqObj, paginationInfo.input.size.split('.').splice(1).join('.'), variable.pagination['size']);
|
|
311
|
+
bodyVal[bodyParam] = reqObj[bodyParam];
|
|
312
|
+
requestBody = JSON.stringify(bodyVal);
|
|
313
|
+
resObj['requestBody'] = requestBody;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else if (variable.pagination.next && paramObj) {
|
|
317
|
+
/**
|
|
318
|
+
* For cursor type pagination, if pagination info is present in the path
|
|
319
|
+
* Based on whether user clicks on the next or prev button modify the url
|
|
320
|
+
*/
|
|
321
|
+
if (paramObj.parameterType === 'path') {
|
|
322
|
+
var urlParams = operationInfo.relativePath.split('/'), paramConfig = '{' + paramObj.name + '}', paramIndex = urlParams.indexOf(paramConfig);
|
|
323
|
+
var invokeUrl = void 0;
|
|
324
|
+
if (variable.pagination.isNext) {
|
|
325
|
+
invokeUrl = variable.pagination.next.split('/');
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
invokeUrl = variable.pagination.prev.split('/');
|
|
329
|
+
}
|
|
330
|
+
var urlPathParmas = void 0;
|
|
331
|
+
var urlPath = void 0;
|
|
332
|
+
if (operationInfo.directPath) { // For direct path, as url has hostname, derivate pathname using URL object
|
|
333
|
+
urlPath = new URL(url);
|
|
334
|
+
urlPathParmas = urlPath.pathname.split('/');
|
|
335
|
+
urlPathParmas[paramIndex] = invokeUrl[paramIndex];
|
|
336
|
+
urlPath.pathname = urlPathParmas.join('/');
|
|
337
|
+
url = urlPath.href;
|
|
338
|
+
resObj['url'] = url;
|
|
339
|
+
}
|
|
340
|
+
else { // Else modify the url with index as +1 (following proxy pattern)
|
|
341
|
+
urlPathParmas = url.split('/');
|
|
342
|
+
urlPathParmas[paramIndex + 1] = invokeUrl[paramIndex];
|
|
343
|
+
url = urlPathParmas.join('/');
|
|
344
|
+
resObj['url'] = url;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else if (paramObj.parameterType === 'query') {
|
|
348
|
+
/**
|
|
349
|
+
* For cursor type pagination, if pagination info is present in the query
|
|
350
|
+
* Based on whether user clicks on the next or prev button modify the url's query params
|
|
351
|
+
*/
|
|
352
|
+
var sizeParam_1 = paginationInfo.input['size'].split('.')[0];
|
|
353
|
+
var sizeObj = find(operationInfo.parameters, function (obj) { return obj.name === sizeParam_1; });
|
|
354
|
+
var urlParams = url.split('?');
|
|
355
|
+
var invokeUrl = void 0;
|
|
356
|
+
if (variable.pagination.isNext) {
|
|
357
|
+
invokeUrl = variable.pagination.next.split('?');
|
|
358
|
+
}
|
|
359
|
+
else if (variable.pagination.isPrev) {
|
|
360
|
+
invokeUrl = variable.pagination.prev.split('?');
|
|
361
|
+
}
|
|
362
|
+
if (invokeUrl) {
|
|
363
|
+
var queryParams = new URLSearchParams(invokeUrl[1]);
|
|
364
|
+
if (sizeObj && sizeObj.sampleValue) {
|
|
365
|
+
queryParams.set(sizeObj.name, sizeObj.sampleValue);
|
|
366
|
+
}
|
|
367
|
+
invokeUrl[1] = queryParams.toString();
|
|
368
|
+
urlParams[1] = invokeUrl[1];
|
|
369
|
+
url = urlParams.join('?');
|
|
370
|
+
resObj['url'] = url;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return resObj;
|
|
375
|
+
};
|
|
376
|
+
/**
|
|
377
|
+
* Sets the pagination info recieved from api's response in the res object
|
|
378
|
+
* @param operationInfo has metadata of the variable
|
|
379
|
+
* @param res holds the information of pagination which has to be stored on the variable
|
|
380
|
+
* @param paramName has key name against which data has to be stored in pagination
|
|
381
|
+
* @param variable withholds variable information
|
|
382
|
+
* @returns {void} This method does not return anything
|
|
383
|
+
*/
|
|
384
|
+
PaginationUtils.setParameterVal = function (paramName, res, operationInfo, variable, options) {
|
|
385
|
+
var paginationInfo = this.getPaginationInfo(operationInfo, variable);
|
|
386
|
+
var paginationParams = paginationInfo.input[paramName].split('.');
|
|
387
|
+
var param = paginationParams[0];
|
|
388
|
+
var sizeObj = find(operationInfo.parameters, function (obj) { return obj.name === param; });
|
|
389
|
+
if (paramName === 'size' && paginationInfo && (paginationInfo.type === 'offset' || paginationInfo.type === 'page') && (options === null || options === void 0 ? void 0 : options.size) && (sizeObj === null || sizeObj === void 0 ? void 0 : sizeObj.sampleValue)) {
|
|
390
|
+
sizeObj.sampleValue = options['size'] || result(sizeObj, 'sampleValue');
|
|
391
|
+
}
|
|
392
|
+
res[paramName] = result(sizeObj, 'sampleValue');
|
|
393
|
+
// if input value is configured from object, fetch the value from the specified path
|
|
394
|
+
if (paginationParams.length > 1) {
|
|
395
|
+
res[paramName] = get(getValidJSON(res[paramName]), paginationInfo.input[paramName].split('.').splice(1).join('.'));
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
/**
|
|
399
|
+
* Creates res object from the response recieved from the api triggered
|
|
400
|
+
* @param variable withholds variable information
|
|
401
|
+
* @param operationInfo has metadata of the variable
|
|
402
|
+
* @param paginationInfo has metadata of the variable's pagination
|
|
403
|
+
* @param response has data of the api call's response
|
|
404
|
+
* @param options has info of the api's query params
|
|
405
|
+
* @param resHeaders has data of the api call's response headers
|
|
406
|
+
* @returns {object} An object which holds the information of pagination which has to be stored on the variable
|
|
407
|
+
*/
|
|
408
|
+
PaginationUtils.generatePaginationRes = function (operationInfo, paginationInfo, response, resHeaders, options, variable) {
|
|
409
|
+
var _a, _b, _c, _d;
|
|
410
|
+
var res = {};
|
|
411
|
+
var resOutput = paginationInfo.output;
|
|
412
|
+
// If pagination type is not cursor, create the following metadata
|
|
413
|
+
if (!(resOutput === null || resOutput === void 0 ? void 0 : resOutput.next)) {
|
|
414
|
+
/**
|
|
415
|
+
* If size is present in the pagination's output metadata deduce size from api's response
|
|
416
|
+
* Else deduce size from the pagination's input metadata size key
|
|
417
|
+
*/
|
|
418
|
+
if (resOutput === null || resOutput === void 0 ? void 0 : resOutput.size) {
|
|
419
|
+
this.setPaginationItems(resOutput.size, response, res, 'size', resHeaders);
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
this.setParameterVal('size', res, operationInfo, variable, options);
|
|
423
|
+
}
|
|
424
|
+
if (!(resOutput === null || resOutput === void 0 ? void 0 : resOutput.size) && ((_a = paginationInfo.input) === null || _a === void 0 ? void 0 : _a.size) && paginationInfo.type === 'page') {
|
|
425
|
+
res['size'] = (Number((_b = paginationInfo.input) === null || _b === void 0 ? void 0 : _b.size) ? (_c = paginationInfo.input) === null || _c === void 0 ? void 0 : _c.size : get(response, (_d = paginationInfo.input) === null || _d === void 0 ? void 0 : _d.size)) || res['size'];
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* If page is present in the pagination's output metadata deduce page from api's response
|
|
429
|
+
* Else deduce page from the pagination's input metadata page key
|
|
430
|
+
*/
|
|
431
|
+
if (resOutput === null || resOutput === void 0 ? void 0 : resOutput.page) {
|
|
432
|
+
this.setPaginationItems(resOutput.page, response, res, 'page', resHeaders);
|
|
433
|
+
}
|
|
434
|
+
else if (paginationInfo.type !== 'offset') {
|
|
435
|
+
this.setParameterVal('page', res, operationInfo, variable, options);
|
|
436
|
+
}
|
|
437
|
+
this.setTotalElements(resOutput, options, res, variable, response, paginationInfo, resHeaders);
|
|
438
|
+
/**
|
|
439
|
+
* If hasMoreItems is present in the pagination's output metadata deduce hasMoreItems from api's response
|
|
440
|
+
* Else assign it as empty which will be calculated at pagination object generation
|
|
441
|
+
*/
|
|
442
|
+
if (resOutput === null || resOutput === void 0 ? void 0 : resOutput.hasMoreItems) {
|
|
443
|
+
this.setPaginationItems(resOutput.hasMoreItems, response, res, 'hasMoreItems', resHeaders);
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
res['hasMoreItems'] = '';
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
else if (resOutput) { // For cursor type pagination set next and prev keys in res object
|
|
450
|
+
this.setPaginationItems(resOutput.next, response, res, 'next', resHeaders);
|
|
451
|
+
this.setPaginationItems(resOutput.prev, response, res, 'prev', resHeaders);
|
|
452
|
+
this.setPaginationItems(resOutput.size, response, res, 'size', resHeaders);
|
|
453
|
+
this.setParameterVal('page', res, operationInfo, variable, options);
|
|
454
|
+
this.setTotalElements(resOutput, options, res, variable, response, paginationInfo, resHeaders);
|
|
455
|
+
}
|
|
456
|
+
return res;
|
|
457
|
+
};
|
|
458
|
+
/**
|
|
459
|
+
* If totalElements has $minValue in it, set totalElements as $minValue
|
|
460
|
+
* If the rendered elements are greater than $minValue, set totalElements as Number of elements rendered + 1
|
|
461
|
+
|
|
462
|
+
* If totalElements is present in the pagination's output metadata deduce totalElements from api's response
|
|
463
|
+
|
|
464
|
+
* If Pagination type is offset, deduce totalElements from size and options[page] else deduce from size and res[page]
|
|
465
|
+
*/
|
|
466
|
+
PaginationUtils.setTotalElements = function (resOutput, options, res, variable, response, paginationInfo, resHeaders) {
|
|
467
|
+
if (startsWith(resOutput === null || resOutput === void 0 ? void 0 : resOutput.totalElements, '$minValue')) {
|
|
468
|
+
var totalEl = resOutput.totalElements.replace('$minValue=', '');
|
|
469
|
+
var pageParam = res['page'] ? res['page'] : options['page'];
|
|
470
|
+
var elRendered = res['size'] * pageParam;
|
|
471
|
+
if (!variable.pagination || variable.pagination['totalElements'] > elRendered) {
|
|
472
|
+
res['totalElements'] = parseInt(totalEl);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
res['totalElements'] = elRendered + 1;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
else if (resOutput === null || resOutput === void 0 ? void 0 : resOutput.totalElements) {
|
|
479
|
+
this.setPaginationItems(resOutput.totalElements, response, res, 'totalElements', resHeaders);
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {
|
|
483
|
+
res['totalElements'] = (res['size'] * (options['page'] ? options['page'] : 1)) + 1;
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
res['totalElements'] = (res['size'] * res['page']) + 1;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
return PaginationUtils;
|
|
491
|
+
}());
|
|
492
|
+
export { PaginationUtils };
|
|
493
|
+
//# sourceMappingURL=pagination.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.utils.js","sourceRoot":"./","sources":["src/util/variable/pagination.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { jmespath } from '@metrichor/jmespath';\n\nimport {startsWith, find, set, result, get} from 'lodash-es';\nimport { getValidJSON } from '../utils';\nimport { VARIABLE_CONSTANTS } from '../../constants/variables.constants';\n\nexport class PaginationUtils {\n /**\n * Modifies the query values with the pagination info which is retrieved from the previous API response.\n * @param variable withholds variable information \n * @param operationInfo has metadata of the variable \n * @param paginationInfo has metadata of the variable pagination data\n * @returns {void} This method does not return anything\n */\n static setPaginationQueryParams(variable, operationInfo, paginationInfo) {\n operationInfo.parameters.forEach(element => {\n // pagination input information varies based on the type\n let inputParam;\n if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {\n inputParam = 'offset';\n } else {\n inputParam = 'page';\n }\n // modifies query values based on the pagination of variable\n // compare parameter name with the input parameter's starting naming key (ex: channelcontext in channelcontext.pagination)\n if (element.name === paginationInfo.input[inputParam].split('.')[0]) {\n element.sampleValue = variable.pagination['page'];\n } else if (element.name === paginationInfo.input.size.split('.')[0]) {\n element.sampleValue = variable.pagination['size'];\n }\n });\n }\n\n /**\n * Sets pagination on the variable based on the response of the triggered api call.\n * @param variable withholds variable information \n * @param response has data of the api call's response\n * @param options has info of the api's query params\n * @returns {void} This method does not return anything\n */\n static setVariablePagination(variable, response, options) {\n if (!variable.pagination) {\n variable.pagination = {\n empty: false\n };\n }\n variable.pagination['size'] = response.size;\n variable.pagination['page'] = response.page || 0;\n variable.pagination['totalElements'] = response.totalElements;\n variable.pagination['numberOfElements'] = variable.pagination['size'];\n variable.pagination['number'] = options['page'] ? options['page'] - 1 : 0;\n \n /**\n * Deduce totalPages from totalElements by size.\n * If the total elements are evenly split among the pages, assign the same to totalPages\n * Else assign totalPages + 1\n */\n variable.pagination['totalPages'] = variable.pagination['totalElements'] / variable.pagination['size'];\n if (variable.pagination['totalElements'] % variable.pagination['size'] === 0) {\n variable.pagination['totalPages'] = parseInt(variable.pagination['totalPages']);\n } else {\n variable.pagination['totalPages'] = parseInt(variable.pagination['totalPages']) + 1;\n }\n\n // If pagination type is cursor, fill next & prev\n if (response.next) {\n variable.pagination['next'] = response.next;\n variable.pagination['prev'] = response.prev;\n variable.pagination['last'] = response.next ? false : true;\n variable.pagination['first'] = response.prev ? false : true;\n } else {\n variable.pagination['first'] = variable.pagination['page'] <= 1 ? true : false;\n // calculate last based on current page index against total pages\n variable.pagination['last'] = response.hasMoreItems === '' ? !(variable.pagination['page'] < variable.pagination['totalPages']) : !response.hasMoreItems;\n }\n }\n\n /**\n * Resolves the expression given in pagination metadata's output\n * @param item has value of each key which is inside output pagination metadata\n * @param response has data of the api call's response\n * @param resHeaders has data of the api call's response headers\n * @param res holds the information of pagination which has to be stored on the variable\n * @param key has key name against which data has to be stored in pagination \n * @returns {void} This method does not return anything\n */\n static setPaginationItems(item, response, res, key, resHeaders) {\n // if the item has body, resolve the expression against the response\n if (startsWith(item, '$body')) {\n const bodyKey = item.replace('$body.', '');\n try {\n res[key] = jmespath.search(response, bodyKey);\n } catch {\n console.warn(`${item} expression needs to be corrected as per JMES guidelines`);\n }\n } else if (startsWith(item, '$header')) { // if the item has header, resolve the expression against the response headers \n const headerKey = item.replace('$header.', '');\n const headers = (<any>Object).fromEntries(resHeaders?.headers || resHeaders);\n const headerParams = headerKey.split('.');\n const headerRootKey = headerParams[0].toLowerCase();\n const cloakPrefix = VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY.toLowerCase();\n // Pagination metadata may provide header names with quotes (e.g. \"X-Total-Count\").\n // Remove surrounding quotes before prefix checks / cloaked-key composition.\n const unquotedHeaderRootKey = headerRootKey.replace(/^[\"']|[\"']$/g, '');\n const cloakedHeaderLookupKey = cloakPrefix + unquotedHeaderRootKey;\n const getHeaderExpr = (headerName: string) => {\n // Normalize once so caller can pass bare names or pre-quoted names.\n const normalizedHeaderName = headerName.replace(/^[\"']|[\"']$/g, '');\n // Hyphenated header names are not valid bare identifiers in JMESPath.\n if (/^[a-z_][a-z0-9_]*$/i.test(normalizedHeaderName)) {\n return normalizedHeaderName;\n }\n // Quote and escape to produce a valid JMESPath identifier for headers like x-wm-x-total-count.\n return `\"${normalizedHeaderName.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n };\n const headerRootExpr = getHeaderExpr(headerRootKey);\n const cloakedHeaderRootExpr = getHeaderExpr(cloakedHeaderLookupKey);\n try {\n res[key] = jmespath.search(headers, headerRootExpr);\n // For proxied calls response headers may be cloaked as x-wm-<header-name>.\n if (!res[key] && !unquotedHeaderRootKey.startsWith(cloakPrefix)) {\n res[key] = jmespath.search(headers, cloakedHeaderRootExpr);\n }\n } catch {\n console.warn(`${item} expression needs to be corrected as per JMES guidelines`);\n }\n if (res[key]?.length) { \n let headerVal = res[key].join();\n if (headerParams.length === 1) { \n /**\n * If the headerParams has only 1 key (which is not an object) name assing headerVal to the res[key]\n */\n res[key] = headerVal;\n } else { \n /**\n * If the headerParams has more than 1 key (an object), parse the stringified headerVal which is an object\n * Resolve the expression against headerVal object amd assign it to res[key]\n */\n let keyName = headerParams.slice(1).join('.');\n const headerResp = JSON.parse(headerVal);\n const specialChar = /[!@#$%^&*()+\\=\\[\\]{};':\"\\\\|,<>\\/?]+/;\n if (specialChar.test(keyName)) {\n // If key name has expression (ex: comparission expression) \n // add root key name to keyName for JMES to resolve the expression\n keyName = 'headerResp.' + keyName;\n }\n try {\n res[key] = jmespath.search(headerResp, keyName);\n } catch {\n console.warn(`${item} expression needs to be corrected as per JMES guidelines`);\n }\n }\n }\n }\n }\n\n /**\n * Return the pagination information of the service based on its existence on swagger or on the variable\n * @param variable withholds variable information \n * @param operationInfo has metadata of the variable \n * @returns {object} This method return pagination metadata\n */\n static getPaginationInfo(operationInfo, variable) {\n if (operationInfo?.paginationInfo) {\n return operationInfo.paginationInfo;\n } else {\n return variable._paginationConfig;\n }\n }\n\n /**\n * Set query params with the pagination info, if pagination metadata is present in query params\n * @param variable withholds variable information \n * @param operationInfo has metadata of the variable \n * @param options has info of the api's query params\n * @returns {void} This method does not return anything\n */\n static checkPaginationAtQuery(operationInfo, variable, options) { \n const paginationInfo = this.getPaginationInfo(operationInfo, variable);\n // If page is not first, pagination is present on the variable and paginationInfo's input meta has size set pagination in query params\n const hasPagination = options && options['page'] && paginationInfo?.input.size && variable.pagination; \n if (!hasPagination) {\n return;\n }\n\n let inputParam,sizeParam;\n // if pagination type is offset, asssign inputParam to offset else page\n if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {\n inputParam = 'offset';\n } else {\n inputParam = 'page';\n }\n if([\"page\",\"offset\",\"cursor\"].includes(paginationInfo.type)) {\n sizeParam = 'size';\n }\n if(sizeParam) {\n const sizeParamName = paginationInfo.input[sizeParam].split('.')[0];\n const sizeParamObj = find(operationInfo.parameters, function (obj) { return obj.name === sizeParamName; });\n if (sizeParamObj && sizeParamObj.parameterType === 'query' && [\"page\",\"offset\",\"cursor\"].includes(paginationInfo.type)) {\n variable.pagination['size'] = options['size'] || variable.pagination['size'];\n }\n }\n const paramName = paginationInfo.input[inputParam].split('.')[0]; \n const paramObj = find(operationInfo.parameters, function(obj) { return obj.name === paramName }); \n // check if the variable has query params and they are not empty\n if (paramObj && paramObj.parameterType === 'query') {\n /**\n * For pagination type other than offset, assign page which is recieved from options\n * For offset type, calculate page from size and options[page]\n */\n if (!paginationInfo.output?.page && paginationInfo.type !== 'offset') {\n variable.pagination['page'] = options['page'];\n } else {\n variable.pagination['page'] = this.getOffsetInfo(variable, options);\n }\n this.setPaginationQueryParams(variable, operationInfo, paginationInfo); \n } else if(paginationInfo.type === 'cursor') {\n const sParam = (paginationInfo.input?.size && paginationInfo.input['size'].split('.')[0]) || \"\";\n if(sParam) {\n const sParamObj = find(operationInfo.parameters, function(obj) { return obj.name === sParam && obj.parameterType === 'path' });\n if(sParamObj) {\n sParamObj.sampleValue = options['size'] || variable.pagination['size'] || sParamObj.sampleValue;\n }\n }\n }\n }\n\n /**\n * Deduces the offset information from the size and page params\n * @param variable withholds variable information \n * @param options has info of the api's query params\n * @returns {object} Returns the next offset number\n */\n static getOffsetInfo(variable, options) {\n return variable.pagination['size'] * (options['page'] ? (options['page'] - 1) : 0);\n }\n\n /**\n * Sets Pagination data on the request information\n * @param variable withholds variable information \n * @param operationInfo has metadata of the variable \n * @param options has info of the api's query params\n * @param paginationInfo has pagination information of the variable\n * @param headers has request headers\n * @param requestBody has request body\n * @param url has request url\n * @returns {object} Returns the request object which has pagination info\n */\n static setPaginationAtReq(paginationInfo, operationInfo, variable, headers, requestBody, url, options) {\n let reqObj = {};\n let inputParam;\n let resObj = {};\n // pagination input information varies based on the type\n if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {\n inputParam = 'offset';\n } else {\n inputParam = 'page';\n }\n const paramName = paginationInfo.input[inputParam].split('.')[0]; \n // check if paramName is present in parameters of operation info \n const paramObj = find(operationInfo.parameters, function(obj) { \n if(obj.parameterType === 'body' && inputParam === 'page'){\n return obj.sampleValue.hasOwnProperty(paramName)\n }else{\n return obj.name === paramName\n }\n }); \n // set page/offset and size from pagination if matched parameter's type is header \n if (paramObj?.parameterType === 'header') {\n const inputBodyParam = VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY + paginationInfo.input[inputParam]; \n if (inputParam !== 'offset') { \n set(reqObj, inputBodyParam, variable.pagination['page']);\n } else {\n set(reqObj, inputBodyParam, this.getOffsetInfo(variable, options));\n }\n set(reqObj, VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY + paginationInfo.input.size, variable.pagination['size']);\n let headerKey = VARIABLE_CONSTANTS.REST_SERVICE.PREFIX.CLOAK_HEADER_KEY + paramName;\n headers[headerKey] = typeof reqObj[headerKey] === 'object' ? JSON.stringify(reqObj[headerKey]) : reqObj[headerKey];\n resObj['headers'] = headers;\n } else if (paramObj?.parameterType === 'body') { \n // set page/offset and size from pagination if matched parameter's type is body \n // assign bodyVal to updated pagination info object\n let bodyVal: any;\n try {\n bodyVal = typeof paramObj.sampleValue === 'string' ? JSON.parse(paramObj.sampleValue) : paramObj.sampleValue;\n } catch (e) {\n bodyVal = paramObj.sampleValue;\n }\n const bodyParam = inputParam === 'page' ? paginationInfo.input[inputParam] : paginationInfo.input[inputParam].split('.')[1]\n if (bodyVal && bodyVal[bodyParam]) {\n let inputBodyParam = paginationInfo.input[inputParam].split('.').splice(1).join('.'); \n if (inputParam !== 'offset') { \n inputBodyParam = paginationInfo.input[inputParam]; \n set(reqObj, inputBodyParam, options.page ? options.page : 1);\n } else {\n set(reqObj, inputBodyParam, this.getOffsetInfo(variable, options));\n }\n set(reqObj, paginationInfo.input.size.split('.').splice(1).join('.'), variable.pagination['size']);\n bodyVal[bodyParam] = reqObj[bodyParam];\n requestBody = JSON.stringify(bodyVal);\n resObj['requestBody'] = requestBody;\n }\n } else if (variable.pagination.next && paramObj) {\n /**\n * For cursor type pagination, if pagination info is present in the path \n * Based on whether user clicks on the next or prev button modify the url \n */\n \n if (paramObj.parameterType === 'path') {\n const urlParams = operationInfo.relativePath.split('/'),\n paramConfig = '{' + paramObj.name + '}',\n paramIndex = urlParams.indexOf(paramConfig);\n let invokeUrl;\n if (variable.pagination.isNext) {\n invokeUrl = variable.pagination.next.split('/');\n } else {\n invokeUrl = variable.pagination.prev.split('/');\n }\n\n let urlPathParmas;\n let urlPath;\n if (operationInfo.directPath) { // For direct path, as url has hostname, derivate pathname using URL object\n urlPath = new URL(url);\n urlPathParmas = urlPath.pathname.split('/');\n urlPathParmas[paramIndex] = invokeUrl[paramIndex];\n urlPath.pathname = urlPathParmas.join('/');\n url = urlPath.href;\n resObj['url'] = url;\n } else { // Else modify the url with index as +1 (following proxy pattern)\n urlPathParmas = url.split('/');\n urlPathParmas[paramIndex + 1] = invokeUrl[paramIndex];\n url = urlPathParmas.join('/');\n resObj['url'] = url;\n }\n\n } else if (paramObj.parameterType === 'query') {\n /**\n * For cursor type pagination, if pagination info is present in the query \n * Based on whether user clicks on the next or prev button modify the url's query params\n */\n const sizeParam = paginationInfo.input['size'].split('.')[0];\n const sizeObj = find(operationInfo.parameters, function(obj) { return obj.name === sizeParam });\n const urlParams = url.split('?');\n let invokeUrl;\n if (variable.pagination.isNext) {\n invokeUrl = variable.pagination.next.split('?');\n } else if(variable.pagination.isPrev) {\n invokeUrl = variable.pagination.prev.split('?');\n }\n if(invokeUrl) {\n const queryParams = new URLSearchParams(invokeUrl[1]);\n if (sizeObj && sizeObj.sampleValue) {\n queryParams.set(sizeObj.name, sizeObj.sampleValue);\n }\n invokeUrl[1] = queryParams.toString();\n urlParams[1] = invokeUrl[1]\n url = urlParams.join('?');\n resObj['url'] = url;\n }\n }\n }\n return resObj; \n }\n\n /**\n * Sets the pagination info recieved from api's response in the res object\n * @param operationInfo has metadata of the variable\n * @param res holds the information of pagination which has to be stored on the variable\n * @param paramName has key name against which data has to be stored in pagination\n * @param variable withholds variable information \n * @returns {void} This method does not return anything\n */\n static setParameterVal(paramName, res, operationInfo, variable, options?) {\n const paginationInfo = this.getPaginationInfo(operationInfo, variable);\n const paginationParams = paginationInfo.input[paramName].split('.');\n const param = paginationParams[0]; \n const sizeObj = find(operationInfo.parameters, function(obj) { return obj.name === param });\n if(paramName === 'size' && paginationInfo && (paginationInfo.type === 'offset' || paginationInfo.type === 'page') && options?.size && sizeObj?.sampleValue) {\n sizeObj.sampleValue = options['size'] || result(sizeObj, 'sampleValue');\n }\n res[paramName] = result(sizeObj, 'sampleValue');\n // if input value is configured from object, fetch the value from the specified path\n if (paginationParams.length > 1) {\n res[paramName] = get(getValidJSON(res[paramName]), paginationInfo.input[paramName].split('.').splice(1).join('.'));\n }\n }\n\n /**\n * Creates res object from the response recieved from the api triggered\n * @param variable withholds variable information \n * @param operationInfo has metadata of the variable\n * @param paginationInfo has metadata of the variable's pagination\n * @param response has data of the api call's response\n * @param options has info of the api's query params\n * @param resHeaders has data of the api call's response headers\n * @returns {object} An object which holds the information of pagination which has to be stored on the variable\n */\n static generatePaginationRes(operationInfo, paginationInfo, response, resHeaders, options, variable) {\n let res = {};\n const resOutput = paginationInfo.output;\n // If pagination type is not cursor, create the following metadata \n if (!resOutput?.next) {\n /**\n * If size is present in the pagination's output metadata deduce size from api's response\n * Else deduce size from the pagination's input metadata size key\n */\n if (resOutput?.size) {\n this.setPaginationItems(resOutput.size, response, res, 'size', resHeaders);\n }else{ \n this.setParameterVal('size', res, operationInfo, variable, options);\n }\n \n if(!resOutput?.size && paginationInfo.input?.size && paginationInfo.type === 'page'){\n res['size'] = (Number(paginationInfo.input?.size) ? paginationInfo.input?.size : get(response, paginationInfo.input?.size)) || res['size'];\n }\n /**\n * If page is present in the pagination's output metadata deduce page from api's response\n * Else deduce page from the pagination's input metadata page key\n */\n if (resOutput?.page) {\n this.setPaginationItems(resOutput.page, response, res, 'page', resHeaders);\n } else if (paginationInfo.type !== 'offset') {\n this.setParameterVal('page', res, operationInfo, variable, options);\n }\n this.setTotalElements(resOutput,options,res,variable,response,paginationInfo,resHeaders);\n /**\n * If hasMoreItems is present in the pagination's output metadata deduce hasMoreItems from api's response\n * Else assign it as empty which will be calculated at pagination object generation\n */\n if (resOutput?.hasMoreItems) {\n this.setPaginationItems(resOutput.hasMoreItems, response, res, 'hasMoreItems', resHeaders);\n } else {\n res['hasMoreItems'] = '';\n }\n } else if (resOutput) { // For cursor type pagination set next and prev keys in res object\n this.setPaginationItems(resOutput.next, response, res, 'next', resHeaders);\n this.setPaginationItems(resOutput.prev, response, res, 'prev', resHeaders);\n this.setPaginationItems(resOutput.size, response, res, 'size', resHeaders);\n this.setParameterVal('page', res, operationInfo, variable, options);\n this.setTotalElements(resOutput,options,res,variable,response,paginationInfo,resHeaders);\n }\n return res;\n }\n /**\n * If totalElements has $minValue in it, set totalElements as $minValue\n * If the rendered elements are greater than $minValue, set totalElements as Number of elements rendered + 1\n\n * If totalElements is present in the pagination's output metadata deduce totalElements from api's response\n\n * If Pagination type is offset, deduce totalElements from size and options[page] else deduce from size and res[page]\n */\n static setTotalElements(resOutput, options, res, variable, response, paginationInfo, resHeaders) {\n if (startsWith(resOutput?.totalElements, '$minValue')) {\n const totalEl = resOutput.totalElements.replace('$minValue=', '');\n const pageParam = res['page'] ? res['page'] : options['page']\n const elRendered = res['size'] * pageParam;\n if (!variable.pagination || variable.pagination['totalElements'] > elRendered) {\n res['totalElements'] = parseInt(totalEl);\n } else {\n res['totalElements'] = elRendered + 1;\n }\n } else if (resOutput?.totalElements) {\n this.setPaginationItems(resOutput.totalElements, response, res, 'totalElements', resHeaders);\n } else {\n if (paginationInfo.type === 'offset' || paginationInfo.input.offset) {\n res['totalElements'] = (res['size'] * (options['page'] ? options['page'] : 1)) + 1;\n } else {\n res['totalElements'] = (res['size'] * res['page']) + 1;\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class ServiceVariableUtils {
|
|
2
|
+
/**
|
|
3
|
+
* prepares the HTTP request info for a Service Variable
|
|
4
|
+
* @param variable
|
|
5
|
+
* @param operationInfo
|
|
6
|
+
* @param inputFields
|
|
7
|
+
* @returns {any}
|
|
8
|
+
*/
|
|
9
|
+
static constructRequestParams(variable: any, operationInfo: any, inputFields: any, options?: any): any;
|
|
10
|
+
static isFileUploadRequest(variable: any): boolean;
|
|
11
|
+
static isFileDeleteRequest(variable: any): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* This method returns array of query param names for variable other then page,size,sort
|
|
14
|
+
* @params {params} params of the variable
|
|
15
|
+
*/
|
|
16
|
+
static excludePaginationParams(params: any): any;
|
|
17
|
+
}
|