remult 0.14.2 → 0.14.5

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 (70) hide show
  1. package/assign.js +1 -5
  2. package/classType.js +1 -2
  3. package/graphql.js +84 -146
  4. package/index.d.ts +13 -0
  5. package/index.js +25 -55
  6. package/inputTypes.js +9 -16
  7. package/package.json +6 -1
  8. package/postgres/index.js +1 -4
  9. package/postgres/postgres-data-provider.js +165 -364
  10. package/postgres/postgresColumnSyntax.js +4 -8
  11. package/remult-express.js +6 -10
  12. package/remult-knex/index.js +300 -720
  13. package/remult-middleware.js +24 -30
  14. package/remult-mongo.js +172 -406
  15. package/server/JsonEntityFileStorage.js +10 -15
  16. package/server/expressBridge.js +383 -569
  17. package/server/index.js +4 -11
  18. package/server/register-actions-on-server.js +12 -38
  19. package/server/register-entities-on-server.js +9 -13
  20. package/src/__EntityValueProvider.js +1 -2
  21. package/src/__RowsOfDataForTesting.js +1 -2
  22. package/src/backend-tests/backend-database-test-setup.backend-spec.js +72 -190
  23. package/src/backend-tests/my-test.backend-spec.js +45 -114
  24. package/src/column-interfaces.js +2 -6
  25. package/src/column.js +71 -113
  26. package/src/context.js +174 -330
  27. package/src/data-api.js +162 -326
  28. package/src/data-interfaces.js +7 -11
  29. package/src/data-providers/array-entity-data-provider.js +171 -286
  30. package/src/data-providers/in-memory-database.js +12 -27
  31. package/src/data-providers/json-data-provider.js +41 -77
  32. package/src/data-providers/rest-data-provider.js +102 -189
  33. package/src/data-providers/sql-database.js +223 -403
  34. package/src/data-providers/web-sql-data-provider.js +78 -139
  35. package/src/entity.js +1 -2
  36. package/src/filter/filter-consumer-bridge-to-sql-request.js +106 -248
  37. package/src/filter/filter-consumer-bridge-to-url-builder.js +1 -2
  38. package/src/filter/filter-interfaces.js +277 -440
  39. package/src/id-entity.js +8 -17
  40. package/src/remult3/RepositoryImplementation.js +1191 -2367
  41. package/src/remult3/index.js +2 -5
  42. package/src/remult3/remult3.js +1 -2
  43. package/src/server-action.js +294 -528
  44. package/src/shared-tests/db-tests-setup.js +49 -153
  45. package/src/shared-tests/db-tests.db-tests.js +660 -1566
  46. package/src/shared-tests/deleteAll.js +3 -20
  47. package/src/shared-tests/entityWithValidations.js +52 -79
  48. package/src/shared-tests/index.js +4 -6
  49. package/src/shared-tests/test-custom-id-column.spec.js +37 -85
  50. package/src/shared-tests/test-special-value.spec.js +64 -104
  51. package/src/shared-tests/test-update-with-null.spec.js +28 -49
  52. package/src/sort.js +38 -95
  53. package/src/sql-command.js +1 -2
  54. package/src/tests/Done.js +7 -13
  55. package/src/tests/TestDataApiResponse.js +15 -22
  56. package/src/tests/c.js +21 -27
  57. package/src/tests/createData.js +20 -48
  58. package/src/tests/d.js +19 -27
  59. package/src/tests/dWithPrefilter.js +31 -44
  60. package/src/tests/entityForCustomFilter.js +42 -66
  61. package/src/tests/entityWithValidationsOnColumn.js +21 -29
  62. package/src/tests/frontend-database-tests-setup.spec.js +35 -98
  63. package/src/tests/h.js +35 -44
  64. package/src/tests/remult-3-entities.js +71 -80
  65. package/src/tests/tasks.js +23 -29
  66. package/src/tests/testHelper.spec.js +170 -322
  67. package/src/tests/testModel/models.js +25 -33
  68. package/src/validators.js +32 -59
  69. package/urlBuilder.js +8 -14
  70. package/valueConverters.js +161 -160
@@ -1,76 +1,62 @@
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) {
1
+ import { getEntityRef, getEntitySettings } from "../remult3";
2
+ export class Filter {
3
+ constructor(apply) {
8
4
  this.apply = apply;
9
5
  if (!this.apply) {
10
- this.apply = function () { };
6
+ this.apply = () => { };
11
7
  }
12
8
  }
13
- Filter.prototype.__applyToConsumer = function (add) {
9
+ __applyToConsumer(add) {
14
10
  this.apply(add);
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 = {};
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 = {};
35
21
  if (x == undefined)
36
22
  x = {};
37
23
  if (!customFilterInfo.key)
38
24
  throw "Usage of custom filter before a key was assigned to it";
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) {
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) {
47
33
  if (Object.prototype.hasOwnProperty.call(whereItem, key)) {
48
- var fieldToFilter_1 = whereItem[key];
34
+ let fieldToFilter = whereItem[key];
49
35
  {
50
36
  if (key == "$or") {
51
- result.push(new (OrFilter.bind.apply(OrFilter, tslib_1.__spread([void 0], fieldToFilter_1.map(function (x) { return Filter.fromEntityFilter(entity, x); }))))());
37
+ result.push(new OrFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
52
38
  }
53
39
  else if (key == "$and") {
54
- result.push(new (AndFilter.bind.apply(AndFilter, tslib_1.__spread([void 0], fieldToFilter_1.map(function (x) { return Filter.fromEntityFilter(entity, x); }))))());
40
+ result.push(new AndFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
55
41
  }
56
- else if (key.startsWith(exports.customUrlToken)) {
57
- result.push(new Filter(function (x) {
58
- x.custom(key.substring(exports.customUrlToken.length), fieldToFilter_1);
42
+ else if (key.startsWith(customUrlToken)) {
43
+ result.push(new Filter(x => {
44
+ x.custom(key.substring(customUrlToken.length), fieldToFilter);
59
45
  }));
60
46
  }
61
- else if (key == exports.customDatabaseFilterToken) {
62
- result.push(new Filter(function (x) { return x.databaseCustom(fieldToFilter_1); }));
47
+ else if (key == customDatabaseFilterToken) {
48
+ result.push(new Filter(x => x.databaseCustom(fieldToFilter)));
63
49
  }
64
50
  else {
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) {
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) {
74
60
  case "$gte":
75
61
  case ">=":
76
62
  result.push(fh.isGreaterOrEqualTo(element));
@@ -107,328 +93,234 @@ var Filter = /** @class */ (function () {
107
93
  }
108
94
  }
109
95
  }
110
- if (Array.isArray(fieldToFilter_1)) {
96
+ if (Array.isArray(fieldToFilter)) {
111
97
  found = true;
112
- result.push(fh.isIn(fieldToFilter_1));
98
+ result.push(fh.isIn(fieldToFilter));
113
99
  }
114
100
  }
115
- if (!found && fieldToFilter_1 !== undefined) {
116
- result.push(fh.isEqualTo(fieldToFilter_1));
101
+ if (!found && fieldToFilter !== undefined) {
102
+ result.push(fh.isEqualTo(fieldToFilter));
117
103
  }
118
104
  }
119
105
  }
120
106
  }
121
- };
122
- for (var key in whereItem) {
123
- _loop_1(key);
124
107
  }
125
- return new (AndFilter.bind.apply(AndFilter, tslib_1.__spread([void 0], result)))();
126
- };
127
- Filter.prototype.toJson = function () {
128
- var r = new FilterSerializer();
108
+ return new AndFilter(...result);
109
+ }
110
+ toJson() {
111
+ let r = new FilterSerializer();
129
112
  this.__applyToConsumer(r);
130
113
  return r.result;
131
- };
132
- Filter.entityFilterToJson = function (entityDefs, where) {
114
+ }
115
+ static entityFilterToJson(entityDefs, where) {
133
116
  return Filter.fromEntityFilter(entityDefs, where).toJson();
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];
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
+ }
183
130
  }
184
- });
131
+ }
132
+ return r;
185
133
  });
186
- };
187
- return Filter;
188
- }());
189
- exports.Filter = Filter;
190
- var filterHelper = /** @class */ (function () {
191
- function filterHelper(metadata) {
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) {
192
142
  this.metadata = metadata;
193
143
  }
194
- filterHelper.prototype.processVal = function (val) {
195
- var ei = remult3_1.getEntitySettings(this.metadata.valueType, false);
144
+ processVal(val) {
145
+ let ei = getEntitySettings(this.metadata.valueType, false);
196
146
  if (ei) {
197
147
  if (!val)
198
148
  return null;
199
149
  if (typeof val === "string" || typeof val === "number")
200
150
  return val;
201
- return remult3_1.getEntityRef(val).getId();
151
+ return getEntityRef(val).getId();
202
152
  }
203
153
  return 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;
154
+ }
155
+ contains(val) {
156
+ return new Filter(add => add.containsCaseInsensitive(this.metadata, val));
157
+ }
158
+ isLessThan(val) {
211
159
  val = this.processVal(val);
212
- return new Filter(function (add) { return add.isLessThan(_this.metadata, val); });
213
- };
214
- filterHelper.prototype.isGreaterOrEqualTo = function (val) {
215
- var _this = this;
160
+ return new Filter(add => add.isLessThan(this.metadata, val));
161
+ }
162
+ isGreaterOrEqualTo(val) {
216
163
  val = this.processVal(val);
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; }
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));
235
170
  }
236
171
  });
237
- };
238
- filterHelper.prototype.isDifferentFrom = function (val) {
239
- var _this = this;
172
+ }
173
+ isDifferentFrom(val) {
240
174
  val = this.processVal(val);
241
175
  if ((val === null || val === undefined) && this.metadata.allowNull)
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;
176
+ return new Filter(add => add.isNotNull(this.metadata));
177
+ return new Filter(add => add.isDifferentFrom(this.metadata, val));
178
+ }
179
+ isLessOrEqualTo(val) {
247
180
  val = this.processVal(val);
248
- return new Filter(function (add) { return add.isLessOrEqualTo(_this.metadata, val); });
249
- };
250
- filterHelper.prototype.isGreaterThan = function (val) {
251
- var _this = this;
181
+ return new Filter(add => add.isLessOrEqualTo(this.metadata, val));
182
+ }
183
+ isGreaterThan(val) {
252
184
  val = this.processVal(val);
253
- return new Filter(function (add) { return add.isGreaterThan(_this.metadata, val); });
254
- };
255
- filterHelper.prototype.isEqualTo = function (val) {
256
- var _this = this;
185
+ return new Filter(add => add.isGreaterThan(this.metadata, val));
186
+ }
187
+ isEqualTo(val) {
257
188
  val = this.processVal(val);
258
189
  if ((val === null || val === undefined) && this.metadata.allowNull)
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
- }
285
- }
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; }
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);
292
204
  }
293
- }) || this;
294
- _this.filters = filters;
295
- return _this;
205
+ });
206
+ this.filters = filters;
296
207
  }
297
- AndFilter.prototype.add = function (filter) {
208
+ add(filter) {
298
209
  this.filters.push(filter);
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; });
210
+ }
211
+ }
212
+ export class OrFilter extends Filter {
213
+ constructor(...filters) {
214
+ super(add => {
215
+ let f = this.filters.filter(x => x !== undefined);
312
216
  if (f.length > 1) {
313
217
  add.or(f);
314
218
  }
315
219
  else if (f.length == 1)
316
220
  f[0].__applyToConsumer(add);
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() {
221
+ });
222
+ this.filters = filters;
223
+ }
224
+ }
225
+ export const customUrlToken = "$custom$";
226
+ export const customDatabaseFilterToken = "$db$";
227
+ export class FilterSerializer {
228
+ constructor() {
328
229
  this.result = {};
329
230
  this.hasUndefined = false;
330
231
  }
331
- FilterSerializer.prototype.databaseCustom = function (databaseCustom) {
232
+ databaseCustom(databaseCustom) {
332
233
  throw new Error("database custom is not allowed with api calls.");
333
- };
334
- FilterSerializer.prototype.custom = function (key, customItem) {
335
- this.add(exports.customUrlToken + key, customItem);
336
- };
337
- FilterSerializer.prototype.add = function (key, val) {
234
+ }
235
+ custom(key, customItem) {
236
+ this.add(customUrlToken + key, customItem);
237
+ }
238
+ add(key, val) {
338
239
  if (val === undefined)
339
240
  this.hasUndefined = true;
340
- var r = this.result;
241
+ let r = this.result;
341
242
  if (!r[key]) {
342
243
  r[key] = val;
343
244
  return;
344
245
  }
345
- var v = r[key];
246
+ let v = r[key];
346
247
  if (v instanceof Array) {
347
248
  v.push(val);
348
249
  }
349
250
  else
350
251
  v = [v, val];
351
252
  r[key] = v;
352
- };
353
- FilterSerializer.prototype.or = function (orElements) {
354
- this.add("OR", orElements.map(function (x) {
355
- var f = new FilterSerializer();
253
+ }
254
+ or(orElements) {
255
+ this.add("OR", orElements.map(x => {
256
+ let f = new FilterSerializer();
356
257
  x.__applyToConsumer(f);
357
258
  return f.result;
358
259
  }));
359
- };
360
- FilterSerializer.prototype.isNull = function (col) {
260
+ }
261
+ isNull(col) {
361
262
  this.add(col.key + "_null", true);
362
- };
363
- FilterSerializer.prototype.isNotNull = function (col) {
263
+ }
264
+ isNotNull(col) {
364
265
  this.add(col.key + "_null", false);
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) {
266
+ }
267
+ isIn(col, val) {
268
+ this.add(col.key + "_in", val.map(x => col.valueConverter.toJson(x)));
269
+ }
270
+ isEqualTo(col, val) {
370
271
  this.add(col.key, col.valueConverter.toJson(val));
371
- };
372
- FilterSerializer.prototype.isDifferentFrom = function (col, val) {
272
+ }
273
+ isDifferentFrom(col, val) {
373
274
  this.add(col.key + '_ne', col.valueConverter.toJson(val));
374
- };
375
- FilterSerializer.prototype.isGreaterOrEqualTo = function (col, val) {
275
+ }
276
+ isGreaterOrEqualTo(col, val) {
376
277
  this.add(col.key + '_gte', col.valueConverter.toJson(val));
377
- };
378
- FilterSerializer.prototype.isGreaterThan = function (col, val) {
278
+ }
279
+ isGreaterThan(col, val) {
379
280
  this.add(col.key + '_gt', col.valueConverter.toJson(val));
380
- };
381
- FilterSerializer.prototype.isLessOrEqualTo = function (col, val) {
281
+ }
282
+ isLessOrEqualTo(col, val) {
382
283
  this.add(col.key + '_lte', col.valueConverter.toJson(val));
383
- };
384
- FilterSerializer.prototype.isLessThan = function (col, val) {
284
+ }
285
+ isLessThan(col, val) {
385
286
  this.add(col.key + '_lt', col.valueConverter.toJson(val));
386
- };
387
- FilterSerializer.prototype.containsCaseInsensitive = function (col, val) {
287
+ }
288
+ containsCaseInsensitive(col, val) {
388
289
  this.add(col.key + "_contains", val);
389
- };
390
- return FilterSerializer;
391
- }());
392
- exports.FilterSerializer = FilterSerializer;
393
- function entityFilterToJson(entityDefs, where) {
290
+ }
291
+ }
292
+ export function entityFilterToJson(entityDefs, where) {
394
293
  if (!where)
395
294
  return {};
396
295
  return (Filter.fromEntityFilter(entityDefs, where)).toJson();
397
296
  }
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);
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);
409
302
  if (val !== undefined) {
410
- var addFilter_1 = function (val) {
411
- var _a;
412
- var theVal = val;
303
+ let addFilter = (val) => {
304
+ let theVal = val;
413
305
  if (jsonArray) {
414
- var arr = void 0;
306
+ let arr;
415
307
  if (typeof val === 'string')
416
308
  arr = JSON.parse(val);
417
309
  else
418
310
  arr = val;
419
- theVal = arr.map(function (x) { return asString ? x : col.valueConverter.fromJson(x); });
311
+ theVal = arr.map(x => asString ? x : col.valueConverter.fromJson(x));
420
312
  }
421
313
  else {
422
314
  theVal = asString ? theVal : col.valueConverter.fromJson(theVal);
423
315
  }
424
- var f = theFilter(theVal);
316
+ let f = theFilter(theVal);
425
317
  if (f !== undefined) {
426
- where.push((_a = {}, _a[col.key] = f, _a));
318
+ where.push({ [col.key]: f });
427
319
  }
428
320
  };
429
321
  if (!jsonArray && val instanceof Array) {
430
- val.forEach(function (v) {
431
- addFilter_1(v);
322
+ val.forEach(v => {
323
+ addFilter(v);
432
324
  });
433
325
  }
434
326
  else {
@@ -436,31 +328,21 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
436
328
  if (typeof val === 'string')
437
329
  val = JSON.parse(val);
438
330
  }
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; }
331
+ const array = separateArrayFromInnerArray(val);
332
+ for (const x of array) {
333
+ addFilter(x);
452
334
  }
453
335
  }
454
336
  }
455
337
  }
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);
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);
464
346
  var nullFilter = filterInfo.get(col.key + "_null");
465
347
  if (nullFilter) {
466
348
  nullFilter = nullFilter.toString().trim().toLowerCase();
@@ -468,163 +350,118 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
468
350
  case "y":
469
351
  case "true":
470
352
  case "yes":
471
- where.push((_a = {}, _a[col.key] = null, _a));
353
+ where.push({ [col.key]: null });
472
354
  break;
473
355
  default:
474
- where.push((_b = {}, _b[col.key] = { "$ne": null }, _b));
356
+ where.push({ [col.key]: { "$ne": null } });
475
357
  break;
476
358
  }
477
359
  }
478
- addFilter('_contains', function (val) { return ({ $contains: val }); }, false, true);
360
+ addFilter('_contains', val => ({ $contains: val }), false, true);
479
361
  });
480
- var val = filterInfo.get('OR');
362
+ let val = filterInfo.get('OR');
481
363
  if (val) {
482
- var array = separateArrayFromInnerArray(val);
364
+ const array = separateArrayFromInnerArray(val);
483
365
  where.push({
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
- }); })
366
+ $and: array.map(v => ({
367
+ $or: v.map(x => buildFilterFromRequestParameters(entity, { get: (key) => x[key] }))
368
+ }))
489
369
  });
490
370
  }
491
- for (var key in entity.entityType) {
492
- var element = entity.entityType[key];
371
+ for (const key in entity.entityType) {
372
+ const element = entity.entityType[key];
493
373
  if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
494
- var custom = filterInfo.get(exports.customUrlToken + key);
374
+ let custom = filterInfo.get(customUrlToken + key);
495
375
  if (custom !== undefined) {
496
- where.push((_a = {}, _a[exports.customUrlToken + key] = custom, _a));
376
+ where.push({ [customUrlToken + key]: custom });
497
377
  }
498
378
  }
499
379
  }
500
380
  return { $and: where };
501
381
  function separateArrayFromInnerArray(val) {
502
- var e_4, _a;
503
382
  if (!Array.isArray(val))
504
383
  return [val];
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);
384
+ const nonArray = [], array = [];
385
+ for (const v of val) {
386
+ if (Array.isArray(v)) {
387
+ array.push(v);
520
388
  }
521
- finally { if (e_4) throw e_4.error; }
389
+ else
390
+ nonArray.push(v);
522
391
  }
523
392
  array.push(nonArray);
524
393
  return array;
525
394
  }
526
395
  }
527
- exports.buildFilterFromRequestParameters = buildFilterFromRequestParameters;
528
- var customTranslator = /** @class */ (function () {
529
- function customTranslator(translateCustom) {
396
+ class customTranslator {
397
+ constructor(translateCustom) {
530
398
  this.translateCustom = translateCustom;
531
399
  this.commands = [];
532
400
  this.promises = [];
533
401
  }
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) {
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 => {
554
413
  newOrElements = x;
555
414
  }));
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
- }());
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
+ }