remult 0.23.3 → 0.23.5
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/expressBridge.js +39 -43
- package/esm/src/data-api.d.ts +1 -0
- package/esm/src/data-api.js +15 -1
- package/esm/src/filter/filter-interfaces.d.ts +1 -1
- package/esm/src/filter/filter-interfaces.js +13 -2
- package/esm/src/remult3/RepositoryImplementation.js +22 -13
- package/esm/src/remult3/remult3.js +3 -2
- package/package.json +1 -1
- package/server/expressBridge.js +89 -94
- package/src/data-api.d.ts +1 -0
- package/src/data-api.js +31 -6
- package/src/filter/filter-interfaces.d.ts +1 -1
- package/src/filter/filter-interfaces.js +13 -2
- package/src/remult3/RepositoryImplementation.js +22 -13
- package/src/remult3/remult3.js +3 -2
|
@@ -31,43 +31,6 @@ export function createRemultServerCore(options, serverCoreOptions) {
|
|
|
31
31
|
if (options.ensureSchema === undefined)
|
|
32
32
|
options.ensureSchema = true;
|
|
33
33
|
RemultAsyncLocalStorage.enable();
|
|
34
|
-
const entitiesMetaData = [];
|
|
35
|
-
dataProvider = dataProvider.then(async (dp) => {
|
|
36
|
-
var remult = new Remult(dp);
|
|
37
|
-
await new Promise((res) => {
|
|
38
|
-
RemultAsyncLocalStorage.instance.run(remult, async () => {
|
|
39
|
-
if (options.ensureSchema) {
|
|
40
|
-
let started = false;
|
|
41
|
-
const startConsoleLog = () => {
|
|
42
|
-
if (started)
|
|
43
|
-
return;
|
|
44
|
-
started = true;
|
|
45
|
-
console.time('Schema ensured');
|
|
46
|
-
};
|
|
47
|
-
entitiesMetaData.push(...options.entities.map((e) => remult.repo(e).metadata));
|
|
48
|
-
if (dp.ensureSchema) {
|
|
49
|
-
startConsoleLog();
|
|
50
|
-
await dp.ensureSchema(entitiesMetaData);
|
|
51
|
-
}
|
|
52
|
-
for (const item of [
|
|
53
|
-
options.liveQueryStorage,
|
|
54
|
-
options.queueStorage,
|
|
55
|
-
]) {
|
|
56
|
-
if (item?.ensureSchema) {
|
|
57
|
-
startConsoleLog();
|
|
58
|
-
await item.ensureSchema();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (started)
|
|
62
|
-
console.timeEnd('Schema ensured');
|
|
63
|
-
}
|
|
64
|
-
if (options.initApi)
|
|
65
|
-
await options.initApi(remult);
|
|
66
|
-
res({});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
return dp;
|
|
70
|
-
});
|
|
71
34
|
{
|
|
72
35
|
let allControllers = [];
|
|
73
36
|
if (!options.entities)
|
|
@@ -81,7 +44,7 @@ export function createRemultServerCore(options, serverCoreOptions) {
|
|
|
81
44
|
if (options.rootPath === undefined)
|
|
82
45
|
options.rootPath = '/api';
|
|
83
46
|
actionInfo.runningOnServer = true;
|
|
84
|
-
let bridge = new RemultServerImplementation(new inProcessQueueHandler(options.queueStorage), options, dataProvider, serverCoreOptions
|
|
47
|
+
let bridge = new RemultServerImplementation(new inProcessQueueHandler(options.queueStorage), options, dataProvider, serverCoreOptions);
|
|
85
48
|
return bridge;
|
|
86
49
|
}
|
|
87
50
|
/* @internal*/
|
|
@@ -90,18 +53,50 @@ export class RemultServerImplementation {
|
|
|
90
53
|
options;
|
|
91
54
|
dataProvider;
|
|
92
55
|
coreOptions;
|
|
93
|
-
entitiesMetaData;
|
|
94
56
|
liveQueryStorage = new InMemoryLiveQueryStorage();
|
|
95
|
-
constructor(queue, options, dataProvider, coreOptions
|
|
57
|
+
constructor(queue, options, dataProvider, coreOptions) {
|
|
96
58
|
this.queue = queue;
|
|
97
59
|
this.options = options;
|
|
98
60
|
this.dataProvider = dataProvider;
|
|
99
61
|
this.coreOptions = coreOptions;
|
|
100
|
-
this.entitiesMetaData = entitiesMetaData;
|
|
101
62
|
if (options.liveQueryStorage)
|
|
102
63
|
this.liveQueryStorage = options.liveQueryStorage;
|
|
103
64
|
if (options.subscriptionServer)
|
|
104
65
|
this.subscriptionServer = options.subscriptionServer;
|
|
66
|
+
const entitiesMetaData = [];
|
|
67
|
+
this.dataProvider = dataProvider.then(async (dp) => {
|
|
68
|
+
await this.runWithRemult(async (remult) => {
|
|
69
|
+
remult.dataProvider = dp;
|
|
70
|
+
if (options.ensureSchema) {
|
|
71
|
+
let started = false;
|
|
72
|
+
const startConsoleLog = () => {
|
|
73
|
+
if (started)
|
|
74
|
+
return;
|
|
75
|
+
started = true;
|
|
76
|
+
console.time('Schema ensured');
|
|
77
|
+
};
|
|
78
|
+
entitiesMetaData.push(...options.entities.map((e) => remult.repo(e).metadata));
|
|
79
|
+
if (dp.ensureSchema) {
|
|
80
|
+
startConsoleLog();
|
|
81
|
+
await dp.ensureSchema(entitiesMetaData);
|
|
82
|
+
}
|
|
83
|
+
for (const item of [
|
|
84
|
+
options.liveQueryStorage,
|
|
85
|
+
options.queueStorage,
|
|
86
|
+
]) {
|
|
87
|
+
if (item?.ensureSchema) {
|
|
88
|
+
startConsoleLog();
|
|
89
|
+
await item.ensureSchema();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (started)
|
|
93
|
+
console.timeEnd('Schema ensured');
|
|
94
|
+
}
|
|
95
|
+
if (options.initApi)
|
|
96
|
+
await options.initApi(remult);
|
|
97
|
+
}, { skipDataProvider: true });
|
|
98
|
+
return dp;
|
|
99
|
+
});
|
|
105
100
|
}
|
|
106
101
|
withRemultPromise(request, what) {
|
|
107
102
|
return new Promise((resolve, error) => {
|
|
@@ -250,10 +245,11 @@ export class RemultServerImplementation {
|
|
|
250
245
|
.delete(this.process(async (c, req, res, orig) => dataApiFactory(c).delete(res, orig.params.id)));
|
|
251
246
|
}
|
|
252
247
|
//runs with remult but without init request
|
|
253
|
-
async runWithRemult(what) {
|
|
248
|
+
async runWithRemult(what, options) {
|
|
254
249
|
let remult = new Remult();
|
|
255
250
|
remult.liveQueryPublisher = new LiveQueryPublisher(() => remult.subscriptionServer, () => remult.liveQueryStorage, this.runWithSerializedJsonContextData);
|
|
256
|
-
|
|
251
|
+
if (!options?.skipDataProvider)
|
|
252
|
+
remult.dataProvider = await this.dataProvider;
|
|
257
253
|
remult.subscriptionServer = this.subscriptionServer;
|
|
258
254
|
remult.liveQueryStorage = this.liveQueryStorage;
|
|
259
255
|
await new Promise((res) => {
|
package/esm/src/data-api.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare class DataApi<T = any> {
|
|
|
14
14
|
r: any[];
|
|
15
15
|
findOptions: FindOptions<T>;
|
|
16
16
|
}>;
|
|
17
|
+
private includeNone;
|
|
17
18
|
getArray(response: DataApiResponse, request: DataApiRequest, filterBody?: any): Promise<void>;
|
|
18
19
|
liveQuery(response: DataApiResponse, request: DataApiRequest, filterBody: any, serializeContext: () => Promise<any>, queryChannel: string): Promise<void>;
|
|
19
20
|
private buildWhere;
|
package/esm/src/data-api.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getRelationInfo } from '../internals';
|
|
1
2
|
import { doTransaction } from './context';
|
|
2
3
|
import { findOptionsToJson, liveQueryAction, } from './data-providers/rest-data-provider';
|
|
3
4
|
import { Filter, buildFilterFromRequestParameters, customUrlToken, } from './filter/filter-interfaces';
|
|
@@ -60,7 +61,10 @@ export class DataApi {
|
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
async getArrayImpl(response, request, filterBody) {
|
|
63
|
-
let findOptions = {
|
|
64
|
+
let findOptions = {
|
|
65
|
+
load: () => [],
|
|
66
|
+
include: this.includeNone(),
|
|
67
|
+
};
|
|
64
68
|
findOptions.where = await this.buildWhere(request, filterBody);
|
|
65
69
|
if (request) {
|
|
66
70
|
let sort = request.get('_sort');
|
|
@@ -111,6 +115,15 @@ export class DataApi {
|
|
|
111
115
|
});
|
|
112
116
|
return { r, findOptions };
|
|
113
117
|
}
|
|
118
|
+
includeNone() {
|
|
119
|
+
let include = {};
|
|
120
|
+
for (const field of this.repository.metadata.fields) {
|
|
121
|
+
if (getRelationInfo(field.options)) {
|
|
122
|
+
include[field.key] = false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return include;
|
|
126
|
+
}
|
|
114
127
|
async getArray(response, request, filterBody) {
|
|
115
128
|
if (!this.repository.metadata.apiReadAllowed) {
|
|
116
129
|
response.forbidden();
|
|
@@ -191,6 +204,7 @@ export class DataApi {
|
|
|
191
204
|
await this.repository
|
|
192
205
|
.find({
|
|
193
206
|
where: { $and: where },
|
|
207
|
+
include: this.includeNone(),
|
|
194
208
|
})
|
|
195
209
|
.then(async (r) => {
|
|
196
210
|
if (r.length == 0)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Remult } from '../context';
|
|
1
2
|
import { getEntityRef, getEntitySettings } from '../remult3/getEntityRef';
|
|
2
3
|
import { getRelationInfo } from '../remult3/relationInfoMember';
|
|
3
4
|
export class Filter {
|
|
@@ -57,7 +58,7 @@ export class Filter {
|
|
|
57
58
|
: new filterHelper(field);
|
|
58
59
|
let found = false;
|
|
59
60
|
if (fieldToFilter !== undefined && fieldToFilter != null) {
|
|
60
|
-
if (fieldToFilter.$id)
|
|
61
|
+
if (fieldToFilter.$id !== undefined)
|
|
61
62
|
fieldToFilter = fieldToFilter.$id;
|
|
62
63
|
for (const key in fieldToFilter) {
|
|
63
64
|
if (Object.prototype.hasOwnProperty.call(fieldToFilter, key)) {
|
|
@@ -164,8 +165,18 @@ class filterHelper {
|
|
|
164
165
|
processVal(val) {
|
|
165
166
|
let ei = getEntitySettings(this.metadata.valueType, false);
|
|
166
167
|
if (ei) {
|
|
167
|
-
if (!val)
|
|
168
|
+
if (!val) {
|
|
169
|
+
if (val === null && !this.metadata.allowNull) {
|
|
170
|
+
const rel = getRelationInfo(this.metadata.options);
|
|
171
|
+
if (rel?.type === 'reference')
|
|
172
|
+
if (new Remult().repo(rel.toType()).metadata.idMetadata.field.options
|
|
173
|
+
.valueType === Number)
|
|
174
|
+
return 0;
|
|
175
|
+
else
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
168
178
|
return null;
|
|
179
|
+
}
|
|
169
180
|
if (typeof val === 'string' || typeof val === 'number')
|
|
170
181
|
return val;
|
|
171
182
|
return getEntityRef(val).getId();
|
|
@@ -1015,20 +1015,24 @@ class rowHelperBase {
|
|
|
1015
1015
|
val = lu.id;
|
|
1016
1016
|
else
|
|
1017
1017
|
val = this.instance[col.key];
|
|
1018
|
-
if (rel &&
|
|
1018
|
+
if (rel &&
|
|
1019
|
+
isNew &&
|
|
1020
|
+
!col.allowNull &&
|
|
1021
|
+
(val === undefined || val === null)) {
|
|
1019
1022
|
if (this.remult.repo(rel.toType()).metadata.idMetadata.field.valueType ===
|
|
1020
1023
|
Number)
|
|
1021
1024
|
val = 0;
|
|
1022
1025
|
else
|
|
1023
1026
|
val = '';
|
|
1024
1027
|
}
|
|
1025
|
-
if (
|
|
1026
|
-
val
|
|
1027
|
-
|
|
1028
|
-
val
|
|
1029
|
-
|
|
1030
|
-
|
|
1028
|
+
if (!rel || rel.type === 'reference') {
|
|
1029
|
+
if (val !== undefined) {
|
|
1030
|
+
val = col.valueConverter.toJson(val);
|
|
1031
|
+
if (val !== undefined && val !== null)
|
|
1032
|
+
val = col.valueConverter.fromJson(JSON.parse(JSON.stringify(val)));
|
|
1033
|
+
}
|
|
1031
1034
|
d[col.key] = val;
|
|
1035
|
+
}
|
|
1032
1036
|
}
|
|
1033
1037
|
return d;
|
|
1034
1038
|
}
|
|
@@ -1075,12 +1079,17 @@ class rowHelperBase {
|
|
|
1075
1079
|
else
|
|
1076
1080
|
val = lu.id;
|
|
1077
1081
|
else {
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1082
|
+
if (getRelationInfo(col) && !includeRelatedEntities) {
|
|
1083
|
+
disable = true;
|
|
1084
|
+
}
|
|
1085
|
+
else {
|
|
1086
|
+
val = this.instance[col.key];
|
|
1087
|
+
if (!this.remult) {
|
|
1088
|
+
if (val) {
|
|
1089
|
+
let eo = getEntitySettings(val.constructor, false);
|
|
1090
|
+
if (eo) {
|
|
1091
|
+
val = getEntityRef(val).getId();
|
|
1092
|
+
}
|
|
1084
1093
|
}
|
|
1085
1094
|
}
|
|
1086
1095
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//p1 -
|
|
2
|
+
//p1 - issue with relation that is allow null false, without a value - we set it to 0, but I couldn't filter on it using null! or using $id:0
|
|
3
|
+
//p1 - in tree like shape, got an error of circular json reference with parent folder and child folders
|
|
3
4
|
//p1 - sql-expression for knex
|
|
4
5
|
//p1 - postgres case sensitive
|
|
5
6
|
//p1 - filterToRaw should get a dbnames of - and we should create a dbnames of that supports an alias
|
|
@@ -18,7 +19,7 @@ request optional - and depends on that run `getUser` & `initRequest`
|
|
|
18
19
|
//p1 - add schema option to create postgres data provider
|
|
19
20
|
//p1 - find one i had a question about find first's different syntax from find that confused a user
|
|
20
21
|
//p1 - I think there should be a way to throw a forbidden exception
|
|
21
|
-
//
|
|
22
|
+
//p1 - Write some ctrl g
|
|
22
23
|
//y1 - get backend methods to work when specifying types for date, and entities as poco's
|
|
23
24
|
//y1 - required
|
|
24
25
|
//y1 - reconsider validators
|
package/package.json
CHANGED
package/server/expressBridge.js
CHANGED
|
@@ -15,7 +15,6 @@ var server_action_1 = require("../src/server-action");
|
|
|
15
15
|
var server_action_info_1 = require("../src/server-action-info");
|
|
16
16
|
var initDataProvider_1 = require("./initDataProvider");
|
|
17
17
|
function createRemultServerCore(options, serverCoreOptions) {
|
|
18
|
-
var _this = this;
|
|
19
18
|
if (!options) {
|
|
20
19
|
options = {};
|
|
21
20
|
}
|
|
@@ -35,89 +34,6 @@ function createRemultServerCore(options, serverCoreOptions) {
|
|
|
35
34
|
if (options.ensureSchema === undefined)
|
|
36
35
|
options.ensureSchema = true;
|
|
37
36
|
context_1.RemultAsyncLocalStorage.enable();
|
|
38
|
-
var entitiesMetaData = [];
|
|
39
|
-
dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
40
|
-
var remult;
|
|
41
|
-
var _this = this;
|
|
42
|
-
return tslib_1.__generator(this, function (_a) {
|
|
43
|
-
switch (_a.label) {
|
|
44
|
-
case 0:
|
|
45
|
-
remult = new context_1.Remult(dp);
|
|
46
|
-
return [4 /*yield*/, new Promise(function (res) {
|
|
47
|
-
context_1.RemultAsyncLocalStorage.instance.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
48
|
-
var started_1, startConsoleLog, _a, _b, item, e_1_1;
|
|
49
|
-
var e_1, _c;
|
|
50
|
-
return tslib_1.__generator(this, function (_d) {
|
|
51
|
-
switch (_d.label) {
|
|
52
|
-
case 0:
|
|
53
|
-
if (!options.ensureSchema) return [3 /*break*/, 10];
|
|
54
|
-
started_1 = false;
|
|
55
|
-
startConsoleLog = function () {
|
|
56
|
-
if (started_1)
|
|
57
|
-
return;
|
|
58
|
-
started_1 = true;
|
|
59
|
-
console.time('Schema ensured');
|
|
60
|
-
};
|
|
61
|
-
entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(options.entities.map(function (e) { return remult.repo(e).metadata; })), false));
|
|
62
|
-
if (!dp.ensureSchema) return [3 /*break*/, 2];
|
|
63
|
-
startConsoleLog();
|
|
64
|
-
return [4 /*yield*/, dp.ensureSchema(entitiesMetaData)];
|
|
65
|
-
case 1:
|
|
66
|
-
_d.sent();
|
|
67
|
-
_d.label = 2;
|
|
68
|
-
case 2:
|
|
69
|
-
_d.trys.push([2, 7, 8, 9]);
|
|
70
|
-
_a = tslib_1.__values([
|
|
71
|
-
options.liveQueryStorage,
|
|
72
|
-
options.queueStorage,
|
|
73
|
-
]), _b = _a.next();
|
|
74
|
-
_d.label = 3;
|
|
75
|
-
case 3:
|
|
76
|
-
if (!!_b.done) return [3 /*break*/, 6];
|
|
77
|
-
item = _b.value;
|
|
78
|
-
if (!(item === null || item === void 0 ? void 0 : item.ensureSchema)) return [3 /*break*/, 5];
|
|
79
|
-
startConsoleLog();
|
|
80
|
-
return [4 /*yield*/, item.ensureSchema()];
|
|
81
|
-
case 4:
|
|
82
|
-
_d.sent();
|
|
83
|
-
_d.label = 5;
|
|
84
|
-
case 5:
|
|
85
|
-
_b = _a.next();
|
|
86
|
-
return [3 /*break*/, 3];
|
|
87
|
-
case 6: return [3 /*break*/, 9];
|
|
88
|
-
case 7:
|
|
89
|
-
e_1_1 = _d.sent();
|
|
90
|
-
e_1 = { error: e_1_1 };
|
|
91
|
-
return [3 /*break*/, 9];
|
|
92
|
-
case 8:
|
|
93
|
-
try {
|
|
94
|
-
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
95
|
-
}
|
|
96
|
-
finally { if (e_1) throw e_1.error; }
|
|
97
|
-
return [7 /*endfinally*/];
|
|
98
|
-
case 9:
|
|
99
|
-
if (started_1)
|
|
100
|
-
console.timeEnd('Schema ensured');
|
|
101
|
-
_d.label = 10;
|
|
102
|
-
case 10:
|
|
103
|
-
if (!options.initApi) return [3 /*break*/, 12];
|
|
104
|
-
return [4 /*yield*/, options.initApi(remult)];
|
|
105
|
-
case 11:
|
|
106
|
-
_d.sent();
|
|
107
|
-
_d.label = 12;
|
|
108
|
-
case 12:
|
|
109
|
-
res({});
|
|
110
|
-
return [2 /*return*/];
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}); });
|
|
114
|
-
})];
|
|
115
|
-
case 1:
|
|
116
|
-
_a.sent();
|
|
117
|
-
return [2 /*return*/, dp];
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}); });
|
|
121
37
|
{
|
|
122
38
|
var allControllers = [];
|
|
123
39
|
if (!options.entities)
|
|
@@ -131,23 +47,22 @@ function createRemultServerCore(options, serverCoreOptions) {
|
|
|
131
47
|
if (options.rootPath === undefined)
|
|
132
48
|
options.rootPath = '/api';
|
|
133
49
|
server_action_info_1.actionInfo.runningOnServer = true;
|
|
134
|
-
var bridge = new RemultServerImplementation(new inProcessQueueHandler(options.queueStorage), options, dataProvider, serverCoreOptions
|
|
50
|
+
var bridge = new RemultServerImplementation(new inProcessQueueHandler(options.queueStorage), options, dataProvider, serverCoreOptions);
|
|
135
51
|
return bridge;
|
|
136
52
|
}
|
|
137
53
|
exports.createRemultServerCore = createRemultServerCore;
|
|
138
54
|
/* @internal*/
|
|
139
55
|
var RemultServerImplementation = /** @class */ (function () {
|
|
140
|
-
function RemultServerImplementation(queue, options, dataProvider, coreOptions
|
|
56
|
+
function RemultServerImplementation(queue, options, dataProvider, coreOptions) {
|
|
141
57
|
var _this = this;
|
|
142
58
|
this.queue = queue;
|
|
143
59
|
this.options = options;
|
|
144
60
|
this.dataProvider = dataProvider;
|
|
145
61
|
this.coreOptions = coreOptions;
|
|
146
|
-
this.entitiesMetaData = entitiesMetaData;
|
|
147
62
|
this.liveQueryStorage = new SubscriptionServer_1.InMemoryLiveQueryStorage();
|
|
148
63
|
this.runWithSerializedJsonContextData = function (jsonContextData, entityKey, what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
149
|
-
var _loop_1, this_1, _a, _b, e, state_1,
|
|
150
|
-
var
|
|
64
|
+
var _loop_1, this_1, _a, _b, e, state_1, e_1_1;
|
|
65
|
+
var e_1, _c;
|
|
151
66
|
var _this = this;
|
|
152
67
|
return tslib_1.__generator(this, function (_d) {
|
|
153
68
|
switch (_d.label) {
|
|
@@ -211,14 +126,14 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
211
126
|
return [3 /*break*/, 2];
|
|
212
127
|
case 5: return [3 /*break*/, 8];
|
|
213
128
|
case 6:
|
|
214
|
-
|
|
215
|
-
|
|
129
|
+
e_1_1 = _d.sent();
|
|
130
|
+
e_1 = { error: e_1_1 };
|
|
216
131
|
return [3 /*break*/, 8];
|
|
217
132
|
case 7:
|
|
218
133
|
try {
|
|
219
134
|
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
220
135
|
}
|
|
221
|
-
finally { if (
|
|
136
|
+
finally { if (e_1) throw e_1.error; }
|
|
222
137
|
return [7 /*endfinally*/];
|
|
223
138
|
case 8: throw new Error("Couldn't find entity " + entityKey);
|
|
224
139
|
}
|
|
@@ -240,6 +155,83 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
240
155
|
this.liveQueryStorage = options.liveQueryStorage;
|
|
241
156
|
if (options.subscriptionServer)
|
|
242
157
|
this.subscriptionServer = options.subscriptionServer;
|
|
158
|
+
var entitiesMetaData = [];
|
|
159
|
+
this.dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
160
|
+
var _this = this;
|
|
161
|
+
return tslib_1.__generator(this, function (_a) {
|
|
162
|
+
switch (_a.label) {
|
|
163
|
+
case 0: return [4 /*yield*/, this.runWithRemult(function (remult) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
164
|
+
var started_1, startConsoleLog, _a, _b, item, e_2_1;
|
|
165
|
+
var e_2, _c;
|
|
166
|
+
return tslib_1.__generator(this, function (_d) {
|
|
167
|
+
switch (_d.label) {
|
|
168
|
+
case 0:
|
|
169
|
+
remult.dataProvider = dp;
|
|
170
|
+
if (!options.ensureSchema) return [3 /*break*/, 10];
|
|
171
|
+
started_1 = false;
|
|
172
|
+
startConsoleLog = function () {
|
|
173
|
+
if (started_1)
|
|
174
|
+
return;
|
|
175
|
+
started_1 = true;
|
|
176
|
+
console.time('Schema ensured');
|
|
177
|
+
};
|
|
178
|
+
entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(options.entities.map(function (e) { return remult.repo(e).metadata; })), false));
|
|
179
|
+
if (!dp.ensureSchema) return [3 /*break*/, 2];
|
|
180
|
+
startConsoleLog();
|
|
181
|
+
return [4 /*yield*/, dp.ensureSchema(entitiesMetaData)];
|
|
182
|
+
case 1:
|
|
183
|
+
_d.sent();
|
|
184
|
+
_d.label = 2;
|
|
185
|
+
case 2:
|
|
186
|
+
_d.trys.push([2, 7, 8, 9]);
|
|
187
|
+
_a = tslib_1.__values([
|
|
188
|
+
options.liveQueryStorage,
|
|
189
|
+
options.queueStorage,
|
|
190
|
+
]), _b = _a.next();
|
|
191
|
+
_d.label = 3;
|
|
192
|
+
case 3:
|
|
193
|
+
if (!!_b.done) return [3 /*break*/, 6];
|
|
194
|
+
item = _b.value;
|
|
195
|
+
if (!(item === null || item === void 0 ? void 0 : item.ensureSchema)) return [3 /*break*/, 5];
|
|
196
|
+
startConsoleLog();
|
|
197
|
+
return [4 /*yield*/, item.ensureSchema()];
|
|
198
|
+
case 4:
|
|
199
|
+
_d.sent();
|
|
200
|
+
_d.label = 5;
|
|
201
|
+
case 5:
|
|
202
|
+
_b = _a.next();
|
|
203
|
+
return [3 /*break*/, 3];
|
|
204
|
+
case 6: return [3 /*break*/, 9];
|
|
205
|
+
case 7:
|
|
206
|
+
e_2_1 = _d.sent();
|
|
207
|
+
e_2 = { error: e_2_1 };
|
|
208
|
+
return [3 /*break*/, 9];
|
|
209
|
+
case 8:
|
|
210
|
+
try {
|
|
211
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
212
|
+
}
|
|
213
|
+
finally { if (e_2) throw e_2.error; }
|
|
214
|
+
return [7 /*endfinally*/];
|
|
215
|
+
case 9:
|
|
216
|
+
if (started_1)
|
|
217
|
+
console.timeEnd('Schema ensured');
|
|
218
|
+
_d.label = 10;
|
|
219
|
+
case 10:
|
|
220
|
+
if (!options.initApi) return [3 /*break*/, 12];
|
|
221
|
+
return [4 /*yield*/, options.initApi(remult)];
|
|
222
|
+
case 11:
|
|
223
|
+
_d.sent();
|
|
224
|
+
_d.label = 12;
|
|
225
|
+
case 12: return [2 /*return*/];
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}); }, { skipDataProvider: true })];
|
|
229
|
+
case 1:
|
|
230
|
+
_a.sent();
|
|
231
|
+
return [2 /*return*/, dp];
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}); });
|
|
243
235
|
}
|
|
244
236
|
RemultServerImplementation.prototype.withRemultPromise = function (request, what) {
|
|
245
237
|
var _this = this;
|
|
@@ -482,7 +474,7 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
482
474
|
}); }); }));
|
|
483
475
|
};
|
|
484
476
|
//runs with remult but without init request
|
|
485
|
-
RemultServerImplementation.prototype.runWithRemult = function (what) {
|
|
477
|
+
RemultServerImplementation.prototype.runWithRemult = function (what, options) {
|
|
486
478
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
487
479
|
var remult, _a;
|
|
488
480
|
var _this = this;
|
|
@@ -491,10 +483,13 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
491
483
|
case 0:
|
|
492
484
|
remult = new context_1.Remult();
|
|
493
485
|
remult.liveQueryPublisher = new SubscriptionServer_1.LiveQueryPublisher(function () { return remult.subscriptionServer; }, function () { return remult.liveQueryStorage; }, this.runWithSerializedJsonContextData);
|
|
486
|
+
if (!!(options === null || options === void 0 ? void 0 : options.skipDataProvider)) return [3 /*break*/, 2];
|
|
494
487
|
_a = remult;
|
|
495
488
|
return [4 /*yield*/, this.dataProvider];
|
|
496
489
|
case 1:
|
|
497
490
|
_a.dataProvider = _b.sent();
|
|
491
|
+
_b.label = 2;
|
|
492
|
+
case 2:
|
|
498
493
|
remult.subscriptionServer = this.subscriptionServer;
|
|
499
494
|
remult.liveQueryStorage = this.liveQueryStorage;
|
|
500
495
|
return [4 /*yield*/, new Promise(function (res) {
|
|
@@ -512,7 +507,7 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
512
507
|
});
|
|
513
508
|
}); });
|
|
514
509
|
})];
|
|
515
|
-
case
|
|
510
|
+
case 3:
|
|
516
511
|
_b.sent();
|
|
517
512
|
return [2 /*return*/];
|
|
518
513
|
}
|
package/src/data-api.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare class DataApi<T = any> {
|
|
|
14
14
|
r: any[];
|
|
15
15
|
findOptions: FindOptions<T>;
|
|
16
16
|
}>;
|
|
17
|
+
private includeNone;
|
|
17
18
|
getArray(response: DataApiResponse, request: DataApiRequest, filterBody?: any): Promise<void>;
|
|
18
19
|
liveQuery(response: DataApiResponse, request: DataApiRequest, filterBody: any, serializeContext: () => Promise<any>, queryChannel: string): Promise<void>;
|
|
19
20
|
private buildWhere;
|
package/src/data-api.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serializeError = exports.determineSort = exports.DataApi = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
+
var internals_1 = require("../internals");
|
|
5
6
|
var context_1 = require("./context");
|
|
6
7
|
var rest_data_provider_1 = require("./data-providers/rest-data-provider");
|
|
7
8
|
var filter_interfaces_1 = require("./filter/filter-interfaces");
|
|
@@ -109,7 +110,10 @@ var DataApi = /** @class */ (function () {
|
|
|
109
110
|
return tslib_1.__generator(this, function (_b) {
|
|
110
111
|
switch (_b.label) {
|
|
111
112
|
case 0:
|
|
112
|
-
findOptions = {
|
|
113
|
+
findOptions = {
|
|
114
|
+
load: function () { return []; },
|
|
115
|
+
include: this.includeNone(),
|
|
116
|
+
};
|
|
113
117
|
_a = findOptions;
|
|
114
118
|
return [4 /*yield*/, this.buildWhere(request, filterBody)];
|
|
115
119
|
case 1:
|
|
@@ -178,6 +182,26 @@ var DataApi = /** @class */ (function () {
|
|
|
178
182
|
});
|
|
179
183
|
});
|
|
180
184
|
};
|
|
185
|
+
DataApi.prototype.includeNone = function () {
|
|
186
|
+
var e_1, _a;
|
|
187
|
+
var include = {};
|
|
188
|
+
try {
|
|
189
|
+
for (var _b = tslib_1.__values(this.repository.metadata.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
190
|
+
var field = _c.value;
|
|
191
|
+
if ((0, internals_1.getRelationInfo)(field.options)) {
|
|
192
|
+
include[field.key] = false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
197
|
+
finally {
|
|
198
|
+
try {
|
|
199
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
200
|
+
}
|
|
201
|
+
finally { if (e_1) throw e_1.error; }
|
|
202
|
+
}
|
|
203
|
+
return include;
|
|
204
|
+
};
|
|
181
205
|
DataApi.prototype.getArray = function (response, request, filterBody) {
|
|
182
206
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
183
207
|
var r, err_2;
|
|
@@ -315,6 +339,7 @@ var DataApi = /** @class */ (function () {
|
|
|
315
339
|
case 3: return [4 /*yield*/, this.repository
|
|
316
340
|
.find({
|
|
317
341
|
where: { $and: where },
|
|
342
|
+
include: this.includeNone(),
|
|
318
343
|
})
|
|
319
344
|
.then(function (r) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
320
345
|
return tslib_1.__generator(this, function (_a) {
|
|
@@ -438,8 +463,8 @@ var DataApi = /** @class */ (function () {
|
|
|
438
463
|
if (!Array.isArray(body)) return [3 /*break*/, 2];
|
|
439
464
|
result_1 = [];
|
|
440
465
|
return [4 /*yield*/, (0, context_1.doTransaction)(this.remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
441
|
-
var body_1, body_1_1, item, _a, _b,
|
|
442
|
-
var
|
|
466
|
+
var body_1, body_1_1, item, _a, _b, e_2_1;
|
|
467
|
+
var e_2, _c;
|
|
443
468
|
return tslib_1.__generator(this, function (_d) {
|
|
444
469
|
switch (_d.label) {
|
|
445
470
|
case 0:
|
|
@@ -459,14 +484,14 @@ var DataApi = /** @class */ (function () {
|
|
|
459
484
|
return [3 /*break*/, 1];
|
|
460
485
|
case 4: return [3 /*break*/, 7];
|
|
461
486
|
case 5:
|
|
462
|
-
|
|
463
|
-
|
|
487
|
+
e_2_1 = _d.sent();
|
|
488
|
+
e_2 = { error: e_2_1 };
|
|
464
489
|
return [3 /*break*/, 7];
|
|
465
490
|
case 6:
|
|
466
491
|
try {
|
|
467
492
|
if (body_1_1 && !body_1_1.done && (_c = body_1.return)) _c.call(body_1);
|
|
468
493
|
}
|
|
469
|
-
finally { if (
|
|
494
|
+
finally { if (e_2) throw e_2.error; }
|
|
470
495
|
return [7 /*endfinally*/];
|
|
471
496
|
case 7: return [2 /*return*/];
|
|
472
497
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.__updateEntityBasedOnWhere = exports.buildFilterFromRequestParameters = exports.entityFilterToJson = exports.FilterSerializer = exports.customDatabaseFilterToken = exports.customUrlToken = exports.OrFilter = exports.AndFilter = exports.Filter = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
+
var context_1 = require("../context");
|
|
5
6
|
var getEntityRef_1 = require("../remult3/getEntityRef");
|
|
6
7
|
var relationInfoMember_1 = require("../remult3/relationInfoMember");
|
|
7
8
|
var Filter = /** @class */ (function () {
|
|
@@ -70,7 +71,7 @@ var Filter = /** @class */ (function () {
|
|
|
70
71
|
: new filterHelper(field);
|
|
71
72
|
var found = false;
|
|
72
73
|
if (fieldToFilter_1 !== undefined && fieldToFilter_1 != null) {
|
|
73
|
-
if (fieldToFilter_1.$id)
|
|
74
|
+
if (fieldToFilter_1.$id !== undefined)
|
|
74
75
|
fieldToFilter_1 = fieldToFilter_1.$id;
|
|
75
76
|
for (var key_1 in fieldToFilter_1) {
|
|
76
77
|
if (Object.prototype.hasOwnProperty.call(fieldToFilter_1, key_1)) {
|
|
@@ -215,8 +216,18 @@ var filterHelper = /** @class */ (function () {
|
|
|
215
216
|
filterHelper.prototype.processVal = function (val) {
|
|
216
217
|
var ei = (0, getEntityRef_1.getEntitySettings)(this.metadata.valueType, false);
|
|
217
218
|
if (ei) {
|
|
218
|
-
if (!val)
|
|
219
|
+
if (!val) {
|
|
220
|
+
if (val === null && !this.metadata.allowNull) {
|
|
221
|
+
var rel = (0, relationInfoMember_1.getRelationInfo)(this.metadata.options);
|
|
222
|
+
if ((rel === null || rel === void 0 ? void 0 : rel.type) === 'reference')
|
|
223
|
+
if (new context_1.Remult().repo(rel.toType()).metadata.idMetadata.field.options
|
|
224
|
+
.valueType === Number)
|
|
225
|
+
return 0;
|
|
226
|
+
else
|
|
227
|
+
return '';
|
|
228
|
+
}
|
|
219
229
|
return null;
|
|
230
|
+
}
|
|
220
231
|
if (typeof val === 'string' || typeof val === 'number')
|
|
221
232
|
return val;
|
|
222
233
|
return (0, getEntityRef_1.getEntityRef)(val).getId();
|
|
@@ -1571,20 +1571,24 @@ var rowHelperBase = /** @class */ (function () {
|
|
|
1571
1571
|
val = lu.id;
|
|
1572
1572
|
else
|
|
1573
1573
|
val = this.instance[col.key];
|
|
1574
|
-
if (rel &&
|
|
1574
|
+
if (rel &&
|
|
1575
|
+
isNew &&
|
|
1576
|
+
!col.allowNull &&
|
|
1577
|
+
(val === undefined || val === null)) {
|
|
1575
1578
|
if (this.remult.repo(rel.toType()).metadata.idMetadata.field.valueType ===
|
|
1576
1579
|
Number)
|
|
1577
1580
|
val = 0;
|
|
1578
1581
|
else
|
|
1579
1582
|
val = '';
|
|
1580
1583
|
}
|
|
1581
|
-
if (
|
|
1582
|
-
val
|
|
1583
|
-
|
|
1584
|
-
val
|
|
1585
|
-
|
|
1586
|
-
|
|
1584
|
+
if (!rel || rel.type === 'reference') {
|
|
1585
|
+
if (val !== undefined) {
|
|
1586
|
+
val = col.valueConverter.toJson(val);
|
|
1587
|
+
if (val !== undefined && val !== null)
|
|
1588
|
+
val = col.valueConverter.fromJson(JSON.parse(JSON.stringify(val)));
|
|
1589
|
+
}
|
|
1587
1590
|
d[col.key] = val;
|
|
1591
|
+
}
|
|
1588
1592
|
}
|
|
1589
1593
|
}
|
|
1590
1594
|
catch (e_25_1) { e_25 = { error: e_25_1 }; }
|
|
@@ -1673,12 +1677,17 @@ var rowHelperBase = /** @class */ (function () {
|
|
|
1673
1677
|
else
|
|
1674
1678
|
val = lu.id;
|
|
1675
1679
|
else {
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1680
|
+
if ((0, relationInfoMember_1.getRelationInfo)(col) && !includeRelatedEntities) {
|
|
1681
|
+
disable = true;
|
|
1682
|
+
}
|
|
1683
|
+
else {
|
|
1684
|
+
val = this.instance[col.key];
|
|
1685
|
+
if (!this.remult) {
|
|
1686
|
+
if (val) {
|
|
1687
|
+
var eo = (0, getEntityRef_1.getEntitySettings)(val.constructor, false);
|
|
1688
|
+
if (eo) {
|
|
1689
|
+
val = (0, getEntityRef_1.getEntityRef)(val).getId();
|
|
1690
|
+
}
|
|
1682
1691
|
}
|
|
1683
1692
|
}
|
|
1684
1693
|
}
|
package/src/remult3/remult3.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//p1 -
|
|
3
|
+
//p1 - issue with relation that is allow null false, without a value - we set it to 0, but I couldn't filter on it using null! or using $id:0
|
|
4
|
+
//p1 - in tree like shape, got an error of circular json reference with parent folder and child folders
|
|
4
5
|
//p1 - sql-expression for knex
|
|
5
6
|
//p1 - postgres case sensitive
|
|
6
7
|
//p1 - filterToRaw should get a dbnames of - and we should create a dbnames of that supports an alias
|
|
@@ -19,7 +20,7 @@ request optional - and depends on that run `getUser` & `initRequest`
|
|
|
19
20
|
//p1 - add schema option to create postgres data provider
|
|
20
21
|
//p1 - find one i had a question about find first's different syntax from find that confused a user
|
|
21
22
|
//p1 - I think there should be a way to throw a forbidden exception
|
|
22
|
-
//
|
|
23
|
+
//p1 - Write some ctrl g
|
|
23
24
|
//y1 - get backend methods to work when specifying types for date, and entities as poco's
|
|
24
25
|
//y1 - required
|
|
25
26
|
//y1 - reconsider validators
|