remult 0.14.7 → 0.14.8

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/esm/assign.d.ts +1 -0
  3. package/esm/assign.js +5 -0
  4. package/esm/classType.d.ts +3 -0
  5. package/esm/classType.js +1 -0
  6. package/esm/graphql.d.ts +5 -0
  7. package/esm/graphql.js +102 -0
  8. package/esm/index.d.ts +36 -0
  9. package/esm/index.js +30 -0
  10. package/esm/inputTypes.d.ts +9 -0
  11. package/esm/inputTypes.js +9 -0
  12. package/esm/postgres/index.d.ts +2 -0
  13. package/esm/postgres/index.js +2 -0
  14. package/esm/postgres/postgres-data-provider.d.ts +28 -0
  15. package/esm/postgres/postgres-data-provider.js +97 -0
  16. package/esm/postgres/schema-builder.d.ts +15 -0
  17. package/esm/postgres/schema-builder.js +128 -0
  18. package/esm/remult-express.d.ts +5 -0
  19. package/esm/remult-express.js +16 -0
  20. package/esm/remult-knex/index.d.ts +51 -0
  21. package/esm/remult-knex/index.js +381 -0
  22. package/esm/remult-middleware.d.ts +2 -0
  23. package/esm/remult-middleware.js +63 -0
  24. package/esm/remult-mongo.d.ts +9 -0
  25. package/esm/remult-mongo.js +220 -0
  26. package/esm/server/JsonEntityFileStorage.d.ts +7 -0
  27. package/esm/server/JsonEntityFileStorage.js +20 -0
  28. package/esm/server/expressBridge.d.ts +140 -0
  29. package/esm/server/expressBridge.js +668 -0
  30. package/esm/server/index.d.ts +4 -0
  31. package/esm/server/index.js +4 -0
  32. package/esm/server/register-actions-on-server.d.ts +3 -0
  33. package/esm/server/register-actions-on-server.js +24 -0
  34. package/esm/server/register-entities-on-server.d.ts +3 -0
  35. package/esm/server/register-entities-on-server.js +15 -0
  36. package/esm/src/__EntityValueProvider.d.ts +10 -0
  37. package/esm/src/__EntityValueProvider.js +1 -0
  38. package/esm/src/__RowsOfDataForTesting.d.ts +3 -0
  39. package/esm/src/__RowsOfDataForTesting.js +1 -0
  40. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +5 -0
  41. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +113 -0
  42. package/esm/src/backend-tests/my-test.backend-spec.d.ts +1 -0
  43. package/esm/src/backend-tests/my-test.backend-spec.js +49 -0
  44. package/esm/src/column-interfaces.d.ts +95 -0
  45. package/esm/src/column-interfaces.js +7 -0
  46. package/esm/src/column.d.ts +49 -0
  47. package/esm/src/column.js +133 -0
  48. package/esm/src/context.d.ts +124 -0
  49. package/esm/src/context.js +285 -0
  50. package/esm/src/data-api.d.ts +33 -0
  51. package/esm/src/data-api.js +204 -0
  52. package/esm/src/data-interfaces.d.ts +37 -0
  53. package/esm/src/data-interfaces.js +12 -0
  54. package/esm/src/data-providers/array-entity-data-provider.d.ts +22 -0
  55. package/esm/src/data-providers/array-entity-data-provider.js +264 -0
  56. package/esm/src/data-providers/in-memory-database.d.ts +9 -0
  57. package/esm/src/data-providers/in-memory-database.js +16 -0
  58. package/esm/src/data-providers/json-data-provider.d.ts +12 -0
  59. package/esm/src/data-providers/json-data-provider.js +52 -0
  60. package/esm/src/data-providers/rest-data-provider.d.ts +35 -0
  61. package/esm/src/data-providers/rest-data-provider.js +188 -0
  62. package/esm/src/data-providers/sql-database.d.ts +16 -0
  63. package/esm/src/data-providers/sql-database.js +261 -0
  64. package/esm/src/data-providers/web-sql-data-provider.d.ts +18 -0
  65. package/esm/src/data-providers/web-sql-data-provider.js +121 -0
  66. package/esm/src/entity.d.ts +82 -0
  67. package/esm/src/entity.js +1 -0
  68. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
  69. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +139 -0
  70. package/esm/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
  71. package/esm/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
  72. package/esm/src/filter/filter-interfaces.d.ts +85 -0
  73. package/esm/src/filter/filter-interfaces.js +467 -0
  74. package/esm/src/id-entity.d.ts +4 -0
  75. package/esm/src/id-entity.js +8 -0
  76. package/esm/src/remult3/RepositoryImplementation.d.ts +326 -0
  77. package/esm/src/remult3/RepositoryImplementation.js +1806 -0
  78. package/esm/src/remult3/index.d.ts +2 -0
  79. package/esm/src/remult3/index.js +2 -0
  80. package/esm/src/remult3/remult3.d.ts +312 -0
  81. package/esm/src/remult3/remult3.js +1 -0
  82. package/esm/src/server-action.d.ts +70 -0
  83. package/esm/src/server-action.js +365 -0
  84. package/esm/src/shared-tests/db-tests-setup.d.ts +23 -0
  85. package/esm/src/shared-tests/db-tests-setup.js +66 -0
  86. package/esm/src/shared-tests/db-tests.db-tests.d.ts +26 -0
  87. package/esm/src/shared-tests/db-tests.db-tests.js +723 -0
  88. package/esm/src/shared-tests/deleteAll.d.ts +2 -0
  89. package/esm/src/shared-tests/deleteAll.js +4 -0
  90. package/esm/src/shared-tests/entityWithValidations.d.ts +14 -0
  91. package/esm/src/shared-tests/entityWithValidations.js +53 -0
  92. package/esm/src/shared-tests/index.d.ts +4 -0
  93. package/esm/src/shared-tests/index.js +4 -0
  94. package/esm/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
  95. package/esm/src/shared-tests/test-custom-id-column.spec.js +62 -0
  96. package/esm/src/shared-tests/test-special-value.spec.d.ts +10 -0
  97. package/esm/src/shared-tests/test-special-value.spec.js +88 -0
  98. package/esm/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
  99. package/esm/src/shared-tests/test-update-with-null.spec.js +47 -0
  100. package/esm/src/sort.d.ts +15 -0
  101. package/esm/src/sort.js +82 -0
  102. package/esm/src/sql-command.d.ts +15 -0
  103. package/esm/src/sql-command.js +1 -0
  104. package/esm/src/tests/Done.d.ts +5 -0
  105. package/esm/src/tests/Done.js +11 -0
  106. package/esm/src/tests/TestDataApiResponse.d.ts +10 -0
  107. package/esm/src/tests/TestDataApiResponse.js +22 -0
  108. package/esm/src/tests/c.d.ts +8 -0
  109. package/esm/src/tests/c.js +22 -0
  110. package/esm/src/tests/createData.d.ts +7 -0
  111. package/esm/src/tests/createData.js +22 -0
  112. package/esm/src/tests/d.d.ts +6 -0
  113. package/esm/src/tests/d.js +19 -0
  114. package/esm/src/tests/dWithPrefilter.d.ts +7 -0
  115. package/esm/src/tests/dWithPrefilter.js +32 -0
  116. package/esm/src/tests/entityForCustomFilter.d.ts +16 -0
  117. package/esm/src/tests/entityForCustomFilter.js +44 -0
  118. package/esm/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
  119. package/esm/src/tests/entityWithValidationsOnColumn.js +21 -0
  120. package/esm/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
  121. package/esm/src/tests/frontend-database-tests-setup.spec.js +38 -0
  122. package/esm/src/tests/h.d.ts +6 -0
  123. package/esm/src/tests/h.js +35 -0
  124. package/esm/src/tests/remult-3-entities.d.ts +23 -0
  125. package/esm/src/tests/remult-3-entities.js +72 -0
  126. package/esm/src/tests/tasks.d.ts +6 -0
  127. package/esm/src/tests/tasks.js +24 -0
  128. package/esm/src/tests/testHelper.spec.d.ts +34 -0
  129. package/esm/src/tests/testHelper.spec.js +217 -0
  130. package/esm/src/tests/testModel/models.d.ts +16 -0
  131. package/esm/src/tests/testModel/models.js +31 -0
  132. package/esm/src/validators.d.ts +14 -0
  133. package/esm/src/validators.js +33 -0
  134. package/esm/urlBuilder.d.ts +6 -0
  135. package/esm/urlBuilder.js +19 -0
  136. package/esm/valueConverters.d.ts +12 -0
  137. package/esm/valueConverters.js +169 -0
  138. package/index.d.ts +1 -0
  139. package/index.js +1 -0
  140. package/package.json +22 -1
  141. package/postgres/index.d.ts +1 -0
  142. package/postgres/index.js +1 -0
  143. package/postgres/postgres-data-provider.d.ts +1 -13
  144. package/postgres/postgres-data-provider.js +28 -262
  145. package/postgres/schema-builder.d.ts +15 -0
  146. package/postgres/schema-builder.js +270 -0
  147. package/readme.md +68 -30
  148. package/src/data-providers/web-sql-data-provider.js +4 -3
  149. package/src/entity.d.ts +9 -2
  150. package/src/remult3/RepositoryImplementation.js +11 -3
  151. package/src/shared-tests/test-update-with-null.spec.js +38 -0
  152. package/valueConverters.js +4 -0
@@ -0,0 +1,365 @@
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) {
7
+ this.actionUrl = actionUrl;
8
+ this.queue = queue;
9
+ this.allowed = allowed;
10
+ }
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
+ }
54
+ });
55
+ }
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;
69
+ }
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
+ }
84
+ });
85
+ return result;
86
+ }
87
+ }
88
+ export const actionInfo = {
89
+ allActions: [],
90
+ runningOnServer: false,
91
+ runActionWithoutBlockingUI: (what) => { return what(); },
92
+ startBusyWithProgress: () => ({
93
+ progress: (percent) => { },
94
+ close: () => { }
95
+ })
96
+ };
97
+ export const serverActionField = Symbol('serverActionField');
98
+ const methodHelpers = new Map();
99
+ const classOptions = new Map();
100
+ export function Controller(key) {
101
+ return function (target) {
102
+ let r = target;
103
+ classOptions.set(r, { key });
104
+ setControllerSettings(target, { key });
105
+ return target;
106
+ };
107
+ }
108
+ /** 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) => {
111
+ if (target.prototype !== undefined) {
112
+ var originalMethod = descriptor.value;
113
+ var types = Reflect.getMetadata("design:paramtypes", target, key);
114
+ // 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;
124
+ }
125
+ else
126
+ return (await originalMethod.apply(undefined, args));
127
+ };
128
+ registerAction(target, descriptor);
129
+ descriptor.value[serverActionField] = serverAction;
130
+ return descriptor;
131
+ }
132
+ var types = Reflect.getMetadata("design:paramtypes", target, key);
133
+ let x = classHelpers.get(target.constructor);
134
+ if (!x) {
135
+ x = new ClassHelper();
136
+ classHelpers.set(target.constructor, x);
137
+ }
138
+ let mh = new MethodHelper();
139
+ methodHelpers.set(descriptor, mh);
140
+ x.methods.push(mh);
141
+ 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);
147
+ if (!controllerOptions.key) {
148
+ controllerOptions.key = c.repo(constructor).metadata.key;
149
+ }
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');
241
+ }
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;
257
+ }
258
+ }
259
+ else {
260
+ let defs = getControllerRef(self, undefined);
261
+ 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);
276
+ }
277
+ }
278
+ }
279
+ else
280
+ return (await originalMethod.apply(this, args));
281
+ };
282
+ registerAction(target.constructor, descriptor);
283
+ descriptor.value[serverActionField] = serverAction;
284
+ return descriptor;
285
+ };
286
+ }
287
+ const customUndefined = {
288
+ _isUndefined: true
289
+ };
290
+ function registerAction(target, descriptor) {
291
+ (target[classBackendMethodsArray] || (target[classBackendMethodsArray] = [])).push(descriptor.value);
292
+ actionInfo.allActions.push(descriptor.value);
293
+ }
294
+ function isCustomUndefined(x) {
295
+ return x && x._isUndefined;
296
+ }
297
+ export class ProgressListener {
298
+ constructor(res) {
299
+ this.res = res;
300
+ }
301
+ progress(progress) {
302
+ this.res.progress(progress);
303
+ }
304
+ }
305
+ export function prepareArgsToSend(types, args) {
306
+ 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;
314
+ }
315
+ }
316
+ if (args[index] != undefined) {
317
+ let x = { valueType: paramType };
318
+ x = decorateColumnSettings(x, new Remult());
319
+ if (x.valueConverter)
320
+ args[index] = x.valueConverter.toJson(args[index]);
321
+ let eo = getEntitySettings(paramType, false);
322
+ if (eo != null) {
323
+ let rh = getEntityRef(args[index]);
324
+ args[index] = rh.getId();
325
+ }
326
+ }
327
+ }
328
+ }
329
+ return args.map(x => x !== undefined ? x : customUndefined);
330
+ }
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
+ }
361
+ }
362
+ }
363
+ return args;
364
+ }
365
+ export const classBackendMethodsArray = Symbol('classBackendMethodsArray');
@@ -0,0 +1,23 @@
1
+ import { ClassType } from "../../classType";
2
+ import { Remult } from "../context";
3
+ import { DataProvider } from "../data-interfaces";
4
+ import { Repository } from "../remult3";
5
+ import { CategoriesForTesting } from "../tests/remult-3-entities";
6
+ import { Status } from "../tests/testModel/models";
7
+ export declare function itWithFocus(key: string, what: () => Promise<void>, focus?: boolean): void;
8
+ export declare function testAll(key: string, what: dbTestWhatSignature, focus?: boolean): void;
9
+ export declare function addDatabaseToTest(tester: dbTestMethodSignature): void;
10
+ export declare function testInMemory(key: string, what: dbTestWhatSignature, focus?: boolean): void;
11
+ export declare type dbTestWhatSignature = (db: {
12
+ db: DataProvider;
13
+ remult: Remult;
14
+ createEntity<entityType>(entity: ClassType<entityType>): Promise<Repository<entityType>>;
15
+ }) => Promise<void>;
16
+ export declare type dbTestMethodSignature = (key: string, what: dbTestWhatSignature, focus: boolean) => void;
17
+ export declare function testAllDbs<T extends CategoriesForTesting>(key: string, doTest: (helper: {
18
+ remult: Remult;
19
+ createData: (doInsert?: (insert: (id: number, name: string, description?: string, status?: Status) => Promise<void>) => Promise<void>, entity?: {
20
+ new (): CategoriesForTesting;
21
+ }) => Promise<Repository<T>>;
22
+ insertFourRows: () => Promise<Repository<T>>;
23
+ }) => Promise<any>, focus?: boolean): Promise<void>;
@@ -0,0 +1,66 @@
1
+ import { Remult } from "../context";
2
+ import { InMemoryDataProvider } from "../data-providers/in-memory-database";
3
+ import { Categories } from "../tests/remult-3-entities";
4
+ export function itWithFocus(key, what, focus = false) {
5
+ if (focus)
6
+ fit(key, what);
7
+ else
8
+ it(key, what);
9
+ }
10
+ export function testAll(key, what, focus = false) {
11
+ for (const test of databasesTesters) {
12
+ test(key, what, focus);
13
+ }
14
+ loadedTests.push(x => {
15
+ x(key, what, focus);
16
+ });
17
+ }
18
+ const databasesTesters = [];
19
+ const loadedTests = [];
20
+ export function addDatabaseToTest(tester) {
21
+ for (const test of loadedTests) {
22
+ test(tester);
23
+ }
24
+ databasesTesters.push(tester);
25
+ }
26
+ export function testInMemory(key, what, focus = false) {
27
+ itWithFocus(key + " - in memory", async () => {
28
+ let remult = new Remult();
29
+ let db = new InMemoryDataProvider();
30
+ remult.setDataProvider(db);
31
+ await what({ db, remult, createEntity: async (x) => remult.repo(x) });
32
+ }, focus);
33
+ }
34
+ databasesTesters.push(testInMemory);
35
+ export async function testAllDbs(key, doTest, focus = false) {
36
+ testAll(key, async ({ remult, createEntity }) => {
37
+ let createData = async (doInsert, entity) => {
38
+ if (!entity)
39
+ entity = Categories;
40
+ let rep = await createEntity(entity);
41
+ if (doInsert)
42
+ await doInsert(async (id, name, description, status) => {
43
+ let c = rep.create();
44
+ c.id = id;
45
+ c.categoryName = name;
46
+ c.description = description;
47
+ if (status)
48
+ c.status = status;
49
+ await rep.save(c);
50
+ });
51
+ return rep;
52
+ };
53
+ await doTest({
54
+ remult,
55
+ createData,
56
+ insertFourRows: async () => {
57
+ return createData(async (i) => {
58
+ await i(1, 'noam', 'x');
59
+ await i(4, 'yael', 'x');
60
+ await i(2, 'yoni', 'y');
61
+ await i(3, 'maayan', 'y');
62
+ });
63
+ }
64
+ });
65
+ }, focus);
66
+ }
@@ -0,0 +1,26 @@
1
+ import { EntityBase } from "../remult3";
2
+ import { IdEntity } from "../id-entity";
3
+ export declare class stam extends EntityBase {
4
+ id: number;
5
+ title: string;
6
+ }
7
+ export declare class tasksWithEnum extends IdEntity {
8
+ title: string;
9
+ completed: boolean;
10
+ priority: Priority;
11
+ }
12
+ export declare enum Priority {
13
+ Low = 0,
14
+ High = 1,
15
+ Critical = 2
16
+ }
17
+ export declare class tasksWithStringEnum extends IdEntity {
18
+ title: string;
19
+ completed: boolean;
20
+ priority: PriorityWithString;
21
+ }
22
+ export declare enum PriorityWithString {
23
+ Low = "Low",
24
+ High = "High",
25
+ Critical = "Critical"
26
+ }