remult 3.2.3 → 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.
Files changed (37) hide show
  1. package/esm/graphql.js +1 -1
  2. package/esm/remult-knex/index.js +8 -2
  3. package/esm/remult-mongo.js +7 -3
  4. package/esm/server/remult-api-server.js +1 -1
  5. package/esm/src/data-api.js +30 -19
  6. package/esm/src/data-providers/rest-data-provider.js +50 -35
  7. package/esm/src/data-providers/sql-database.js +35 -13
  8. package/esm/src/filter/fieldDbName.js +4 -1
  9. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +5 -2
  10. package/esm/src/remult-proxy.js +4 -4
  11. package/esm/src/remult3/RepositoryImplementation.js +34 -17
  12. package/esm/src/remult3/remult3.js +8 -0
  13. package/esm/src/valueConverters.js +10 -5
  14. package/graphql.js +1 -1
  15. package/index.d.ts +1 -1
  16. package/package.json +1 -1
  17. package/remult-knex/index.js +16 -8
  18. package/remult-mongo.js +6 -2
  19. package/server/remult-api-server.js +1 -0
  20. package/src/column-interfaces.d.ts +3 -1
  21. package/src/data-api.d.ts +4 -4
  22. package/src/data-api.js +50 -30
  23. package/src/data-interfaces.d.ts +7 -6
  24. package/src/data-providers/rest-data-provider.d.ts +4 -4
  25. package/src/data-providers/rest-data-provider.js +50 -35
  26. package/src/data-providers/sql-database.js +158 -90
  27. package/src/filter/fieldDbName.d.ts +2 -1
  28. package/src/filter/fieldDbName.js +5 -1
  29. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +1 -0
  30. package/src/filter/filter-consumer-bridge-to-sql-request.js +7 -2
  31. package/src/remult-proxy.js +4 -4
  32. package/src/remult3/RepositoryImplementation.d.ts +6 -6
  33. package/src/remult3/RepositoryImplementation.js +209 -169
  34. package/src/remult3/remult3.d.ts +11 -7
  35. package/src/remult3/remult3.js +8 -0
  36. package/src/valueConverters.d.ts +3 -1
  37. package/src/valueConverters.js +10 -6
@@ -13,7 +13,7 @@ export interface UpsertOptions<entityType> {
13
13
  export interface EntityRefBase<entityType> extends Subscribable {
14
14
  hasErrors(): boolean;
15
15
  undoChanges(): void;
16
- save(): Promise<entityType>;
16
+ save(options?: InsertOrUpdateOptions): Promise<entityType>;
17
17
  reload(): Promise<entityType>;
18
18
  delete(): Promise<void>;
19
19
  isNew(): boolean;
@@ -555,19 +555,19 @@ export interface Repository<entityType> {
555
555
  * @example
556
556
  * await taskRepo.insert([{title:"task a"}, {title:"task b", completed:true }])
557
557
  */
558
- insert(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
559
- insert(item: Partial<MembersOnly<entityType>>): Promise<entityType>;
558
+ insert(item: Partial<MembersOnly<entityType>>[], options?: InsertOrUpdateOptions): Promise<entityType[]>;
559
+ insert(item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
560
560
  /** Updates an item, based on its `id`
561
561
  * @example
562
562
  * taskRepo.update(task.id,{...task,completed:true})
563
563
  */
564
- update(id: idType<entityType>, item: Partial<MembersOnly<entityType>>): Promise<entityType>;
565
- update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>): Promise<entityType>;
564
+ update(id: idType<entityType>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
565
+ update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
566
566
  /**
567
567
  * Updates all items that match the `where` condition.
568
568
  */
569
569
  updateMany(options: {
570
- where: EntityFilter<entityType>;
570
+ where: EntityFilter<entityType> | 'all';
571
571
  set: Partial<MembersOnly<entityType>>;
572
572
  }): Promise<number>;
573
573
  /**
@@ -607,7 +607,7 @@ export interface Repository<entityType> {
607
607
  * Deletes all items that match the `where` condition.
608
608
  */
609
609
  deleteMany(options: {
610
- where: EntityFilter<entityType>;
610
+ where: EntityFilter<entityType> | 'all';
611
611
  }): Promise<number>;
612
612
  /** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called.
613
613
  *
@@ -1069,6 +1069,7 @@ export interface FindOptionsBase<entityType> extends LoadOptions<entityType> {
1069
1069
  * await repo(Products).find({ orderBy: { price: "desc", name: "asc" }})
1070
1070
  */
1071
1071
  orderBy?: EntityOrderBy<entityType>;
1072
+ args?: any;
1072
1073
  }
1073
1074
  export interface FindFirstOptions<entityType> extends FindOptionsBase<entityType>, FindFirstOptionsBase<entityType> {
1074
1075
  }
@@ -1197,6 +1198,9 @@ export declare type EntityIdFields<entityType> = {
1197
1198
  export declare type EntitySelectFields<entityType> = {
1198
1199
  [Properties in keyof Partial<MembersOnly<entityType>>]?: boolean;
1199
1200
  };
1201
+ export declare type InsertOrUpdateOptions = {
1202
+ select: 'none';
1203
+ };
1200
1204
  export interface ClassFieldDecoratorContextStub<entityType, valueType> {
1201
1205
  readonly access: {
1202
1206
  set(object: entityType, value: valueType | null): void;
@@ -44,6 +44,14 @@ exports.flags = {
44
44
 
45
45
  -
46
46
  */
47
+ /*p1 - https://github.com/remult/remult/discussions/438
48
+ - should we use the arg for update and insert? for the returning query?
49
+ - Does dbNamesOf still makes sense? I think that abstraction, regarding sql expression has lost it's merit
50
+ - remember caching of sql expression calculations that took a recursive amount of time for JYC
51
+ - maybe introduce a ready dbNamesOf of argument that will be aware of prefixes
52
+ - I've changed the order by to support order by 1
53
+
54
+ */
47
55
  //p1 - deleteAll({title:undefined}) should throw an error - not return 0 (with direct call to db)
48
56
  //p1 - remult-create, move db question ahead of auth - everyone needs a database, not everyone need auth
49
57
  //p1 - allow experimental route registration on remult server, with at least get route, and support redirect, read header and set header - (and the existing get html etc...)
@@ -2,7 +2,9 @@ import type { ValueConverter } from './column-interfaces.js';
2
2
  export declare class ValueConverters {
3
3
  static readonly Date: ValueConverter<Date>;
4
4
  static readonly DateOnly: ValueConverter<Date>;
5
- static readonly DateOnlyString: ValueConverter<Date>;
5
+ static readonly DateOnlyString: ValueConverter<Date> & {
6
+ zeroDate: Date;
7
+ };
6
8
  static readonly Boolean: ValueConverter<Boolean>;
7
9
  static readonly Number: ValueConverter<number>;
8
10
  static readonly String: ValueConverter<String>;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ValueConverters = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var inputTypes_js_1 = require("../inputTypes.js");
6
+ var zeroDate = new Date('0000-01-01');
6
7
  var ValueConverters = /** @class */ (function () {
7
8
  function ValueConverters() {
8
9
  }
@@ -71,6 +72,8 @@ var ValueConverters = /** @class */ (function () {
71
72
  fromJson: function (value) {
72
73
  if (!value || value == '' || value == '0000-00-00')
73
74
  return null;
75
+ if (value == '0000-01-01')
76
+ return zeroDate;
74
77
  var d = new Date(Date.parse(value));
75
78
  d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
76
79
  return d;
@@ -92,6 +95,8 @@ var ValueConverters = /** @class */ (function () {
92
95
  },
93
96
  };
94
97
  ValueConverters.DateOnlyString = tslib_1.__assign(tslib_1.__assign({}, ValueConverters.DateOnly), { toDb: function (d) {
98
+ if (d === zeroDate)
99
+ return '00000000';
95
100
  var val = ValueConverters.DateOnly.toJson(d);
96
101
  if (!val)
97
102
  return undefined;
@@ -101,12 +106,10 @@ var ValueConverters = /** @class */ (function () {
101
106
  return null;
102
107
  if (!val)
103
108
  return undefined;
104
- return new Date(val.substring(0, 4) +
105
- '-' +
106
- val.substring(4, 6) +
107
- '-' +
108
- val.substring(6, 8));
109
- } });
109
+ if (val === '00000000')
110
+ return zeroDate;
111
+ return new Date(Number(val.substring(0, 4)), Number(val.substring(4, 6)) - 1, Number(val.substring(6, 8)));
112
+ }, zeroDate: zeroDate });
110
113
  ValueConverters.Boolean = {
111
114
  toDb: function (val) { return val; },
112
115
  inputType: inputTypes_js_1.InputTypes.checkbox,
@@ -173,6 +176,7 @@ var ValueConverters = /** @class */ (function () {
173
176
  toDb: function (x) { return ValueConverters.JsonString.toDb(x); },
174
177
  fromInput: function (x) { return ValueConverters.Default.fromJson(x); },
175
178
  toInput: function (x) { return ValueConverters.Default.toJson(x); },
179
+ toDbSql: function (x) { return x; },
176
180
  displayValue: function (x) { return x + ''; },
177
181
  fieldTypeInDb: '',
178
182
  inputType: 'text',