remult 0.27.11 → 0.27.13
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.
- package/esm/index.js +0 -1
- package/esm/live-query/data-provider-live-query-storage.js +0 -2
- package/esm/postgres/schema-builder.js +0 -41
- package/esm/remult-duckdb.js +7 -12
- package/esm/remult-knex/index.js +0 -7
- package/esm/remult-mongo.js +33 -0
- package/esm/remult-sqlite-core.js +33 -5
- package/esm/server/get-remult-admin-html.js +1 -1
- package/esm/server/remult-admin.js +2 -0
- package/esm/server/remult-api-server.js +4 -5
- package/esm/src/data-providers/array-entity-data-provider.js +26 -11
- package/esm/src/data-providers/in-memory-database.js +1 -1
- package/esm/src/data-providers/sql-database.js +2 -25
- package/esm/src/filter/filter-interfaces.js +1 -0
- package/esm/src/remult3/RepositoryImplementation.js +15 -4
- package/esm/src/remult3/remult3.js +0 -3
- package/index.d.ts +0 -1
- package/index.js +1 -3
- package/live-query/data-provider-live-query-storage.js +0 -2
- package/package.json +1 -1
- package/postgres/schema-builder.d.ts +0 -4
- package/postgres/schema-builder.js +15 -118
- package/remult-duckdb.d.ts +1 -1
- package/remult-duckdb.js +7 -12
- package/remult-knex/index.d.ts +0 -2
- package/remult-knex/index.js +0 -18
- package/remult-mongo.d.ts +2 -1
- package/remult-mongo.js +128 -37
- package/remult-sqlite-core.d.ts +2 -1
- package/remult-sqlite-core.js +116 -29
- package/server/get-remult-admin-html.js +1 -1
- package/server/remult-admin.d.ts +4 -0
- package/server/remult-admin.js +12 -10
- package/server/remult-api-server.js +14 -14
- package/src/data-providers/array-entity-data-provider.js +82 -37
- package/src/data-providers/in-memory-database.js +1 -1
- package/src/data-providers/sql-database.js +10 -69
- package/src/entity.d.ts +4 -4
- package/src/filter/filter-interfaces.js +1 -0
- package/src/remult3/RepositoryImplementation.js +15 -4
- package/src/remult3/remult3.d.ts +17 -2
- package/src/remult3/remult3.js +0 -3
- package/esm/src/data-providers/web-sql-data-provider.js +0 -140
- package/src/data-providers/web-sql-data-provider.d.ts +0 -20
- package/src/data-providers/web-sql-data-provider.js +0 -228
package/server/remult-admin.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type RelationFields } from '../src/remult3/relationInfoMember.js';
|
|
2
2
|
import type { ClassType } from '../classType.js';
|
|
3
3
|
import type { Remult } from '../src/context.js';
|
|
4
|
+
import { EntityFilter } from '../src/remult3/remult3.js';
|
|
4
5
|
export interface EntityUIInfo {
|
|
5
6
|
key: string;
|
|
6
7
|
caption: string;
|
|
7
8
|
fields: FieldUIInfo[];
|
|
8
9
|
ids: Record<string, true>;
|
|
9
10
|
relations: EntityRelationToManyInfo[];
|
|
11
|
+
defaultOrderBy?: EntityFilter<any>;
|
|
10
12
|
color?: string;
|
|
11
13
|
}
|
|
12
14
|
export interface EntityRelationToManyInfo extends RelationFields {
|
|
@@ -24,6 +26,7 @@ export interface FieldUIInfo {
|
|
|
24
26
|
valFieldKey: string;
|
|
25
27
|
caption: string;
|
|
26
28
|
type: FieldUIInfoType;
|
|
29
|
+
inputType: string;
|
|
27
30
|
relationToOne?: FieldRelationToOneInfo;
|
|
28
31
|
}
|
|
29
32
|
export interface FieldRelationToOneInfo extends RelationFields {
|
|
@@ -41,3 +44,4 @@ export interface DisplayOptions {
|
|
|
41
44
|
}
|
|
42
45
|
export default function remultAdminHtml(options: AdminOptions): string;
|
|
43
46
|
export declare function buildEntityInfo(options: AdminOptions): EntityUIInfo[];
|
|
47
|
+
export type RelationsToOneValues = Record<string, Map<any, any>>;
|
package/server/remult-admin.js
CHANGED
|
@@ -13,24 +13,24 @@ function remultAdminHtml(options) {
|
|
|
13
13
|
}
|
|
14
14
|
function buildEntityInfo(options) {
|
|
15
15
|
var e_1, _a, e_2, _b, e_3, _c;
|
|
16
|
-
var _d;
|
|
16
|
+
var _d, _e;
|
|
17
17
|
var entities = [];
|
|
18
18
|
try {
|
|
19
|
-
for (var
|
|
20
|
-
var metadata =
|
|
19
|
+
for (var _f = tslib_1.__values(options.entities.map(function (e) { return options.remult.repo(e).metadata; })), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
20
|
+
var metadata = _g.value;
|
|
21
21
|
var fields = [];
|
|
22
22
|
var relations = [];
|
|
23
23
|
var ids = {};
|
|
24
24
|
try {
|
|
25
|
-
for (var
|
|
26
|
-
var f =
|
|
25
|
+
for (var _h = (e_2 = void 0, tslib_1.__values(metadata.idMetadata.fields)), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
26
|
+
var f = _j.value;
|
|
27
27
|
ids[f.key] = true;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
31
31
|
finally {
|
|
32
32
|
try {
|
|
33
|
-
if (
|
|
33
|
+
if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
|
|
34
34
|
}
|
|
35
35
|
finally { if (e_2) throw e_2.error; }
|
|
36
36
|
}
|
|
@@ -77,6 +77,7 @@ function buildEntityInfo(options) {
|
|
|
77
77
|
valFieldKey: valFieldKey,
|
|
78
78
|
caption: x.caption,
|
|
79
79
|
relationToOne: relation,
|
|
80
|
+
inputType: x.inputType,
|
|
80
81
|
type: x.valueConverter.fieldTypeInDb == 'json'
|
|
81
82
|
? 'json'
|
|
82
83
|
: x.valueType === Number
|
|
@@ -89,15 +90,15 @@ function buildEntityInfo(options) {
|
|
|
89
90
|
});
|
|
90
91
|
};
|
|
91
92
|
try {
|
|
92
|
-
for (var
|
|
93
|
-
var x =
|
|
93
|
+
for (var _k = (e_3 = void 0, tslib_1.__values(metadata.fields.toArray())), _l = _k.next(); !_l.done; _l = _k.next()) {
|
|
94
|
+
var x = _l.value;
|
|
94
95
|
_loop_1(x);
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
98
99
|
finally {
|
|
99
100
|
try {
|
|
100
|
-
if (
|
|
101
|
+
if (_l && !_l.done && (_c = _k.return)) _c.call(_k);
|
|
101
102
|
}
|
|
102
103
|
finally { if (e_3) throw e_3.error; }
|
|
103
104
|
}
|
|
@@ -108,6 +109,7 @@ function buildEntityInfo(options) {
|
|
|
108
109
|
ids: ids,
|
|
109
110
|
fields: fields,
|
|
110
111
|
relations: relations,
|
|
112
|
+
defaultOrderBy: (_e = metadata.options.defaultOrderBy) !== null && _e !== void 0 ? _e : { id: 'asc' },
|
|
111
113
|
});
|
|
112
114
|
}
|
|
113
115
|
}
|
|
@@ -115,7 +117,7 @@ function buildEntityInfo(options) {
|
|
|
115
117
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
116
118
|
finally {
|
|
117
119
|
try {
|
|
118
|
-
if (
|
|
120
|
+
if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
|
|
119
121
|
}
|
|
120
122
|
finally { if (e_1) throw e_1.error; }
|
|
121
123
|
}
|
|
@@ -39,8 +39,6 @@ function createRemultServerCore(options, serverCoreOptions) {
|
|
|
39
39
|
context_js_1.RemultAsyncLocalStorage.enable();
|
|
40
40
|
{
|
|
41
41
|
var allControllers = [];
|
|
42
|
-
if (!safeOptions.entities)
|
|
43
|
-
safeOptions.entities = tslib_1.__spreadArray([], tslib_1.__read(remult_static_js_1.remultStatic.allEntities), false);
|
|
44
42
|
if (safeOptions.entities)
|
|
45
43
|
allControllers.push.apply(allControllers, tslib_1.__spreadArray([], tslib_1.__read(safeOptions.entities), false));
|
|
46
44
|
if (safeOptions.controllers)
|
|
@@ -189,7 +187,8 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
189
187
|
started_1 = true;
|
|
190
188
|
console.time('Schema ensured');
|
|
191
189
|
};
|
|
192
|
-
|
|
190
|
+
if (options.entities)
|
|
191
|
+
entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(options.entities.map(function (e) { return remult.repo(e).metadata; })), false));
|
|
193
192
|
if (!dp.ensureSchema) return [3 /*break*/, 2];
|
|
194
193
|
startConsoleLog();
|
|
195
194
|
return [4 /*yield*/, dp.ensureSchema(entitiesMetaData)];
|
|
@@ -297,13 +296,14 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
297
296
|
RemultServerImplementation.prototype.registerRouter = function (r) {
|
|
298
297
|
var e_3, _a, e_4, _b;
|
|
299
298
|
var _this = this;
|
|
299
|
+
var _c;
|
|
300
300
|
if (this.registeredRouter)
|
|
301
301
|
throw 'Router already registered';
|
|
302
302
|
this.registeredRouter = true;
|
|
303
303
|
{
|
|
304
304
|
try {
|
|
305
|
-
for (var
|
|
306
|
-
var c =
|
|
305
|
+
for (var _d = tslib_1.__values(this.options.controllers), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
306
|
+
var c = _e.value;
|
|
307
307
|
var z = c[server_action_js_1.classBackendMethodsArray];
|
|
308
308
|
if (z)
|
|
309
309
|
try {
|
|
@@ -328,7 +328,7 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
328
328
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
329
329
|
finally {
|
|
330
330
|
try {
|
|
331
|
-
if (
|
|
331
|
+
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
332
332
|
}
|
|
333
333
|
finally { if (e_3) throw e_3.error; }
|
|
334
334
|
}
|
|
@@ -432,7 +432,7 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
432
432
|
});
|
|
433
433
|
}); }));
|
|
434
434
|
}
|
|
435
|
-
this.options.entities.forEach(function (e) {
|
|
435
|
+
(_c = this.options.entities) === null || _c === void 0 ? void 0 : _c.forEach(function (e) {
|
|
436
436
|
var key = (0, getEntityRef_js_1.getEntityKey)(e);
|
|
437
437
|
if (key != undefined)
|
|
438
438
|
_this.add(key, function (c) {
|
|
@@ -589,13 +589,13 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
589
589
|
return tslib_1.__generator(this, function (_a) {
|
|
590
590
|
switch (_a.label) {
|
|
591
591
|
case 0:
|
|
592
|
-
if (!req) return [3 /*break*/,
|
|
592
|
+
if (!req) return [3 /*break*/, 9];
|
|
593
593
|
;
|
|
594
594
|
remult.context.request = req;
|
|
595
595
|
remult_static_js_1.remultStatic.asyncContext.setInInitRequest(true);
|
|
596
596
|
_a.label = 1;
|
|
597
597
|
case 1:
|
|
598
|
-
_a.trys.push([1, ,
|
|
598
|
+
_a.trys.push([1, , 8, 9]);
|
|
599
599
|
user = void 0;
|
|
600
600
|
if (!this.options.getUser) return [3 /*break*/, 3];
|
|
601
601
|
return [4 /*yield*/, this.options.getUser(req)];
|
|
@@ -623,14 +623,14 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
623
623
|
case 5:
|
|
624
624
|
_a.sent();
|
|
625
625
|
_a.label = 6;
|
|
626
|
-
case 6: return [
|
|
626
|
+
case 6: return [4 /*yield*/, what(remult, myReq, myRes, genReq, origRes, req)];
|
|
627
627
|
case 7:
|
|
628
|
+
_a.sent();
|
|
629
|
+
return [3 /*break*/, 9];
|
|
630
|
+
case 8:
|
|
628
631
|
remult_static_js_1.remultStatic.asyncContext.setInInitRequest(false);
|
|
629
632
|
return [7 /*endfinally*/];
|
|
630
|
-
case
|
|
631
|
-
case 9:
|
|
632
|
-
_a.sent();
|
|
633
|
-
return [2 /*return*/];
|
|
633
|
+
case 9: return [2 /*return*/];
|
|
634
634
|
}
|
|
635
635
|
});
|
|
636
636
|
}); })];
|
|
@@ -463,25 +463,26 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
463
463
|
};
|
|
464
464
|
ArrayEntityDataProvider.prototype.update = function (id, data) {
|
|
465
465
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
466
|
-
var names, idMatches, keys,
|
|
467
|
-
var
|
|
468
|
-
return tslib_1.__generator(this, function (
|
|
469
|
-
switch (
|
|
466
|
+
var names, idMatches, keys, _loop_2, this_1, i, state_2;
|
|
467
|
+
var _this = this;
|
|
468
|
+
return tslib_1.__generator(this, function (_a) {
|
|
469
|
+
switch (_a.label) {
|
|
470
470
|
case 0: return [4 /*yield*/, this.init()];
|
|
471
471
|
case 1:
|
|
472
|
-
names =
|
|
472
|
+
names = _a.sent();
|
|
473
473
|
idMatches = this.idMatches(id, names);
|
|
474
474
|
keys = Object.keys(data);
|
|
475
|
-
|
|
476
|
-
|
|
475
|
+
_loop_2 = function (i) {
|
|
476
|
+
var e_14, _b;
|
|
477
|
+
var r = this_1.rows()[i];
|
|
477
478
|
if (idMatches(r)) {
|
|
478
|
-
|
|
479
|
+
var newR_1 = tslib_1.__assign({}, r);
|
|
479
480
|
try {
|
|
480
|
-
for (
|
|
481
|
-
f =
|
|
481
|
+
for (var _c = (e_14 = void 0, tslib_1.__values(this_1.entity.fields)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
482
|
+
var f = _d.value;
|
|
482
483
|
if (!(0, filter_consumer_bridge_to_sql_request_js_1.isDbReadonly)(f, names)) {
|
|
483
484
|
if (keys.includes(f.key)) {
|
|
484
|
-
|
|
485
|
+
newR_1[names.$dbNameOf(f)] = f.valueConverter.toJson(data[f.key]);
|
|
485
486
|
}
|
|
486
487
|
}
|
|
487
488
|
}
|
|
@@ -489,14 +490,41 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
489
490
|
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
490
491
|
finally {
|
|
491
492
|
try {
|
|
492
|
-
if (
|
|
493
|
+
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
493
494
|
}
|
|
494
495
|
finally { if (e_14) throw e_14.error; }
|
|
495
496
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
497
|
+
if (this_1.entity.idMetadata.fields.find(function (x) { return newR_1[names.$dbNameOf(x)] != r[names.$dbNameOf(x)]; }) &&
|
|
498
|
+
this_1.rows().find(function (x) {
|
|
499
|
+
var e_15, _a;
|
|
500
|
+
try {
|
|
501
|
+
for (var _b = (e_15 = void 0, tslib_1.__values(_this.entity.idMetadata.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
502
|
+
var f = _c.value;
|
|
503
|
+
if (x[names.$dbNameOf(f)] != newR_1[names.$dbNameOf(f)])
|
|
504
|
+
return false;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
|
508
|
+
finally {
|
|
509
|
+
try {
|
|
510
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
511
|
+
}
|
|
512
|
+
finally { if (e_15) throw e_15.error; }
|
|
513
|
+
}
|
|
514
|
+
return true;
|
|
515
|
+
})) {
|
|
516
|
+
throw Error('id already exists');
|
|
517
|
+
}
|
|
518
|
+
this_1.verifyThatRowHasAllNotNullColumns(newR_1, names);
|
|
519
|
+
this_1.rows()[i] = newR_1;
|
|
520
|
+
return { value: Promise.resolve(this_1.translateFromJson(this_1.rows()[i], names)) };
|
|
499
521
|
}
|
|
522
|
+
};
|
|
523
|
+
this_1 = this;
|
|
524
|
+
for (i = 0; i < this.rows().length; i++) {
|
|
525
|
+
state_2 = _loop_2(i);
|
|
526
|
+
if (typeof state_2 === "object")
|
|
527
|
+
return [2 /*return*/, state_2.value];
|
|
500
528
|
}
|
|
501
529
|
throw new Error("ArrayEntityDataProvider: Couldn't find row with id \"".concat(id, "\" in entity \"").concat(this.entity.key, "\" to update"));
|
|
502
530
|
}
|
|
@@ -526,7 +554,8 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
526
554
|
ArrayEntityDataProvider.prototype.insert = function (data) {
|
|
527
555
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
528
556
|
var names, j, idf, _a, _b, row;
|
|
529
|
-
var
|
|
557
|
+
var e_16, _c;
|
|
558
|
+
var _this = this;
|
|
530
559
|
return tslib_1.__generator(this, function (_d) {
|
|
531
560
|
switch (_d.label) {
|
|
532
561
|
case 0: return [4 /*yield*/, this.init()];
|
|
@@ -534,29 +563,45 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
534
563
|
names = _d.sent();
|
|
535
564
|
j = this.translateToJson(data, names);
|
|
536
565
|
idf = this.entity.idMetadata.field;
|
|
537
|
-
if (!(idf instanceof CompoundIdField_js_1.CompoundIdField)
|
|
538
|
-
|
|
539
|
-
|
|
566
|
+
if (!(idf instanceof CompoundIdField_js_1.CompoundIdField) &&
|
|
567
|
+
idf.valueConverter.fieldTypeInDb === 'autoincrement') {
|
|
568
|
+
j[idf.key] = 1;
|
|
569
|
+
try {
|
|
570
|
+
for (_a = tslib_1.__values(this.rows()), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
571
|
+
row = _b.value;
|
|
572
|
+
if (row[idf.key] >= j[idf.key])
|
|
573
|
+
j[idf.key] = row[idf.key] + 1;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
577
|
+
finally {
|
|
540
578
|
try {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
579
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
580
|
+
}
|
|
581
|
+
finally { if (e_16) throw e_16.error; }
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
if (this.rows().find(function (x) {
|
|
586
|
+
var e_17, _a;
|
|
587
|
+
try {
|
|
588
|
+
for (var _b = tslib_1.__values(_this.entity.idMetadata.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
589
|
+
var f = _c.value;
|
|
590
|
+
if (x[names.$dbNameOf(f)] != j[names.$dbNameOf(f)])
|
|
591
|
+
return false;
|
|
545
592
|
}
|
|
546
593
|
}
|
|
547
|
-
catch (
|
|
594
|
+
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
548
595
|
finally {
|
|
549
596
|
try {
|
|
550
|
-
if (
|
|
597
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
551
598
|
}
|
|
552
|
-
finally { if (
|
|
599
|
+
finally { if (e_17) throw e_17.error; }
|
|
553
600
|
}
|
|
601
|
+
return true;
|
|
602
|
+
})) {
|
|
603
|
+
throw Error('id already exists');
|
|
554
604
|
}
|
|
555
|
-
if (j[idf.key])
|
|
556
|
-
this.rows().forEach(function (i) {
|
|
557
|
-
if (j[idf.key] == i[idf.key])
|
|
558
|
-
throw Error('id already exists');
|
|
559
|
-
});
|
|
560
605
|
}
|
|
561
606
|
this.verifyThatRowHasAllNotNullColumns(j, names);
|
|
562
607
|
this.rows().push(j);
|
|
@@ -602,7 +647,7 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
|
|
|
602
647
|
throw new Error('Custom Filter should be translated before it gets here');
|
|
603
648
|
};
|
|
604
649
|
FilterConsumerBridgeToObject.prototype.or = function (orElements) {
|
|
605
|
-
var
|
|
650
|
+
var e_18, _a;
|
|
606
651
|
try {
|
|
607
652
|
for (var orElements_1 = tslib_1.__values(orElements), orElements_1_1 = orElements_1.next(); !orElements_1_1.done; orElements_1_1 = orElements_1.next()) {
|
|
608
653
|
var element = orElements_1_1.value;
|
|
@@ -613,12 +658,12 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
|
|
|
613
658
|
}
|
|
614
659
|
}
|
|
615
660
|
}
|
|
616
|
-
catch (
|
|
661
|
+
catch (e_18_1) { e_18 = { error: e_18_1 }; }
|
|
617
662
|
finally {
|
|
618
663
|
try {
|
|
619
664
|
if (orElements_1_1 && !orElements_1_1.done && (_a = orElements_1.return)) _a.call(orElements_1);
|
|
620
665
|
}
|
|
621
|
-
finally { if (
|
|
666
|
+
finally { if (e_18) throw e_18.error; }
|
|
622
667
|
}
|
|
623
668
|
this.ok = false;
|
|
624
669
|
};
|
|
@@ -637,7 +682,7 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
|
|
|
637
682
|
this.ok = false;
|
|
638
683
|
};
|
|
639
684
|
FilterConsumerBridgeToObject.prototype.isIn = function (col, val) {
|
|
640
|
-
var
|
|
685
|
+
var e_19, _a;
|
|
641
686
|
try {
|
|
642
687
|
for (var val_1 = tslib_1.__values(val), val_1_1 = val_1.next(); !val_1_1.done; val_1_1 = val_1.next()) {
|
|
643
688
|
var v = val_1_1.value;
|
|
@@ -646,12 +691,12 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
|
|
|
646
691
|
}
|
|
647
692
|
}
|
|
648
693
|
}
|
|
649
|
-
catch (
|
|
694
|
+
catch (e_19_1) { e_19 = { error: e_19_1 }; }
|
|
650
695
|
finally {
|
|
651
696
|
try {
|
|
652
697
|
if (val_1_1 && !val_1_1.done && (_a = val_1.return)) _a.call(val_1);
|
|
653
698
|
}
|
|
654
|
-
finally { if (
|
|
699
|
+
finally { if (e_19) throw e_19.error; }
|
|
655
700
|
}
|
|
656
701
|
this.ok = false;
|
|
657
702
|
};
|
|
@@ -32,7 +32,7 @@ var InMemoryDataProvider = /** @class */ (function () {
|
|
|
32
32
|
};
|
|
33
33
|
InMemoryDataProvider.prototype.getEntityDataProvider = function (entity) {
|
|
34
34
|
var _this = this;
|
|
35
|
-
var name = entity.
|
|
35
|
+
var name = entity.dbName;
|
|
36
36
|
if (!this.rows[name])
|
|
37
37
|
this.rows[name] = [];
|
|
38
38
|
return new array_entity_data_provider_js_1.ArrayEntityDataProvider(entity, function () { return _this.rows[name]; });
|
|
@@ -738,65 +738,6 @@ var myDummySQLCommand = /** @class */ (function () {
|
|
|
738
738
|
};
|
|
739
739
|
return myDummySQLCommand;
|
|
740
740
|
}());
|
|
741
|
-
function bulkInsert(array, db) {
|
|
742
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
743
|
-
var chunkSize, _loop_1, i;
|
|
744
|
-
return tslib_1.__generator(this, function (_a) {
|
|
745
|
-
switch (_a.label) {
|
|
746
|
-
case 0:
|
|
747
|
-
if (array.length == 0)
|
|
748
|
-
return [2 /*return*/];
|
|
749
|
-
chunkSize = 250;
|
|
750
|
-
_loop_1 = function (i) {
|
|
751
|
-
var items, c, sql, _b, _c;
|
|
752
|
-
return tslib_1.__generator(this, function (_d) {
|
|
753
|
-
switch (_d.label) {
|
|
754
|
-
case 0:
|
|
755
|
-
items = array.slice(i, i + chunkSize);
|
|
756
|
-
c = db.createCommand();
|
|
757
|
-
_b = 'insert into ';
|
|
758
|
-
return [4 /*yield*/, items[0]._.metadata.dbName];
|
|
759
|
-
case 1:
|
|
760
|
-
_c = _b +
|
|
761
|
-
(_d.sent()) +
|
|
762
|
-
' (';
|
|
763
|
-
return [4 /*yield*/, Promise.all(items[0]._.metadata.fields.toArray().map(function (f) { return f.dbName; }))];
|
|
764
|
-
case 2:
|
|
765
|
-
sql = _c +
|
|
766
|
-
(_d.sent()).join(',') +
|
|
767
|
-
') values ';
|
|
768
|
-
sql += items
|
|
769
|
-
.map(function (row) {
|
|
770
|
-
return '(' +
|
|
771
|
-
row.$.toArray()
|
|
772
|
-
.map(function (f) { return c.param(f.metadata.valueConverter.toDb(f.value)); })
|
|
773
|
-
.join(', ') +
|
|
774
|
-
')';
|
|
775
|
-
})
|
|
776
|
-
.join(',');
|
|
777
|
-
return [4 /*yield*/, c.execute(sql)];
|
|
778
|
-
case 3:
|
|
779
|
-
_d.sent();
|
|
780
|
-
return [2 /*return*/];
|
|
781
|
-
}
|
|
782
|
-
});
|
|
783
|
-
};
|
|
784
|
-
i = 0;
|
|
785
|
-
_a.label = 1;
|
|
786
|
-
case 1:
|
|
787
|
-
if (!(i < array.length)) return [3 /*break*/, 4];
|
|
788
|
-
return [5 /*yield**/, _loop_1(i)];
|
|
789
|
-
case 2:
|
|
790
|
-
_a.sent();
|
|
791
|
-
_a.label = 3;
|
|
792
|
-
case 3:
|
|
793
|
-
i += chunkSize;
|
|
794
|
-
return [3 /*break*/, 1];
|
|
795
|
-
case 4: return [2 /*return*/];
|
|
796
|
-
}
|
|
797
|
-
});
|
|
798
|
-
});
|
|
799
|
-
}
|
|
800
741
|
function getRowAfterUpdate(meta, dataProvider, data, id, operation) {
|
|
801
742
|
var idFilter = id !== undefined ? meta.idMetadata.getIdFilter(id) : {};
|
|
802
743
|
return dataProvider
|
|
@@ -832,7 +773,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
832
773
|
? "count (distinct ".concat(dbName, ")")
|
|
833
774
|
: "".concat(operator, "( ").concat(dbName, " )");
|
|
834
775
|
}
|
|
835
|
-
var select, groupBy, processResultRow,
|
|
776
|
+
var select, groupBy, processResultRow, _loop_1, _a, _b, x, _loop_2, GroupByOperators_1, GroupByOperators_1_1, operator, e_8_1, where, _c, orderBy, _d, _e, x, field, _f, e_9_1, page, result;
|
|
836
777
|
var e_10, _g, e_8, _h, e_9, _j;
|
|
837
778
|
return tslib_1.__generator(this, function (_k) {
|
|
838
779
|
switch (_k.label) {
|
|
@@ -844,7 +785,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
844
785
|
theResult[remult3_js_1.GroupByCountMember] = Number(sqlVal);
|
|
845
786
|
});
|
|
846
787
|
if (options === null || options === void 0 ? void 0 : options.group) {
|
|
847
|
-
|
|
788
|
+
_loop_1 = function (x) {
|
|
848
789
|
if (x.isServerExpression) {
|
|
849
790
|
}
|
|
850
791
|
else {
|
|
@@ -864,7 +805,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
864
805
|
try {
|
|
865
806
|
for (_a = tslib_1.__values(options === null || options === void 0 ? void 0 : options.group), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
866
807
|
x = _b.value;
|
|
867
|
-
|
|
808
|
+
_loop_1(x);
|
|
868
809
|
}
|
|
869
810
|
}
|
|
870
811
|
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
@@ -875,15 +816,15 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
875
816
|
finally { if (e_10) throw e_10.error; }
|
|
876
817
|
}
|
|
877
818
|
}
|
|
878
|
-
|
|
879
|
-
var fields,
|
|
819
|
+
_loop_2 = function (operator) {
|
|
820
|
+
var fields, _loop_3, fields_1, fields_1_1, x, e_11_1;
|
|
880
821
|
var e_11, _l;
|
|
881
822
|
return tslib_1.__generator(this, function (_m) {
|
|
882
823
|
switch (_m.label) {
|
|
883
824
|
case 0:
|
|
884
825
|
fields = options === null || options === void 0 ? void 0 : options[operator];
|
|
885
826
|
if (!fields) return [3 /*break*/, 8];
|
|
886
|
-
|
|
827
|
+
_loop_3 = function (x) {
|
|
887
828
|
var dbName, turnToNumber;
|
|
888
829
|
return tslib_1.__generator(this, function (_o) {
|
|
889
830
|
switch (_o.label) {
|
|
@@ -915,7 +856,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
915
856
|
case 2:
|
|
916
857
|
if (!!fields_1_1.done) return [3 /*break*/, 5];
|
|
917
858
|
x = fields_1_1.value;
|
|
918
|
-
return [5 /*yield**/,
|
|
859
|
+
return [5 /*yield**/, _loop_3(x)];
|
|
919
860
|
case 3:
|
|
920
861
|
_m.sent();
|
|
921
862
|
_m.label = 4;
|
|
@@ -945,7 +886,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
945
886
|
case 2:
|
|
946
887
|
if (!!GroupByOperators_1_1.done) return [3 /*break*/, 5];
|
|
947
888
|
operator = GroupByOperators_1_1.value;
|
|
948
|
-
return [5 /*yield**/,
|
|
889
|
+
return [5 /*yield**/, _loop_2(operator)];
|
|
949
890
|
case 3:
|
|
950
891
|
_k.sent();
|
|
951
892
|
_k.label = 4;
|
|
@@ -1012,9 +953,9 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
|
|
|
1012
953
|
orderBy += ' desc';
|
|
1013
954
|
if (orderByNullFirst) {
|
|
1014
955
|
if (x.isDescending)
|
|
1015
|
-
|
|
956
|
+
orderBy += ' nulls last';
|
|
1016
957
|
else
|
|
1017
|
-
|
|
958
|
+
orderBy += ' nulls first';
|
|
1018
959
|
}
|
|
1019
960
|
_k.label = 15;
|
|
1020
961
|
case 15:
|
package/src/entity.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Allowed, AllowedForInstance } from './context.js';
|
|
2
2
|
import type { FieldMetadata } from './column-interfaces.js';
|
|
3
|
-
import type { EntityFilter, EntityIdFields, EntityMetadata, EntityOrderBy, EntityRef, FieldsMetadata, LifecycleEvent } from './remult3/remult3.js';
|
|
3
|
+
import type { EntityFilter, EntityIdFields, EntityMetadata, EntityOrderBy, EntityRef, FieldsMetadata, LifecycleEvent, MembersOnly } from './remult3/remult3.js';
|
|
4
4
|
import type { FilterPreciseValues } from './filter/filter-interfaces.js';
|
|
5
5
|
export interface EntityOptions<entityType = unknown> {
|
|
6
6
|
/**A human readable name for the entity */
|
|
@@ -173,12 +173,12 @@ export interface EntityOptions<entityType = unknown> {
|
|
|
173
173
|
/** An arrow function that identifies the `id` column to use for this entity
|
|
174
174
|
* @example
|
|
175
175
|
* //Single column id
|
|
176
|
-
* @Entity<Products>("products", { id:
|
|
176
|
+
* @Entity<Products>("products", { id: 'productCode' })
|
|
177
177
|
* @example
|
|
178
178
|
* //Multiple columns id
|
|
179
|
-
* @Entity<OrderDetails>("orderDetails", { id:
|
|
179
|
+
* @Entity<OrderDetails>("orderDetails", { id:['orderId:', 'productCode'] })
|
|
180
180
|
*/
|
|
181
|
-
id?: EntityIdFields<entityType> | ((entity: FieldsMetadata<entityType>) => FieldMetadata | FieldMetadata[]);
|
|
181
|
+
id?: keyof MembersOnly<entityType> | (keyof MembersOnly<entityType>)[] | EntityIdFields<entityType> | ((entity: FieldsMetadata<entityType>) => FieldMetadata | FieldMetadata[]);
|
|
182
182
|
entityRefInit?: (ref: EntityRef<entityType>, row: entityType) => void;
|
|
183
183
|
apiRequireId?: Allowed;
|
|
184
184
|
}
|
|
@@ -1203,7 +1203,9 @@ var RepositoryImplementation = /** @class */ (function () {
|
|
|
1203
1203
|
//I've used define property to hide this member from console.lo g
|
|
1204
1204
|
get: function () { return row_2; },
|
|
1205
1205
|
});
|
|
1206
|
+
row_2.id = row_2.getId();
|
|
1206
1207
|
row_2.saveOriginalData();
|
|
1208
|
+
row_2.originalId = row_2.id;
|
|
1207
1209
|
return result;
|
|
1208
1210
|
}
|
|
1209
1211
|
};
|
|
@@ -2335,7 +2337,10 @@ var rowHelperImplementation = /** @class */ (function (_super) {
|
|
|
2335
2337
|
case 21:
|
|
2336
2338
|
updatedRow = (_t.sent())[0];
|
|
2337
2339
|
return [3 /*break*/, 24];
|
|
2338
|
-
case 22:
|
|
2340
|
+
case 22:
|
|
2341
|
+
if (this.id === undefined)
|
|
2342
|
+
throw new Error('Invalid operation, id is undefined');
|
|
2343
|
+
return [4 /*yield*/, this.edp.update(this.id, changesOnly)];
|
|
2339
2344
|
case 23:
|
|
2340
2345
|
updatedRow = _t.sent();
|
|
2341
2346
|
_t.label = 24;
|
|
@@ -2497,6 +2502,8 @@ var rowHelperImplementation = /** @class */ (function (_super) {
|
|
|
2497
2502
|
case 3:
|
|
2498
2503
|
_e.trys.push([3, 16, , 18]);
|
|
2499
2504
|
if (!doDelete) return [3 /*break*/, 5];
|
|
2505
|
+
if (this.id === undefined)
|
|
2506
|
+
throw new Error('Invalid operation, id is undefined');
|
|
2500
2507
|
return [4 /*yield*/, this.edp.delete(this.id)];
|
|
2501
2508
|
case 4:
|
|
2502
2509
|
_e.sent();
|
|
@@ -3376,9 +3383,13 @@ var EntityFullInfo = /** @class */ (function () {
|
|
|
3376
3383
|
this.fields = r;
|
|
3377
3384
|
this.caption = buildCaption(entityInfo.caption, this.key, remult, this);
|
|
3378
3385
|
if (entityInfo.id) {
|
|
3379
|
-
var r_2 = typeof entityInfo.id === '
|
|
3380
|
-
? entityInfo.id
|
|
3381
|
-
:
|
|
3386
|
+
var r_2 = typeof entityInfo.id === 'string'
|
|
3387
|
+
? this.fields.find(entityInfo.id)
|
|
3388
|
+
: Array.isArray(entityInfo.id)
|
|
3389
|
+
? entityInfo.id.map(function (x) { return _this.fields.find(x); })
|
|
3390
|
+
: typeof entityInfo.id === 'function'
|
|
3391
|
+
? entityInfo.id(this.fields)
|
|
3392
|
+
: Object.keys(entityInfo.id).map(function (x) { return _this.fields.find(x); });
|
|
3382
3393
|
if (Array.isArray(r_2)) {
|
|
3383
3394
|
if (r_2.length > 1)
|
|
3384
3395
|
this.idMetadata.field = new (CompoundIdField_js_1.CompoundIdField.bind.apply(CompoundIdField_js_1.CompoundIdField, tslib_1.__spreadArray([void 0], tslib_1.__read(r_2), false)))();
|