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,92 +1,179 @@
1
- export class FilterConsumerBridgeToSqlRequest {
2
- constructor(r, nameProvider) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dbNameProviderImpl = exports.getDbNameProvider = exports.CustomSqlFilterBuilder = exports.FilterConsumerBridgeToSqlRequest = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var FilterConsumerBridgeToSqlRequest = /** @class */ (function () {
6
+ function FilterConsumerBridgeToSqlRequest(r, nameProvider) {
3
7
  this.r = r;
4
8
  this.nameProvider = nameProvider;
5
9
  this.where = "";
6
10
  this._addWhere = true;
7
11
  this.promises = [];
8
12
  }
9
- async resolveWhere() {
10
- while (this.promises.length > 0) {
11
- let p = this.promises;
12
- this.promises = [];
13
- for (const pr of p) {
14
- await pr;
15
- }
16
- }
17
- return this.where;
18
- }
19
- custom(key, customItem) {
13
+ FilterConsumerBridgeToSqlRequest.prototype.resolveWhere = function () {
14
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
15
+ var p, p_1, p_1_1, pr, e_1_1;
16
+ var e_1, _a;
17
+ return tslib_1.__generator(this, function (_b) {
18
+ switch (_b.label) {
19
+ case 0:
20
+ if (!(this.promises.length > 0)) return [3 /*break*/, 9];
21
+ p = this.promises;
22
+ this.promises = [];
23
+ _b.label = 1;
24
+ case 1:
25
+ _b.trys.push([1, 6, 7, 8]);
26
+ p_1 = (e_1 = void 0, tslib_1.__values(p)), p_1_1 = p_1.next();
27
+ _b.label = 2;
28
+ case 2:
29
+ if (!!p_1_1.done) return [3 /*break*/, 5];
30
+ pr = p_1_1.value;
31
+ return [4 /*yield*/, pr];
32
+ case 3:
33
+ _b.sent();
34
+ _b.label = 4;
35
+ case 4:
36
+ p_1_1 = p_1.next();
37
+ return [3 /*break*/, 2];
38
+ case 5: return [3 /*break*/, 8];
39
+ case 6:
40
+ e_1_1 = _b.sent();
41
+ e_1 = { error: e_1_1 };
42
+ return [3 /*break*/, 8];
43
+ case 7:
44
+ try {
45
+ if (p_1_1 && !p_1_1.done && (_a = p_1.return)) _a.call(p_1);
46
+ }
47
+ finally { if (e_1) throw e_1.error; }
48
+ return [7 /*endfinally*/];
49
+ case 8: return [3 /*break*/, 0];
50
+ case 9: return [2 /*return*/, this.where];
51
+ }
52
+ });
53
+ });
54
+ };
55
+ FilterConsumerBridgeToSqlRequest.prototype.custom = function (key, customItem) {
20
56
  throw new Error("Custom filter should be translated before it gets here");
21
- }
22
- or(orElements) {
23
- let statement = '';
24
- this.promises.push((async () => {
25
- for (const element of orElements) {
26
- let f = new FilterConsumerBridgeToSqlRequest(this.r, this.nameProvider);
27
- f._addWhere = false;
28
- element.__applyToConsumer(f);
29
- let where = await f.resolveWhere();
30
- if (!where)
31
- return; //since if any member of or is empty, then the entire or is irrelevant
32
- if (where.length > 0) {
33
- if (statement.length > 0) {
34
- statement += " or ";
35
- }
36
- if (orElements.length > 1) {
37
- statement += "(" + where + ")";
38
- }
39
- else
40
- statement += where;
57
+ };
58
+ FilterConsumerBridgeToSqlRequest.prototype.or = function (orElements) {
59
+ var _this = this;
60
+ var statement = '';
61
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
62
+ var orElements_1, orElements_1_1, element, f, where, e_2_1;
63
+ var e_2, _a;
64
+ return tslib_1.__generator(this, function (_b) {
65
+ switch (_b.label) {
66
+ case 0:
67
+ _b.trys.push([0, 5, 6, 7]);
68
+ orElements_1 = tslib_1.__values(orElements), orElements_1_1 = orElements_1.next();
69
+ _b.label = 1;
70
+ case 1:
71
+ if (!!orElements_1_1.done) return [3 /*break*/, 4];
72
+ element = orElements_1_1.value;
73
+ f = new FilterConsumerBridgeToSqlRequest(this.r, this.nameProvider);
74
+ f._addWhere = false;
75
+ element.__applyToConsumer(f);
76
+ return [4 /*yield*/, f.resolveWhere()];
77
+ case 2:
78
+ where = _b.sent();
79
+ if (!where)
80
+ return [2 /*return*/]; //since if any member of or is empty, then the entire or is irrelevant
81
+ if (where.length > 0) {
82
+ if (statement.length > 0) {
83
+ statement += " or ";
84
+ }
85
+ if (orElements.length > 1) {
86
+ statement += "(" + where + ")";
87
+ }
88
+ else
89
+ statement += where;
90
+ }
91
+ _b.label = 3;
92
+ case 3:
93
+ orElements_1_1 = orElements_1.next();
94
+ return [3 /*break*/, 1];
95
+ case 4: return [3 /*break*/, 7];
96
+ case 5:
97
+ e_2_1 = _b.sent();
98
+ e_2 = { error: e_2_1 };
99
+ return [3 /*break*/, 7];
100
+ case 6:
101
+ try {
102
+ if (orElements_1_1 && !orElements_1_1.done && (_a = orElements_1.return)) _a.call(orElements_1);
103
+ }
104
+ finally { if (e_2) throw e_2.error; }
105
+ return [7 /*endfinally*/];
106
+ case 7:
107
+ this.addToWhere("(" + statement + ")");
108
+ return [2 /*return*/];
41
109
  }
42
- }
43
- this.addToWhere("(" + statement + ")");
44
- })());
45
- }
46
- isNull(col) {
47
- this.promises.push((async () => this.addToWhere(this.nameProvider.nameOf(col) + ' is null'))());
48
- }
49
- isNotNull(col) {
50
- this.promises.push((async () => this.addToWhere(this.nameProvider.nameOf(col) + ' is not null'))());
51
- }
52
- isIn(col, val) {
53
- this.promises.push((async () => {
54
- if (val && val.length > 0)
55
- this.addToWhere(this.nameProvider.nameOf(col) + " in (" + val.map(x => this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x))).join(",") + ")");
56
- else
57
- this.addToWhere('1 = 0 /*isIn with no values*/');
58
- })());
59
- }
60
- isEqualTo(col, val) {
110
+ });
111
+ }); })());
112
+ };
113
+ FilterConsumerBridgeToSqlRequest.prototype.isNull = function (col) {
114
+ var _this = this;
115
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
116
+ return [2 /*return*/, this.addToWhere(this.nameProvider.nameOf(col) + ' is null')];
117
+ }); }); })());
118
+ };
119
+ FilterConsumerBridgeToSqlRequest.prototype.isNotNull = function (col) {
120
+ var _this = this;
121
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
122
+ return [2 /*return*/, this.addToWhere(this.nameProvider.nameOf(col) + ' is not null')];
123
+ }); }); })());
124
+ };
125
+ FilterConsumerBridgeToSqlRequest.prototype.isIn = function (col, val) {
126
+ var _this = this;
127
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
128
+ var _this = this;
129
+ return tslib_1.__generator(this, function (_a) {
130
+ if (val && val.length > 0)
131
+ this.addToWhere(this.nameProvider.nameOf(col) + " in (" + val.map(function (x) { return _this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x)); }).join(",") + ")");
132
+ else
133
+ this.addToWhere('1 = 0 /*isIn with no values*/');
134
+ return [2 /*return*/];
135
+ });
136
+ }); })());
137
+ };
138
+ FilterConsumerBridgeToSqlRequest.prototype.isEqualTo = function (col, val) {
61
139
  this.add(col, val, "=");
62
- }
63
- isDifferentFrom(col, val) {
140
+ };
141
+ FilterConsumerBridgeToSqlRequest.prototype.isDifferentFrom = function (col, val) {
64
142
  this.add(col, val, "<>");
65
- }
66
- isGreaterOrEqualTo(col, val) {
143
+ };
144
+ FilterConsumerBridgeToSqlRequest.prototype.isGreaterOrEqualTo = function (col, val) {
67
145
  this.add(col, val, ">=");
68
- }
69
- isGreaterThan(col, val) {
146
+ };
147
+ FilterConsumerBridgeToSqlRequest.prototype.isGreaterThan = function (col, val) {
70
148
  this.add(col, val, ">");
71
- }
72
- isLessOrEqualTo(col, val) {
149
+ };
150
+ FilterConsumerBridgeToSqlRequest.prototype.isLessOrEqualTo = function (col, val) {
73
151
  this.add(col, val, "<=");
74
- }
75
- isLessThan(col, val) {
152
+ };
153
+ FilterConsumerBridgeToSqlRequest.prototype.isLessThan = function (col, val) {
76
154
  this.add(col, val, "<");
77
- }
78
- containsCaseInsensitive(col, val) {
79
- this.promises.push((async () => {
80
- this.addToWhere('lower (' + this.nameProvider.nameOf(col) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')");
81
- })());
82
- }
83
- add(col, val, operator) {
84
- this.promises.push((async () => {
85
- let x = this.nameProvider.nameOf(col) + ' ' + operator + ' ' + this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
86
- this.addToWhere(x);
87
- })());
88
- }
89
- addToWhere(x) {
155
+ };
156
+ FilterConsumerBridgeToSqlRequest.prototype.containsCaseInsensitive = function (col, val) {
157
+ var _this = this;
158
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
159
+ return tslib_1.__generator(this, function (_a) {
160
+ this.addToWhere('lower (' + this.nameProvider.nameOf(col) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')");
161
+ return [2 /*return*/];
162
+ });
163
+ }); })());
164
+ };
165
+ FilterConsumerBridgeToSqlRequest.prototype.add = function (col, val, operator) {
166
+ var _this = this;
167
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
168
+ var x;
169
+ return tslib_1.__generator(this, function (_a) {
170
+ x = this.nameProvider.nameOf(col) + ' ' + operator + ' ' + this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
171
+ this.addToWhere(x);
172
+ return [2 /*return*/];
173
+ });
174
+ }); })());
175
+ };
176
+ FilterConsumerBridgeToSqlRequest.prototype.addToWhere = function (x) {
90
177
  if (this.where.length == 0) {
91
178
  if (this._addWhere)
92
179
  this.where += ' where ';
@@ -94,46 +181,101 @@ export class FilterConsumerBridgeToSqlRequest {
94
181
  else
95
182
  this.where += ' and ';
96
183
  this.where += x;
97
- }
98
- databaseCustom(databaseCustom) {
99
- this.promises.push((async () => {
100
- if (databaseCustom?.buildSql) {
101
- let item = new CustomSqlFilterBuilder(this.r);
102
- await databaseCustom.buildSql(item);
103
- if (item.sql) {
104
- this.addToWhere("(" + item.sql + ")");
184
+ };
185
+ FilterConsumerBridgeToSqlRequest.prototype.databaseCustom = function (databaseCustom) {
186
+ var _this = this;
187
+ this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
188
+ var item;
189
+ return tslib_1.__generator(this, function (_a) {
190
+ switch (_a.label) {
191
+ case 0:
192
+ if (!(databaseCustom === null || databaseCustom === void 0 ? void 0 : databaseCustom.buildSql)) return [3 /*break*/, 2];
193
+ item = new CustomSqlFilterBuilder(this.r);
194
+ return [4 /*yield*/, databaseCustom.buildSql(item)];
195
+ case 1:
196
+ _a.sent();
197
+ if (item.sql) {
198
+ this.addToWhere("(" + item.sql + ")");
199
+ }
200
+ _a.label = 2;
201
+ case 2: return [2 /*return*/];
105
202
  }
106
- }
107
- })());
108
- }
109
- }
110
- export class CustomSqlFilterBuilder {
111
- constructor(r) {
203
+ });
204
+ }); })());
205
+ };
206
+ return FilterConsumerBridgeToSqlRequest;
207
+ }());
208
+ exports.FilterConsumerBridgeToSqlRequest = FilterConsumerBridgeToSqlRequest;
209
+ var CustomSqlFilterBuilder = /** @class */ (function () {
210
+ function CustomSqlFilterBuilder(r) {
112
211
  this.r = r;
113
212
  this.sql = '';
114
213
  }
115
- addParameterAndReturnSqlToken(val, field) {
214
+ CustomSqlFilterBuilder.prototype.addParameterAndReturnSqlToken = function (val, field) {
116
215
  if (field)
117
216
  val = field.valueConverter.toDb(val);
118
217
  return this.r.addParameterAndReturnSqlToken(val);
119
- }
120
- }
121
- export async function getDbNameProvider(meta) {
122
- var result = new dbNameProviderImpl();
123
- for (const f of meta.fields) {
124
- result.map.set(f.key, await f.getDbName());
125
- }
126
- result.entityName = await meta.getDbName();
127
- return result;
218
+ };
219
+ return CustomSqlFilterBuilder;
220
+ }());
221
+ exports.CustomSqlFilterBuilder = CustomSqlFilterBuilder;
222
+ function getDbNameProvider(meta) {
223
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
224
+ var result, _a, _b, f, _c, _d, _e, e_3_1, _f;
225
+ var e_3, _g;
226
+ return tslib_1.__generator(this, function (_h) {
227
+ switch (_h.label) {
228
+ case 0:
229
+ result = new dbNameProviderImpl();
230
+ _h.label = 1;
231
+ case 1:
232
+ _h.trys.push([1, 6, 7, 8]);
233
+ _a = tslib_1.__values(meta.fields), _b = _a.next();
234
+ _h.label = 2;
235
+ case 2:
236
+ if (!!_b.done) return [3 /*break*/, 5];
237
+ f = _b.value;
238
+ _d = (_c = result.map).set;
239
+ _e = [f.key];
240
+ return [4 /*yield*/, f.getDbName()];
241
+ case 3:
242
+ _d.apply(_c, _e.concat([_h.sent()]));
243
+ _h.label = 4;
244
+ case 4:
245
+ _b = _a.next();
246
+ return [3 /*break*/, 2];
247
+ case 5: return [3 /*break*/, 8];
248
+ case 6:
249
+ e_3_1 = _h.sent();
250
+ e_3 = { error: e_3_1 };
251
+ return [3 /*break*/, 8];
252
+ case 7:
253
+ try {
254
+ if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
255
+ }
256
+ finally { if (e_3) throw e_3.error; }
257
+ return [7 /*endfinally*/];
258
+ case 8:
259
+ _f = result;
260
+ return [4 /*yield*/, meta.getDbName()];
261
+ case 9:
262
+ _f.entityName = _h.sent();
263
+ return [2 /*return*/, result];
264
+ }
265
+ });
266
+ });
128
267
  }
129
- export class dbNameProviderImpl {
130
- constructor() {
268
+ exports.getDbNameProvider = getDbNameProvider;
269
+ var dbNameProviderImpl = /** @class */ (function () {
270
+ function dbNameProviderImpl() {
131
271
  this.map = new Map();
132
272
  }
133
- nameOf(field) {
273
+ dbNameProviderImpl.prototype.nameOf = function (field) {
134
274
  return this.map.get(field.key);
135
- }
136
- isDbReadonly(x) {
275
+ };
276
+ dbNameProviderImpl.prototype.isDbReadonly = function (x) {
137
277
  return (x.dbReadOnly || x.isServerExpression || this.nameOf(x) != x.options.dbName);
138
- }
139
- }
278
+ };
279
+ return dbNameProviderImpl;
280
+ }());
281
+ exports.dbNameProviderImpl = dbNameProviderImpl;
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });