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,365 +1,599 @@
1
- import 'reflect-metadata';
2
- import { Remult, allEntities, classHelpers, ClassHelper, MethodHelper, setControllerSettings } from './context';
3
- import { SqlDatabase } from './data-providers/sql-database';
4
- import { getEntityRef, decorateColumnSettings, getEntitySettings, getControllerRef } from './remult3';
5
- export class Action {
6
- constructor(actionUrl, queue, allowed) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classBackendMethodsArray = exports.prepareReceivedArgs = exports.prepareArgsToSend = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.serverActionField = exports.actionInfo = exports.myServerAction = exports.Action = void 0;
4
+ var tslib_1 = require("tslib");
5
+ require("reflect-metadata");
6
+ var context_1 = require("./context");
7
+ var sql_database_1 = require("./data-providers/sql-database");
8
+ var remult3_1 = require("./remult3");
9
+ var Action = /** @class */ (function () {
10
+ function Action(actionUrl, queue, allowed) {
7
11
  this.actionUrl = actionUrl;
8
12
  this.queue = queue;
9
13
  this.allowed = allowed;
10
14
  }
11
- async run(pIn) {
12
- let r = await Action.provider.post(Remult.apiBaseUrl + '/' + this.actionUrl, pIn);
13
- let p = r;
14
- if (p && p.queuedJobId) {
15
- let progress = actionInfo.startBusyWithProgress();
16
- try {
17
- let runningJob;
18
- await actionInfo.runActionWithoutBlockingUI(async () => {
19
- while (!runningJob || !runningJob.done) {
20
- if (runningJob)
21
- await new Promise(res => setTimeout(() => {
22
- res(undefined);
23
- }, 200));
24
- runningJob = await Action.provider.post(Remult.apiBaseUrl + '/' + Action.apiUrlForJobStatus, { queuedJobId: r.queuedJobId });
25
- if (runningJob.progress) {
26
- progress.progress(runningJob.progress);
27
- }
28
- }
29
- });
30
- if (runningJob.error)
31
- throw runningJob.error;
32
- progress.progress(1);
33
- return runningJob.result;
34
- }
35
- finally {
36
- progress.close();
37
- }
38
- }
39
- else
40
- return r;
41
- }
42
- __register(reg) {
43
- reg(this.actionUrl, this.queue, this.allowed, async (d, req, res) => {
44
- try {
45
- var r = await this.execute(d, req, res);
46
- res.success(r);
47
- }
48
- catch (err) {
49
- if (err instanceof ForbiddenError)
50
- res.forbidden();
51
- else
52
- res.error(err);
53
- }
15
+ Action.prototype.run = function (pIn) {
16
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
17
+ var r, p, progress_1, runningJob_1;
18
+ var _this = this;
19
+ return tslib_1.__generator(this, function (_a) {
20
+ switch (_a.label) {
21
+ case 0: return [4 /*yield*/, Action.provider.post(context_1.Remult.apiBaseUrl + '/' + this.actionUrl, pIn)];
22
+ case 1:
23
+ r = _a.sent();
24
+ p = r;
25
+ if (!(p && p.queuedJobId)) return [3 /*break*/, 6];
26
+ progress_1 = exports.actionInfo.startBusyWithProgress();
27
+ _a.label = 2;
28
+ case 2:
29
+ _a.trys.push([2, , 4, 5]);
30
+ return [4 /*yield*/, exports.actionInfo.runActionWithoutBlockingUI(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
31
+ return tslib_1.__generator(this, function (_a) {
32
+ switch (_a.label) {
33
+ case 0:
34
+ if (!(!runningJob_1 || !runningJob_1.done)) return [3 /*break*/, 4];
35
+ if (!runningJob_1) return [3 /*break*/, 2];
36
+ return [4 /*yield*/, new Promise(function (res) { return setTimeout(function () {
37
+ res(undefined);
38
+ }, 200); })];
39
+ case 1:
40
+ _a.sent();
41
+ _a.label = 2;
42
+ case 2: return [4 /*yield*/, Action.provider.post(context_1.Remult.apiBaseUrl + '/' + Action.apiUrlForJobStatus, { queuedJobId: r.queuedJobId })];
43
+ case 3:
44
+ runningJob_1 = _a.sent();
45
+ if (runningJob_1.progress) {
46
+ progress_1.progress(runningJob_1.progress);
47
+ }
48
+ return [3 /*break*/, 0];
49
+ case 4: return [2 /*return*/];
50
+ }
51
+ });
52
+ }); })];
53
+ case 3:
54
+ _a.sent();
55
+ if (runningJob_1.error)
56
+ throw runningJob_1.error;
57
+ progress_1.progress(1);
58
+ return [2 /*return*/, runningJob_1.result];
59
+ case 4:
60
+ progress_1.close();
61
+ return [7 /*endfinally*/];
62
+ case 5: return [3 /*break*/, 7];
63
+ case 6: return [2 /*return*/, r];
64
+ case 7: return [2 /*return*/];
65
+ }
66
+ });
54
67
  });
68
+ };
69
+ Action.prototype.__register = function (reg) {
70
+ var _this = this;
71
+ reg(this.actionUrl, this.queue, this.allowed, function (d, req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
72
+ var r, err_1;
73
+ return tslib_1.__generator(this, function (_a) {
74
+ switch (_a.label) {
75
+ case 0:
76
+ _a.trys.push([0, 2, , 3]);
77
+ return [4 /*yield*/, this.execute(d, req, res)];
78
+ case 1:
79
+ r = _a.sent();
80
+ res.success(r);
81
+ return [3 /*break*/, 3];
82
+ case 2:
83
+ err_1 = _a.sent();
84
+ if (err_1 instanceof ForbiddenError)
85
+ res.forbidden();
86
+ else
87
+ res.error(err_1);
88
+ return [3 /*break*/, 3];
89
+ case 3: return [2 /*return*/];
90
+ }
91
+ });
92
+ }); });
93
+ };
94
+ Action.apiUrlForJobStatus = 'jobStatusInQueue';
95
+ return Action;
96
+ }());
97
+ exports.Action = Action;
98
+ var ForbiddenError = /** @class */ (function (_super) {
99
+ tslib_1.__extends(ForbiddenError, _super);
100
+ function ForbiddenError() {
101
+ return _super.call(this, "Forbidden") || this;
55
102
  }
56
- }
57
- Action.apiUrlForJobStatus = 'jobStatusInQueue';
58
- class ForbiddenError extends Error {
59
- constructor() {
60
- super("Forbidden");
61
- }
62
- }
63
- export class myServerAction extends Action {
64
- constructor(name, types, options, originalMethod) {
65
- super(name, options.queue, options.allowed);
66
- this.types = types;
67
- this.options = options;
68
- this.originalMethod = originalMethod;
103
+ return ForbiddenError;
104
+ }(Error));
105
+ var myServerAction = /** @class */ (function (_super) {
106
+ tslib_1.__extends(myServerAction, _super);
107
+ function myServerAction(name, types, options, originalMethod) {
108
+ var _this = _super.call(this, name, options.queue, options.allowed) || this;
109
+ _this.types = types;
110
+ _this.options = options;
111
+ _this.originalMethod = originalMethod;
112
+ return _this;
69
113
  }
70
- async execute(info, remult, res) {
71
- let result = { data: {} };
72
- let ds = remult._dataSource;
73
- await ds.transaction(async (ds) => {
74
- remult.setDataProvider(ds);
75
- if (!remult.isAllowedForInstance(undefined, this.options.allowed))
76
- throw new ForbiddenError();
77
- info.args = await prepareReceivedArgs(this.types, info.args, remult, ds, res);
78
- try {
79
- result.data = await this.originalMethod(info.args);
80
- }
81
- catch (err) {
82
- throw err;
83
- }
114
+ myServerAction.prototype.execute = function (info, remult, res) {
115
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
116
+ var result, ds;
117
+ var _this = this;
118
+ return tslib_1.__generator(this, function (_a) {
119
+ switch (_a.label) {
120
+ case 0:
121
+ result = { data: {} };
122
+ ds = remult._dataSource;
123
+ return [4 /*yield*/, ds.transaction(function (ds) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
124
+ var _a, _b, err_2;
125
+ return tslib_1.__generator(this, function (_c) {
126
+ switch (_c.label) {
127
+ case 0:
128
+ remult.setDataProvider(ds);
129
+ if (!remult.isAllowedForInstance(undefined, this.options.allowed))
130
+ throw new ForbiddenError();
131
+ _a = info;
132
+ return [4 /*yield*/, prepareReceivedArgs(this.types, info.args, remult, ds, res)];
133
+ case 1:
134
+ _a.args = _c.sent();
135
+ _c.label = 2;
136
+ case 2:
137
+ _c.trys.push([2, 4, , 5]);
138
+ _b = result;
139
+ return [4 /*yield*/, this.originalMethod(info.args)];
140
+ case 3:
141
+ _b.data = _c.sent();
142
+ return [3 /*break*/, 5];
143
+ case 4:
144
+ err_2 = _c.sent();
145
+ throw err_2;
146
+ case 5: return [2 /*return*/];
147
+ }
148
+ });
149
+ }); })];
150
+ case 1:
151
+ _a.sent();
152
+ return [2 /*return*/, result];
153
+ }
154
+ });
84
155
  });
85
- return result;
86
- }
87
- }
88
- export const actionInfo = {
156
+ };
157
+ return myServerAction;
158
+ }(Action));
159
+ exports.myServerAction = myServerAction;
160
+ exports.actionInfo = {
89
161
  allActions: [],
90
162
  runningOnServer: false,
91
- runActionWithoutBlockingUI: (what) => { return what(); },
92
- startBusyWithProgress: () => ({
93
- progress: (percent) => { },
94
- close: () => { }
95
- })
163
+ runActionWithoutBlockingUI: function (what) { return what(); },
164
+ startBusyWithProgress: function () { return ({
165
+ progress: function (percent) { },
166
+ close: function () { }
167
+ }); }
96
168
  };
97
- export const serverActionField = Symbol('serverActionField');
98
- const methodHelpers = new Map();
99
- const classOptions = new Map();
100
- export function Controller(key) {
169
+ exports.serverActionField = Symbol('serverActionField');
170
+ var methodHelpers = new Map();
171
+ var classOptions = new Map();
172
+ function Controller(key) {
101
173
  return function (target) {
102
- let r = target;
103
- classOptions.set(r, { key });
104
- setControllerSettings(target, { key });
174
+ var r = target;
175
+ classOptions.set(r, { key: key });
176
+ context_1.setControllerSettings(target, { key: key });
105
177
  return target;
106
178
  };
107
179
  }
180
+ exports.Controller = Controller;
108
181
  /** Indicates that the decorated methods runs on the backend. See: [Backend Methods](https://remult.dev/docs/backendMethods.html) */
109
- export function BackendMethod(options) {
110
- return (target, key, descriptor) => {
182
+ function BackendMethod(options) {
183
+ return function (target, key, descriptor) {
111
184
  if (target.prototype !== undefined) {
112
185
  var originalMethod = descriptor.value;
113
186
  var types = Reflect.getMetadata("design:paramtypes", target, key);
114
187
  // if types are undefined - you've forgot to set: "emitDecoratorMetadata":true
115
- let serverAction = new myServerAction(key, types, options, args => originalMethod.apply(undefined, args));
116
- descriptor.value = async function (...args) {
117
- if (!actionInfo.runningOnServer) {
118
- args = prepareArgsToSend(types, args);
119
- if (options.blockUser === false) {
120
- return await actionInfo.runActionWithoutBlockingUI(async () => (await serverAction.run({ args })).data);
121
- }
122
- else
123
- return (await serverAction.run({ args })).data;
188
+ var serverAction_1 = new myServerAction(key, types, options, function (args) { return originalMethod.apply(undefined, args); });
189
+ descriptor.value = function () {
190
+ var args = [];
191
+ for (var _i = 0; _i < arguments.length; _i++) {
192
+ args[_i] = arguments[_i];
124
193
  }
125
- else
126
- return (await originalMethod.apply(undefined, args));
194
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
195
+ var _this = this;
196
+ return tslib_1.__generator(this, function (_a) {
197
+ switch (_a.label) {
198
+ case 0:
199
+ if (!!exports.actionInfo.runningOnServer) return [3 /*break*/, 5];
200
+ args = prepareArgsToSend(types, args);
201
+ if (!(options.blockUser === false)) return [3 /*break*/, 2];
202
+ return [4 /*yield*/, exports.actionInfo.runActionWithoutBlockingUI(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
203
+ switch (_a.label) {
204
+ case 0: return [4 /*yield*/, serverAction_1.run({ args: args })];
205
+ case 1: return [2 /*return*/, (_a.sent()).data];
206
+ }
207
+ }); }); })];
208
+ case 1: return [2 /*return*/, _a.sent()];
209
+ case 2: return [4 /*yield*/, serverAction_1.run({ args: args })];
210
+ case 3: return [2 /*return*/, (_a.sent()).data];
211
+ case 4: return [3 /*break*/, 7];
212
+ case 5: return [4 /*yield*/, originalMethod.apply(undefined, args)];
213
+ case 6: return [2 /*return*/, (_a.sent())];
214
+ case 7: return [2 /*return*/];
215
+ }
216
+ });
217
+ });
127
218
  };
128
219
  registerAction(target, descriptor);
129
- descriptor.value[serverActionField] = serverAction;
220
+ descriptor.value[exports.serverActionField] = serverAction_1;
130
221
  return descriptor;
131
222
  }
132
223
  var types = Reflect.getMetadata("design:paramtypes", target, key);
133
- let x = classHelpers.get(target.constructor);
224
+ var x = context_1.classHelpers.get(target.constructor);
134
225
  if (!x) {
135
- x = new ClassHelper();
136
- classHelpers.set(target.constructor, x);
226
+ x = new context_1.ClassHelper();
227
+ context_1.classHelpers.set(target.constructor, x);
137
228
  }
138
- let mh = new MethodHelper();
229
+ var mh = new context_1.MethodHelper();
139
230
  methodHelpers.set(descriptor, mh);
140
231
  x.methods.push(mh);
141
232
  var originalMethod = descriptor.value;
142
- let serverAction = {
143
- __register(reg) {
144
- let c = new Remult();
145
- for (const constructor of mh.classes.keys()) {
146
- let controllerOptions = mh.classes.get(constructor);
233
+ var serverAction = {
234
+ __register: function (reg) {
235
+ var e_1, _a;
236
+ var _this = this;
237
+ var c = new context_1.Remult();
238
+ var _loop_1 = function (constructor) {
239
+ var controllerOptions = mh.classes.get(constructor);
147
240
  if (!controllerOptions.key) {
148
241
  controllerOptions.key = c.repo(constructor).metadata.key;
149
242
  }
150
- reg(controllerOptions.key + '/' + key, options ? options.queue : false, options.allowed, async (d, req, res) => {
151
- d.args = d.args.map(x => isCustomUndefined(x) ? undefined : x);
152
- let allowed = options.allowed;
153
- try {
154
- let remult = req;
155
- let ds = remult._dataSource;
156
- let r;
157
- await ds.transaction(async (ds) => {
158
- remult.setDataProvider(ds);
159
- d.args = await prepareReceivedArgs(types, d.args, remult, ds, res);
160
- if (allEntities.includes(constructor)) {
161
- let repo = remult.repo(constructor);
162
- let y;
163
- if (d.rowInfo.isNewRow) {
164
- y = repo.create();
165
- let rowHelper = repo.getEntityRef(y);
166
- await rowHelper._updateEntityBasedOnApi(d.rowInfo.data);
167
- }
168
- else {
169
- let rows = await repo.find({
170
- where: {
171
- ...repo.metadata.idMetadata.getIdFilter(d.rowInfo.id),
172
- $and: [repo.metadata.options.apiPrefilter]
173
- }
174
- });
175
- if (rows.length != 1)
176
- throw new Error("not found or too many matches");
177
- y = rows[0];
178
- await repo.getEntityRef(y)._updateEntityBasedOnApi(d.rowInfo.data);
179
- }
180
- if (!remult.isAllowedForInstance(y, allowed))
181
- throw new ForbiddenError();
182
- let defs = getEntityRef(y);
183
- await defs.__validateEntity();
184
- try {
185
- r = {
186
- result: await originalMethod.apply(y, d.args),
187
- rowInfo: {
188
- data: await defs.toApiJson(),
189
- isNewRow: defs.isNew(),
190
- wasChanged: defs.wasChanged(),
191
- id: defs.getOriginalId()
192
- }
193
- };
194
- }
195
- catch (err) {
196
- throw defs.catchSaveErrors(err);
197
- }
198
- }
199
- else {
200
- let y = new constructor(remult, ds);
201
- let controllerRef = getControllerRef(y, remult);
202
- await controllerRef._updateEntityBasedOnApi(d.fields);
203
- if (!remult.isAllowedForInstance(y, allowed))
204
- throw new ForbiddenError();
205
- await controllerRef.__validateEntity();
206
- try {
207
- r = {
208
- result: await originalMethod.apply(y, d.args),
209
- fields: await controllerRef.toApiJson()
210
- };
211
- }
212
- catch (err) {
213
- throw controllerRef.catchSaveErrors(err);
214
- }
215
- }
216
- });
217
- res.success(r);
218
- }
219
- catch (err) {
220
- res.error(err);
221
- }
222
- });
223
- }
224
- }
225
- };
226
- descriptor.value = async function (...args) {
227
- if (!actionInfo.runningOnServer) {
228
- let self = this;
229
- args = prepareArgsToSend(types, args);
230
- if (allEntities.includes(target.constructor)) {
231
- let defs = getEntityRef(self);
232
- await defs.__validateEntity();
233
- let classOptions = mh.classes.get(self.constructor);
234
- if (!classOptions.key) {
235
- classOptions.key = defs.repository.metadata.key + "_methods";
236
- }
237
- try {
238
- let r = await (new class extends Action {
239
- async execute(a, b) {
240
- throw ('should get here');
243
+ reg(controllerOptions.key + '/' + key, options ? options.queue : false, options.allowed, function (d, req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
244
+ var allowed, remult_1, ds, r_1, err_3;
245
+ var _this = this;
246
+ return tslib_1.__generator(this, function (_a) {
247
+ switch (_a.label) {
248
+ case 0:
249
+ d.args = d.args.map(function (x) { return isCustomUndefined(x) ? undefined : x; });
250
+ allowed = options.allowed;
251
+ _a.label = 1;
252
+ case 1:
253
+ _a.trys.push([1, 3, , 4]);
254
+ remult_1 = req;
255
+ ds = remult_1._dataSource;
256
+ return [4 /*yield*/, ds.transaction(function (ds) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
257
+ var _a, repo, y, rowHelper, rows, defs, err_4, y, controllerRef, err_5;
258
+ var _b, _c, _d;
259
+ return tslib_1.__generator(this, function (_e) {
260
+ switch (_e.label) {
261
+ case 0:
262
+ remult_1.setDataProvider(ds);
263
+ _a = d;
264
+ return [4 /*yield*/, prepareReceivedArgs(types, d.args, remult_1, ds, res)];
265
+ case 1:
266
+ _a.args = _e.sent();
267
+ if (!context_1.allEntities.includes(constructor)) return [3 /*break*/, 13];
268
+ repo = remult_1.repo(constructor);
269
+ y = void 0;
270
+ if (!d.rowInfo.isNewRow) return [3 /*break*/, 3];
271
+ y = repo.create();
272
+ rowHelper = repo.getEntityRef(y);
273
+ return [4 /*yield*/, rowHelper._updateEntityBasedOnApi(d.rowInfo.data)];
274
+ case 2:
275
+ _e.sent();
276
+ return [3 /*break*/, 6];
277
+ case 3: return [4 /*yield*/, repo.find({
278
+ where: tslib_1.__assign(tslib_1.__assign({}, repo.metadata.idMetadata.getIdFilter(d.rowInfo.id)), { $and: [repo.metadata.options.apiPrefilter] })
279
+ })];
280
+ case 4:
281
+ rows = _e.sent();
282
+ if (rows.length != 1)
283
+ throw new Error("not found or too many matches");
284
+ y = rows[0];
285
+ return [4 /*yield*/, repo.getEntityRef(y)._updateEntityBasedOnApi(d.rowInfo.data)];
286
+ case 5:
287
+ _e.sent();
288
+ _e.label = 6;
289
+ case 6:
290
+ if (!remult_1.isAllowedForInstance(y, allowed))
291
+ throw new ForbiddenError();
292
+ defs = remult3_1.getEntityRef(y);
293
+ return [4 /*yield*/, defs.__validateEntity()];
294
+ case 7:
295
+ _e.sent();
296
+ _e.label = 8;
297
+ case 8:
298
+ _e.trys.push([8, 11, , 12]);
299
+ _b = {};
300
+ return [4 /*yield*/, originalMethod.apply(y, d.args)];
301
+ case 9:
302
+ _b.result = _e.sent();
303
+ _c = {};
304
+ return [4 /*yield*/, defs.toApiJson()];
305
+ case 10:
306
+ r_1 = (_b.rowInfo = (_c.data = _e.sent(),
307
+ _c.isNewRow = defs.isNew(),
308
+ _c.wasChanged = defs.wasChanged(),
309
+ _c.id = defs.getOriginalId(),
310
+ _c),
311
+ _b);
312
+ return [3 /*break*/, 12];
313
+ case 11:
314
+ err_4 = _e.sent();
315
+ throw defs.catchSaveErrors(err_4);
316
+ case 12: return [3 /*break*/, 20];
317
+ case 13:
318
+ y = new constructor(remult_1, ds);
319
+ controllerRef = remult3_1.getControllerRef(y, remult_1);
320
+ return [4 /*yield*/, controllerRef._updateEntityBasedOnApi(d.fields)];
321
+ case 14:
322
+ _e.sent();
323
+ if (!remult_1.isAllowedForInstance(y, allowed))
324
+ throw new ForbiddenError();
325
+ return [4 /*yield*/, controllerRef.__validateEntity()];
326
+ case 15:
327
+ _e.sent();
328
+ _e.label = 16;
329
+ case 16:
330
+ _e.trys.push([16, 19, , 20]);
331
+ _d = {};
332
+ return [4 /*yield*/, originalMethod.apply(y, d.args)];
333
+ case 17:
334
+ _d.result = _e.sent();
335
+ return [4 /*yield*/, controllerRef.toApiJson()];
336
+ case 18:
337
+ r_1 = (_d.fields = _e.sent(),
338
+ _d);
339
+ return [3 /*break*/, 20];
340
+ case 19:
341
+ err_5 = _e.sent();
342
+ throw controllerRef.catchSaveErrors(err_5);
343
+ case 20: return [2 /*return*/];
344
+ }
345
+ });
346
+ }); })];
347
+ case 2:
348
+ _a.sent();
349
+ res.success(r_1);
350
+ return [3 /*break*/, 4];
351
+ case 3:
352
+ err_3 = _a.sent();
353
+ res.error(err_3);
354
+ return [3 /*break*/, 4];
355
+ case 4: return [2 /*return*/];
241
356
  }
242
- }(classOptions.key + "/" + key, options ? options.queue : false, options.allowed).run({
243
- args,
244
- rowInfo: {
245
- data: await defs.toApiJson(),
246
- isNewRow: defs.isNew(),
247
- wasChanged: defs.wasChanged(),
248
- id: defs.getOriginalId()
249
- }
250
- }));
251
- await defs._updateEntityBasedOnApi(r.rowInfo.data);
252
- return r.result;
253
- }
254
- catch (err) {
255
- defs.catchSaveErrors(err);
256
- throw err;
357
+ });
358
+ }); });
359
+ };
360
+ try {
361
+ for (var _b = tslib_1.__values(mh.classes.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
362
+ var constructor = _c.value;
363
+ _loop_1(constructor);
257
364
  }
258
365
  }
259
- else {
260
- let defs = getControllerRef(self, undefined);
366
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
367
+ finally {
261
368
  try {
262
- await defs.__validateEntity();
263
- let r = await (new class extends Action {
264
- async execute(a, b) {
265
- throw ('should get here');
266
- }
267
- }(mh.classes.get(this.constructor).key + "/" + key, options ? options.queue : false, options.allowed).run({
268
- args,
269
- fields: await defs.toApiJson()
270
- }));
271
- await defs._updateEntityBasedOnApi(r.fields);
272
- return r.result;
273
- }
274
- catch (e) {
275
- throw defs.catchSaveErrors(e);
369
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
276
370
  }
371
+ finally { if (e_1) throw e_1.error; }
277
372
  }
278
373
  }
279
- else
280
- return (await originalMethod.apply(this, args));
374
+ };
375
+ descriptor.value = function () {
376
+ var args = [];
377
+ for (var _i = 0; _i < arguments.length; _i++) {
378
+ args[_i] = arguments[_i];
379
+ }
380
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
381
+ var self_1, defs, classOptions_1, r, _a, _b, err_6, defs, r, _c, _d, e_2;
382
+ var _e, _f, _g;
383
+ return tslib_1.__generator(this, function (_h) {
384
+ switch (_h.label) {
385
+ case 0:
386
+ if (!!exports.actionInfo.runningOnServer) return [3 /*break*/, 16];
387
+ self_1 = this;
388
+ args = prepareArgsToSend(types, args);
389
+ if (!context_1.allEntities.includes(target.constructor)) return [3 /*break*/, 8];
390
+ defs = remult3_1.getEntityRef(self_1);
391
+ return [4 /*yield*/, defs.__validateEntity()];
392
+ case 1:
393
+ _h.sent();
394
+ classOptions_1 = mh.classes.get(self_1.constructor);
395
+ if (!classOptions_1.key) {
396
+ classOptions_1.key = defs.repository.metadata.key + "_methods";
397
+ }
398
+ _h.label = 2;
399
+ case 2:
400
+ _h.trys.push([2, 6, , 7]);
401
+ _b = (_a = new /** @class */ (function (_super) {
402
+ tslib_1.__extends(class_1, _super);
403
+ function class_1() {
404
+ return _super !== null && _super.apply(this, arguments) || this;
405
+ }
406
+ class_1.prototype.execute = function (a, b) {
407
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
408
+ return tslib_1.__generator(this, function (_a) {
409
+ throw ('should get here');
410
+ });
411
+ });
412
+ };
413
+ return class_1;
414
+ }(Action))(classOptions_1.key + "/" + key, options ? options.queue : false, options.allowed)).run;
415
+ _e = {
416
+ args: args
417
+ };
418
+ _f = {};
419
+ return [4 /*yield*/, defs.toApiJson()];
420
+ case 3: return [4 /*yield*/, (_b.apply(_a, [(_e.rowInfo = (_f.data = _h.sent(),
421
+ _f.isNewRow = defs.isNew(),
422
+ _f.wasChanged = defs.wasChanged(),
423
+ _f.id = defs.getOriginalId(),
424
+ _f),
425
+ _e)]))];
426
+ case 4:
427
+ r = _h.sent();
428
+ return [4 /*yield*/, defs._updateEntityBasedOnApi(r.rowInfo.data)];
429
+ case 5:
430
+ _h.sent();
431
+ return [2 /*return*/, r.result];
432
+ case 6:
433
+ err_6 = _h.sent();
434
+ defs.catchSaveErrors(err_6);
435
+ throw err_6;
436
+ case 7: return [3 /*break*/, 15];
437
+ case 8:
438
+ defs = remult3_1.getControllerRef(self_1, undefined);
439
+ _h.label = 9;
440
+ case 9:
441
+ _h.trys.push([9, 14, , 15]);
442
+ return [4 /*yield*/, defs.__validateEntity()];
443
+ case 10:
444
+ _h.sent();
445
+ _d = (_c = new /** @class */ (function (_super) {
446
+ tslib_1.__extends(class_2, _super);
447
+ function class_2() {
448
+ return _super !== null && _super.apply(this, arguments) || this;
449
+ }
450
+ class_2.prototype.execute = function (a, b) {
451
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
452
+ return tslib_1.__generator(this, function (_a) {
453
+ throw ('should get here');
454
+ });
455
+ });
456
+ };
457
+ return class_2;
458
+ }(Action))(mh.classes.get(this.constructor).key + "/" + key, options ? options.queue : false, options.allowed)).run;
459
+ _g = {
460
+ args: args
461
+ };
462
+ return [4 /*yield*/, defs.toApiJson()];
463
+ case 11: return [4 /*yield*/, (_d.apply(_c, [(_g.fields = _h.sent(),
464
+ _g)]))];
465
+ case 12:
466
+ r = _h.sent();
467
+ return [4 /*yield*/, defs._updateEntityBasedOnApi(r.fields)];
468
+ case 13:
469
+ _h.sent();
470
+ return [2 /*return*/, r.result];
471
+ case 14:
472
+ e_2 = _h.sent();
473
+ throw defs.catchSaveErrors(e_2);
474
+ case 15: return [3 /*break*/, 18];
475
+ case 16: return [4 /*yield*/, originalMethod.apply(this, args)];
476
+ case 17: return [2 /*return*/, (_h.sent())];
477
+ case 18: return [2 /*return*/];
478
+ }
479
+ });
480
+ });
281
481
  };
282
482
  registerAction(target.constructor, descriptor);
283
- descriptor.value[serverActionField] = serverAction;
483
+ descriptor.value[exports.serverActionField] = serverAction;
284
484
  return descriptor;
285
485
  };
286
486
  }
287
- const customUndefined = {
487
+ exports.BackendMethod = BackendMethod;
488
+ var customUndefined = {
288
489
  _isUndefined: true
289
490
  };
290
491
  function registerAction(target, descriptor) {
291
- (target[classBackendMethodsArray] || (target[classBackendMethodsArray] = [])).push(descriptor.value);
292
- actionInfo.allActions.push(descriptor.value);
492
+ (target[exports.classBackendMethodsArray] || (target[exports.classBackendMethodsArray] = [])).push(descriptor.value);
493
+ exports.actionInfo.allActions.push(descriptor.value);
293
494
  }
294
495
  function isCustomUndefined(x) {
295
496
  return x && x._isUndefined;
296
497
  }
297
- export class ProgressListener {
298
- constructor(res) {
498
+ var ProgressListener = /** @class */ (function () {
499
+ function ProgressListener(res) {
299
500
  this.res = res;
300
501
  }
301
- progress(progress) {
502
+ ProgressListener.prototype.progress = function (progress) {
302
503
  this.res.progress(progress);
303
- }
304
- }
305
- export function prepareArgsToSend(types, args) {
504
+ };
505
+ return ProgressListener;
506
+ }());
507
+ exports.ProgressListener = ProgressListener;
508
+ function prepareArgsToSend(types, args) {
509
+ var e_3, _a;
306
510
  if (types) {
307
- for (let index = 0; index < types.length; index++) {
308
- const paramType = types[index];
309
- for (const type of [Remult, SqlDatabase]) {
310
- if (args[index] instanceof type)
311
- args[index] = undefined;
312
- else if (paramType == type) {
313
- args[index] = undefined;
511
+ for (var index = 0; index < types.length; index++) {
512
+ var paramType = types[index];
513
+ try {
514
+ for (var _b = (e_3 = void 0, tslib_1.__values([context_1.Remult, sql_database_1.SqlDatabase])), _c = _b.next(); !_c.done; _c = _b.next()) {
515
+ var type = _c.value;
516
+ if (args[index] instanceof type)
517
+ args[index] = undefined;
518
+ else if (paramType == type) {
519
+ args[index] = undefined;
520
+ }
314
521
  }
315
522
  }
523
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
524
+ finally {
525
+ try {
526
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
527
+ }
528
+ finally { if (e_3) throw e_3.error; }
529
+ }
316
530
  if (args[index] != undefined) {
317
- let x = { valueType: paramType };
318
- x = decorateColumnSettings(x, new Remult());
531
+ var x = { valueType: paramType };
532
+ x = remult3_1.decorateColumnSettings(x, new context_1.Remult());
319
533
  if (x.valueConverter)
320
534
  args[index] = x.valueConverter.toJson(args[index]);
321
- let eo = getEntitySettings(paramType, false);
535
+ var eo = remult3_1.getEntitySettings(paramType, false);
322
536
  if (eo != null) {
323
- let rh = getEntityRef(args[index]);
537
+ var rh = remult3_1.getEntityRef(args[index]);
324
538
  args[index] = rh.getId();
325
539
  }
326
540
  }
327
541
  }
328
542
  }
329
- return args.map(x => x !== undefined ? x : customUndefined);
543
+ return args.map(function (x) { return x !== undefined ? x : customUndefined; });
330
544
  }
331
- export async function prepareReceivedArgs(types, args, remult, ds, res) {
332
- for (let index = 0; index < args.length; index++) {
333
- const element = args[index];
334
- if (isCustomUndefined(element))
335
- args[index] = undefined;
336
- }
337
- if (types)
338
- for (let i = 0; i < types.length; i++) {
339
- if (args.length < i) {
340
- args.push(undefined);
341
- }
342
- if (types[i] == Remult || types[i] == Remult) {
343
- args[i] = remult;
344
- }
345
- else if (types[i] == SqlDatabase && ds) {
346
- args[i] = ds;
347
- }
348
- else if (types[i] == ProgressListener) {
349
- args[i] = new ProgressListener(res);
350
- }
351
- else {
352
- let x = { valueType: types[i] };
353
- x = decorateColumnSettings(x, remult);
354
- if (x.valueConverter)
355
- args[i] = x.valueConverter.fromJson(args[i]);
356
- let eo = getEntitySettings(types[i], false);
357
- if (eo != null) {
358
- if (!(args[i] === null || args[i] === undefined))
359
- args[i] = await remult.repo(types[i]).findId(args[i]);
360
- }
545
+ exports.prepareArgsToSend = prepareArgsToSend;
546
+ function prepareReceivedArgs(types, args, remult, ds, res) {
547
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
548
+ var index, element, i, x, eo, _a, _b;
549
+ return tslib_1.__generator(this, function (_c) {
550
+ switch (_c.label) {
551
+ case 0:
552
+ for (index = 0; index < args.length; index++) {
553
+ element = args[index];
554
+ if (isCustomUndefined(element))
555
+ args[index] = undefined;
556
+ }
557
+ if (!types) return [3 /*break*/, 7];
558
+ i = 0;
559
+ _c.label = 1;
560
+ case 1:
561
+ if (!(i < types.length)) return [3 /*break*/, 7];
562
+ if (args.length < i) {
563
+ args.push(undefined);
564
+ }
565
+ if (!(types[i] == context_1.Remult || types[i] == context_1.Remult)) return [3 /*break*/, 2];
566
+ args[i] = remult;
567
+ return [3 /*break*/, 6];
568
+ case 2:
569
+ if (!(types[i] == sql_database_1.SqlDatabase && ds)) return [3 /*break*/, 3];
570
+ args[i] = ds;
571
+ return [3 /*break*/, 6];
572
+ case 3:
573
+ if (!(types[i] == ProgressListener)) return [3 /*break*/, 4];
574
+ args[i] = new ProgressListener(res);
575
+ return [3 /*break*/, 6];
576
+ case 4:
577
+ x = { valueType: types[i] };
578
+ x = remult3_1.decorateColumnSettings(x, remult);
579
+ if (x.valueConverter)
580
+ args[i] = x.valueConverter.fromJson(args[i]);
581
+ eo = remult3_1.getEntitySettings(types[i], false);
582
+ if (!(eo != null)) return [3 /*break*/, 6];
583
+ if (!!(args[i] === null || args[i] === undefined)) return [3 /*break*/, 6];
584
+ _a = args;
585
+ _b = i;
586
+ return [4 /*yield*/, remult.repo(types[i]).findId(args[i])];
587
+ case 5:
588
+ _a[_b] = _c.sent();
589
+ _c.label = 6;
590
+ case 6:
591
+ i++;
592
+ return [3 /*break*/, 1];
593
+ case 7: return [2 /*return*/, args];
361
594
  }
362
- }
363
- return args;
595
+ });
596
+ });
364
597
  }
365
- export const classBackendMethodsArray = Symbol('classBackendMethodsArray');
598
+ exports.prepareReceivedArgs = prepareReceivedArgs;
599
+ exports.classBackendMethodsArray = Symbol('classBackendMethodsArray');