remult 0.17.3 → 0.18.0

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 (163) hide show
  1. package/SseSubscriptionServer.d.ts +23 -0
  2. package/SseSubscriptionServer.js +143 -0
  3. package/ably.d.ts +13 -0
  4. package/ably.js +59 -0
  5. package/esm/SseSubscriptionServer.d.ts +23 -0
  6. package/esm/SseSubscriptionServer.js +102 -0
  7. package/esm/ably.d.ts +13 -0
  8. package/esm/ably.js +28 -0
  9. package/esm/index.d.ts +7 -4
  10. package/esm/index.js +4 -2
  11. package/esm/live-query/data-provider-live-query-storage.d.ts +23 -0
  12. package/esm/live-query/data-provider-live-query-storage.js +78 -0
  13. package/esm/myLog.d.ts +1 -0
  14. package/esm/myLog.js +5 -0
  15. package/esm/postgres/postgres-data-provider.d.ts +4 -2
  16. package/esm/postgres/postgres-data-provider.js +18 -6
  17. package/esm/postgres/schema-builder.d.ts +2 -1
  18. package/esm/postgres/schema-builder.js +49 -29
  19. package/esm/remult-knex/index.d.ts +10 -32
  20. package/esm/remult-knex/index.js +75 -51
  21. package/esm/remult-mongo.d.ts +9 -2
  22. package/esm/remult-mongo.js +24 -8
  23. package/esm/remult-next.d.ts +11 -0
  24. package/esm/remult-next.js +27 -0
  25. package/esm/server/core.d.ts +2 -0
  26. package/esm/server/core.js +2 -0
  27. package/esm/server/expressBridge.d.ts +19 -7
  28. package/esm/server/expressBridge.js +135 -31
  29. package/esm/server/index.d.ts +2 -1
  30. package/esm/server/index.js +2 -1
  31. package/esm/server/initDataProvider.d.ts +2 -0
  32. package/esm/server/initDataProvider.js +14 -0
  33. package/esm/src/buildRestDataProvider.d.ts +31 -0
  34. package/esm/src/buildRestDataProvider.js +110 -0
  35. package/esm/src/column-interfaces.d.ts +44 -8
  36. package/esm/src/column.d.ts +3 -3
  37. package/esm/src/context.d.ts +39 -36
  38. package/esm/src/context.js +87 -117
  39. package/esm/src/data-api.d.ts +9 -3
  40. package/esm/src/data-api.js +130 -63
  41. package/esm/src/data-interfaces.d.ts +5 -1
  42. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  43. package/esm/src/data-providers/array-entity-data-provider.js +2 -17
  44. package/esm/src/data-providers/rest-data-provider.d.ts +4 -3
  45. package/esm/src/data-providers/rest-data-provider.js +64 -23
  46. package/esm/src/data-providers/sql-database.d.ts +7 -3
  47. package/esm/src/data-providers/sql-database.js +60 -17
  48. package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
  49. package/esm/src/data-providers/web-sql-data-provider.js +23 -9
  50. package/esm/src/entity.d.ts +2 -2
  51. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  52. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  53. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  54. package/esm/src/filter/filter-interfaces.js +31 -26
  55. package/esm/src/live-query/LiveQueryClient.d.ts +1 -0
  56. package/esm/src/live-query/LiveQueryClient.js +184 -0
  57. package/esm/src/live-query/SseSubscriptionClient.d.ts +5 -0
  58. package/esm/src/live-query/SseSubscriptionClient.js +86 -0
  59. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  60. package/esm/src/live-query/SubscriptionChannel.js +121 -0
  61. package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
  62. package/esm/src/live-query/SubscriptionServer.js +108 -0
  63. package/esm/src/remult-proxy.d.ts +1 -1
  64. package/esm/src/remult-proxy.js +52 -7
  65. package/esm/src/remult3/RepositoryImplementation.d.ts +14 -5
  66. package/esm/src/remult3/RepositoryImplementation.js +124 -44
  67. package/esm/src/remult3/getId.d.ts +2 -0
  68. package/esm/src/remult3/getId.js +7 -0
  69. package/esm/src/remult3/remult3.d.ts +67 -10
  70. package/esm/src/remult3/remult3.js +1 -0
  71. package/esm/src/server-action.d.ts +5 -1
  72. package/esm/src/server-action.js +11 -12
  73. package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
  74. package/esm/src/shared-tests/db-tests-setup.js +14 -6
  75. package/esm/src/shared-tests/db-tests.db-tests.js +71 -10
  76. package/esm/src/sort.d.ts +1 -0
  77. package/esm/src/sort.js +18 -0
  78. package/esm/src/sql-command.d.ts +5 -2
  79. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  80. package/esm/src/tests/entityForCustomFilter.js +20 -21
  81. package/esm/src/tests/frontend-database-tests-setup.spec.js +3 -4
  82. package/esm/src/tests/testHelper.spec.d.ts +3 -1
  83. package/esm/src/tests/testHelper.spec.js +63 -60
  84. package/esm/src/valueConverters.js +15 -7
  85. package/index.d.ts +7 -4
  86. package/index.js +7 -3
  87. package/live-query/data-provider-live-query-storage.d.ts +23 -0
  88. package/live-query/data-provider-live-query-storage.js +236 -0
  89. package/myLog.d.ts +1 -0
  90. package/myLog.js +20 -0
  91. package/package.json +18 -1
  92. package/postgres/postgres-data-provider.d.ts +4 -2
  93. package/postgres/postgres-data-provider.js +54 -39
  94. package/postgres/schema-builder.d.ts +2 -1
  95. package/postgres/schema-builder.js +118 -70
  96. package/remult-express.js +1 -1
  97. package/remult-knex/index.d.ts +10 -32
  98. package/remult-knex/index.js +134 -87
  99. package/remult-mongo.d.ts +9 -2
  100. package/remult-mongo.js +39 -7
  101. package/remult-next.d.ts +11 -0
  102. package/remult-next.js +73 -0
  103. package/server/JsonEntityFileStorage.js +2 -2
  104. package/server/core.d.ts +2 -0
  105. package/server/core.js +5 -1
  106. package/server/expressBridge.d.ts +19 -7
  107. package/server/expressBridge.js +283 -69
  108. package/server/index.d.ts +2 -1
  109. package/server/index.js +3 -1
  110. package/server/initDataProvider.d.ts +2 -0
  111. package/server/initDataProvider.js +26 -0
  112. package/src/buildRestDataProvider.d.ts +31 -0
  113. package/src/buildRestDataProvider.js +162 -0
  114. package/src/column-interfaces.d.ts +44 -8
  115. package/src/column.d.ts +3 -3
  116. package/src/context.d.ts +39 -36
  117. package/src/context.js +171 -166
  118. package/src/data-api.d.ts +9 -3
  119. package/src/data-api.js +233 -88
  120. package/src/data-interfaces.d.ts +5 -1
  121. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  122. package/src/data-providers/array-entity-data-provider.js +2 -17
  123. package/src/data-providers/rest-data-provider.d.ts +4 -3
  124. package/src/data-providers/rest-data-provider.js +105 -39
  125. package/src/data-providers/sql-database.d.ts +7 -3
  126. package/src/data-providers/sql-database.js +89 -16
  127. package/src/data-providers/web-sql-data-provider.d.ts +3 -0
  128. package/src/data-providers/web-sql-data-provider.js +56 -11
  129. package/src/entity.d.ts +2 -2
  130. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  131. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  132. package/src/filter/filter-interfaces.d.ts +5 -5
  133. package/src/filter/filter-interfaces.js +31 -26
  134. package/src/live-query/LiveQueryClient.d.ts +1 -0
  135. package/src/live-query/LiveQueryClient.js +283 -0
  136. package/src/live-query/SseSubscriptionClient.d.ts +5 -0
  137. package/src/live-query/SseSubscriptionClient.js +150 -0
  138. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  139. package/src/live-query/SubscriptionChannel.js +209 -0
  140. package/src/live-query/SubscriptionServer.d.ts +38 -0
  141. package/src/live-query/SubscriptionServer.js +258 -0
  142. package/src/remult-proxy.d.ts +1 -1
  143. package/src/remult-proxy.js +153 -8
  144. package/src/remult3/RepositoryImplementation.d.ts +14 -5
  145. package/src/remult3/RepositoryImplementation.js +200 -85
  146. package/src/remult3/getId.d.ts +2 -0
  147. package/src/remult3/getId.js +11 -0
  148. package/src/remult3/remult3.d.ts +67 -10
  149. package/src/remult3/remult3.js +1 -0
  150. package/src/server-action.d.ts +5 -1
  151. package/src/server-action.js +11 -11
  152. package/src/shared-tests/db-tests-setup.d.ts +12 -5
  153. package/src/shared-tests/db-tests-setup.js +17 -8
  154. package/src/shared-tests/db-tests.db-tests.js +140 -8
  155. package/src/sort.d.ts +1 -0
  156. package/src/sort.js +18 -0
  157. package/src/sql-command.d.ts +5 -2
  158. package/src/tests/entityForCustomFilter.d.ts +6 -6
  159. package/src/tests/entityForCustomFilter.js +30 -31
  160. package/src/tests/frontend-database-tests-setup.spec.js +5 -6
  161. package/src/tests/testHelper.spec.d.ts +3 -1
  162. package/src/tests/testHelper.spec.js +104 -100
  163. package/src/valueConverters.js +15 -7
package/src/data-api.js CHANGED
@@ -1,30 +1,58 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.serializeError = exports.determineSort = exports.DataApi = void 0;
3
+ exports.getLiveQueryChannel = exports.serializeError = exports.determineSort = exports.DataApi = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var filter_interfaces_1 = require("./filter/filter-interfaces");
6
+ var context_1 = require("./context");
6
7
  var filter_interfaces_2 = require("./filter/filter-interfaces");
8
+ var server_action_1 = require("./server-action");
9
+ var getId_1 = require("./remult3/getId");
10
+ var rest_data_provider_1 = require("./data-providers/rest-data-provider");
7
11
  var DataApi = /** @class */ (function () {
8
12
  function DataApi(repository, remult) {
9
13
  this.repository = repository;
10
14
  this.remult = remult;
11
15
  }
12
- DataApi.prototype.httpGet = function (res, req) {
13
- if (req.get("__action") == "count") {
14
- return this.count(res, req);
15
- }
16
- else
17
- return this.getArray(res, req);
18
- };
19
- DataApi.prototype.httpPost = function (res, req, body) {
20
- switch (req.get("__action")) {
16
+ DataApi.prototype.httpGet = function (res, req, serializeRequest) {
17
+ var _a;
18
+ var action = req === null || req === void 0 ? void 0 : req.get("__action");
19
+ if (action === null || action === void 0 ? void 0 : action.startsWith(rest_data_provider_1.liveQueryAction))
20
+ return this.liveQuery(res, req, undefined, serializeRequest, getLiveQueryChannel(action.substring(rest_data_provider_1.liveQueryAction.length), (_a = this.remult.user) === null || _a === void 0 ? void 0 : _a.id));
21
+ switch (action) {
21
22
  case "get":
22
- return this.getArray(res, req, body);
23
23
  case "count":
24
- return this.count(res, req, body);
25
- default:
26
- return this.post(res, body);
24
+ return this.count(res, req, undefined);
27
25
  }
26
+ return this.getArray(res, req, undefined);
27
+ };
28
+ DataApi.prototype.httpPost = function (res, req, body, serializeRequest) {
29
+ var _a, _b;
30
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
31
+ var action, _c;
32
+ return tslib_1.__generator(this, function (_d) {
33
+ switch (_d.label) {
34
+ case 0:
35
+ action = req === null || req === void 0 ? void 0 : req.get("__action");
36
+ if (action === null || action === void 0 ? void 0 : action.startsWith(rest_data_provider_1.liveQueryAction))
37
+ return [2 /*return*/, this.liveQuery(res, req, undefined, serializeRequest, getLiveQueryChannel(action.substring(rest_data_provider_1.liveQueryAction.length), (_a = this.remult.user) === null || _a === void 0 ? void 0 : _a.id))];
38
+ _c = action;
39
+ switch (_c) {
40
+ case "get": return [3 /*break*/, 1];
41
+ case "count": return [3 /*break*/, 2];
42
+ case "endLiveQuery": return [3 /*break*/, 3];
43
+ }
44
+ return [3 /*break*/, 5];
45
+ case 1: return [2 /*return*/, this.getArray(res, req, body)];
46
+ case 2: return [2 /*return*/, this.count(res, req, body)];
47
+ case 3: return [4 /*yield*/, this.remult.liveQueryStorage.remove(getLiveQueryChannel(body.id, (_b = this.remult.user) === null || _b === void 0 ? void 0 : _b.id))];
48
+ case 4:
49
+ _d.sent();
50
+ res.success("ok");
51
+ return [2 /*return*/];
52
+ case 5: return [2 /*return*/, this.post(res, body)];
53
+ }
54
+ });
55
+ });
28
56
  };
29
57
  DataApi.prototype.get = function (response, id) {
30
58
  return tslib_1.__awaiter(this, void 0, void 0, function () {
@@ -77,29 +105,34 @@ var DataApi = /** @class */ (function () {
77
105
  });
78
106
  });
79
107
  };
80
- DataApi.prototype.getArray = function (response, request, filterBody) {
108
+ DataApi.prototype.getArrayImpl = function (response, request, filterBody) {
81
109
  return tslib_1.__awaiter(this, void 0, void 0, function () {
82
- var findOptions, _a, hasId_1, w, sort, dir, limit, err_2;
110
+ var findOptions, _a, sort, dir, limit, hasId_1, w, r;
83
111
  var _this = this;
84
112
  return tslib_1.__generator(this, function (_b) {
85
113
  switch (_b.label) {
86
114
  case 0:
87
- if (!this.repository.metadata.apiReadAllowed) {
88
- response.forbidden();
89
- return [2 /*return*/];
90
- }
91
- _b.label = 1;
92
- case 1:
93
- _b.trys.push([1, 6, , 7]);
94
115
  findOptions = { load: function () { return []; } };
95
116
  _a = findOptions;
96
117
  return [4 /*yield*/, this.buildWhere(request, filterBody)];
97
- case 2:
118
+ case 1:
98
119
  _a.where = _b.sent();
99
- if (!this.remult.isAllowed(this.repository.metadata.options.apiRequireId)) return [3 /*break*/, 4];
120
+ if (request) {
121
+ sort = request.get("_sort");
122
+ if (sort != undefined) {
123
+ dir = request.get('_order');
124
+ findOptions.orderBy = determineSort(sort, dir);
125
+ }
126
+ limit = +request.get("_limit");
127
+ if (!limit && DataApi.defaultGetLimit)
128
+ limit = DataApi.defaultGetLimit;
129
+ findOptions.limit = limit;
130
+ findOptions.page = +request.get("_page");
131
+ }
132
+ if (!this.remult.isAllowed(this.repository.metadata.options.apiRequireId)) return [3 /*break*/, 3];
100
133
  hasId_1 = false;
101
134
  return [4 /*yield*/, filter_interfaces_2.Filter.fromEntityFilter(this.repository.metadata, findOptions.where)];
102
- case 3:
135
+ case 2:
103
136
  w = _b.sent();
104
137
  if (w) {
105
138
  w.__applyToConsumer({
@@ -123,47 +156,97 @@ var DataApi = /** @class */ (function () {
123
156
  }
124
157
  if (!hasId_1) {
125
158
  response.forbidden();
126
- return [2 /*return*/];
159
+ throw new server_action_1.ForbiddenError();
127
160
  }
128
- _b.label = 4;
161
+ _b.label = 3;
162
+ case 3: return [4 /*yield*/, this.repository.find(findOptions)
163
+ .then(function (r) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
164
+ var _this = this;
165
+ return tslib_1.__generator(this, function (_a) {
166
+ switch (_a.label) {
167
+ case 0: return [4 /*yield*/, Promise.all(r.map(function (y) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
168
+ return [2 /*return*/, this.repository.getEntityRef(y).toApiJson()];
169
+ }); }); }))];
170
+ case 1: return [2 /*return*/, _a.sent()];
171
+ }
172
+ });
173
+ }); })];
129
174
  case 4:
130
- if (request) {
131
- sort = request.get("_sort");
132
- if (sort != undefined) {
133
- dir = request.get('_order');
134
- findOptions.orderBy = determineSort(sort, dir);
135
- }
136
- limit = +request.get("_limit");
137
- if (!limit && DataApi.defaultGetLimit)
138
- limit = DataApi.defaultGetLimit;
139
- findOptions.limit = limit;
140
- findOptions.page = +request.get("_page");
175
+ r = _b.sent();
176
+ return [2 /*return*/, { r: r, findOptions: findOptions }];
177
+ }
178
+ });
179
+ });
180
+ };
181
+ DataApi.prototype.getArray = function (response, request, filterBody) {
182
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
183
+ var r, err_2;
184
+ return tslib_1.__generator(this, function (_a) {
185
+ switch (_a.label) {
186
+ case 0:
187
+ if (!this.repository.metadata.apiReadAllowed) {
188
+ response.forbidden();
189
+ return [2 /*return*/];
141
190
  }
142
- return [4 /*yield*/, this.repository.find(findOptions)
143
- .then(function (r) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
144
- var _a, _b;
145
- var _this = this;
146
- return tslib_1.__generator(this, function (_c) {
147
- switch (_c.label) {
148
- case 0:
149
- _b = (_a = response).success;
150
- return [4 /*yield*/, Promise.all(r.map(function (y) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
151
- return [2 /*return*/, this.repository.getEntityRef(y).toApiJson()];
152
- }); }); }))];
153
- case 1:
154
- _b.apply(_a, [_c.sent()]);
155
- return [2 /*return*/];
156
- }
157
- });
158
- }); })];
159
- case 5:
160
- _b.sent();
161
- return [3 /*break*/, 7];
162
- case 6:
163
- err_2 = _b.sent();
164
- response.error(err_2);
165
- return [3 /*break*/, 7];
166
- case 7: return [2 /*return*/];
191
+ _a.label = 1;
192
+ case 1:
193
+ _a.trys.push([1, 3, , 4]);
194
+ return [4 /*yield*/, this.getArrayImpl(response, request, filterBody)];
195
+ case 2:
196
+ r = (_a.sent()).r;
197
+ response.success(r);
198
+ return [3 /*break*/, 4];
199
+ case 3:
200
+ err_2 = _a.sent();
201
+ if (err_2.isForbiddenError)
202
+ response.forbidden();
203
+ else
204
+ response.error(err_2);
205
+ return [3 /*break*/, 4];
206
+ case 4: return [2 /*return*/];
207
+ }
208
+ });
209
+ });
210
+ };
211
+ DataApi.prototype.liveQuery = function (response, request, filterBody, serializeRequest, queryChannel) {
212
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
213
+ var r, data, err_3;
214
+ var _this = this;
215
+ return tslib_1.__generator(this, function (_a) {
216
+ switch (_a.label) {
217
+ case 0:
218
+ if (!this.repository.metadata.apiReadAllowed) {
219
+ response.forbidden();
220
+ return [2 /*return*/];
221
+ }
222
+ _a.label = 1;
223
+ case 1:
224
+ _a.trys.push([1, 4, , 5]);
225
+ return [4 /*yield*/, this.getArrayImpl(response, request, filterBody)];
226
+ case 2:
227
+ r = _a.sent();
228
+ data = {
229
+ requestJson: serializeRequest(),
230
+ findOptionsJson: rest_data_provider_1.findOptionsToJson(r.findOptions, this.repository.metadata),
231
+ lastIds: r.r.map(function (y) { return getId_1.getId(_this.repository.metadata, y); })
232
+ };
233
+ return [4 /*yield*/, this.remult.liveQueryStorage.add({
234
+ entityKey: this.repository.metadata.key,
235
+ id: queryChannel,
236
+ data: data
237
+ })];
238
+ case 3:
239
+ _a.sent();
240
+ response.success(r.r);
241
+ return [3 /*break*/, 5];
242
+ case 4:
243
+ err_3 = _a.sent();
244
+ if (err_3.isForbiddenError)
245
+ response.forbidden();
246
+ else
247
+ response.error(err_3);
248
+ return [3 /*break*/, 5];
249
+ case 5: return [2 /*return*/];
167
250
  }
168
251
  });
169
252
  });
@@ -205,7 +288,7 @@ var DataApi = /** @class */ (function () {
205
288
  };
206
289
  DataApi.prototype.doOnId = function (response, id, what) {
207
290
  return tslib_1.__awaiter(this, void 0, void 0, function () {
208
- var err_3;
291
+ var err_4;
209
292
  var _this = this;
210
293
  return tslib_1.__generator(this, function (_a) {
211
294
  switch (_a.label) {
@@ -237,8 +320,8 @@ var DataApi = /** @class */ (function () {
237
320
  _a.sent();
238
321
  return [3 /*break*/, 3];
239
322
  case 2:
240
- err_3 = _a.sent();
241
- response.error(err_3);
323
+ err_4 = _a.sent();
324
+ response.error(err_4);
242
325
  return [3 /*break*/, 3];
243
326
  case 3: return [2 /*return*/];
244
327
  }
@@ -263,10 +346,10 @@ var DataApi = /** @class */ (function () {
263
346
  response.forbidden();
264
347
  return [2 /*return*/];
265
348
  }
266
- return [4 /*yield*/, this.repository.getEntityRef(row).save()];
349
+ return [4 /*yield*/, ref.save()];
267
350
  case 2:
268
351
  _a.sent();
269
- response.success(this.repository.getEntityRef(row).toApiJson());
352
+ response.success(ref.toApiJson());
270
353
  return [2 /*return*/];
271
354
  }
272
355
  });
@@ -308,29 +391,87 @@ var DataApi = /** @class */ (function () {
308
391
  };
309
392
  DataApi.prototype.post = function (response, body) {
310
393
  return tslib_1.__awaiter(this, void 0, void 0, function () {
311
- var newr, err_4;
312
- return tslib_1.__generator(this, function (_a) {
313
- switch (_a.label) {
394
+ var insert_1, result_1, _a, _b, err_5;
395
+ var _this = this;
396
+ return tslib_1.__generator(this, function (_c) {
397
+ switch (_c.label) {
314
398
  case 0:
315
- _a.trys.push([0, 3, , 4]);
316
- newr = this.repository.create();
317
- return [4 /*yield*/, this.repository.getEntityRef(newr)._updateEntityBasedOnApi(body)];
399
+ _c.trys.push([0, 5, , 6]);
400
+ insert_1 = function (what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
401
+ var newr;
402
+ return tslib_1.__generator(this, function (_a) {
403
+ switch (_a.label) {
404
+ case 0:
405
+ newr = this.repository.create();
406
+ return [4 /*yield*/, this.repository.getEntityRef(newr)._updateEntityBasedOnApi(what)];
407
+ case 1:
408
+ _a.sent();
409
+ if (!this.repository.getEntityRef(newr).apiInsertAllowed) {
410
+ throw new server_action_1.ForbiddenError();
411
+ }
412
+ return [4 /*yield*/, this.repository.getEntityRef(newr).save()];
413
+ case 2:
414
+ _a.sent();
415
+ return [2 /*return*/, this.repository.getEntityRef(newr).toApiJson()];
416
+ }
417
+ });
418
+ }); };
419
+ if (!Array.isArray(body)) return [3 /*break*/, 2];
420
+ result_1 = [];
421
+ return [4 /*yield*/, context_1.doTransaction(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
422
+ var body_1, body_1_1, item, _a, _b, e_1_1;
423
+ var e_1, _c;
424
+ return tslib_1.__generator(this, function (_d) {
425
+ switch (_d.label) {
426
+ case 0:
427
+ _d.trys.push([0, 5, 6, 7]);
428
+ body_1 = tslib_1.__values(body), body_1_1 = body_1.next();
429
+ _d.label = 1;
430
+ case 1:
431
+ if (!!body_1_1.done) return [3 /*break*/, 4];
432
+ item = body_1_1.value;
433
+ _b = (_a = result_1).push;
434
+ return [4 /*yield*/, insert_1(item)];
435
+ case 2:
436
+ _b.apply(_a, [_d.sent()]);
437
+ _d.label = 3;
438
+ case 3:
439
+ body_1_1 = body_1.next();
440
+ return [3 /*break*/, 1];
441
+ case 4: return [3 /*break*/, 7];
442
+ case 5:
443
+ e_1_1 = _d.sent();
444
+ e_1 = { error: e_1_1 };
445
+ return [3 /*break*/, 7];
446
+ case 6:
447
+ try {
448
+ if (body_1_1 && !body_1_1.done && (_c = body_1.return)) _c.call(body_1);
449
+ }
450
+ finally { if (e_1) throw e_1.error; }
451
+ return [7 /*endfinally*/];
452
+ case 7: return [2 /*return*/];
453
+ }
454
+ });
455
+ }); })];
318
456
  case 1:
319
- _a.sent();
320
- if (!this.repository.getEntityRef(newr).apiInsertAllowed) {
321
- response.forbidden();
322
- return [2 /*return*/];
323
- }
324
- return [4 /*yield*/, this.repository.getEntityRef(newr).save()];
325
- case 2:
326
- _a.sent();
327
- response.created(this.repository.getEntityRef(newr).toApiJson());
457
+ _c.sent();
458
+ response.created(result_1);
328
459
  return [3 /*break*/, 4];
460
+ case 2:
461
+ _b = (_a = response).created;
462
+ return [4 /*yield*/, insert_1(body)];
329
463
  case 3:
330
- err_4 = _a.sent();
331
- response.error(err_4);
332
- return [3 /*break*/, 4];
333
- case 4: return [2 /*return*/];
464
+ _b.apply(_a, [_c.sent()]);
465
+ _c.label = 4;
466
+ case 4: return [3 /*break*/, 6];
467
+ case 5:
468
+ err_5 = _c.sent();
469
+ if (err_5.isForbiddenError)
470
+ response.forbidden();
471
+ else
472
+ response.error(err_5);
473
+ return [3 /*break*/, 6];
474
+ case 6: return [2 /*return*/];
334
475
  }
335
476
  });
336
477
  });
@@ -366,3 +507,7 @@ function serializeError(data) {
366
507
  return data;
367
508
  }
368
509
  exports.serializeError = serializeError;
510
+ function getLiveQueryChannel(queryId, userId) {
511
+ return "users:" + userId + ":queries:" + queryId;
512
+ }
513
+ exports.getLiveQueryChannel = getLiveQueryChannel;
@@ -4,7 +4,11 @@ import { EntityMetadata, OmitEB } from './remult3';
4
4
  export interface DataProvider {
5
5
  getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
6
6
  transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
7
- supportsCustomFilter?: boolean;
7
+ supportsRawFilter?: boolean;
8
+ ensureSchema?(entities: EntityMetadata[]): Promise<void>;
9
+ }
10
+ export interface Storage {
11
+ ensureSchema(): Promise<void>;
8
12
  }
9
13
  export interface EntityDataProvider {
10
14
  count(where: Filter): Promise<number>;
@@ -4,7 +4,7 @@ import { EntityMetadata, EntityFilter } from '../remult3';
4
4
  export declare class ArrayEntityDataProvider implements EntityDataProvider {
5
5
  private entity;
6
6
  private rows?;
7
- static customFilter(filter: CustomArrayFilter): EntityFilter<any>;
7
+ static rawFilter(filter: CustomArrayFilter): EntityFilter<any>;
8
8
  constructor(entity: EntityMetadata, rows?: any[]);
9
9
  private verifyThatRowHasAllNotNullColumns;
10
10
  count(where?: Filter): Promise<number>;
@@ -27,7 +27,7 @@ var ArrayEntityDataProvider = /** @class */ (function () {
27
27
  }
28
28
  }
29
29
  }
30
- ArrayEntityDataProvider.customFilter = function (filter) {
30
+ ArrayEntityDataProvider.rawFilter = function (filter) {
31
31
  var _a;
32
32
  return _a = {},
33
33
  _a[filter_interfaces_1.customDatabaseFilterToken] = {
@@ -102,22 +102,7 @@ var ArrayEntityDataProvider = /** @class */ (function () {
102
102
  }
103
103
  if (options.orderBy) {
104
104
  rows = rows.sort(function (a, b) {
105
- var r = 0;
106
- for (var i = 0; i < options.orderBy.Segments.length; i++) {
107
- var seg = options.orderBy.Segments[i];
108
- var left = a[seg.field.key];
109
- var right = b[seg.field.key];
110
- if (left > right)
111
- r = 1;
112
- else if (left < right)
113
- r = -1;
114
- if (r != 0) {
115
- if (seg.isDescending)
116
- r *= -1;
117
- return r;
118
- }
119
- }
120
- return r;
105
+ return options.orderBy.compare(a, b);
121
106
  });
122
107
  }
123
108
  rows = pageArray(rows, options);
@@ -6,9 +6,9 @@ import { ApiClient } from '../context';
6
6
  export declare class RestDataProvider implements DataProvider {
7
7
  private apiProvider;
8
8
  constructor(apiProvider: () => ApiClient);
9
- getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
9
+ getEntityDataProvider(entity: EntityMetadata): RestEntityDataProvider;
10
10
  transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
11
- supportsCustomFilter: boolean;
11
+ supportsRawFilter: boolean;
12
12
  }
13
13
  export declare class RestEntityDataProvider implements EntityDataProvider {
14
14
  private url;
@@ -18,7 +18,7 @@ export declare class RestEntityDataProvider implements EntityDataProvider {
18
18
  translateFromJson(row: any): {};
19
19
  translateToJson(row: any): {};
20
20
  count(where: Filter): Promise<number>;
21
- find(options: EntityDataProviderFindOptions): Promise<Array<any>>;
21
+ find(options?: EntityDataProviderFindOptions): Promise<Array<any>>;
22
22
  update(id: any, data: any): Promise<any>;
23
23
  delete(id: any): Promise<void>;
24
24
  insert(data: any): Promise<any>;
@@ -36,3 +36,4 @@ export declare class RestDataProviderHttpProviderUsingFetch implements RestDataP
36
36
  }): Promise<any>;
37
37
  }
38
38
  export declare function addFilterToUrlAndReturnTrueIfSuccessful(filter: any, url: UrlBuilder): boolean;
39
+ export declare const liveQueryAction = "liveQuery-";