remult 0.27.12 → 0.27.14
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/server/get-remult-admin-html.js +1 -1
- package/esm/server/remult-admin.js +2 -0
- package/esm/server/remult-api-server.js +3 -1
- package/esm/src/data-providers/sql-database.js +2 -25
- package/esm/src/remult3/RepositoryImplementation.js +8 -1
- package/esm/src/remult3/relationInfoMember.js +2 -2
- package/esm/src/remult3/remult3.js +1 -0
- package/package.json +1 -1
- 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 +9 -7
- package/src/data-providers/sql-database.js +10 -69
- package/src/remult3/RepositoryImplementation.js +8 -1
- package/src/remult3/relationInfoMember.js +2 -2
- package/src/remult3/remult3.d.ts +5 -1
- package/src/remult3/remult3.js +1 -0
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
|
}
|
|
@@ -20,6 +20,8 @@ var isOfType_js_1 = require("../src/isOfType.js");
|
|
|
20
20
|
var initDataProviderOrJson_js_1 = require("./initDataProviderOrJson.js");
|
|
21
21
|
function createRemultServerCore(options, serverCoreOptions) {
|
|
22
22
|
var safeOptions = options !== null && options !== void 0 ? options : {};
|
|
23
|
+
if (!safeOptions.entities)
|
|
24
|
+
safeOptions.entities = [];
|
|
23
25
|
if (!safeOptions.subscriptionServer) {
|
|
24
26
|
safeOptions.subscriptionServer = new SseSubscriptionServer_js_1.SseSubscriptionServer();
|
|
25
27
|
}
|
|
@@ -589,13 +591,13 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
589
591
|
return tslib_1.__generator(this, function (_a) {
|
|
590
592
|
switch (_a.label) {
|
|
591
593
|
case 0:
|
|
592
|
-
if (!req) return [3 /*break*/,
|
|
594
|
+
if (!req) return [3 /*break*/, 9];
|
|
593
595
|
;
|
|
594
596
|
remult.context.request = req;
|
|
595
597
|
remult_static_js_1.remultStatic.asyncContext.setInInitRequest(true);
|
|
596
598
|
_a.label = 1;
|
|
597
599
|
case 1:
|
|
598
|
-
_a.trys.push([1, ,
|
|
600
|
+
_a.trys.push([1, , 8, 9]);
|
|
599
601
|
user = void 0;
|
|
600
602
|
if (!this.options.getUser) return [3 /*break*/, 3];
|
|
601
603
|
return [4 /*yield*/, this.options.getUser(req)];
|
|
@@ -623,14 +625,14 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
623
625
|
case 5:
|
|
624
626
|
_a.sent();
|
|
625
627
|
_a.label = 6;
|
|
626
|
-
case 6: return [
|
|
628
|
+
case 6: return [4 /*yield*/, what(remult, myReq, myRes, genReq, origRes, req)];
|
|
627
629
|
case 7:
|
|
630
|
+
_a.sent();
|
|
631
|
+
return [3 /*break*/, 9];
|
|
632
|
+
case 8:
|
|
628
633
|
remult_static_js_1.remultStatic.asyncContext.setInInitRequest(false);
|
|
629
634
|
return [7 /*endfinally*/];
|
|
630
|
-
case
|
|
631
|
-
case 9:
|
|
632
|
-
_a.sent();
|
|
633
|
-
return [2 /*return*/];
|
|
635
|
+
case 9: return [2 /*return*/];
|
|
634
636
|
}
|
|
635
637
|
});
|
|
636
638
|
}); })];
|
|
@@ -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:
|
|
@@ -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();
|
|
@@ -48,7 +48,7 @@ function verifyFieldRelationInfo(repo, remult, dp) {
|
|
|
48
48
|
compoundIdField: undefined,
|
|
49
49
|
};
|
|
50
50
|
function buildError(what) {
|
|
51
|
-
return Error("Error for relation: \"".concat(
|
|
51
|
+
return Error("Error for relation: \"".concat(repo.metadata.key, ".").concat(field.key, "\", ") +
|
|
52
52
|
what);
|
|
53
53
|
}
|
|
54
54
|
var hasFields = function () { return relationField || relFields.fields; };
|
|
@@ -90,7 +90,7 @@ function verifyFieldRelationInfo(repo, remult, dp) {
|
|
|
90
90
|
finally { if (e_2) throw e_2.error; }
|
|
91
91
|
}
|
|
92
92
|
if (!hasFields())
|
|
93
|
-
throw buildError("No matching field found on target. Please specify field/fields");
|
|
93
|
+
throw buildError("No matching field found on target \"".concat(toRepo_1.metadata.key, "\". Please specify field/fields"));
|
|
94
94
|
}
|
|
95
95
|
function requireField(field, meta) {
|
|
96
96
|
var result = meta.fields.find(field);
|
package/src/remult3/remult3.d.ts
CHANGED
|
@@ -539,7 +539,11 @@ export interface Repository<entityType> {
|
|
|
539
539
|
deleteMany(options: {
|
|
540
540
|
where: EntityFilter<entityType>;
|
|
541
541
|
}): Promise<number>;
|
|
542
|
-
/** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called
|
|
542
|
+
/** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called.
|
|
543
|
+
*
|
|
544
|
+
* It's usefull to start or reset a form taking your entity default values into account.
|
|
545
|
+
*
|
|
546
|
+
*/
|
|
543
547
|
create(item?: Partial<MembersOnly<entityType>>): entityType;
|
|
544
548
|
toJson(item: Promise<entityType[]>): Promise<any[]>;
|
|
545
549
|
toJson(item: entityType[]): any[];
|
package/src/remult3/remult3.js
CHANGED
|
@@ -20,6 +20,7 @@ var wnn = [
|
|
|
20
20
|
exports.flags = {
|
|
21
21
|
error500RetryCount: 4,
|
|
22
22
|
};
|
|
23
|
+
//p1 - add aggregate to query
|
|
23
24
|
//p1 - add parameter all to deleteMany, and updateMany
|
|
24
25
|
//p1 filter.apply ApiPreFilter
|
|
25
26
|
/*p1 - add id and use uuid by default, but allow changes with Fields.id.defaultIdProvider NO but defaultProvider yes???
|