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.
@@ -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, entitiesMetaData);
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, entitiesMetaData) {
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
- remult.dataProvider = await this.dataProvider;
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) => {
@@ -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;
@@ -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 = { load: () => [] };
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,5 +1,5 @@
1
1
  import type { FieldMetadata } from '../column-interfaces';
2
- import type { Remult } from '../context';
2
+ import { Remult } from '../context';
3
3
  import type { EntityFilter, EntityMetadata } from '../remult3/remult3';
4
4
  export declare class Filter {
5
5
  private apply;
@@ -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 && isNew && !col.allowNull && (val === undefined || null)) {
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 (val !== undefined) {
1026
- val = col.valueConverter.toJson(val);
1027
- if (val !== undefined && val !== null)
1028
- val = col.valueConverter.fromJson(JSON.parse(JSON.stringify(val)));
1029
- }
1030
- if (!rel || rel.type === 'reference')
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
- val = this.instance[col.key];
1079
- if (!this.remult) {
1080
- if (val) {
1081
- let eo = getEntitySettings(val.constructor, false);
1082
- if (eo) {
1083
- val = getEntityRef(val).getId();
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 - not contains - meni request
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
- //y1 - Write some ctrl g
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.23.3",
3
+ "version": "0.23.5",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "types": "index.d.ts",
6
6
  "module": "esm/index.js",
@@ -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, entitiesMetaData);
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, entitiesMetaData) {
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, e_2_1;
150
- var e_2, _c;
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
- e_2_1 = _d.sent();
215
- e_2 = { error: e_2_1 };
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 (e_2) throw e_2.error; }
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 2:
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 = { load: function () { return []; } };
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, e_1_1;
442
- var e_1, _c;
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
- e_1_1 = _d.sent();
463
- e_1 = { error: e_1_1 };
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 (e_1) throw e_1.error; }
494
+ finally { if (e_2) throw e_2.error; }
470
495
  return [7 /*endfinally*/];
471
496
  case 7: return [2 /*return*/];
472
497
  }
@@ -1,5 +1,5 @@
1
1
  import type { FieldMetadata } from '../column-interfaces';
2
- import type { Remult } from '../context';
2
+ import { Remult } from '../context';
3
3
  import type { EntityFilter, EntityMetadata } from '../remult3/remult3';
4
4
  export declare class Filter {
5
5
  private apply;
@@ -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 && isNew && !col.allowNull && (val === undefined || null)) {
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 (val !== undefined) {
1582
- val = col.valueConverter.toJson(val);
1583
- if (val !== undefined && val !== null)
1584
- val = col.valueConverter.fromJson(JSON.parse(JSON.stringify(val)));
1585
- }
1586
- if (!rel || rel.type === 'reference')
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
- val = this.instance[col.key];
1677
- if (!this.remult) {
1678
- if (val) {
1679
- var eo = (0, getEntityRef_1.getEntitySettings)(val.constructor, false);
1680
- if (eo) {
1681
- val = (0, getEntityRef_1.getEntityRef)(val).getId();
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
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //p1 - not contains - meni request
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
- //y1 - Write some ctrl g
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