remult 3.3.0-next.1 → 3.3.1

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 (38) hide show
  1. package/esm/graphql.js +1 -1
  2. package/esm/remult-knex/index.js +10 -3
  3. package/esm/remult-mongo.js +7 -3
  4. package/esm/server/get-remult-admin-html.js +125 -111
  5. package/esm/server/remult-admin.js +2 -0
  6. package/esm/server/remult-api-server.js +1 -1
  7. package/esm/src/data-api.js +30 -19
  8. package/esm/src/data-providers/rest-data-provider.js +48 -37
  9. package/esm/src/data-providers/sql-database.js +14 -3
  10. package/esm/src/live-query/SubscriptionChannel.js +52 -4
  11. package/esm/src/remult-proxy.js +4 -4
  12. package/esm/src/remult3/RepositoryImplementation.js +53 -25
  13. package/esm/src/server-action.js +2 -2
  14. package/esm/src/valueConverters.js +9 -5
  15. package/graphql.js +1 -1
  16. package/index.d.ts +1 -1
  17. package/package.json +1 -1
  18. package/remult-knex/index.js +18 -9
  19. package/remult-mongo.js +6 -2
  20. package/server/get-remult-admin-html.js +1 -1
  21. package/server/remult-admin.d.ts +2 -0
  22. package/server/remult-admin.js +2 -1
  23. package/server/remult-api-server.js +1 -0
  24. package/src/data-api.d.ts +4 -4
  25. package/src/data-api.js +50 -30
  26. package/src/data-interfaces.d.ts +6 -6
  27. package/src/data-providers/rest-data-provider.d.ts +4 -4
  28. package/src/data-providers/rest-data-provider.js +48 -37
  29. package/src/data-providers/sql-database.js +14 -3
  30. package/src/live-query/SubscriptionChannel.d.ts +52 -4
  31. package/src/live-query/SubscriptionChannel.js +52 -4
  32. package/src/remult-proxy.js +4 -4
  33. package/src/remult3/RepositoryImplementation.d.ts +11 -10
  34. package/src/remult3/RepositoryImplementation.js +237 -177
  35. package/src/remult3/remult3.d.ts +25 -23
  36. package/src/server-action.js +2 -2
  37. package/src/valueConverters.d.ts +3 -1
  38. package/src/valueConverters.js +9 -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;
@@ -395,9 +395,14 @@ export type GroupByResult<entityType, groupByFields extends (keyof entityType)[]
395
395
  };
396
396
  /** used to perform CRUD operations on an `entityType` */
397
397
  export interface Repository<entityType> {
398
- /** returns a result array based on the provided options */
398
+ /** returns an array based on the provided options */
399
399
  find(options?: FindOptions<entityType>): Promise<entityType[]>;
400
- /** returns a result array based on the provided options */
400
+ /** Using the same options as the {@link find} method, but subscribing to entity changes.
401
+ *
402
+ * _Note that today it subscribes to entity changes, but not included entities [Feature Request](https://github.com/remult/remult/issues/712)!_
403
+ *
404
+ * @see {@link LiveQuery}
405
+ */
401
406
  liveQuery(options?: FindOptions<entityType>): LiveQuery<entityType>;
402
407
  /** returns the first item that matchers the `where` condition
403
408
  * @example
@@ -547,27 +552,27 @@ export interface Repository<entityType> {
547
552
  * @example
548
553
  * await taskRepo.save({...task, completed:true })
549
554
  */
550
- save(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
551
- save(item: Partial<MembersOnly<entityType>>): Promise<entityType>;
555
+ save(item: Partial<MembersOnly<entityType>>[], options?: InsertOrUpdateOptions): Promise<entityType[]>;
556
+ save(item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
552
557
  /**Insert an item or item[] to the data source
553
558
  * @example
554
559
  * await taskRepo.insert({title:"task a"})
555
560
  * @example
556
561
  * await taskRepo.insert([{title:"task a"}, {title:"task b", completed:true }])
557
562
  */
558
- insert(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
559
- insert(item: Partial<MembersOnly<entityType>>): Promise<entityType>;
563
+ insert(item: Partial<MembersOnly<entityType>>[], options?: InsertOrUpdateOptions): Promise<entityType[]>;
564
+ insert(item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
560
565
  /** Updates an item, based on its `id`
561
566
  * @example
562
567
  * taskRepo.update(task.id,{...task,completed:true})
563
568
  */
564
- update(id: idType<entityType>, item: Partial<MembersOnly<entityType>>): Promise<entityType>;
565
- update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>): Promise<entityType>;
569
+ update(id: idType<entityType>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
570
+ update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
566
571
  /**
567
572
  * Updates all items that match the `where` condition.
568
573
  */
569
574
  updateMany(options: {
570
- where: EntityFilter<entityType>;
575
+ where: EntityFilter<entityType> | 'all';
571
576
  set: Partial<MembersOnly<entityType>>;
572
577
  }): Promise<number>;
573
578
  /**
@@ -607,7 +612,7 @@ export interface Repository<entityType> {
607
612
  * Deletes all items that match the `where` condition.
608
613
  */
609
614
  deleteMany(options: {
610
- where: EntityFilter<entityType>;
615
+ where: EntityFilter<entityType> | 'all';
611
616
  }): Promise<number>;
612
617
  /** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called.
613
618
  *
@@ -674,7 +679,7 @@ export interface LiveQuery<entityType> {
674
679
  *
675
680
  * @example
676
681
  * // Subscribing to changes in a live query
677
- * const unsubscribe = taskRepo
682
+ * const unsubscribe = repo(Task)
678
683
  * .liveQuery({
679
684
  * limit: 20,
680
685
  * orderBy: { createdAt: 'asc' }
@@ -734,20 +739,14 @@ export interface LiveQueryChangeInfo<entityType> {
734
739
  applyChanges(prevState: entityType[] | undefined): entityType[];
735
740
  }
736
741
  export interface FindOptions<entityType> extends FindOptionsBase<entityType> {
737
- /** Determines the number of rows returned by the request, on the browser the default is 100 rows
742
+ /** Number of rows returned. _(Defaults to 100 in the browser)_
738
743
  * @example
739
- * await repo(Products).find({
740
- * limit: 10,
741
- * page: 2
742
- * })
744
+ * await repo(Products).find({ limit: 10 })
743
745
  */
744
746
  limit?: number;
745
- /** Determines the page number that will be used to extract the data
747
+ /** Determines the page number to retrieve. Works in tandem with the `limit` option.
746
748
  * @example
747
- * await repo(Products).find({
748
- * limit: 10,
749
- * page: 2
750
- * })
749
+ * await repo(Products).find({ page: 2 })
751
750
  */
752
751
  page?: number;
753
752
  }
@@ -1058,7 +1057,7 @@ export interface FindOptionsBase<entityType> extends LoadOptions<entityType> {
1058
1057
  select?: EntitySelectFields<entityType>;
1059
1058
  /** filters the data
1060
1059
  * @example
1061
- * await taskRepo.find({where: { completed:false }})
1060
+ * await taskRepo.find({ where: { completed:false } })
1062
1061
  * @see For more usage examples see [EntityFilter](https://remult.dev/docs/entityFilter.html)
1063
1062
  */
1064
1063
  where?: EntityFilter<entityType>;
@@ -1198,6 +1197,9 @@ export declare type EntityIdFields<entityType> = {
1198
1197
  export declare type EntitySelectFields<entityType> = {
1199
1198
  [Properties in keyof Partial<MembersOnly<entityType>>]?: boolean;
1200
1199
  };
1200
+ export declare type InsertOrUpdateOptions = {
1201
+ select: 'none';
1202
+ };
1201
1203
  export interface ClassFieldDecoratorContextStub<entityType, valueType> {
1202
1204
  readonly access: {
1203
1205
  set(object: entityType, value: valueType | null): void;
@@ -295,7 +295,7 @@ function BackendMethod(options) {
295
295
  reg(controllerOptions.key +
296
296
  '/' +
297
297
  ((options === null || options === void 0 ? void 0 : options.apiPrefix) ? options.apiPrefix + '/' : '') +
298
- key, options ? (_b = options.queue) !== null && _b !== void 0 ? _b : false : false, options.allowed, function (d, req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
298
+ key, options ? ((_b = options.queue) !== null && _b !== void 0 ? _b : false) : false, options.allowed, function (d, req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
299
299
  var allowed, remult_1, r_1, err_3;
300
300
  var _this = this;
301
301
  return tslib_1.__generator(this, function (_a) {
@@ -475,7 +475,7 @@ function BackendMethod(options) {
475
475
  http])];
476
476
  case 4:
477
477
  r = _k.sent();
478
- return [4 /*yield*/, defs._updateEntityBasedOnApi(r.rowInfo.data, true)];
478
+ return [4 /*yield*/, defs._updateResultsFromServerAction(r.rowInfo)];
479
479
  case 5:
480
480
  _k.sent();
481
481
  return [2 /*return*/, r.result];
@@ -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,