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.
@@ -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 {
@@ -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<rowHelperImplementation<T>>;
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, [(_f.sent()).toApiJson()]);
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.buildWhere(request, body)];
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.buildWhere(request, body)];
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
- return [4 /*yield*/, ref.save()];
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
- return [2 /*return*/, ref];
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
- var ref;
877
- return tslib_1.__generator(this, function (_a) {
878
- switch (_a.label) {
879
- case 0: return [4 /*yield*/, this.actualUpdate(row, body)];
880
- case 1:
881
- ref = _a.sent();
882
- response.success(ref.toApiJson());
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
  });
@@ -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 = options.where.toJson(); // options.where.__applyToConsumer(new FilterConsumnerBridgeToUrlBuilder(url));
292
- if (options.args === undefined)
293
- if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url))
294
- filterObject = undefined;
290
+ if (options.where === 'all') {
291
+ filterObject = 'all';
295
292
  }
296
- if (options.orderBy && options.orderBy.Segments) {
297
- var sort_1 = '';
298
- var order_1 = '';
299
- var hasDescending_1 = false;
300
- options.orderBy.Segments.forEach(function (c) {
301
- if (sort_1.length > 0) {
302
- sort_1 += ',';
303
- order_1 += ',';
304
- }
305
- sort_1 += c.field.key;
306
- order_1 += c.isDescending ? 'desc' : 'asc';
307
- if (c.isDescending)
308
- hasDescending_1 = true;
309
- });
310
- if (sort_1)
311
- url.add('_sort', sort_1);
312
- if (hasDescending_1)
313
- url.add('_order', order_1);
314
- }
315
- if (options.limit)
316
- url.add('_limit', options.limit);
317
- if (options.page)
318
- url.add('_page', options.page);
319
- if (options.select) {
320
- url.add('_select', options.select.join(','));
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 === null || options === void 0 ? void 0 : options.args)
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) : '?__action=emptyId'), this.toJsonOfIncludedKeys(data))
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()];
@@ -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>>): Promise<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>>): Promise<entityType>;
63
- update(originalItem: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>): Promise<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;