remult 0.27.11 → 0.27.13

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.
Files changed (45) hide show
  1. package/esm/index.js +0 -1
  2. package/esm/live-query/data-provider-live-query-storage.js +0 -2
  3. package/esm/postgres/schema-builder.js +0 -41
  4. package/esm/remult-duckdb.js +7 -12
  5. package/esm/remult-knex/index.js +0 -7
  6. package/esm/remult-mongo.js +33 -0
  7. package/esm/remult-sqlite-core.js +33 -5
  8. package/esm/server/get-remult-admin-html.js +1 -1
  9. package/esm/server/remult-admin.js +2 -0
  10. package/esm/server/remult-api-server.js +4 -5
  11. package/esm/src/data-providers/array-entity-data-provider.js +26 -11
  12. package/esm/src/data-providers/in-memory-database.js +1 -1
  13. package/esm/src/data-providers/sql-database.js +2 -25
  14. package/esm/src/filter/filter-interfaces.js +1 -0
  15. package/esm/src/remult3/RepositoryImplementation.js +15 -4
  16. package/esm/src/remult3/remult3.js +0 -3
  17. package/index.d.ts +0 -1
  18. package/index.js +1 -3
  19. package/live-query/data-provider-live-query-storage.js +0 -2
  20. package/package.json +1 -1
  21. package/postgres/schema-builder.d.ts +0 -4
  22. package/postgres/schema-builder.js +15 -118
  23. package/remult-duckdb.d.ts +1 -1
  24. package/remult-duckdb.js +7 -12
  25. package/remult-knex/index.d.ts +0 -2
  26. package/remult-knex/index.js +0 -18
  27. package/remult-mongo.d.ts +2 -1
  28. package/remult-mongo.js +128 -37
  29. package/remult-sqlite-core.d.ts +2 -1
  30. package/remult-sqlite-core.js +116 -29
  31. package/server/get-remult-admin-html.js +1 -1
  32. package/server/remult-admin.d.ts +4 -0
  33. package/server/remult-admin.js +12 -10
  34. package/server/remult-api-server.js +14 -14
  35. package/src/data-providers/array-entity-data-provider.js +82 -37
  36. package/src/data-providers/in-memory-database.js +1 -1
  37. package/src/data-providers/sql-database.js +10 -69
  38. package/src/entity.d.ts +4 -4
  39. package/src/filter/filter-interfaces.js +1 -0
  40. package/src/remult3/RepositoryImplementation.js +15 -4
  41. package/src/remult3/remult3.d.ts +17 -2
  42. package/src/remult3/remult3.js +0 -3
  43. package/esm/src/data-providers/web-sql-data-provider.js +0 -140
  44. package/src/data-providers/web-sql-data-provider.d.ts +0 -20
  45. package/src/data-providers/web-sql-data-provider.js +0 -228
@@ -1,12 +1,14 @@
1
1
  import { type RelationFields } from '../src/remult3/relationInfoMember.js';
2
2
  import type { ClassType } from '../classType.js';
3
3
  import type { Remult } from '../src/context.js';
4
+ import { EntityFilter } from '../src/remult3/remult3.js';
4
5
  export interface EntityUIInfo {
5
6
  key: string;
6
7
  caption: string;
7
8
  fields: FieldUIInfo[];
8
9
  ids: Record<string, true>;
9
10
  relations: EntityRelationToManyInfo[];
11
+ defaultOrderBy?: EntityFilter<any>;
10
12
  color?: string;
11
13
  }
12
14
  export interface EntityRelationToManyInfo extends RelationFields {
@@ -24,6 +26,7 @@ export interface FieldUIInfo {
24
26
  valFieldKey: string;
25
27
  caption: string;
26
28
  type: FieldUIInfoType;
29
+ inputType: string;
27
30
  relationToOne?: FieldRelationToOneInfo;
28
31
  }
29
32
  export interface FieldRelationToOneInfo extends RelationFields {
@@ -41,3 +44,4 @@ export interface DisplayOptions {
41
44
  }
42
45
  export default function remultAdminHtml(options: AdminOptions): string;
43
46
  export declare function buildEntityInfo(options: AdminOptions): EntityUIInfo[];
47
+ export type RelationsToOneValues = Record<string, Map<any, any>>;
@@ -13,24 +13,24 @@ function remultAdminHtml(options) {
13
13
  }
14
14
  function buildEntityInfo(options) {
15
15
  var e_1, _a, e_2, _b, e_3, _c;
16
- var _d;
16
+ var _d, _e;
17
17
  var entities = [];
18
18
  try {
19
- for (var _e = tslib_1.__values(options.entities.map(function (e) { return options.remult.repo(e).metadata; })), _f = _e.next(); !_f.done; _f = _e.next()) {
20
- var metadata = _f.value;
19
+ for (var _f = tslib_1.__values(options.entities.map(function (e) { return options.remult.repo(e).metadata; })), _g = _f.next(); !_g.done; _g = _f.next()) {
20
+ var metadata = _g.value;
21
21
  var fields = [];
22
22
  var relations = [];
23
23
  var ids = {};
24
24
  try {
25
- for (var _g = (e_2 = void 0, tslib_1.__values(metadata.idMetadata.fields)), _h = _g.next(); !_h.done; _h = _g.next()) {
26
- var f = _h.value;
25
+ for (var _h = (e_2 = void 0, tslib_1.__values(metadata.idMetadata.fields)), _j = _h.next(); !_j.done; _j = _h.next()) {
26
+ var f = _j.value;
27
27
  ids[f.key] = true;
28
28
  }
29
29
  }
30
30
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
31
31
  finally {
32
32
  try {
33
- if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
33
+ if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
34
34
  }
35
35
  finally { if (e_2) throw e_2.error; }
36
36
  }
@@ -77,6 +77,7 @@ function buildEntityInfo(options) {
77
77
  valFieldKey: valFieldKey,
78
78
  caption: x.caption,
79
79
  relationToOne: relation,
80
+ inputType: x.inputType,
80
81
  type: x.valueConverter.fieldTypeInDb == 'json'
81
82
  ? 'json'
82
83
  : x.valueType === Number
@@ -89,15 +90,15 @@ function buildEntityInfo(options) {
89
90
  });
90
91
  };
91
92
  try {
92
- for (var _j = (e_3 = void 0, tslib_1.__values(metadata.fields.toArray())), _k = _j.next(); !_k.done; _k = _j.next()) {
93
- var x = _k.value;
93
+ for (var _k = (e_3 = void 0, tslib_1.__values(metadata.fields.toArray())), _l = _k.next(); !_l.done; _l = _k.next()) {
94
+ var x = _l.value;
94
95
  _loop_1(x);
95
96
  }
96
97
  }
97
98
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
98
99
  finally {
99
100
  try {
100
- if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
101
+ if (_l && !_l.done && (_c = _k.return)) _c.call(_k);
101
102
  }
102
103
  finally { if (e_3) throw e_3.error; }
103
104
  }
@@ -108,6 +109,7 @@ function buildEntityInfo(options) {
108
109
  ids: ids,
109
110
  fields: fields,
110
111
  relations: relations,
112
+ defaultOrderBy: (_e = metadata.options.defaultOrderBy) !== null && _e !== void 0 ? _e : { id: 'asc' },
111
113
  });
112
114
  }
113
115
  }
@@ -115,7 +117,7 @@ function buildEntityInfo(options) {
115
117
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
116
118
  finally {
117
119
  try {
118
- if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
120
+ if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
119
121
  }
120
122
  finally { if (e_1) throw e_1.error; }
121
123
  }
@@ -39,8 +39,6 @@ function createRemultServerCore(options, serverCoreOptions) {
39
39
  context_js_1.RemultAsyncLocalStorage.enable();
40
40
  {
41
41
  var allControllers = [];
42
- if (!safeOptions.entities)
43
- safeOptions.entities = tslib_1.__spreadArray([], tslib_1.__read(remult_static_js_1.remultStatic.allEntities), false);
44
42
  if (safeOptions.entities)
45
43
  allControllers.push.apply(allControllers, tslib_1.__spreadArray([], tslib_1.__read(safeOptions.entities), false));
46
44
  if (safeOptions.controllers)
@@ -189,7 +187,8 @@ var RemultServerImplementation = /** @class */ (function () {
189
187
  started_1 = true;
190
188
  console.time('Schema ensured');
191
189
  };
192
- entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(options.entities.map(function (e) { return remult.repo(e).metadata; })), false));
190
+ if (options.entities)
191
+ entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(options.entities.map(function (e) { return remult.repo(e).metadata; })), false));
193
192
  if (!dp.ensureSchema) return [3 /*break*/, 2];
194
193
  startConsoleLog();
195
194
  return [4 /*yield*/, dp.ensureSchema(entitiesMetaData)];
@@ -297,13 +296,14 @@ var RemultServerImplementation = /** @class */ (function () {
297
296
  RemultServerImplementation.prototype.registerRouter = function (r) {
298
297
  var e_3, _a, e_4, _b;
299
298
  var _this = this;
299
+ var _c;
300
300
  if (this.registeredRouter)
301
301
  throw 'Router already registered';
302
302
  this.registeredRouter = true;
303
303
  {
304
304
  try {
305
- for (var _c = tslib_1.__values(this.options.controllers), _d = _c.next(); !_d.done; _d = _c.next()) {
306
- var c = _d.value;
305
+ for (var _d = tslib_1.__values(this.options.controllers), _e = _d.next(); !_e.done; _e = _d.next()) {
306
+ var c = _e.value;
307
307
  var z = c[server_action_js_1.classBackendMethodsArray];
308
308
  if (z)
309
309
  try {
@@ -328,7 +328,7 @@ var RemultServerImplementation = /** @class */ (function () {
328
328
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
329
329
  finally {
330
330
  try {
331
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
331
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
332
332
  }
333
333
  finally { if (e_3) throw e_3.error; }
334
334
  }
@@ -432,7 +432,7 @@ var RemultServerImplementation = /** @class */ (function () {
432
432
  });
433
433
  }); }));
434
434
  }
435
- this.options.entities.forEach(function (e) {
435
+ (_c = this.options.entities) === null || _c === void 0 ? void 0 : _c.forEach(function (e) {
436
436
  var key = (0, getEntityRef_js_1.getEntityKey)(e);
437
437
  if (key != undefined)
438
438
  _this.add(key, function (c) {
@@ -589,13 +589,13 @@ var RemultServerImplementation = /** @class */ (function () {
589
589
  return tslib_1.__generator(this, function (_a) {
590
590
  switch (_a.label) {
591
591
  case 0:
592
- if (!req) return [3 /*break*/, 8];
592
+ if (!req) return [3 /*break*/, 9];
593
593
  ;
594
594
  remult.context.request = req;
595
595
  remult_static_js_1.remultStatic.asyncContext.setInInitRequest(true);
596
596
  _a.label = 1;
597
597
  case 1:
598
- _a.trys.push([1, , 7, 8]);
598
+ _a.trys.push([1, , 8, 9]);
599
599
  user = void 0;
600
600
  if (!this.options.getUser) return [3 /*break*/, 3];
601
601
  return [4 /*yield*/, this.options.getUser(req)];
@@ -623,14 +623,14 @@ var RemultServerImplementation = /** @class */ (function () {
623
623
  case 5:
624
624
  _a.sent();
625
625
  _a.label = 6;
626
- case 6: return [3 /*break*/, 8];
626
+ case 6: return [4 /*yield*/, what(remult, myReq, myRes, genReq, origRes, req)];
627
627
  case 7:
628
+ _a.sent();
629
+ return [3 /*break*/, 9];
630
+ case 8:
628
631
  remult_static_js_1.remultStatic.asyncContext.setInInitRequest(false);
629
632
  return [7 /*endfinally*/];
630
- case 8: return [4 /*yield*/, what(remult, myReq, myRes, genReq, origRes, req)];
631
- case 9:
632
- _a.sent();
633
- return [2 /*return*/];
633
+ case 9: return [2 /*return*/];
634
634
  }
635
635
  });
636
636
  }); })];
@@ -463,25 +463,26 @@ var ArrayEntityDataProvider = /** @class */ (function () {
463
463
  };
464
464
  ArrayEntityDataProvider.prototype.update = function (id, data) {
465
465
  return tslib_1.__awaiter(this, void 0, void 0, function () {
466
- var names, idMatches, keys, i, r, newR, _a, _b, f;
467
- var e_14, _c;
468
- return tslib_1.__generator(this, function (_d) {
469
- switch (_d.label) {
466
+ var names, idMatches, keys, _loop_2, this_1, i, state_2;
467
+ var _this = this;
468
+ return tslib_1.__generator(this, function (_a) {
469
+ switch (_a.label) {
470
470
  case 0: return [4 /*yield*/, this.init()];
471
471
  case 1:
472
- names = _d.sent();
472
+ names = _a.sent();
473
473
  idMatches = this.idMatches(id, names);
474
474
  keys = Object.keys(data);
475
- for (i = 0; i < this.rows().length; i++) {
476
- r = this.rows()[i];
475
+ _loop_2 = function (i) {
476
+ var e_14, _b;
477
+ var r = this_1.rows()[i];
477
478
  if (idMatches(r)) {
478
- newR = tslib_1.__assign({}, r);
479
+ var newR_1 = tslib_1.__assign({}, r);
479
480
  try {
480
- for (_a = (e_14 = void 0, tslib_1.__values(this.entity.fields)), _b = _a.next(); !_b.done; _b = _a.next()) {
481
- f = _b.value;
481
+ for (var _c = (e_14 = void 0, tslib_1.__values(this_1.entity.fields)), _d = _c.next(); !_d.done; _d = _c.next()) {
482
+ var f = _d.value;
482
483
  if (!(0, filter_consumer_bridge_to_sql_request_js_1.isDbReadonly)(f, names)) {
483
484
  if (keys.includes(f.key)) {
484
- newR[names.$dbNameOf(f)] = f.valueConverter.toJson(data[f.key]);
485
+ newR_1[names.$dbNameOf(f)] = f.valueConverter.toJson(data[f.key]);
485
486
  }
486
487
  }
487
488
  }
@@ -489,14 +490,41 @@ var ArrayEntityDataProvider = /** @class */ (function () {
489
490
  catch (e_14_1) { e_14 = { error: e_14_1 }; }
490
491
  finally {
491
492
  try {
492
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
493
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
493
494
  }
494
495
  finally { if (e_14) throw e_14.error; }
495
496
  }
496
- this.verifyThatRowHasAllNotNullColumns(newR, names);
497
- this.rows()[i] = newR;
498
- return [2 /*return*/, Promise.resolve(this.translateFromJson(this.rows()[i], names))];
497
+ if (this_1.entity.idMetadata.fields.find(function (x) { return newR_1[names.$dbNameOf(x)] != r[names.$dbNameOf(x)]; }) &&
498
+ this_1.rows().find(function (x) {
499
+ var e_15, _a;
500
+ try {
501
+ for (var _b = (e_15 = void 0, tslib_1.__values(_this.entity.idMetadata.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
502
+ var f = _c.value;
503
+ if (x[names.$dbNameOf(f)] != newR_1[names.$dbNameOf(f)])
504
+ return false;
505
+ }
506
+ }
507
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
508
+ finally {
509
+ try {
510
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
511
+ }
512
+ finally { if (e_15) throw e_15.error; }
513
+ }
514
+ return true;
515
+ })) {
516
+ throw Error('id already exists');
517
+ }
518
+ this_1.verifyThatRowHasAllNotNullColumns(newR_1, names);
519
+ this_1.rows()[i] = newR_1;
520
+ return { value: Promise.resolve(this_1.translateFromJson(this_1.rows()[i], names)) };
499
521
  }
522
+ };
523
+ this_1 = this;
524
+ for (i = 0; i < this.rows().length; i++) {
525
+ state_2 = _loop_2(i);
526
+ if (typeof state_2 === "object")
527
+ return [2 /*return*/, state_2.value];
500
528
  }
501
529
  throw new Error("ArrayEntityDataProvider: Couldn't find row with id \"".concat(id, "\" in entity \"").concat(this.entity.key, "\" to update"));
502
530
  }
@@ -526,7 +554,8 @@ var ArrayEntityDataProvider = /** @class */ (function () {
526
554
  ArrayEntityDataProvider.prototype.insert = function (data) {
527
555
  return tslib_1.__awaiter(this, void 0, void 0, function () {
528
556
  var names, j, idf, _a, _b, row;
529
- var e_15, _c;
557
+ var e_16, _c;
558
+ var _this = this;
530
559
  return tslib_1.__generator(this, function (_d) {
531
560
  switch (_d.label) {
532
561
  case 0: return [4 /*yield*/, this.init()];
@@ -534,29 +563,45 @@ var ArrayEntityDataProvider = /** @class */ (function () {
534
563
  names = _d.sent();
535
564
  j = this.translateToJson(data, names);
536
565
  idf = this.entity.idMetadata.field;
537
- if (!(idf instanceof CompoundIdField_js_1.CompoundIdField)) {
538
- if (idf.valueConverter.fieldTypeInDb === 'autoincrement') {
539
- j[idf.key] = 1;
566
+ if (!(idf instanceof CompoundIdField_js_1.CompoundIdField) &&
567
+ idf.valueConverter.fieldTypeInDb === 'autoincrement') {
568
+ j[idf.key] = 1;
569
+ try {
570
+ for (_a = tslib_1.__values(this.rows()), _b = _a.next(); !_b.done; _b = _a.next()) {
571
+ row = _b.value;
572
+ if (row[idf.key] >= j[idf.key])
573
+ j[idf.key] = row[idf.key] + 1;
574
+ }
575
+ }
576
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
577
+ finally {
540
578
  try {
541
- for (_a = tslib_1.__values(this.rows()), _b = _a.next(); !_b.done; _b = _a.next()) {
542
- row = _b.value;
543
- if (row[idf.key] >= j[idf.key])
544
- j[idf.key] = row[idf.key] + 1;
579
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
580
+ }
581
+ finally { if (e_16) throw e_16.error; }
582
+ }
583
+ }
584
+ else {
585
+ if (this.rows().find(function (x) {
586
+ var e_17, _a;
587
+ try {
588
+ for (var _b = tslib_1.__values(_this.entity.idMetadata.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
589
+ var f = _c.value;
590
+ if (x[names.$dbNameOf(f)] != j[names.$dbNameOf(f)])
591
+ return false;
545
592
  }
546
593
  }
547
- catch (e_15_1) { e_15 = { error: e_15_1 }; }
594
+ catch (e_17_1) { e_17 = { error: e_17_1 }; }
548
595
  finally {
549
596
  try {
550
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
597
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
551
598
  }
552
- finally { if (e_15) throw e_15.error; }
599
+ finally { if (e_17) throw e_17.error; }
553
600
  }
601
+ return true;
602
+ })) {
603
+ throw Error('id already exists');
554
604
  }
555
- if (j[idf.key])
556
- this.rows().forEach(function (i) {
557
- if (j[idf.key] == i[idf.key])
558
- throw Error('id already exists');
559
- });
560
605
  }
561
606
  this.verifyThatRowHasAllNotNullColumns(j, names);
562
607
  this.rows().push(j);
@@ -602,7 +647,7 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
602
647
  throw new Error('Custom Filter should be translated before it gets here');
603
648
  };
604
649
  FilterConsumerBridgeToObject.prototype.or = function (orElements) {
605
- var e_16, _a;
650
+ var e_18, _a;
606
651
  try {
607
652
  for (var orElements_1 = tslib_1.__values(orElements), orElements_1_1 = orElements_1.next(); !orElements_1_1.done; orElements_1_1 = orElements_1.next()) {
608
653
  var element = orElements_1_1.value;
@@ -613,12 +658,12 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
613
658
  }
614
659
  }
615
660
  }
616
- catch (e_16_1) { e_16 = { error: e_16_1 }; }
661
+ catch (e_18_1) { e_18 = { error: e_18_1 }; }
617
662
  finally {
618
663
  try {
619
664
  if (orElements_1_1 && !orElements_1_1.done && (_a = orElements_1.return)) _a.call(orElements_1);
620
665
  }
621
- finally { if (e_16) throw e_16.error; }
666
+ finally { if (e_18) throw e_18.error; }
622
667
  }
623
668
  this.ok = false;
624
669
  };
@@ -637,7 +682,7 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
637
682
  this.ok = false;
638
683
  };
639
684
  FilterConsumerBridgeToObject.prototype.isIn = function (col, val) {
640
- var e_17, _a;
685
+ var e_19, _a;
641
686
  try {
642
687
  for (var val_1 = tslib_1.__values(val), val_1_1 = val_1.next(); !val_1_1.done; val_1_1 = val_1.next()) {
643
688
  var v = val_1_1.value;
@@ -646,12 +691,12 @@ var FilterConsumerBridgeToObject = /** @class */ (function () {
646
691
  }
647
692
  }
648
693
  }
649
- catch (e_17_1) { e_17 = { error: e_17_1 }; }
694
+ catch (e_19_1) { e_19 = { error: e_19_1 }; }
650
695
  finally {
651
696
  try {
652
697
  if (val_1_1 && !val_1_1.done && (_a = val_1.return)) _a.call(val_1);
653
698
  }
654
- finally { if (e_17) throw e_17.error; }
699
+ finally { if (e_19) throw e_19.error; }
655
700
  }
656
701
  this.ok = false;
657
702
  };
@@ -32,7 +32,7 @@ var InMemoryDataProvider = /** @class */ (function () {
32
32
  };
33
33
  InMemoryDataProvider.prototype.getEntityDataProvider = function (entity) {
34
34
  var _this = this;
35
- var name = entity.key;
35
+ var name = entity.dbName;
36
36
  if (!this.rows[name])
37
37
  this.rows[name] = [];
38
38
  return new array_entity_data_provider_js_1.ArrayEntityDataProvider(entity, function () { return _this.rows[name]; });
@@ -738,65 +738,6 @@ var myDummySQLCommand = /** @class */ (function () {
738
738
  };
739
739
  return myDummySQLCommand;
740
740
  }());
741
- function bulkInsert(array, db) {
742
- return tslib_1.__awaiter(this, void 0, void 0, function () {
743
- var chunkSize, _loop_1, i;
744
- return tslib_1.__generator(this, function (_a) {
745
- switch (_a.label) {
746
- case 0:
747
- if (array.length == 0)
748
- return [2 /*return*/];
749
- chunkSize = 250;
750
- _loop_1 = function (i) {
751
- var items, c, sql, _b, _c;
752
- return tslib_1.__generator(this, function (_d) {
753
- switch (_d.label) {
754
- case 0:
755
- items = array.slice(i, i + chunkSize);
756
- c = db.createCommand();
757
- _b = 'insert into ';
758
- return [4 /*yield*/, items[0]._.metadata.dbName];
759
- case 1:
760
- _c = _b +
761
- (_d.sent()) +
762
- ' (';
763
- return [4 /*yield*/, Promise.all(items[0]._.metadata.fields.toArray().map(function (f) { return f.dbName; }))];
764
- case 2:
765
- sql = _c +
766
- (_d.sent()).join(',') +
767
- ') values ';
768
- sql += items
769
- .map(function (row) {
770
- return '(' +
771
- row.$.toArray()
772
- .map(function (f) { return c.param(f.metadata.valueConverter.toDb(f.value)); })
773
- .join(', ') +
774
- ')';
775
- })
776
- .join(',');
777
- return [4 /*yield*/, c.execute(sql)];
778
- case 3:
779
- _d.sent();
780
- return [2 /*return*/];
781
- }
782
- });
783
- };
784
- i = 0;
785
- _a.label = 1;
786
- case 1:
787
- if (!(i < array.length)) return [3 /*break*/, 4];
788
- return [5 /*yield**/, _loop_1(i)];
789
- case 2:
790
- _a.sent();
791
- _a.label = 3;
792
- case 3:
793
- i += chunkSize;
794
- return [3 /*break*/, 1];
795
- case 4: return [2 /*return*/];
796
- }
797
- });
798
- });
799
- }
800
741
  function getRowAfterUpdate(meta, dataProvider, data, id, operation) {
801
742
  var idFilter = id !== undefined ? meta.idMetadata.getIdFilter(id) : {};
802
743
  return dataProvider
@@ -832,7 +773,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
832
773
  ? "count (distinct ".concat(dbName, ")")
833
774
  : "".concat(operator, "( ").concat(dbName, " )");
834
775
  }
835
- var select, groupBy, processResultRow, _loop_2, _a, _b, x, _loop_3, GroupByOperators_1, GroupByOperators_1_1, operator, e_8_1, where, _c, orderBy, _d, _e, x, field, _f, e_9_1, page, result;
776
+ var select, groupBy, processResultRow, _loop_1, _a, _b, x, _loop_2, GroupByOperators_1, GroupByOperators_1_1, operator, e_8_1, where, _c, orderBy, _d, _e, x, field, _f, e_9_1, page, result;
836
777
  var e_10, _g, e_8, _h, e_9, _j;
837
778
  return tslib_1.__generator(this, function (_k) {
838
779
  switch (_k.label) {
@@ -844,7 +785,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
844
785
  theResult[remult3_js_1.GroupByCountMember] = Number(sqlVal);
845
786
  });
846
787
  if (options === null || options === void 0 ? void 0 : options.group) {
847
- _loop_2 = function (x) {
788
+ _loop_1 = function (x) {
848
789
  if (x.isServerExpression) {
849
790
  }
850
791
  else {
@@ -864,7 +805,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
864
805
  try {
865
806
  for (_a = tslib_1.__values(options === null || options === void 0 ? void 0 : options.group), _b = _a.next(); !_b.done; _b = _a.next()) {
866
807
  x = _b.value;
867
- _loop_2(x);
808
+ _loop_1(x);
868
809
  }
869
810
  }
870
811
  catch (e_10_1) { e_10 = { error: e_10_1 }; }
@@ -875,15 +816,15 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
875
816
  finally { if (e_10) throw e_10.error; }
876
817
  }
877
818
  }
878
- _loop_3 = function (operator) {
879
- var fields, _loop_4, fields_1, fields_1_1, x, e_11_1;
819
+ _loop_2 = function (operator) {
820
+ var fields, _loop_3, fields_1, fields_1_1, x, e_11_1;
880
821
  var e_11, _l;
881
822
  return tslib_1.__generator(this, function (_m) {
882
823
  switch (_m.label) {
883
824
  case 0:
884
825
  fields = options === null || options === void 0 ? void 0 : options[operator];
885
826
  if (!fields) return [3 /*break*/, 8];
886
- _loop_4 = function (x) {
827
+ _loop_3 = function (x) {
887
828
  var dbName, turnToNumber;
888
829
  return tslib_1.__generator(this, function (_o) {
889
830
  switch (_o.label) {
@@ -915,7 +856,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
915
856
  case 2:
916
857
  if (!!fields_1_1.done) return [3 /*break*/, 5];
917
858
  x = fields_1_1.value;
918
- return [5 /*yield**/, _loop_4(x)];
859
+ return [5 /*yield**/, _loop_3(x)];
919
860
  case 3:
920
861
  _m.sent();
921
862
  _m.label = 4;
@@ -945,7 +886,7 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
945
886
  case 2:
946
887
  if (!!GroupByOperators_1_1.done) return [3 /*break*/, 5];
947
888
  operator = GroupByOperators_1_1.value;
948
- return [5 /*yield**/, _loop_3(operator)];
889
+ return [5 /*yield**/, _loop_2(operator)];
949
890
  case 3:
950
891
  _k.sent();
951
892
  _k.label = 4;
@@ -1012,9 +953,9 @@ function groupByImpl(options, e, r, orderByNullFirst, limitSyntax) {
1012
953
  orderBy += ' desc';
1013
954
  if (orderByNullFirst) {
1014
955
  if (x.isDescending)
1015
- select += ' nulls last';
956
+ orderBy += ' nulls last';
1016
957
  else
1017
- select += ' nulls first';
958
+ orderBy += ' nulls first';
1018
959
  }
1019
960
  _k.label = 15;
1020
961
  case 15:
package/src/entity.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Allowed, AllowedForInstance } from './context.js';
2
2
  import type { FieldMetadata } from './column-interfaces.js';
3
- import type { EntityFilter, EntityIdFields, EntityMetadata, EntityOrderBy, EntityRef, FieldsMetadata, LifecycleEvent } from './remult3/remult3.js';
3
+ import type { EntityFilter, EntityIdFields, EntityMetadata, EntityOrderBy, EntityRef, FieldsMetadata, LifecycleEvent, MembersOnly } from './remult3/remult3.js';
4
4
  import type { FilterPreciseValues } from './filter/filter-interfaces.js';
5
5
  export interface EntityOptions<entityType = unknown> {
6
6
  /**A human readable name for the entity */
@@ -173,12 +173,12 @@ export interface EntityOptions<entityType = unknown> {
173
173
  /** An arrow function that identifies the `id` column to use for this entity
174
174
  * @example
175
175
  * //Single column id
176
- * @Entity<Products>("products", { id: {productCode: true} })
176
+ * @Entity<Products>("products", { id: 'productCode' })
177
177
  * @example
178
178
  * //Multiple columns id
179
- * @Entity<OrderDetails>("orderDetails", { id:{ orderId:true, productCode:true} })
179
+ * @Entity<OrderDetails>("orderDetails", { id:['orderId:', 'productCode'] })
180
180
  */
181
- id?: EntityIdFields<entityType> | ((entity: FieldsMetadata<entityType>) => FieldMetadata | FieldMetadata[]);
181
+ id?: keyof MembersOnly<entityType> | (keyof MembersOnly<entityType>)[] | EntityIdFields<entityType> | ((entity: FieldsMetadata<entityType>) => FieldMetadata | FieldMetadata[]);
182
182
  entityRefInit?: (ref: EntityRef<entityType>, row: entityType) => void;
183
183
  apiRequireId?: Allowed;
184
184
  }
@@ -267,6 +267,7 @@ var Filter = /** @class */ (function () {
267
267
  found = true;
268
268
  break;
269
269
  case '$ne':
270
+ case '$not':
270
271
  case '!=':
271
272
  case '$nin':
272
273
  found = true;
@@ -1203,7 +1203,9 @@ var RepositoryImplementation = /** @class */ (function () {
1203
1203
  //I've used define property to hide this member from console.lo g
1204
1204
  get: function () { return row_2; },
1205
1205
  });
1206
+ row_2.id = row_2.getId();
1206
1207
  row_2.saveOriginalData();
1208
+ row_2.originalId = row_2.id;
1207
1209
  return result;
1208
1210
  }
1209
1211
  };
@@ -2335,7 +2337,10 @@ var rowHelperImplementation = /** @class */ (function (_super) {
2335
2337
  case 21:
2336
2338
  updatedRow = (_t.sent())[0];
2337
2339
  return [3 /*break*/, 24];
2338
- case 22: return [4 /*yield*/, this.edp.update(this.id, changesOnly)];
2340
+ case 22:
2341
+ if (this.id === undefined)
2342
+ throw new Error('Invalid operation, id is undefined');
2343
+ return [4 /*yield*/, this.edp.update(this.id, changesOnly)];
2339
2344
  case 23:
2340
2345
  updatedRow = _t.sent();
2341
2346
  _t.label = 24;
@@ -2497,6 +2502,8 @@ var rowHelperImplementation = /** @class */ (function (_super) {
2497
2502
  case 3:
2498
2503
  _e.trys.push([3, 16, , 18]);
2499
2504
  if (!doDelete) return [3 /*break*/, 5];
2505
+ if (this.id === undefined)
2506
+ throw new Error('Invalid operation, id is undefined');
2500
2507
  return [4 /*yield*/, this.edp.delete(this.id)];
2501
2508
  case 4:
2502
2509
  _e.sent();
@@ -3376,9 +3383,13 @@ var EntityFullInfo = /** @class */ (function () {
3376
3383
  this.fields = r;
3377
3384
  this.caption = buildCaption(entityInfo.caption, this.key, remult, this);
3378
3385
  if (entityInfo.id) {
3379
- var r_2 = typeof entityInfo.id === 'function'
3380
- ? entityInfo.id(this.fields)
3381
- : Object.keys(entityInfo.id).map(function (x) { return _this.fields.find(x); });
3386
+ var r_2 = typeof entityInfo.id === 'string'
3387
+ ? this.fields.find(entityInfo.id)
3388
+ : Array.isArray(entityInfo.id)
3389
+ ? entityInfo.id.map(function (x) { return _this.fields.find(x); })
3390
+ : typeof entityInfo.id === 'function'
3391
+ ? entityInfo.id(this.fields)
3392
+ : Object.keys(entityInfo.id).map(function (x) { return _this.fields.find(x); });
3382
3393
  if (Array.isArray(r_2)) {
3383
3394
  if (r_2.length > 1)
3384
3395
  this.idMetadata.field = new (CompoundIdField_js_1.CompoundIdField.bind.apply(CompoundIdField_js_1.CompoundIdField, tslib_1.__spreadArray([void 0], tslib_1.__read(r_2), false)))();