remult 0.14.6 → 0.14.7
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/assign.js +5 -1
- package/classType.js +2 -1
- package/graphql.js +146 -84
- package/index.js +73 -25
- package/inputTypes.js +16 -9
- package/package.json +1 -2
- package/postgres/index.js +4 -1
- package/postgres/postgres-data-provider.d.ts +4 -1
- package/postgres/postgres-data-provider.js +364 -165
- package/postgres/postgresColumnSyntax.d.ts +1 -1
- package/postgres/postgresColumnSyntax.js +8 -4
- package/remult-express.js +10 -6
- package/remult-knex/index.d.ts +5 -2
- package/remult-knex/index.js +720 -300
- package/remult-middleware.js +29 -24
- package/remult-mongo.js +406 -172
- package/server/JsonEntityFileStorage.js +15 -10
- package/server/expressBridge.d.ts +4 -2
- package/server/expressBridge.js +570 -383
- package/server/index.js +11 -4
- package/server/register-actions-on-server.js +38 -12
- package/server/register-entities-on-server.js +13 -9
- package/src/__EntityValueProvider.js +2 -1
- package/src/__RowsOfDataForTesting.js +2 -1
- package/src/backend-tests/backend-database-test-setup.backend-spec.js +190 -72
- package/src/backend-tests/my-test.backend-spec.js +114 -45
- package/src/column-interfaces.js +6 -2
- package/src/column.js +113 -71
- package/src/context.js +330 -174
- package/src/data-api.js +326 -162
- package/src/data-interfaces.js +11 -7
- package/src/data-providers/array-entity-data-provider.js +286 -171
- package/src/data-providers/in-memory-database.js +27 -12
- package/src/data-providers/json-data-provider.js +77 -41
- package/src/data-providers/rest-data-provider.js +189 -102
- package/src/data-providers/sql-database.js +403 -223
- package/src/data-providers/web-sql-data-provider.js +139 -78
- package/src/entity.js +2 -1
- package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +1 -1
- package/src/filter/filter-consumer-bridge-to-sql-request.js +248 -106
- package/src/filter/filter-consumer-bridge-to-url-builder.js +2 -1
- package/src/filter/filter-interfaces.js +440 -277
- package/src/id-entity.js +17 -8
- package/src/remult3/RepositoryImplementation.js +2367 -1191
- package/src/remult3/index.js +5 -2
- package/src/remult3/remult3.js +2 -1
- package/src/server-action.js +528 -294
- package/src/shared-tests/db-tests-setup.js +153 -49
- package/src/shared-tests/db-tests.db-tests.js +1566 -660
- package/src/shared-tests/deleteAll.js +20 -3
- package/src/shared-tests/entityWithValidations.js +79 -52
- package/src/shared-tests/index.js +6 -4
- package/src/shared-tests/test-custom-id-column.spec.js +85 -37
- package/src/shared-tests/test-special-value.spec.js +104 -64
- package/src/shared-tests/test-update-with-null.spec.js +49 -28
- package/src/sort.js +95 -38
- package/src/sql-command.js +2 -1
- package/src/tests/Done.js +13 -7
- package/src/tests/TestDataApiResponse.js +22 -15
- package/src/tests/c.js +27 -21
- package/src/tests/createData.js +48 -20
- package/src/tests/d.js +27 -19
- package/src/tests/dWithPrefilter.js +44 -31
- package/src/tests/entityForCustomFilter.js +66 -42
- package/src/tests/entityWithValidationsOnColumn.js +29 -21
- package/src/tests/frontend-database-tests-setup.spec.js +98 -35
- package/src/tests/h.js +44 -35
- package/src/tests/remult-3-entities.js +80 -71
- package/src/tests/tasks.js +29 -23
- package/src/tests/testHelper.spec.js +322 -170
- package/src/tests/testModel/models.js +33 -25
- package/src/validators.js +59 -32
- package/urlBuilder.js +14 -8
- package/valueConverters.js +160 -161
|
@@ -1,62 +1,76 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildFilterFromRequestParameters = exports.entityFilterToJson = exports.FilterSerializer = exports.customDatabaseFilterToken = exports.customUrlToken = exports.OrFilter = exports.AndFilter = exports.filterHelper = exports.Filter = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var remult3_1 = require("../remult3");
|
|
6
|
+
var Filter = /** @class */ (function () {
|
|
7
|
+
function Filter(apply) {
|
|
4
8
|
this.apply = apply;
|
|
5
9
|
if (!this.apply) {
|
|
6
|
-
this.apply = ()
|
|
10
|
+
this.apply = function () { };
|
|
7
11
|
}
|
|
8
12
|
}
|
|
9
|
-
__applyToConsumer(add) {
|
|
13
|
+
Filter.prototype.__applyToConsumer = function (add) {
|
|
10
14
|
this.apply(add);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
};
|
|
16
|
+
Filter.resolve = function (filter) {
|
|
17
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
18
|
+
return tslib_1.__generator(this, function (_a) {
|
|
19
|
+
switch (_a.label) {
|
|
20
|
+
case 0:
|
|
21
|
+
if (!(typeof filter === "function")) return [3 /*break*/, 2];
|
|
22
|
+
return [4 /*yield*/, filter()];
|
|
23
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
24
|
+
case 2: return [2 /*return*/, filter];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
Filter.createCustom = function (customFilterTranslator, key) {
|
|
30
|
+
if (key === void 0) { key = ''; }
|
|
31
|
+
var customFilterInfo = { key: key, customFilterTranslator: customFilterTranslator };
|
|
32
|
+
return Object.assign(function (x) {
|
|
33
|
+
var _a;
|
|
34
|
+
var z = {};
|
|
21
35
|
if (x == undefined)
|
|
22
36
|
x = {};
|
|
23
37
|
if (!customFilterInfo.key)
|
|
24
38
|
throw "Usage of custom filter before a key was assigned to it";
|
|
25
|
-
return {
|
|
26
|
-
[customUrlToken + customFilterInfo.key]
|
|
27
|
-
|
|
28
|
-
}, { customFilterInfo });
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
39
|
+
return _a = {},
|
|
40
|
+
_a[exports.customUrlToken + customFilterInfo.key] = x,
|
|
41
|
+
_a;
|
|
42
|
+
}, { customFilterInfo: customFilterInfo });
|
|
43
|
+
};
|
|
44
|
+
Filter.fromEntityFilter = function (entity, whereItem) {
|
|
45
|
+
var result = [];
|
|
46
|
+
var _loop_1 = function (key) {
|
|
33
47
|
if (Object.prototype.hasOwnProperty.call(whereItem, key)) {
|
|
34
|
-
|
|
48
|
+
var fieldToFilter_1 = whereItem[key];
|
|
35
49
|
{
|
|
36
50
|
if (key == "$or") {
|
|
37
|
-
result.push(new OrFilter(
|
|
51
|
+
result.push(new (OrFilter.bind.apply(OrFilter, tslib_1.__spread([void 0], fieldToFilter_1.map(function (x) { return Filter.fromEntityFilter(entity, x); }))))());
|
|
38
52
|
}
|
|
39
53
|
else if (key == "$and") {
|
|
40
|
-
result.push(new AndFilter(
|
|
54
|
+
result.push(new (AndFilter.bind.apply(AndFilter, tslib_1.__spread([void 0], fieldToFilter_1.map(function (x) { return Filter.fromEntityFilter(entity, x); }))))());
|
|
41
55
|
}
|
|
42
|
-
else if (key.startsWith(customUrlToken)) {
|
|
43
|
-
result.push(new Filter(x
|
|
44
|
-
x.custom(key.substring(customUrlToken.length),
|
|
56
|
+
else if (key.startsWith(exports.customUrlToken)) {
|
|
57
|
+
result.push(new Filter(function (x) {
|
|
58
|
+
x.custom(key.substring(exports.customUrlToken.length), fieldToFilter_1);
|
|
45
59
|
}));
|
|
46
60
|
}
|
|
47
|
-
else if (key == customDatabaseFilterToken) {
|
|
48
|
-
result.push(new Filter(x
|
|
61
|
+
else if (key == exports.customDatabaseFilterToken) {
|
|
62
|
+
result.push(new Filter(function (x) { return x.databaseCustom(fieldToFilter_1); }));
|
|
49
63
|
}
|
|
50
64
|
else {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
for (
|
|
57
|
-
if (Object.prototype.hasOwnProperty.call(
|
|
58
|
-
|
|
59
|
-
switch (
|
|
65
|
+
var fh = new filterHelper(entity.fields[key]);
|
|
66
|
+
var found = false;
|
|
67
|
+
if (fieldToFilter_1 !== undefined && fieldToFilter_1 != null) {
|
|
68
|
+
if (fieldToFilter_1.$id)
|
|
69
|
+
fieldToFilter_1 = fieldToFilter_1.$id;
|
|
70
|
+
for (var key_1 in fieldToFilter_1) {
|
|
71
|
+
if (Object.prototype.hasOwnProperty.call(fieldToFilter_1, key_1)) {
|
|
72
|
+
var element = fieldToFilter_1[key_1];
|
|
73
|
+
switch (key_1) {
|
|
60
74
|
case "$gte":
|
|
61
75
|
case ">=":
|
|
62
76
|
result.push(fh.isGreaterOrEqualTo(element));
|
|
@@ -93,234 +107,328 @@ export class Filter {
|
|
|
93
107
|
}
|
|
94
108
|
}
|
|
95
109
|
}
|
|
96
|
-
if (Array.isArray(
|
|
110
|
+
if (Array.isArray(fieldToFilter_1)) {
|
|
97
111
|
found = true;
|
|
98
|
-
result.push(fh.isIn(
|
|
112
|
+
result.push(fh.isIn(fieldToFilter_1));
|
|
99
113
|
}
|
|
100
114
|
}
|
|
101
|
-
if (!found &&
|
|
102
|
-
result.push(fh.isEqualTo(
|
|
115
|
+
if (!found && fieldToFilter_1 !== undefined) {
|
|
116
|
+
result.push(fh.isEqualTo(fieldToFilter_1));
|
|
103
117
|
}
|
|
104
118
|
}
|
|
105
119
|
}
|
|
106
120
|
}
|
|
121
|
+
};
|
|
122
|
+
for (var key in whereItem) {
|
|
123
|
+
_loop_1(key);
|
|
107
124
|
}
|
|
108
|
-
return new AndFilter(
|
|
109
|
-
}
|
|
110
|
-
toJson() {
|
|
111
|
-
|
|
125
|
+
return new (AndFilter.bind.apply(AndFilter, tslib_1.__spread([void 0], result)))();
|
|
126
|
+
};
|
|
127
|
+
Filter.prototype.toJson = function () {
|
|
128
|
+
var r = new FilterSerializer();
|
|
112
129
|
this.__applyToConsumer(r);
|
|
113
130
|
return r.result;
|
|
114
|
-
}
|
|
115
|
-
|
|
131
|
+
};
|
|
132
|
+
Filter.entityFilterToJson = function (entityDefs, where) {
|
|
116
133
|
return Filter.fromEntityFilter(entityDefs, where).toJson();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return buildFilterFromRequestParameters(entityDefs, { get: (key)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
134
|
+
};
|
|
135
|
+
Filter.entityFilterFromJson = function (entityDefs, packed) {
|
|
136
|
+
return buildFilterFromRequestParameters(entityDefs, { get: function (key) { return packed[key]; } });
|
|
137
|
+
};
|
|
138
|
+
Filter.translateCustomWhere = function (r, entity, remult) {
|
|
139
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
140
|
+
var f;
|
|
141
|
+
var _this = this;
|
|
142
|
+
return tslib_1.__generator(this, function (_a) {
|
|
143
|
+
switch (_a.label) {
|
|
144
|
+
case 0:
|
|
145
|
+
f = new customTranslator(function (filterKey, custom) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
146
|
+
var r, _a, _b, _i, key, element, _c, _d, _e, _f, _g;
|
|
147
|
+
return tslib_1.__generator(this, function (_h) {
|
|
148
|
+
switch (_h.label) {
|
|
149
|
+
case 0:
|
|
150
|
+
r = [];
|
|
151
|
+
_a = [];
|
|
152
|
+
for (_b in entity.entityType)
|
|
153
|
+
_a.push(_b);
|
|
154
|
+
_i = 0;
|
|
155
|
+
_h.label = 1;
|
|
156
|
+
case 1:
|
|
157
|
+
if (!(_i < _a.length)) return [3 /*break*/, 5];
|
|
158
|
+
key = _a[_i];
|
|
159
|
+
element = entity.entityType[key];
|
|
160
|
+
if (!(element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator)) return [3 /*break*/, 4];
|
|
161
|
+
if (!(element.customFilterInfo.key == filterKey)) return [3 /*break*/, 4];
|
|
162
|
+
_d = (_c = r).push;
|
|
163
|
+
_f = (_e = Filter).fromEntityFilter;
|
|
164
|
+
_g = [entity];
|
|
165
|
+
return [4 /*yield*/, element.customFilterInfo.customFilterTranslator(remult, custom)];
|
|
166
|
+
case 2: return [4 /*yield*/, _f.apply(_e, _g.concat([_h.sent()]))];
|
|
167
|
+
case 3:
|
|
168
|
+
_d.apply(_c, [_h.sent()]);
|
|
169
|
+
_h.label = 4;
|
|
170
|
+
case 4:
|
|
171
|
+
_i++;
|
|
172
|
+
return [3 /*break*/, 1];
|
|
173
|
+
case 5: return [2 /*return*/, r];
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}); });
|
|
177
|
+
r.__applyToConsumer(f);
|
|
178
|
+
return [4 /*yield*/, f.resolve()];
|
|
179
|
+
case 1:
|
|
180
|
+
_a.sent();
|
|
181
|
+
r = new Filter(function (x) { return f.applyTo(x); });
|
|
182
|
+
return [2 /*return*/, r];
|
|
130
183
|
}
|
|
131
|
-
}
|
|
132
|
-
return r;
|
|
184
|
+
});
|
|
133
185
|
});
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
export class filterHelper {
|
|
141
|
-
constructor(metadata) {
|
|
186
|
+
};
|
|
187
|
+
return Filter;
|
|
188
|
+
}());
|
|
189
|
+
exports.Filter = Filter;
|
|
190
|
+
var filterHelper = /** @class */ (function () {
|
|
191
|
+
function filterHelper(metadata) {
|
|
142
192
|
this.metadata = metadata;
|
|
143
193
|
}
|
|
144
|
-
processVal(val) {
|
|
145
|
-
|
|
194
|
+
filterHelper.prototype.processVal = function (val) {
|
|
195
|
+
var ei = remult3_1.getEntitySettings(this.metadata.valueType, false);
|
|
146
196
|
if (ei) {
|
|
147
197
|
if (!val)
|
|
148
198
|
return null;
|
|
149
199
|
if (typeof val === "string" || typeof val === "number")
|
|
150
200
|
return val;
|
|
151
|
-
return getEntityRef(val).getId();
|
|
201
|
+
return remult3_1.getEntityRef(val).getId();
|
|
152
202
|
}
|
|
153
203
|
return val;
|
|
154
|
-
}
|
|
155
|
-
contains(val) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
204
|
+
};
|
|
205
|
+
filterHelper.prototype.contains = function (val) {
|
|
206
|
+
var _this = this;
|
|
207
|
+
return new Filter(function (add) { return add.containsCaseInsensitive(_this.metadata, val); });
|
|
208
|
+
};
|
|
209
|
+
filterHelper.prototype.isLessThan = function (val) {
|
|
210
|
+
var _this = this;
|
|
159
211
|
val = this.processVal(val);
|
|
160
|
-
return new Filter(add
|
|
161
|
-
}
|
|
162
|
-
isGreaterOrEqualTo(val) {
|
|
212
|
+
return new Filter(function (add) { return add.isLessThan(_this.metadata, val); });
|
|
213
|
+
};
|
|
214
|
+
filterHelper.prototype.isGreaterOrEqualTo = function (val) {
|
|
215
|
+
var _this = this;
|
|
163
216
|
val = this.processVal(val);
|
|
164
|
-
return new Filter(add
|
|
165
|
-
}
|
|
166
|
-
isNotIn(values) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
217
|
+
return new Filter(function (add) { return add.isGreaterOrEqualTo(_this.metadata, val); });
|
|
218
|
+
};
|
|
219
|
+
filterHelper.prototype.isNotIn = function (values) {
|
|
220
|
+
var _this = this;
|
|
221
|
+
return new Filter(function (add) {
|
|
222
|
+
var e_1, _a;
|
|
223
|
+
try {
|
|
224
|
+
for (var values_1 = tslib_1.__values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
|
|
225
|
+
var v = values_1_1.value;
|
|
226
|
+
add.isDifferentFrom(_this.metadata, _this.processVal(v));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
230
|
+
finally {
|
|
231
|
+
try {
|
|
232
|
+
if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
|
|
233
|
+
}
|
|
234
|
+
finally { if (e_1) throw e_1.error; }
|
|
170
235
|
}
|
|
171
236
|
});
|
|
172
|
-
}
|
|
173
|
-
isDifferentFrom(val) {
|
|
237
|
+
};
|
|
238
|
+
filterHelper.prototype.isDifferentFrom = function (val) {
|
|
239
|
+
var _this = this;
|
|
174
240
|
val = this.processVal(val);
|
|
175
241
|
if ((val === null || val === undefined) && this.metadata.allowNull)
|
|
176
|
-
return new Filter(add
|
|
177
|
-
return new Filter(add
|
|
178
|
-
}
|
|
179
|
-
isLessOrEqualTo(val) {
|
|
242
|
+
return new Filter(function (add) { return add.isNotNull(_this.metadata); });
|
|
243
|
+
return new Filter(function (add) { return add.isDifferentFrom(_this.metadata, val); });
|
|
244
|
+
};
|
|
245
|
+
filterHelper.prototype.isLessOrEqualTo = function (val) {
|
|
246
|
+
var _this = this;
|
|
180
247
|
val = this.processVal(val);
|
|
181
|
-
return new Filter(add
|
|
182
|
-
}
|
|
183
|
-
isGreaterThan(val) {
|
|
248
|
+
return new Filter(function (add) { return add.isLessOrEqualTo(_this.metadata, val); });
|
|
249
|
+
};
|
|
250
|
+
filterHelper.prototype.isGreaterThan = function (val) {
|
|
251
|
+
var _this = this;
|
|
184
252
|
val = this.processVal(val);
|
|
185
|
-
return new Filter(add
|
|
186
|
-
}
|
|
187
|
-
isEqualTo(val) {
|
|
253
|
+
return new Filter(function (add) { return add.isGreaterThan(_this.metadata, val); });
|
|
254
|
+
};
|
|
255
|
+
filterHelper.prototype.isEqualTo = function (val) {
|
|
256
|
+
var _this = this;
|
|
188
257
|
val = this.processVal(val);
|
|
189
258
|
if ((val === null || val === undefined) && this.metadata.allowNull)
|
|
190
|
-
return new Filter(add
|
|
191
|
-
return new Filter(add
|
|
192
|
-
}
|
|
193
|
-
isIn(val) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
259
|
+
return new Filter(function (add) { return add.isNull(_this.metadata); });
|
|
260
|
+
return new Filter(function (add) { return add.isEqualTo(_this.metadata, val); });
|
|
261
|
+
};
|
|
262
|
+
filterHelper.prototype.isIn = function (val) {
|
|
263
|
+
var _this = this;
|
|
264
|
+
val = val.map(function (x) { return _this.processVal(x); });
|
|
265
|
+
return new Filter(function (add) { return add.isIn(_this.metadata, val); });
|
|
266
|
+
};
|
|
267
|
+
return filterHelper;
|
|
268
|
+
}());
|
|
269
|
+
exports.filterHelper = filterHelper;
|
|
270
|
+
var AndFilter = /** @class */ (function (_super) {
|
|
271
|
+
tslib_1.__extends(AndFilter, _super);
|
|
272
|
+
function AndFilter() {
|
|
273
|
+
var filters = [];
|
|
274
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
275
|
+
filters[_i] = arguments[_i];
|
|
276
|
+
}
|
|
277
|
+
var _this = _super.call(this, function (add) {
|
|
278
|
+
var e_2, _a;
|
|
279
|
+
try {
|
|
280
|
+
for (var _b = tslib_1.__values(_this.filters), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
281
|
+
var iterator = _c.value;
|
|
282
|
+
if (iterator)
|
|
283
|
+
iterator.__applyToConsumer(add);
|
|
284
|
+
}
|
|
204
285
|
}
|
|
205
|
-
|
|
206
|
-
|
|
286
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
287
|
+
finally {
|
|
288
|
+
try {
|
|
289
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
290
|
+
}
|
|
291
|
+
finally { if (e_2) throw e_2.error; }
|
|
292
|
+
}
|
|
293
|
+
}) || this;
|
|
294
|
+
_this.filters = filters;
|
|
295
|
+
return _this;
|
|
207
296
|
}
|
|
208
|
-
add(filter) {
|
|
297
|
+
AndFilter.prototype.add = function (filter) {
|
|
209
298
|
this.filters.push(filter);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
299
|
+
};
|
|
300
|
+
return AndFilter;
|
|
301
|
+
}(Filter));
|
|
302
|
+
exports.AndFilter = AndFilter;
|
|
303
|
+
var OrFilter = /** @class */ (function (_super) {
|
|
304
|
+
tslib_1.__extends(OrFilter, _super);
|
|
305
|
+
function OrFilter() {
|
|
306
|
+
var filters = [];
|
|
307
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
308
|
+
filters[_i] = arguments[_i];
|
|
309
|
+
}
|
|
310
|
+
var _this = _super.call(this, function (add) {
|
|
311
|
+
var f = _this.filters.filter(function (x) { return x !== undefined; });
|
|
216
312
|
if (f.length > 1) {
|
|
217
313
|
add.or(f);
|
|
218
314
|
}
|
|
219
315
|
else if (f.length == 1)
|
|
220
316
|
f[0].__applyToConsumer(add);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
317
|
+
}) || this;
|
|
318
|
+
_this.filters = filters;
|
|
319
|
+
return _this;
|
|
320
|
+
}
|
|
321
|
+
return OrFilter;
|
|
322
|
+
}(Filter));
|
|
323
|
+
exports.OrFilter = OrFilter;
|
|
324
|
+
exports.customUrlToken = "$custom$";
|
|
325
|
+
exports.customDatabaseFilterToken = "$db$";
|
|
326
|
+
var FilterSerializer = /** @class */ (function () {
|
|
327
|
+
function FilterSerializer() {
|
|
229
328
|
this.result = {};
|
|
230
329
|
this.hasUndefined = false;
|
|
231
330
|
}
|
|
232
|
-
databaseCustom(databaseCustom) {
|
|
331
|
+
FilterSerializer.prototype.databaseCustom = function (databaseCustom) {
|
|
233
332
|
throw new Error("database custom is not allowed with api calls.");
|
|
234
|
-
}
|
|
235
|
-
custom(key, customItem) {
|
|
236
|
-
this.add(customUrlToken + key, customItem);
|
|
237
|
-
}
|
|
238
|
-
add(key, val) {
|
|
333
|
+
};
|
|
334
|
+
FilterSerializer.prototype.custom = function (key, customItem) {
|
|
335
|
+
this.add(exports.customUrlToken + key, customItem);
|
|
336
|
+
};
|
|
337
|
+
FilterSerializer.prototype.add = function (key, val) {
|
|
239
338
|
if (val === undefined)
|
|
240
339
|
this.hasUndefined = true;
|
|
241
|
-
|
|
340
|
+
var r = this.result;
|
|
242
341
|
if (!r[key]) {
|
|
243
342
|
r[key] = val;
|
|
244
343
|
return;
|
|
245
344
|
}
|
|
246
|
-
|
|
345
|
+
var v = r[key];
|
|
247
346
|
if (v instanceof Array) {
|
|
248
347
|
v.push(val);
|
|
249
348
|
}
|
|
250
349
|
else
|
|
251
350
|
v = [v, val];
|
|
252
351
|
r[key] = v;
|
|
253
|
-
}
|
|
254
|
-
or(orElements) {
|
|
255
|
-
this.add("OR", orElements.map(x
|
|
256
|
-
|
|
352
|
+
};
|
|
353
|
+
FilterSerializer.prototype.or = function (orElements) {
|
|
354
|
+
this.add("OR", orElements.map(function (x) {
|
|
355
|
+
var f = new FilterSerializer();
|
|
257
356
|
x.__applyToConsumer(f);
|
|
258
357
|
return f.result;
|
|
259
358
|
}));
|
|
260
|
-
}
|
|
261
|
-
isNull(col) {
|
|
359
|
+
};
|
|
360
|
+
FilterSerializer.prototype.isNull = function (col) {
|
|
262
361
|
this.add(col.key + "_null", true);
|
|
263
|
-
}
|
|
264
|
-
isNotNull(col) {
|
|
362
|
+
};
|
|
363
|
+
FilterSerializer.prototype.isNotNull = function (col) {
|
|
265
364
|
this.add(col.key + "_null", false);
|
|
266
|
-
}
|
|
267
|
-
isIn(col, val) {
|
|
268
|
-
this.add(col.key + "_in", val.map(x
|
|
269
|
-
}
|
|
270
|
-
isEqualTo(col, val) {
|
|
365
|
+
};
|
|
366
|
+
FilterSerializer.prototype.isIn = function (col, val) {
|
|
367
|
+
this.add(col.key + "_in", val.map(function (x) { return col.valueConverter.toJson(x); }));
|
|
368
|
+
};
|
|
369
|
+
FilterSerializer.prototype.isEqualTo = function (col, val) {
|
|
271
370
|
this.add(col.key, col.valueConverter.toJson(val));
|
|
272
|
-
}
|
|
273
|
-
isDifferentFrom(col, val) {
|
|
371
|
+
};
|
|
372
|
+
FilterSerializer.prototype.isDifferentFrom = function (col, val) {
|
|
274
373
|
this.add(col.key + '_ne', col.valueConverter.toJson(val));
|
|
275
|
-
}
|
|
276
|
-
isGreaterOrEqualTo(col, val) {
|
|
374
|
+
};
|
|
375
|
+
FilterSerializer.prototype.isGreaterOrEqualTo = function (col, val) {
|
|
277
376
|
this.add(col.key + '_gte', col.valueConverter.toJson(val));
|
|
278
|
-
}
|
|
279
|
-
isGreaterThan(col, val) {
|
|
377
|
+
};
|
|
378
|
+
FilterSerializer.prototype.isGreaterThan = function (col, val) {
|
|
280
379
|
this.add(col.key + '_gt', col.valueConverter.toJson(val));
|
|
281
|
-
}
|
|
282
|
-
isLessOrEqualTo(col, val) {
|
|
380
|
+
};
|
|
381
|
+
FilterSerializer.prototype.isLessOrEqualTo = function (col, val) {
|
|
283
382
|
this.add(col.key + '_lte', col.valueConverter.toJson(val));
|
|
284
|
-
}
|
|
285
|
-
isLessThan(col, val) {
|
|
383
|
+
};
|
|
384
|
+
FilterSerializer.prototype.isLessThan = function (col, val) {
|
|
286
385
|
this.add(col.key + '_lt', col.valueConverter.toJson(val));
|
|
287
|
-
}
|
|
288
|
-
containsCaseInsensitive(col, val) {
|
|
386
|
+
};
|
|
387
|
+
FilterSerializer.prototype.containsCaseInsensitive = function (col, val) {
|
|
289
388
|
this.add(col.key + "_contains", val);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
|
|
389
|
+
};
|
|
390
|
+
return FilterSerializer;
|
|
391
|
+
}());
|
|
392
|
+
exports.FilterSerializer = FilterSerializer;
|
|
393
|
+
function entityFilterToJson(entityDefs, where) {
|
|
293
394
|
if (!where)
|
|
294
395
|
return {};
|
|
295
396
|
return (Filter.fromEntityFilter(entityDefs, where)).toJson();
|
|
296
397
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
398
|
+
exports.entityFilterToJson = entityFilterToJson;
|
|
399
|
+
function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
400
|
+
var _a;
|
|
401
|
+
var where = [];
|
|
402
|
+
tslib_1.__spread(entity.fields).forEach(function (col) {
|
|
403
|
+
var _a, _b;
|
|
404
|
+
function addFilter(operation, theFilter, jsonArray, asString) {
|
|
405
|
+
var e_3, _a;
|
|
406
|
+
if (jsonArray === void 0) { jsonArray = false; }
|
|
407
|
+
if (asString === void 0) { asString = false; }
|
|
408
|
+
var val = filterInfo.get(col.key + operation);
|
|
302
409
|
if (val !== undefined) {
|
|
303
|
-
|
|
304
|
-
|
|
410
|
+
var addFilter_1 = function (val) {
|
|
411
|
+
var _a;
|
|
412
|
+
var theVal = val;
|
|
305
413
|
if (jsonArray) {
|
|
306
|
-
|
|
414
|
+
var arr = void 0;
|
|
307
415
|
if (typeof val === 'string')
|
|
308
416
|
arr = JSON.parse(val);
|
|
309
417
|
else
|
|
310
418
|
arr = val;
|
|
311
|
-
theVal = arr.map(x
|
|
419
|
+
theVal = arr.map(function (x) { return asString ? x : col.valueConverter.fromJson(x); });
|
|
312
420
|
}
|
|
313
421
|
else {
|
|
314
422
|
theVal = asString ? theVal : col.valueConverter.fromJson(theVal);
|
|
315
423
|
}
|
|
316
|
-
|
|
424
|
+
var f = theFilter(theVal);
|
|
317
425
|
if (f !== undefined) {
|
|
318
|
-
where.push({ [col.key]
|
|
426
|
+
where.push((_a = {}, _a[col.key] = f, _a));
|
|
319
427
|
}
|
|
320
428
|
};
|
|
321
429
|
if (!jsonArray && val instanceof Array) {
|
|
322
|
-
val.forEach(v
|
|
323
|
-
|
|
430
|
+
val.forEach(function (v) {
|
|
431
|
+
addFilter_1(v);
|
|
324
432
|
});
|
|
325
433
|
}
|
|
326
434
|
else {
|
|
@@ -328,21 +436,31 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
328
436
|
if (typeof val === 'string')
|
|
329
437
|
val = JSON.parse(val);
|
|
330
438
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
439
|
+
var array = separateArrayFromInnerArray(val);
|
|
440
|
+
try {
|
|
441
|
+
for (var array_1 = tslib_1.__values(array), array_1_1 = array_1.next(); !array_1_1.done; array_1_1 = array_1.next()) {
|
|
442
|
+
var x = array_1_1.value;
|
|
443
|
+
addFilter_1(x);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
447
|
+
finally {
|
|
448
|
+
try {
|
|
449
|
+
if (array_1_1 && !array_1_1.done && (_a = array_1.return)) _a.call(array_1);
|
|
450
|
+
}
|
|
451
|
+
finally { if (e_3) throw e_3.error; }
|
|
334
452
|
}
|
|
335
453
|
}
|
|
336
454
|
}
|
|
337
455
|
}
|
|
338
|
-
|
|
339
|
-
addFilter('', val
|
|
340
|
-
addFilter('_gt', val
|
|
341
|
-
addFilter('_gte', val
|
|
342
|
-
addFilter('_lt', val
|
|
343
|
-
addFilter('_lte', val
|
|
344
|
-
addFilter('_ne', val
|
|
345
|
-
addFilter('_in', val
|
|
456
|
+
var c = new filterHelper(col);
|
|
457
|
+
addFilter('', function (val) { return val; });
|
|
458
|
+
addFilter('_gt', function (val) { return ({ "$gt": val }); });
|
|
459
|
+
addFilter('_gte', function (val) { return ({ "$gte": val }); });
|
|
460
|
+
addFilter('_lt', function (val) { return ({ "$lt": val }); });
|
|
461
|
+
addFilter('_lte', function (val) { return ({ "$lte": val }); });
|
|
462
|
+
addFilter('_ne', function (val) { return ({ "$ne": val }); });
|
|
463
|
+
addFilter('_in', function (val) { return val; }, true);
|
|
346
464
|
var nullFilter = filterInfo.get(col.key + "_null");
|
|
347
465
|
if (nullFilter) {
|
|
348
466
|
nullFilter = nullFilter.toString().trim().toLowerCase();
|
|
@@ -350,118 +468,163 @@ export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
350
468
|
case "y":
|
|
351
469
|
case "true":
|
|
352
470
|
case "yes":
|
|
353
|
-
where.push({ [col.key]
|
|
471
|
+
where.push((_a = {}, _a[col.key] = null, _a));
|
|
354
472
|
break;
|
|
355
473
|
default:
|
|
356
|
-
where.push({ [col.key]
|
|
474
|
+
where.push((_b = {}, _b[col.key] = { "$ne": null }, _b));
|
|
357
475
|
break;
|
|
358
476
|
}
|
|
359
477
|
}
|
|
360
|
-
addFilter('_contains', val
|
|
478
|
+
addFilter('_contains', function (val) { return ({ $contains: val }); }, false, true);
|
|
361
479
|
});
|
|
362
|
-
|
|
480
|
+
var val = filterInfo.get('OR');
|
|
363
481
|
if (val) {
|
|
364
|
-
|
|
482
|
+
var array = separateArrayFromInnerArray(val);
|
|
365
483
|
where.push({
|
|
366
|
-
$and: array.map(v
|
|
367
|
-
$or: v.map(
|
|
368
|
-
|
|
484
|
+
$and: array.map(function (v) { return ({
|
|
485
|
+
$or: v.map(function (x) {
|
|
486
|
+
return buildFilterFromRequestParameters(entity, { get: function (key) { return x[key]; } });
|
|
487
|
+
})
|
|
488
|
+
}); })
|
|
369
489
|
});
|
|
370
490
|
}
|
|
371
|
-
for (
|
|
372
|
-
|
|
491
|
+
for (var key in entity.entityType) {
|
|
492
|
+
var element = entity.entityType[key];
|
|
373
493
|
if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
|
|
374
|
-
|
|
494
|
+
var custom = filterInfo.get(exports.customUrlToken + key);
|
|
375
495
|
if (custom !== undefined) {
|
|
376
|
-
where.push({ [customUrlToken + key]
|
|
496
|
+
where.push((_a = {}, _a[exports.customUrlToken + key] = custom, _a));
|
|
377
497
|
}
|
|
378
498
|
}
|
|
379
499
|
}
|
|
380
500
|
return { $and: where };
|
|
381
501
|
function separateArrayFromInnerArray(val) {
|
|
502
|
+
var e_4, _a;
|
|
382
503
|
if (!Array.isArray(val))
|
|
383
504
|
return [val];
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
505
|
+
var nonArray = [], array = [];
|
|
506
|
+
try {
|
|
507
|
+
for (var val_1 = tslib_1.__values(val), val_1_1 = val_1.next(); !val_1_1.done; val_1_1 = val_1.next()) {
|
|
508
|
+
var v = val_1_1.value;
|
|
509
|
+
if (Array.isArray(v)) {
|
|
510
|
+
array.push(v);
|
|
511
|
+
}
|
|
512
|
+
else
|
|
513
|
+
nonArray.push(v);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
517
|
+
finally {
|
|
518
|
+
try {
|
|
519
|
+
if (val_1_1 && !val_1_1.done && (_a = val_1.return)) _a.call(val_1);
|
|
388
520
|
}
|
|
389
|
-
|
|
390
|
-
nonArray.push(v);
|
|
521
|
+
finally { if (e_4) throw e_4.error; }
|
|
391
522
|
}
|
|
392
523
|
array.push(nonArray);
|
|
393
524
|
return array;
|
|
394
525
|
}
|
|
395
526
|
}
|
|
396
|
-
|
|
397
|
-
|
|
527
|
+
exports.buildFilterFromRequestParameters = buildFilterFromRequestParameters;
|
|
528
|
+
var customTranslator = /** @class */ (function () {
|
|
529
|
+
function customTranslator(translateCustom) {
|
|
398
530
|
this.translateCustom = translateCustom;
|
|
399
531
|
this.commands = [];
|
|
400
532
|
this.promises = [];
|
|
401
533
|
}
|
|
402
|
-
applyTo(x) {
|
|
403
|
-
this.commands.forEach(y
|
|
404
|
-
}
|
|
405
|
-
or(orElements) {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
534
|
+
customTranslator.prototype.applyTo = function (x) {
|
|
535
|
+
this.commands.forEach(function (y) { return y(x); });
|
|
536
|
+
};
|
|
537
|
+
customTranslator.prototype.or = function (orElements) {
|
|
538
|
+
var _this = this;
|
|
539
|
+
var newOrElements;
|
|
540
|
+
this.promises.push(Promise.all(orElements.map(function (element) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
541
|
+
var c;
|
|
542
|
+
return tslib_1.__generator(this, function (_a) {
|
|
543
|
+
switch (_a.label) {
|
|
544
|
+
case 0:
|
|
545
|
+
c = new customTranslator(this.translateCustom);
|
|
546
|
+
element.__applyToConsumer(c);
|
|
547
|
+
return [4 /*yield*/, c.resolve()];
|
|
548
|
+
case 1:
|
|
549
|
+
_a.sent();
|
|
550
|
+
return [2 /*return*/, new Filter(function (x) { return c.applyTo(x); })];
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
}); })).then(function (x) {
|
|
413
554
|
newOrElements = x;
|
|
414
555
|
}));
|
|
415
|
-
this.commands.push(x
|
|
416
|
-
}
|
|
417
|
-
isEqualTo(col, val) {
|
|
418
|
-
this.commands.push(x
|
|
419
|
-
}
|
|
420
|
-
isDifferentFrom(col, val) {
|
|
421
|
-
this.commands.push(x
|
|
422
|
-
}
|
|
423
|
-
isNull(col) {
|
|
424
|
-
this.commands.push(x
|
|
425
|
-
}
|
|
426
|
-
isNotNull(col) {
|
|
427
|
-
this.commands.push(x
|
|
428
|
-
}
|
|
429
|
-
isGreaterOrEqualTo(col, val) {
|
|
430
|
-
this.commands.push(x
|
|
431
|
-
}
|
|
432
|
-
isGreaterThan(col, val) {
|
|
433
|
-
this.commands.push(x
|
|
434
|
-
}
|
|
435
|
-
isLessOrEqualTo(col, val) {
|
|
436
|
-
this.commands.push(x
|
|
437
|
-
}
|
|
438
|
-
isLessThan(col, val) {
|
|
439
|
-
this.commands.push(x
|
|
440
|
-
}
|
|
441
|
-
containsCaseInsensitive(col, val) {
|
|
442
|
-
this.commands.push(x
|
|
443
|
-
}
|
|
444
|
-
isIn(col, val) {
|
|
445
|
-
this.commands.push(x
|
|
446
|
-
}
|
|
447
|
-
custom(key, customItem) {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
|
|
556
|
+
this.commands.push(function (x) { return x.or(newOrElements); });
|
|
557
|
+
};
|
|
558
|
+
customTranslator.prototype.isEqualTo = function (col, val) {
|
|
559
|
+
this.commands.push(function (x) { return x.isEqualTo(col, val); });
|
|
560
|
+
};
|
|
561
|
+
customTranslator.prototype.isDifferentFrom = function (col, val) {
|
|
562
|
+
this.commands.push(function (x) { return x.isDifferentFrom(col, val); });
|
|
563
|
+
};
|
|
564
|
+
customTranslator.prototype.isNull = function (col) {
|
|
565
|
+
this.commands.push(function (x) { return x.isNull(col); });
|
|
566
|
+
};
|
|
567
|
+
customTranslator.prototype.isNotNull = function (col) {
|
|
568
|
+
this.commands.push(function (x) { return x.isNotNull(col); });
|
|
569
|
+
};
|
|
570
|
+
customTranslator.prototype.isGreaterOrEqualTo = function (col, val) {
|
|
571
|
+
this.commands.push(function (x) { return x.isGreaterOrEqualTo(col, val); });
|
|
572
|
+
};
|
|
573
|
+
customTranslator.prototype.isGreaterThan = function (col, val) {
|
|
574
|
+
this.commands.push(function (x) { return x.isGreaterThan(col, val); });
|
|
575
|
+
};
|
|
576
|
+
customTranslator.prototype.isLessOrEqualTo = function (col, val) {
|
|
577
|
+
this.commands.push(function (x) { return x.isLessOrEqualTo(col, val); });
|
|
578
|
+
};
|
|
579
|
+
customTranslator.prototype.isLessThan = function (col, val) {
|
|
580
|
+
this.commands.push(function (x) { return x.isLessThan(col, val); });
|
|
581
|
+
};
|
|
582
|
+
customTranslator.prototype.containsCaseInsensitive = function (col, val) {
|
|
583
|
+
this.commands.push(function (x) { return x.containsCaseInsensitive(col, val); });
|
|
584
|
+
};
|
|
585
|
+
customTranslator.prototype.isIn = function (col, val) {
|
|
586
|
+
this.commands.push(function (x) { return x.isIn(col, val); });
|
|
587
|
+
};
|
|
588
|
+
customTranslator.prototype.custom = function (key, customItem) {
|
|
589
|
+
var _this = this;
|
|
590
|
+
this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
591
|
+
var r;
|
|
592
|
+
var _this = this;
|
|
593
|
+
return tslib_1.__generator(this, function (_a) {
|
|
594
|
+
switch (_a.label) {
|
|
595
|
+
case 0: return [4 /*yield*/, this.translateCustom(key, customItem)];
|
|
596
|
+
case 1:
|
|
597
|
+
r = _a.sent();
|
|
598
|
+
if (r)
|
|
599
|
+
if (Array.isArray(r))
|
|
600
|
+
r.forEach(function (x) { return x.__applyToConsumer(_this); });
|
|
601
|
+
else
|
|
602
|
+
r.__applyToConsumer(this);
|
|
603
|
+
return [2 /*return*/];
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
}); })());
|
|
607
|
+
};
|
|
608
|
+
customTranslator.prototype.databaseCustom = function (custom) {
|
|
609
|
+
this.commands.push(function (x) { return x.databaseCustom(custom); });
|
|
610
|
+
};
|
|
611
|
+
customTranslator.prototype.resolve = function () {
|
|
612
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
613
|
+
var p;
|
|
614
|
+
return tslib_1.__generator(this, function (_a) {
|
|
615
|
+
switch (_a.label) {
|
|
616
|
+
case 0:
|
|
617
|
+
if (!(this.promises.length > 0)) return [3 /*break*/, 2];
|
|
618
|
+
p = this.promises;
|
|
619
|
+
this.promises = [];
|
|
620
|
+
return [4 /*yield*/, Promise.all(p)];
|
|
621
|
+
case 1:
|
|
622
|
+
_a.sent();
|
|
623
|
+
return [3 /*break*/, 0];
|
|
624
|
+
case 2: return [2 /*return*/];
|
|
625
|
+
}
|
|
626
|
+
});
|
|
627
|
+
});
|
|
628
|
+
};
|
|
629
|
+
return customTranslator;
|
|
630
|
+
}());
|