remult 3.3.0-next.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/graphql.js +1 -1
- package/esm/remult-knex/index.js +8 -2
- package/esm/remult-mongo.js +7 -3
- package/esm/server/get-remult-admin-html.js +125 -111
- package/esm/server/remult-admin.js +2 -0
- package/esm/server/remult-api-server.js +1 -1
- package/esm/src/data-api.js +28 -19
- package/esm/src/data-providers/rest-data-provider.js +48 -37
- package/esm/src/data-providers/sql-database.js +14 -3
- package/esm/src/remult-proxy.js +4 -4
- package/esm/src/remult3/RepositoryImplementation.js +41 -17
- package/esm/src/server-action.js +2 -2
- package/esm/src/valueConverters.js +9 -5
- package/graphql.js +1 -1
- package/index.d.ts +1 -1
- package/package.json +1 -1
- package/remult-knex/index.js +16 -8
- package/remult-mongo.js +6 -2
- package/server/get-remult-admin-html.js +1 -1
- package/server/remult-admin.d.ts +2 -0
- package/server/remult-admin.js +2 -1
- package/server/remult-api-server.js +1 -0
- package/src/data-api.d.ts +4 -4
- package/src/data-api.js +48 -30
- package/src/data-interfaces.d.ts +6 -6
- package/src/data-providers/rest-data-provider.d.ts +4 -4
- package/src/data-providers/rest-data-provider.js +48 -37
- package/src/data-providers/sql-database.js +14 -3
- package/src/remult-proxy.js +4 -4
- package/src/remult3/RepositoryImplementation.d.ts +8 -7
- package/src/remult3/RepositoryImplementation.js +225 -169
- package/src/remult3/remult3.d.ts +10 -7
- package/src/server-action.js +2 -2
- package/src/valueConverters.d.ts +3 -1
- package/src/valueConverters.js +9 -6
package/server/remult-admin.d.ts
CHANGED
|
@@ -30,12 +30,14 @@ export interface FieldUIInfo {
|
|
|
30
30
|
caption: string;
|
|
31
31
|
type: FieldUIInfoType;
|
|
32
32
|
inputType: string;
|
|
33
|
+
allowNull: boolean;
|
|
33
34
|
relationToOne?: FieldRelationToOneInfo;
|
|
34
35
|
}
|
|
35
36
|
export interface FieldRelationToOneInfo extends RelationFields {
|
|
36
37
|
entityKey: string;
|
|
37
38
|
idField: string;
|
|
38
39
|
captionField: string;
|
|
40
|
+
allowNull: boolean;
|
|
39
41
|
where?: any;
|
|
40
42
|
}
|
|
41
43
|
export interface AdminEntitiesOptions {
|
package/server/remult-admin.js
CHANGED
|
@@ -65,7 +65,7 @@ function buildEntityInfo(options) {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
if (relRepo.metadata.apiReadAllowed) {
|
|
68
|
-
relation = tslib_1.__assign(tslib_1.__assign({}, relInfo), { where: where, entityKey: relRepo.metadata.key, idField: idField_1, captionField: (_b = relRepo.metadata.fields
|
|
68
|
+
relation = tslib_1.__assign(tslib_1.__assign({}, relInfo), { allowNull: x.allowNull, where: where, entityKey: relRepo.metadata.key, idField: idField_1, captionField: (_b = relRepo.metadata.fields
|
|
69
69
|
.toArray()
|
|
70
70
|
.find(function (x) { return x.key != idField_1 && x.valueType == String; })) === null || _b === void 0 ? void 0 : _b.key });
|
|
71
71
|
}
|
|
@@ -85,6 +85,7 @@ function buildEntityInfo(options) {
|
|
|
85
85
|
caption: x.label,
|
|
86
86
|
relationToOne: relation,
|
|
87
87
|
inputType: x.inputType,
|
|
88
|
+
allowNull: x.allowNull,
|
|
88
89
|
type: x.inputType === inputTypes_js_1.InputTypes.json
|
|
89
90
|
? 'json'
|
|
90
91
|
: x.valueType === Number
|
|
@@ -579,6 +579,7 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
579
579
|
case 0:
|
|
580
580
|
_b = (_a = dataApiFactory(c)).put;
|
|
581
581
|
_c = [res,
|
|
582
|
+
req,
|
|
582
583
|
reqInfo.params.id];
|
|
583
584
|
return [4 /*yield*/, this.coreOptions.getRequestBody(orig)];
|
|
584
585
|
case 1: return [2 /*return*/, _b.apply(_a, _c.concat([_d.sent()]))];
|
package/src/data-api.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Remult } from './context.js';
|
|
2
2
|
import { type ErrorInfo } from './data-interfaces.js';
|
|
3
3
|
import { type EntityMetadata, type FindOptions, type Repository } from './remult3/remult3.js';
|
|
4
|
-
import type { rowHelperImplementation } from './remult3/RepositoryImplementation.js';
|
|
5
4
|
export declare class DataApi<T = unknown> {
|
|
6
5
|
private repository;
|
|
7
6
|
private remult;
|
|
@@ -17,6 +16,7 @@ export declare class DataApi<T = unknown> {
|
|
|
17
16
|
get(response: DataApiResponse, id: any): Promise<void>;
|
|
18
17
|
count(response: DataApiResponse, request: DataApiRequest, body?: any): Promise<void>;
|
|
19
18
|
deleteMany(response: DataApiResponse, request: DataApiRequest, body?: any): Promise<void>;
|
|
19
|
+
private prepareWhereForManyOperation;
|
|
20
20
|
groupBy(request: DataApiRequest, body: any): Promise<import("./remult3/remult3.js").GroupByResult<T, any[], any[], any[], any[], any[], any[]>[]>;
|
|
21
21
|
getArrayImpl(request: DataApiRequest, body: any): Promise<{
|
|
22
22
|
r: any[];
|
|
@@ -33,11 +33,11 @@ export declare class DataApi<T = unknown> {
|
|
|
33
33
|
where?: any;
|
|
34
34
|
set?: any;
|
|
35
35
|
}): Promise<void>;
|
|
36
|
-
actualUpdate(row: any, body: any): Promise<
|
|
37
|
-
put(response: DataApiResponse, id: any, body: any): Promise<void>;
|
|
36
|
+
actualUpdate(row: any, body: any, req: DataApiRequest): Promise<any>;
|
|
37
|
+
put(response: DataApiResponse, req: DataApiRequest, id: any, body: any): Promise<void>;
|
|
38
38
|
actualDelete(row: any): Promise<void>;
|
|
39
39
|
delete(response: DataApiResponse, id: any): Promise<void>;
|
|
40
|
-
post(body: any): Promise<any>;
|
|
40
|
+
post(body: any, req: DataApiRequest): Promise<any>;
|
|
41
41
|
}
|
|
42
42
|
export interface DataApiResponse {
|
|
43
43
|
success(data: any): void;
|
package/src/data-api.js
CHANGED
|
@@ -99,7 +99,7 @@ var DataApi = /** @class */ (function () {
|
|
|
99
99
|
case 12: return [2 /*return*/, _e.apply(_d, [_h.sent()])];
|
|
100
100
|
case 13:
|
|
101
101
|
_g = (_f = res).created;
|
|
102
|
-
return [4 /*yield*/, this.post(body)];
|
|
102
|
+
return [4 /*yield*/, this.post(body, req)];
|
|
103
103
|
case 14: return [2 /*return*/, _g.apply(_f, [_h.sent()])];
|
|
104
104
|
case 15: return [3 /*break*/, 17];
|
|
105
105
|
case 16:
|
|
@@ -146,16 +146,16 @@ var DataApi = /** @class */ (function () {
|
|
|
146
146
|
r = _f.sent();
|
|
147
147
|
if (!(r.length == 0)) return [3 /*break*/, 6];
|
|
148
148
|
_b = (_a = result).push;
|
|
149
|
-
return [4 /*yield*/, this.post(tslib_1.__assign(tslib_1.__assign({}, item.where), item.set))];
|
|
149
|
+
return [4 /*yield*/, this.post(tslib_1.__assign(tslib_1.__assign({}, item.where), item.set), request)];
|
|
150
150
|
case 5:
|
|
151
151
|
_b.apply(_a, [_f.sent()]);
|
|
152
152
|
return [3 /*break*/, 9];
|
|
153
153
|
case 6:
|
|
154
154
|
if (!(item.set !== undefined)) return [3 /*break*/, 8];
|
|
155
155
|
_d = (_c = result).push;
|
|
156
|
-
return [4 /*yield*/, this.actualUpdate(r[0], item.set)];
|
|
156
|
+
return [4 /*yield*/, this.actualUpdate(r[0], item.set, request)];
|
|
157
157
|
case 7:
|
|
158
|
-
_d.apply(_c, [
|
|
158
|
+
_d.apply(_c, [_f.sent()]);
|
|
159
159
|
return [3 /*break*/, 9];
|
|
160
160
|
case 8:
|
|
161
161
|
result.push(this.repository.getEntityRef(r[0]).toApiJson());
|
|
@@ -282,10 +282,9 @@ var DataApi = /** @class */ (function () {
|
|
|
282
282
|
case 0:
|
|
283
283
|
_a.trys.push([0, 3, , 4]);
|
|
284
284
|
deleted_1 = 0;
|
|
285
|
-
return [4 /*yield*/, this.
|
|
285
|
+
return [4 /*yield*/, this.prepareWhereForManyOperation(body, request)];
|
|
286
286
|
case 1:
|
|
287
287
|
where_1 = _a.sent();
|
|
288
|
-
filter_interfaces_js_1.Filter.throwErrorIfFilterIsEmpty(where_1, 'deleteMany');
|
|
289
288
|
return [4 /*yield*/, (0, context_js_1.doTransaction)(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
290
289
|
var _a, _b, _c, x, e_2_1;
|
|
291
290
|
var _d, e_2, _e, _f;
|
|
@@ -346,6 +345,24 @@ var DataApi = /** @class */ (function () {
|
|
|
346
345
|
});
|
|
347
346
|
});
|
|
348
347
|
};
|
|
348
|
+
DataApi.prototype.prepareWhereForManyOperation = function (body, request) {
|
|
349
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
350
|
+
var where;
|
|
351
|
+
return tslib_1.__generator(this, function (_a) {
|
|
352
|
+
switch (_a.label) {
|
|
353
|
+
case 0:
|
|
354
|
+
where = undefined;
|
|
355
|
+
if (!((body === null || body === void 0 ? void 0 : body.where) !== 'all')) return [3 /*break*/, 2];
|
|
356
|
+
return [4 /*yield*/, this.buildWhere(request, body)];
|
|
357
|
+
case 1:
|
|
358
|
+
where = _a.sent();
|
|
359
|
+
filter_interfaces_js_1.Filter.throwErrorIfFilterIsEmpty(where, 'deleteMany');
|
|
360
|
+
_a.label = 2;
|
|
361
|
+
case 2: return [2 /*return*/, where];
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
};
|
|
349
366
|
DataApi.prototype.groupBy = function (request, body) {
|
|
350
367
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
351
368
|
var findOptions, orderBy, _a, _b, element, direction, group, result;
|
|
@@ -762,7 +779,7 @@ var DataApi = /** @class */ (function () {
|
|
|
762
779
|
return tslib_1.__generator(this, function (_a) {
|
|
763
780
|
action = request === null || request === void 0 ? void 0 : request.get('__action');
|
|
764
781
|
if (action == 'emptyId') {
|
|
765
|
-
return [2 /*return*/, this.put(response, '', body)];
|
|
782
|
+
return [2 /*return*/, this.put(response, request, '', body)];
|
|
766
783
|
}
|
|
767
784
|
return [2 /*return*/, this.updateManyImplementation(response, request, {
|
|
768
785
|
where: undefined,
|
|
@@ -779,10 +796,9 @@ var DataApi = /** @class */ (function () {
|
|
|
779
796
|
switch (_a.label) {
|
|
780
797
|
case 0:
|
|
781
798
|
_a.trys.push([0, 3, , 4]);
|
|
782
|
-
return [4 /*yield*/, this.
|
|
799
|
+
return [4 /*yield*/, this.prepareWhereForManyOperation(body, request)];
|
|
783
800
|
case 1:
|
|
784
801
|
where_2 = _a.sent();
|
|
785
|
-
filter_interfaces_js_1.Filter.throwErrorIfFilterIsEmpty(where_2, 'updateMany');
|
|
786
802
|
return [4 /*yield*/, (0, context_js_1.doTransaction)(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
787
803
|
var updated, _a, _b, _c, x, e_6_1;
|
|
788
804
|
var _d, e_6, _e, _f;
|
|
@@ -805,7 +821,7 @@ var DataApi = /** @class */ (function () {
|
|
|
805
821
|
_f = _c.value;
|
|
806
822
|
_a = false;
|
|
807
823
|
x = _f;
|
|
808
|
-
return [4 /*yield*/, this.actualUpdate(x, body.set)];
|
|
824
|
+
return [4 /*yield*/, this.actualUpdate(x, body.set, request)];
|
|
809
825
|
case 4:
|
|
810
826
|
_g.sent();
|
|
811
827
|
updated++;
|
|
@@ -846,9 +862,9 @@ var DataApi = /** @class */ (function () {
|
|
|
846
862
|
});
|
|
847
863
|
});
|
|
848
864
|
};
|
|
849
|
-
DataApi.prototype.actualUpdate = function (row, body) {
|
|
865
|
+
DataApi.prototype.actualUpdate = function (row, body, req) {
|
|
850
866
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
851
|
-
var ref;
|
|
867
|
+
var ref, options;
|
|
852
868
|
return tslib_1.__generator(this, function (_a) {
|
|
853
869
|
switch (_a.label) {
|
|
854
870
|
case 0:
|
|
@@ -859,31 +875,30 @@ var DataApi = /** @class */ (function () {
|
|
|
859
875
|
if (!ref.apiUpdateAllowed) {
|
|
860
876
|
throw new server_action_js_1.ForbiddenError();
|
|
861
877
|
}
|
|
862
|
-
|
|
878
|
+
options = req.get('_select') === 'none' ? { select: 'none' } : undefined;
|
|
879
|
+
return [4 /*yield*/, ref.save(options)];
|
|
863
880
|
case 2:
|
|
864
881
|
_a.sent();
|
|
865
|
-
|
|
882
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
883
|
+
return [2 /*return*/, undefined];
|
|
884
|
+
return [2 /*return*/, ref.toApiJson()];
|
|
866
885
|
}
|
|
867
886
|
});
|
|
868
887
|
});
|
|
869
888
|
};
|
|
870
|
-
DataApi.prototype.put = function (response, id, body) {
|
|
889
|
+
DataApi.prototype.put = function (response, req, id, body) {
|
|
871
890
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
872
891
|
var _this = this;
|
|
873
892
|
return tslib_1.__generator(this, function (_a) {
|
|
874
893
|
switch (_a.label) {
|
|
875
|
-
case 0: return [4 /*yield*/, this.doOnId(response, id, function (row) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
return [2 /*return*/];
|
|
884
|
-
}
|
|
885
|
-
});
|
|
886
|
-
}); })];
|
|
894
|
+
case 0: return [4 /*yield*/, this.doOnId(response, id, function (row) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var _a, _b; return tslib_1.__generator(this, function (_c) {
|
|
895
|
+
switch (_c.label) {
|
|
896
|
+
case 0:
|
|
897
|
+
_b = (_a = response).success;
|
|
898
|
+
return [4 /*yield*/, this.actualUpdate(row, body, req)];
|
|
899
|
+
case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()])];
|
|
900
|
+
}
|
|
901
|
+
}); }); })];
|
|
887
902
|
case 1:
|
|
888
903
|
_a.sent();
|
|
889
904
|
return [2 /*return*/];
|
|
@@ -930,13 +945,14 @@ var DataApi = /** @class */ (function () {
|
|
|
930
945
|
});
|
|
931
946
|
});
|
|
932
947
|
};
|
|
933
|
-
DataApi.prototype.post = function (body) {
|
|
948
|
+
DataApi.prototype.post = function (body, req) {
|
|
934
949
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
935
|
-
var insert, result_1;
|
|
950
|
+
var options, insert, result_1;
|
|
936
951
|
var _this = this;
|
|
937
952
|
return tslib_1.__generator(this, function (_a) {
|
|
938
953
|
switch (_a.label) {
|
|
939
954
|
case 0:
|
|
955
|
+
options = req.get('_select') === 'none' ? { select: 'none' } : undefined;
|
|
940
956
|
insert = function (what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
941
957
|
var newr;
|
|
942
958
|
return tslib_1.__generator(this, function (_a) {
|
|
@@ -949,9 +965,11 @@ var DataApi = /** @class */ (function () {
|
|
|
949
965
|
if (!this.repository.getEntityRef(newr).apiInsertAllowed) {
|
|
950
966
|
throw new server_action_js_1.ForbiddenError();
|
|
951
967
|
}
|
|
952
|
-
return [4 /*yield*/, this.repository.getEntityRef(newr).save()];
|
|
968
|
+
return [4 /*yield*/, this.repository.getEntityRef(newr).save(options)];
|
|
953
969
|
case 2:
|
|
954
970
|
_a.sent();
|
|
971
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
972
|
+
return [2 /*return*/, undefined];
|
|
955
973
|
return [2 /*return*/, this.repository.getEntityRef(newr).toApiJson()];
|
|
956
974
|
}
|
|
957
975
|
});
|
package/src/data-interfaces.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FieldMetadata } from '../index.js';
|
|
2
2
|
import type { Filter } from './filter/filter-interfaces.js';
|
|
3
|
-
import type { GroupByOperators, EntityMetadata, MembersOnly } from './remult3/remult3.js';
|
|
3
|
+
import type { GroupByOperators, EntityMetadata, MembersOnly, InsertOrUpdateOptions } from './remult3/remult3.js';
|
|
4
4
|
import { Sort } from './sort.js';
|
|
5
5
|
export interface DataProvider {
|
|
6
6
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
@@ -28,14 +28,14 @@ export interface EntityDataProvider {
|
|
|
28
28
|
count(where: Filter): Promise<number>;
|
|
29
29
|
find(options?: EntityDataProviderFindOptions): Promise<Array<any>>;
|
|
30
30
|
groupBy(options?: EntityDataProviderGroupByOptions): Promise<any[]>;
|
|
31
|
-
update(id: any, data: any): Promise<any>;
|
|
31
|
+
update(id: any, data: any, options?: InsertOrUpdateOptions): Promise<any>;
|
|
32
32
|
delete(id: any): Promise<void>;
|
|
33
|
-
insert(data: any): Promise<any>;
|
|
33
|
+
insert(data: any, options?: InsertOrUpdateOptions): Promise<any>;
|
|
34
34
|
}
|
|
35
35
|
export interface ProxyEntityDataProvider {
|
|
36
|
-
insertMany(data: any[]): Promise<any[]>;
|
|
37
|
-
deleteMany(where: Filter): Promise<number>;
|
|
38
|
-
updateMany(where: Filter, data: any): Promise<number>;
|
|
36
|
+
insertMany(data: any[], options?: InsertOrUpdateOptions): Promise<any[]>;
|
|
37
|
+
deleteMany(where: Filter | 'all'): Promise<number>;
|
|
38
|
+
updateMany(where: Filter | 'all', data: any): Promise<number>;
|
|
39
39
|
query(options: EntityDataProviderFindOptions, aggregateOptions: EntityDataProviderGroupByOptions): Promise<{
|
|
40
40
|
items: any[];
|
|
41
41
|
aggregates: any;
|
|
@@ -2,7 +2,7 @@ import type { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions
|
|
|
2
2
|
import { UrlBuilder } from '../../urlBuilder.js';
|
|
3
3
|
import type { ApiClient } from '../context.js';
|
|
4
4
|
import { Filter } from '../filter/filter-interfaces.js';
|
|
5
|
-
import type { EntityMetadata } from '../remult3/remult3.js';
|
|
5
|
+
import type { EntityMetadata, InsertOrUpdateOptions } from '../remult3/remult3.js';
|
|
6
6
|
export declare class RestDataProvider implements DataProvider {
|
|
7
7
|
private apiProvider;
|
|
8
8
|
private entityRequested?;
|
|
@@ -33,11 +33,11 @@ export declare class RestEntityDataProvider implements EntityDataProvider, Proxy
|
|
|
33
33
|
set: any;
|
|
34
34
|
}[]): Promise<any[]>;
|
|
35
35
|
find(options?: EntityDataProviderFindOptions): Promise<Array<any>>;
|
|
36
|
-
update(id: any, data: any): Promise<any>;
|
|
36
|
+
update(id: any, data: any, options?: InsertOrUpdateOptions): Promise<any>;
|
|
37
37
|
private toJsonOfIncludedKeys;
|
|
38
38
|
delete(id: any): Promise<void>;
|
|
39
|
-
insert(data: any): Promise<any>;
|
|
40
|
-
insertMany(data: any[]): Promise<any[]>;
|
|
39
|
+
insert(data: any, options?: InsertOrUpdateOptions): Promise<any>;
|
|
40
|
+
insertMany(data: any[], options?: InsertOrUpdateOptions): Promise<any[]>;
|
|
41
41
|
}
|
|
42
42
|
export declare function addFilterToUrlAndReturnTrueIfSuccessful(filter: any, url: UrlBuilder): boolean;
|
|
43
43
|
export declare const liveQueryAction = "liveQuery-";
|
|
@@ -287,37 +287,42 @@ var RestEntityDataProvider = /** @class */ (function () {
|
|
|
287
287
|
var url = new urlBuilder_js_1.UrlBuilder(this.url());
|
|
288
288
|
var filterObject;
|
|
289
289
|
if (options) {
|
|
290
|
-
if (options.where) {
|
|
291
|
-
filterObject =
|
|
292
|
-
if (options.args === undefined)
|
|
293
|
-
if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url))
|
|
294
|
-
filterObject = undefined;
|
|
290
|
+
if (options.where === 'all') {
|
|
291
|
+
filterObject = 'all';
|
|
295
292
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
293
|
+
else {
|
|
294
|
+
if (options.where) {
|
|
295
|
+
filterObject = options.where.toJson();
|
|
296
|
+
if (options.args === undefined)
|
|
297
|
+
if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url))
|
|
298
|
+
filterObject = undefined;
|
|
299
|
+
}
|
|
300
|
+
if (options.orderBy && options.orderBy.Segments) {
|
|
301
|
+
var sort_1 = '';
|
|
302
|
+
var order_1 = '';
|
|
303
|
+
var hasDescending_1 = false;
|
|
304
|
+
options.orderBy.Segments.forEach(function (c) {
|
|
305
|
+
if (sort_1.length > 0) {
|
|
306
|
+
sort_1 += ',';
|
|
307
|
+
order_1 += ',';
|
|
308
|
+
}
|
|
309
|
+
sort_1 += c.field.key;
|
|
310
|
+
order_1 += c.isDescending ? 'desc' : 'asc';
|
|
311
|
+
if (c.isDescending)
|
|
312
|
+
hasDescending_1 = true;
|
|
313
|
+
});
|
|
314
|
+
if (sort_1)
|
|
315
|
+
url.add('_sort', sort_1);
|
|
316
|
+
if (hasDescending_1)
|
|
317
|
+
url.add('_order', order_1);
|
|
318
|
+
}
|
|
319
|
+
if (options.limit)
|
|
320
|
+
url.add('_limit', options.limit);
|
|
321
|
+
if (options.page)
|
|
322
|
+
url.add('_page', options.page);
|
|
323
|
+
if (options.select) {
|
|
324
|
+
url.add('_select', options.select.join(','));
|
|
325
|
+
}
|
|
321
326
|
}
|
|
322
327
|
}
|
|
323
328
|
var run = function (action, body) {
|
|
@@ -334,7 +339,7 @@ var RestEntityDataProvider = /** @class */ (function () {
|
|
|
334
339
|
else
|
|
335
340
|
body = tslib_1.__assign(tslib_1.__assign({}, body), { where: filterObject });
|
|
336
341
|
}
|
|
337
|
-
if (options
|
|
342
|
+
if (options && 'args' in options)
|
|
338
343
|
body.args = options.args;
|
|
339
344
|
if (body && method != 'put')
|
|
340
345
|
return _this.http().post(u.url, body);
|
|
@@ -370,11 +375,17 @@ var RestEntityDataProvider = /** @class */ (function () {
|
|
|
370
375
|
}); },
|
|
371
376
|
};
|
|
372
377
|
};
|
|
373
|
-
RestEntityDataProvider.prototype.update = function (id, data) {
|
|
378
|
+
RestEntityDataProvider.prototype.update = function (id, data, options) {
|
|
374
379
|
var _this = this;
|
|
380
|
+
var urlArgs = [];
|
|
381
|
+
if (id == '')
|
|
382
|
+
urlArgs.push('__action=emptyId');
|
|
383
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
384
|
+
urlArgs.push('_select=$none');
|
|
375
385
|
return this.http()
|
|
376
386
|
.put(this.url() +
|
|
377
|
-
(id != '' ? '/' + encodeURIComponent(id) : '
|
|
387
|
+
(id != '' ? '/' + encodeURIComponent(id) : '') +
|
|
388
|
+
(urlArgs.length > 0 ? '?' + urlArgs.join('&') : ''), this.toJsonOfIncludedKeys(data))
|
|
378
389
|
.then(function (y) { return _this.translateFromJson(y); });
|
|
379
390
|
};
|
|
380
391
|
RestEntityDataProvider.prototype.toJsonOfIncludedKeys = function (data) {
|
|
@@ -413,16 +424,16 @@ var RestEntityDataProvider = /** @class */ (function () {
|
|
|
413
424
|
});
|
|
414
425
|
});
|
|
415
426
|
};
|
|
416
|
-
RestEntityDataProvider.prototype.insert = function (data) {
|
|
427
|
+
RestEntityDataProvider.prototype.insert = function (data, options) {
|
|
417
428
|
var _this = this;
|
|
418
429
|
return this.http()
|
|
419
|
-
.post(this.url(), this.translateToJson(data))
|
|
430
|
+
.post(this.url() + ((options === null || options === void 0 ? void 0 : options.select) === 'none' ? '?_select=$none' : ''), this.translateToJson(data))
|
|
420
431
|
.then(function (y) { return _this.translateFromJson(y); });
|
|
421
432
|
};
|
|
422
|
-
RestEntityDataProvider.prototype.insertMany = function (data) {
|
|
433
|
+
RestEntityDataProvider.prototype.insertMany = function (data, options) {
|
|
423
434
|
var _this = this;
|
|
424
435
|
return this.http()
|
|
425
|
-
.post(this.url(), data.map(function (data) { return _this.translateToJson(data); }))
|
|
436
|
+
.post(this.url() + ((options === null || options === void 0 ? void 0 : options.select) === 'none' ? '?_select=$none' : ''), data.map(function (data) { return _this.translateToJson(data); }))
|
|
426
437
|
.then(function (y) { return y.map(function (y) { return _this.translateFromJson(y); }); });
|
|
427
438
|
};
|
|
428
439
|
return RestEntityDataProvider;
|
|
@@ -601,7 +601,7 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
601
601
|
});
|
|
602
602
|
});
|
|
603
603
|
};
|
|
604
|
-
ActualSQLEntityDataProvider.prototype.update = function (id, data) {
|
|
604
|
+
ActualSQLEntityDataProvider.prototype.update = function (id, data, options) {
|
|
605
605
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
606
606
|
var e, r, statement, added, _a, _b, x, v, idFilter, f, _c, _d, colKeys, select, returning;
|
|
607
607
|
var e_5, _e;
|
|
@@ -651,6 +651,8 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
651
651
|
returning = true;
|
|
652
652
|
if (this.sql._getSourceSql().doesNotSupportReturningSyntax)
|
|
653
653
|
returning = false;
|
|
654
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
655
|
+
returning = false;
|
|
654
656
|
if (returning &&
|
|
655
657
|
this.sql._getSourceSql().doesNotSupportReturningSyntaxOnlyForUpdate)
|
|
656
658
|
returning = false;
|
|
@@ -660,6 +662,8 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
660
662
|
var _a, _b;
|
|
661
663
|
(_b = (_a = _this.sql._getSourceSql()).afterMutation) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
662
664
|
if (!returning) {
|
|
665
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
666
|
+
return undefined;
|
|
663
667
|
return getRowAfterUpdate(_this.entity, _this, data, id, 'update');
|
|
664
668
|
}
|
|
665
669
|
if (sqlResult.rows.length != 1)
|
|
@@ -698,7 +702,7 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
698
702
|
});
|
|
699
703
|
});
|
|
700
704
|
};
|
|
701
|
-
ActualSQLEntityDataProvider.prototype.insert = function (data) {
|
|
705
|
+
ActualSQLEntityDataProvider.prototype.insert = function (data, options) {
|
|
702
706
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
703
707
|
var e, r, cols, vals, added, _a, _b, x, v, statement, _c, colKeys, select;
|
|
704
708
|
var e_6, _d;
|
|
@@ -743,7 +747,8 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
743
747
|
return [4 /*yield*/, this.buildSelect(e, r, undefined, undefined)];
|
|
744
748
|
case 2:
|
|
745
749
|
_c = _e.sent(), colKeys = _c.colKeys, select = _c.select;
|
|
746
|
-
if (!this.sql._getSourceSql().doesNotSupportReturningSyntax
|
|
750
|
+
if (!this.sql._getSourceSql().doesNotSupportReturningSyntax &&
|
|
751
|
+
!((options === null || options === void 0 ? void 0 : options.select) === 'none'))
|
|
747
752
|
statement += ' returning ' + select;
|
|
748
753
|
return [4 /*yield*/, r.execute(statement).then(function (sql) {
|
|
749
754
|
var _a, _b;
|
|
@@ -754,6 +759,8 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
754
759
|
if (typeof id_1 !== 'number')
|
|
755
760
|
throw new Error('Auto increment, for a database that is does not support returning syntax, should return an array with the single last added id. Instead it returned: ' +
|
|
756
761
|
JSON.stringify(id_1));
|
|
762
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
763
|
+
return undefined;
|
|
757
764
|
return _this.find({
|
|
758
765
|
where: new filter_interfaces_js_1.Filter(function (x) {
|
|
759
766
|
return x.isEqualTo(_this.entity.idMetadata.field, id_1);
|
|
@@ -761,9 +768,13 @@ var ActualSQLEntityDataProvider = /** @class */ (function () {
|
|
|
761
768
|
}).then(function (r) { return r[0]; });
|
|
762
769
|
}
|
|
763
770
|
else {
|
|
771
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
772
|
+
return undefined;
|
|
764
773
|
return getRowAfterUpdate(_this.entity, _this, data, undefined, 'insert');
|
|
765
774
|
}
|
|
766
775
|
}
|
|
776
|
+
if ((options === null || options === void 0 ? void 0 : options.select) === 'none')
|
|
777
|
+
return undefined;
|
|
767
778
|
return _this.buildResultRow(colKeys, sql.rows[0], sql);
|
|
768
779
|
})];
|
|
769
780
|
case 3: return [2 /*return*/, _e.sent()];
|
package/src/remult-proxy.js
CHANGED
|
@@ -195,11 +195,11 @@ var RemultProxy = /** @class */ (function () {
|
|
|
195
195
|
.repo.apply(_b, tslib_1.__spreadArray([], tslib_1.__read(args), false)))
|
|
196
196
|
.getEntityRef.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(args2), false));
|
|
197
197
|
},
|
|
198
|
-
_a.insert = function (args2) {
|
|
198
|
+
_a.insert = function (args2, args3) {
|
|
199
199
|
var _a;
|
|
200
200
|
return (_a = self
|
|
201
201
|
.remultFactory())
|
|
202
|
-
.repo.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(args), false)).insert(args2);
|
|
202
|
+
.repo.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(args), false)).insert(args2, args3);
|
|
203
203
|
},
|
|
204
204
|
_a.liveQuery = function () {
|
|
205
205
|
var _a, _b;
|
|
@@ -238,11 +238,11 @@ var RemultProxy = /** @class */ (function () {
|
|
|
238
238
|
.remultFactory())
|
|
239
239
|
.repo.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(args), false)).upsert(args2);
|
|
240
240
|
},
|
|
241
|
-
_a.update = function (a, b) {
|
|
241
|
+
_a.update = function (a, b, c) {
|
|
242
242
|
var _a;
|
|
243
243
|
return (_a = self
|
|
244
244
|
.remultFactory())
|
|
245
|
-
.repo.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(args), false)).update(a, b);
|
|
245
|
+
.repo.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(args), false)).update(a, b, c);
|
|
246
246
|
},
|
|
247
247
|
_a);
|
|
248
248
|
entityCache.set(args[1], result);
|
|
@@ -5,8 +5,8 @@ import { Remult } from '../context.js';
|
|
|
5
5
|
import type { EntityOptions } from '../entity.js';
|
|
6
6
|
import { Filter } from '../filter/filter-interfaces.js';
|
|
7
7
|
import { type GroupByOptions, type GroupByResult, type ControllerRef, type ControllerRefForControllerBase, type EntityFilter, type EntityMetadata, type EntityOrderBy, type EntityRef, type EntityRefForEntityBase, type FieldRef, type FieldsMetadata, type FieldsRef, type FieldsRefForEntityBase, type FindFirstOptions, type FindFirstOptionsBase, type FindOptions, type IdMetadata, type LiveQuery, type LoadOptions, type MembersOnly, type NumericKeys, type Repository, type RepositoryRelations, type idType } from './remult3.js';
|
|
8
|
-
import type { QueryOptions, RefSubscriber, UpsertOptions } from './remult3.js';
|
|
9
|
-
import type { entityEventListener } from '../__EntityValueProvider.js';
|
|
8
|
+
import type { InsertOrUpdateOptions, QueryOptions, RefSubscriber, UpsertOptions } from './remult3.js';
|
|
9
|
+
import type { entityEventListener, packedRowInfo } from '../__EntityValueProvider.js';
|
|
10
10
|
import { type DataProvider, type EntityDataProvider, type EntityDataProviderGroupByOptions, type EntityDataProviderFindOptions, type ErrorInfo, EntityError } from '../data-interfaces.js';
|
|
11
11
|
import type { Unsubscribe } from '../live-query/SubscriptionChannel.js';
|
|
12
12
|
import { RelationLoader } from './relation-loader.js';
|
|
@@ -50,8 +50,8 @@ export declare class RepositoryImplementation<entityType> implements Repository<
|
|
|
50
50
|
delete(id: idType<entityType>): Promise<void>;
|
|
51
51
|
delete(item: Partial<MembersOnly<entityType>>): Promise<void>;
|
|
52
52
|
__cleanupPartialObject(item: Partial<MembersOnly<entityType>>): void;
|
|
53
|
-
insert(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
|
|
54
|
-
insert(item: Partial<MembersOnly<entityType
|
|
53
|
+
insert(item: Partial<MembersOnly<entityType>>[], options?: InsertOrUpdateOptions): Promise<entityType[]>;
|
|
54
|
+
insert(item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
55
55
|
get fields(): FieldsMetadata<entityType>;
|
|
56
56
|
validate(entity: Partial<MembersOnly<entityType>>, ...fields: Extract<keyof MembersOnly<entityType>, string>[]): Promise<ErrorInfo<entityType> | undefined>;
|
|
57
57
|
private __createDto;
|
|
@@ -59,8 +59,8 @@ export declare class RepositoryImplementation<entityType> implements Repository<
|
|
|
59
59
|
where: EntityFilter<entityType>;
|
|
60
60
|
set: Partial<MembersOnly<entityType>>;
|
|
61
61
|
}): Promise<number>;
|
|
62
|
-
update(id: idType<entityType>, item: Partial<MembersOnly<entityType
|
|
63
|
-
update(originalItem: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType
|
|
62
|
+
update(id: idType<entityType>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
63
|
+
update(originalItem: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
64
64
|
upsert(options: UpsertOptions<entityType>[]): Promise<entityType[]>;
|
|
65
65
|
upsert(options: UpsertOptions<entityType>): Promise<entityType>;
|
|
66
66
|
private _getRefForExistingRow;
|
|
@@ -136,6 +136,7 @@ export declare class rowHelperImplementation<T> extends rowHelperBase<T> impleme
|
|
|
136
136
|
private repo;
|
|
137
137
|
private edp;
|
|
138
138
|
private _isNew;
|
|
139
|
+
_updateResultsFromServerAction(rowInfo: packedRowInfo): Promise<void>;
|
|
139
140
|
constructor(info: EntityFullInfo<T>, instance: T, repo: RepositoryImplementation<T>, edp: EntityDataProvider, remult: Remult, _isNew: boolean, excludeRelationMembers?: Set<string>);
|
|
140
141
|
repository: Repository<unknown>;
|
|
141
142
|
clone(): T;
|
|
@@ -153,7 +154,7 @@ export declare class rowHelperImplementation<T> extends rowHelperBase<T> impleme
|
|
|
153
154
|
private _columns?;
|
|
154
155
|
get fields(): FieldsRef<T>;
|
|
155
156
|
private _saving;
|
|
156
|
-
save(onlyTheseFieldsSentOnlyInTheCaseOfProxySaveWithPartialObject?: string[]): Promise<T>;
|
|
157
|
+
save(options: InsertOrUpdateOptions | undefined, onlyTheseFieldsSentOnlyInTheCaseOfProxySaveWithPartialObject?: string[]): Promise<T>;
|
|
157
158
|
processInsertResponseDto(updatedRow: any): Promise<T>;
|
|
158
159
|
buildDtoForInsert(): Promise<any>;
|
|
159
160
|
private buildLifeCycleEvent;
|