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.
Files changed (74) hide show
  1. package/assign.js +5 -1
  2. package/classType.js +2 -1
  3. package/graphql.js +146 -84
  4. package/index.js +73 -25
  5. package/inputTypes.js +16 -9
  6. package/package.json +1 -2
  7. package/postgres/index.js +4 -1
  8. package/postgres/postgres-data-provider.d.ts +4 -1
  9. package/postgres/postgres-data-provider.js +364 -165
  10. package/postgres/postgresColumnSyntax.d.ts +1 -1
  11. package/postgres/postgresColumnSyntax.js +8 -4
  12. package/remult-express.js +10 -6
  13. package/remult-knex/index.d.ts +5 -2
  14. package/remult-knex/index.js +720 -300
  15. package/remult-middleware.js +29 -24
  16. package/remult-mongo.js +406 -172
  17. package/server/JsonEntityFileStorage.js +15 -10
  18. package/server/expressBridge.d.ts +4 -2
  19. package/server/expressBridge.js +570 -383
  20. package/server/index.js +11 -4
  21. package/server/register-actions-on-server.js +38 -12
  22. package/server/register-entities-on-server.js +13 -9
  23. package/src/__EntityValueProvider.js +2 -1
  24. package/src/__RowsOfDataForTesting.js +2 -1
  25. package/src/backend-tests/backend-database-test-setup.backend-spec.js +190 -72
  26. package/src/backend-tests/my-test.backend-spec.js +114 -45
  27. package/src/column-interfaces.js +6 -2
  28. package/src/column.js +113 -71
  29. package/src/context.js +330 -174
  30. package/src/data-api.js +326 -162
  31. package/src/data-interfaces.js +11 -7
  32. package/src/data-providers/array-entity-data-provider.js +286 -171
  33. package/src/data-providers/in-memory-database.js +27 -12
  34. package/src/data-providers/json-data-provider.js +77 -41
  35. package/src/data-providers/rest-data-provider.js +189 -102
  36. package/src/data-providers/sql-database.js +403 -223
  37. package/src/data-providers/web-sql-data-provider.js +139 -78
  38. package/src/entity.js +2 -1
  39. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +1 -1
  40. package/src/filter/filter-consumer-bridge-to-sql-request.js +248 -106
  41. package/src/filter/filter-consumer-bridge-to-url-builder.js +2 -1
  42. package/src/filter/filter-interfaces.js +440 -277
  43. package/src/id-entity.js +17 -8
  44. package/src/remult3/RepositoryImplementation.js +2367 -1191
  45. package/src/remult3/index.js +5 -2
  46. package/src/remult3/remult3.js +2 -1
  47. package/src/server-action.js +528 -294
  48. package/src/shared-tests/db-tests-setup.js +153 -49
  49. package/src/shared-tests/db-tests.db-tests.js +1566 -660
  50. package/src/shared-tests/deleteAll.js +20 -3
  51. package/src/shared-tests/entityWithValidations.js +79 -52
  52. package/src/shared-tests/index.js +6 -4
  53. package/src/shared-tests/test-custom-id-column.spec.js +85 -37
  54. package/src/shared-tests/test-special-value.spec.js +104 -64
  55. package/src/shared-tests/test-update-with-null.spec.js +49 -28
  56. package/src/sort.js +95 -38
  57. package/src/sql-command.js +2 -1
  58. package/src/tests/Done.js +13 -7
  59. package/src/tests/TestDataApiResponse.js +22 -15
  60. package/src/tests/c.js +27 -21
  61. package/src/tests/createData.js +48 -20
  62. package/src/tests/d.js +27 -19
  63. package/src/tests/dWithPrefilter.js +44 -31
  64. package/src/tests/entityForCustomFilter.js +66 -42
  65. package/src/tests/entityWithValidationsOnColumn.js +29 -21
  66. package/src/tests/frontend-database-tests-setup.spec.js +98 -35
  67. package/src/tests/h.js +44 -35
  68. package/src/tests/remult-3-entities.js +80 -71
  69. package/src/tests/tasks.js +29 -23
  70. package/src/tests/testHelper.spec.js +322 -170
  71. package/src/tests/testModel/models.js +33 -25
  72. package/src/validators.js +59 -32
  73. package/urlBuilder.js +14 -8
  74. package/valueConverters.js +160 -161
@@ -1,62 +1,76 @@
1
- import { getEntityRef, getEntitySettings } from "../remult3";
2
- export class Filter {
3
- constructor(apply) {
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
- static async resolve(filter) {
13
- if (typeof filter === "function")
14
- return await filter();
15
- return filter;
16
- }
17
- static createCustom(customFilterTranslator, key = '') {
18
- let customFilterInfo = { key: key, customFilterTranslator };
19
- return Object.assign((x) => {
20
- let z = {};
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]: x
27
- };
28
- }, { customFilterInfo });
29
- }
30
- static fromEntityFilter(entity, whereItem) {
31
- let result = [];
32
- for (const key in whereItem) {
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
- let fieldToFilter = whereItem[key];
48
+ var fieldToFilter_1 = whereItem[key];
35
49
  {
36
50
  if (key == "$or") {
37
- result.push(new OrFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
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(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
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), fieldToFilter);
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 => x.databaseCustom(fieldToFilter)));
61
+ else if (key == exports.customDatabaseFilterToken) {
62
+ result.push(new Filter(function (x) { return x.databaseCustom(fieldToFilter_1); }));
49
63
  }
50
64
  else {
51
- let fh = new filterHelper(entity.fields[key]);
52
- let found = false;
53
- if (fieldToFilter !== undefined && fieldToFilter != null) {
54
- if (fieldToFilter.$id)
55
- fieldToFilter = fieldToFilter.$id;
56
- for (const key in fieldToFilter) {
57
- if (Object.prototype.hasOwnProperty.call(fieldToFilter, key)) {
58
- const element = fieldToFilter[key];
59
- switch (key) {
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(fieldToFilter)) {
110
+ if (Array.isArray(fieldToFilter_1)) {
97
111
  found = true;
98
- result.push(fh.isIn(fieldToFilter));
112
+ result.push(fh.isIn(fieldToFilter_1));
99
113
  }
100
114
  }
101
- if (!found && fieldToFilter !== undefined) {
102
- result.push(fh.isEqualTo(fieldToFilter));
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(...result);
109
- }
110
- toJson() {
111
- let r = new FilterSerializer();
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
- static entityFilterToJson(entityDefs, where) {
131
+ };
132
+ Filter.entityFilterToJson = function (entityDefs, where) {
116
133
  return Filter.fromEntityFilter(entityDefs, where).toJson();
117
- }
118
- static entityFilterFromJson(entityDefs, packed) {
119
- return buildFilterFromRequestParameters(entityDefs, { get: (key) => packed[key] });
120
- }
121
- static async translateCustomWhere(r, entity, remult) {
122
- let f = new customTranslator(async (filterKey, custom) => {
123
- let r = [];
124
- for (const key in entity.entityType) {
125
- const element = entity.entityType[key];
126
- if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
127
- if (element.customFilterInfo.key == filterKey) {
128
- r.push(await Filter.fromEntityFilter(entity, await element.customFilterInfo.customFilterTranslator(remult, custom)));
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
- r.__applyToConsumer(f);
135
- await f.resolve();
136
- r = new Filter(x => f.applyTo(x));
137
- return r;
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
- let ei = getEntitySettings(this.metadata.valueType, false);
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
- return new Filter(add => add.containsCaseInsensitive(this.metadata, val));
157
- }
158
- isLessThan(val) {
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 => add.isLessThan(this.metadata, val));
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 => add.isGreaterOrEqualTo(this.metadata, val));
165
- }
166
- isNotIn(values) {
167
- return new Filter(add => {
168
- for (const v of values) {
169
- add.isDifferentFrom(this.metadata, this.processVal(v));
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 => add.isNotNull(this.metadata));
177
- return new Filter(add => add.isDifferentFrom(this.metadata, val));
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 => add.isLessOrEqualTo(this.metadata, val));
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 => add.isGreaterThan(this.metadata, val));
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 => add.isNull(this.metadata));
191
- return new Filter(add => add.isEqualTo(this.metadata, val));
192
- }
193
- isIn(val) {
194
- val = val.map(x => this.processVal(x));
195
- return new Filter(add => add.isIn(this.metadata, val));
196
- }
197
- }
198
- export class AndFilter extends Filter {
199
- constructor(...filters) {
200
- super(add => {
201
- for (const iterator of this.filters) {
202
- if (iterator)
203
- iterator.__applyToConsumer(add);
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
- this.filters = filters;
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
- export class OrFilter extends Filter {
213
- constructor(...filters) {
214
- super(add => {
215
- let f = this.filters.filter(x => x !== undefined);
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
- this.filters = filters;
223
- }
224
- }
225
- export const customUrlToken = "$custom$";
226
- export const customDatabaseFilterToken = "$db$";
227
- export class FilterSerializer {
228
- constructor() {
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
- let r = this.result;
340
+ var r = this.result;
242
341
  if (!r[key]) {
243
342
  r[key] = val;
244
343
  return;
245
344
  }
246
- let v = r[key];
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
- let f = new FilterSerializer();
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 => col.valueConverter.toJson(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
- export function entityFilterToJson(entityDefs, where) {
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
- export function buildFilterFromRequestParameters(entity, filterInfo) {
298
- let where = [];
299
- [...entity.fields].forEach(col => {
300
- function addFilter(operation, theFilter, jsonArray = false, asString = false) {
301
- let val = filterInfo.get(col.key + operation);
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
- let addFilter = (val) => {
304
- let theVal = val;
410
+ var addFilter_1 = function (val) {
411
+ var _a;
412
+ var theVal = val;
305
413
  if (jsonArray) {
306
- let arr;
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 => asString ? x : col.valueConverter.fromJson(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
- let f = theFilter(theVal);
424
+ var f = theFilter(theVal);
317
425
  if (f !== undefined) {
318
- where.push({ [col.key]: f });
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
- addFilter(v);
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
- const array = separateArrayFromInnerArray(val);
332
- for (const x of array) {
333
- addFilter(x);
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
- let c = new filterHelper(col);
339
- addFilter('', val => val);
340
- addFilter('_gt', val => ({ "$gt": val }));
341
- addFilter('_gte', val => ({ "$gte": val }));
342
- addFilter('_lt', val => ({ "$lt": val }));
343
- addFilter('_lte', val => ({ "$lte": val }));
344
- addFilter('_ne', val => ({ "$ne": val }));
345
- addFilter('_in', val => val, true);
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]: null });
471
+ where.push((_a = {}, _a[col.key] = null, _a));
354
472
  break;
355
473
  default:
356
- where.push({ [col.key]: { "$ne": null } });
474
+ where.push((_b = {}, _b[col.key] = { "$ne": null }, _b));
357
475
  break;
358
476
  }
359
477
  }
360
- addFilter('_contains', val => ({ $contains: val }), false, true);
478
+ addFilter('_contains', function (val) { return ({ $contains: val }); }, false, true);
361
479
  });
362
- let val = filterInfo.get('OR');
480
+ var val = filterInfo.get('OR');
363
481
  if (val) {
364
- const array = separateArrayFromInnerArray(val);
482
+ var array = separateArrayFromInnerArray(val);
365
483
  where.push({
366
- $and: array.map(v => ({
367
- $or: v.map(x => buildFilterFromRequestParameters(entity, { get: (key) => x[key] }))
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 (const key in entity.entityType) {
372
- const element = entity.entityType[key];
491
+ for (var key in entity.entityType) {
492
+ var element = entity.entityType[key];
373
493
  if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
374
- let custom = filterInfo.get(customUrlToken + key);
494
+ var custom = filterInfo.get(exports.customUrlToken + key);
375
495
  if (custom !== undefined) {
376
- where.push({ [customUrlToken + key]: custom });
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
- const nonArray = [], array = [];
385
- for (const v of val) {
386
- if (Array.isArray(v)) {
387
- array.push(v);
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
- else
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
- class customTranslator {
397
- constructor(translateCustom) {
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 => y(x));
404
- }
405
- or(orElements) {
406
- let newOrElements;
407
- this.promises.push(Promise.all(orElements.map(async (element) => {
408
- let c = new customTranslator(this.translateCustom);
409
- element.__applyToConsumer(c);
410
- await c.resolve();
411
- return new Filter(x => c.applyTo(x));
412
- })).then(x => {
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 => x.or(newOrElements));
416
- }
417
- isEqualTo(col, val) {
418
- this.commands.push(x => x.isEqualTo(col, val));
419
- }
420
- isDifferentFrom(col, val) {
421
- this.commands.push(x => x.isDifferentFrom(col, val));
422
- }
423
- isNull(col) {
424
- this.commands.push(x => x.isNull(col));
425
- }
426
- isNotNull(col) {
427
- this.commands.push(x => x.isNotNull(col));
428
- }
429
- isGreaterOrEqualTo(col, val) {
430
- this.commands.push(x => x.isGreaterOrEqualTo(col, val));
431
- }
432
- isGreaterThan(col, val) {
433
- this.commands.push(x => x.isGreaterThan(col, val));
434
- }
435
- isLessOrEqualTo(col, val) {
436
- this.commands.push(x => x.isLessOrEqualTo(col, val));
437
- }
438
- isLessThan(col, val) {
439
- this.commands.push(x => x.isLessThan(col, val));
440
- }
441
- containsCaseInsensitive(col, val) {
442
- this.commands.push(x => x.containsCaseInsensitive(col, val));
443
- }
444
- isIn(col, val) {
445
- this.commands.push(x => x.isIn(col, val));
446
- }
447
- custom(key, customItem) {
448
- this.promises.push((async () => {
449
- let r = await this.translateCustom(key, customItem);
450
- if (r)
451
- if (Array.isArray(r))
452
- r.forEach(x => x.__applyToConsumer(this));
453
- else
454
- r.__applyToConsumer(this);
455
- })());
456
- }
457
- databaseCustom(custom) {
458
- this.commands.push(x => x.databaseCustom(custom));
459
- }
460
- async resolve() {
461
- while (this.promises.length > 0) {
462
- let p = this.promises;
463
- this.promises = [];
464
- await Promise.all(p);
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
+ }());