remult 0.27.20-next.0 → 0.27.20-next.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.
@@ -1,5 +1,4 @@
1
1
  import { queryConfig } from '../context.js';
2
- import { isOfType } from '../isOfType.js';
3
2
  import { Sort } from '../sort.js';
4
3
  import { RelationLoader } from './relation-loader.js';
5
4
  export class QueryResultImpl {
@@ -53,8 +52,11 @@ export class QueryResultImpl {
53
52
  include: this.options.include,
54
53
  };
55
54
  let getItems = () => this.repo.find(options);
56
- if (this._aggregates === undefined &&
57
- isOfType(this.options, 'aggregate')) {
55
+ if (this._aggregates === undefined /* &&
56
+ (isOfType<QueryOptions<entityType, any, any, any, any, any>>(
57
+ this.options,
58
+ 'aggregate',
59
+ ))*/) {
58
60
  let agg = this.options.aggregate;
59
61
  if (!this.repo._dataProvider.isProxy) {
60
62
  let itemsPromise = getItems();
package/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import type { ClassType } from './classType.js';
2
2
  import type { DataProvider } from './src/data-interfaces.js';
3
3
  export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider.js';
4
4
  export type { ClassType } from './classType.js';
5
- export { ValidateFieldEvent, MembersOnly, FieldsMetadata, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, FindOptionsBase, QueryResult, QueryOptionsWithAggregates, QueryResultWithAggregates, PaginatorWithAggregates, QueryOptions, Repository, GroupByOptions, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, EntityRef, SortSegments, Paginator, LiveQuery, LiveQueryChangeInfo, Subscribable, RefSubscriber, RefSubscriberBase, RelationOptions, ObjectMembersOnly, MembersToInclude, RepositoryRelations, EntityIdFields, ClassFieldDecorator, ClassFieldDecoratorContextStub, //n1 consider removing in ts5
5
+ export { ValidateFieldEvent, MembersOnly, FieldsMetadata, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, FindOptionsBase, QueryResult, QueryOptions, Repository, GroupByOptions, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, EntityRef, SortSegments, Paginator, LiveQuery, LiveQueryChangeInfo, Subscribable, RefSubscriber, RefSubscriberBase, RelationOptions, ObjectMembersOnly, MembersToInclude, RepositoryRelations, EntityIdFields, ClassFieldDecorator, ClassFieldDecoratorContextStub, //n1 consider removing in ts5
6
6
  LifecycleEvent, FieldsRefBase, FieldsRefForEntityBase, RepositoryRelationsForEntityBase, ControllerRefForControllerBase, ControllerRefBase, ControllerRef, EntityRefForEntityBase, IdMetadata, FindFirstOptionsBase, } from './src/remult3/remult3.js';
7
7
  export { EntityBase, ControllerBase, FieldType, getFields, ValueListFieldType, getValueList, ValueListFieldOptions, ValueListInfo, CaptionTransformer, } from './src/remult3/RepositoryImplementation.js';
8
8
  export { Entity } from './src/remult3/entity.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.27.20-next.0",
3
+ "version": "0.27.20-next.1",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {
@@ -3,7 +3,7 @@ import type { RepositoryImplementation } from './RepositoryImplementation.js';
3
3
  export declare class QueryResultImpl<entityType> implements QueryResult<entityType> {
4
4
  private options;
5
5
  private repo;
6
- constructor(options: QueryOptions<entityType>, repo: RepositoryImplementation<entityType>);
6
+ constructor(options: QueryOptions<entityType, any, any, any, any, any>, repo: RepositoryImplementation<entityType>);
7
7
  private _count;
8
8
  private _aggregates;
9
9
  getPage(page?: number): Promise<entityType[]>;
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueryResultImpl = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var context_js_1 = require("../context.js");
6
- var isOfType_js_1 = require("../isOfType.js");
7
6
  var sort_js_1 = require("../sort.js");
8
7
  var relation_loader_js_1 = require("./relation-loader.js");
9
8
  var QueryResultImpl = /** @class */ (function () {
@@ -117,8 +116,11 @@ var QueryResultImpl = /** @class */ (function () {
117
116
  include: this.options.include,
118
117
  };
119
118
  getItems = function () { return _this.repo.find(options); };
120
- if (this._aggregates === undefined &&
121
- (0, isOfType_js_1.isOfType)(this.options, 'aggregate')) {
119
+ if (this._aggregates === undefined /* &&
120
+ (isOfType<QueryOptions<entityType, any, any, any, any, any>>(
121
+ this.options,
122
+ 'aggregate',
123
+ ))*/) {
122
124
  agg_1 = this.options.aggregate;
123
125
  if (!this.repo._dataProvider.isProxy) {
124
126
  itemsPromise_1 = getItems();
@@ -5,7 +5,7 @@ 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 Subscribable, type idType } from './remult3.js';
8
- import type { QueryOptions, QueryOptionsWithAggregates, QueryResult, QueryResultWithAggregates, RefSubscriber } from './remult3.js';
8
+ import type { QueryOptions, QueryResult, RefSubscriber } from './remult3.js';
9
9
  import type { entityEventListener } from '../__EntityValueProvider.js';
10
10
  import type { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo } from '../data-interfaces.js';
11
11
  import type { Unsubscribe } from '../live-query/SubscriptionChannel.js';
@@ -42,8 +42,7 @@ export declare class RepositoryImplementation<entityType> implements Repository<
42
42
  get metadata(): EntityMetadata<entityType>;
43
43
  listeners?: entityEventListener<entityType>[];
44
44
  addEventListener(listener: entityEventListener<entityType>): () => void;
45
- query(options?: QueryOptions<entityType>): QueryResult<entityType>;
46
- query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptionsWithAggregates<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResultWithAggregates<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
45
+ query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptions<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResult<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
47
46
  getEntityRef(entity: entityType): EntityRef<entityType>;
48
47
  delete(id: idType<entityType>): Promise<void>;
49
48
  delete(item: Partial<MembersOnly<entityType>>): Promise<void>;
@@ -362,7 +362,7 @@ export type GroupByOptions<entityType, groupByFields extends (keyof MembersOnly<
362
362
  export declare const GroupByCountMember: "$count";
363
363
  export declare const GroupByForApiKey: unique symbol;
364
364
  export declare const GroupByOperators: readonly ["sum", "avg", "min", "max", "distinctCount"];
365
- export type GroupByResult<entityType, groupByFields extends (keyof entityType)[], sumFields extends (keyof entityType)[], averageFields extends NumericKeys<entityType>[], minFields extends NumericKeys<entityType>[], maxFields extends NumericKeys<entityType>[], distinctCountFields extends (keyof entityType)[]> = {
365
+ export type GroupByResult<entityType, groupByFields extends (keyof entityType)[], sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends NumericKeys<entityType>[], maxFields extends NumericKeys<entityType>[], distinctCountFields extends (keyof entityType)[]> = {
366
366
  [K in groupByFields[number] | sumFields[number]]: K extends groupByFields[number] ? entityType[K] : K extends sumFields[number] ? {
367
367
  sum: number;
368
368
  } : never;
@@ -461,36 +461,16 @@ export interface Repository<entityType> {
461
461
 
462
462
  */
463
463
  aggregate<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options: Omit<GroupByOptions<entityType, never, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>, 'orderBy' | 'limit' | 'page' | 'group'>): Promise<GroupByResult<entityType, never, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>>;
464
- /** An alternative form of fetching data from the API server, which is intended for operating on large numbers of entity objects.
464
+ /**
465
+ * Fetches data from the repository in a way that is optimized for handling large sets of entity objects.
465
466
  *
466
- * It also has it's own paging mechanism that can be used n paging scenarios.
467
+ * Unlike the `find` method, which returns an array, the `query` method returns an iterable `QueryResult` object.
468
+ * This allows for more efficient data handling, particularly in scenarios that involve paging through large amounts of data.
467
469
  *
468
- * The `query` method doesn't return an array (as the `find` method) and instead returns an `iterable` `QueryResult` object
469
- * which supports iterations using the JavaScript `for await` statement.
470
- * @example
471
- * for await (const task of taskRepo.query()) {
472
- * // do something.
473
- * }
474
- * @example
475
- * const query = taskRepo.query({
476
- * where: { completed: false },
477
- * pageSize: 100,
478
- * })
479
- * const count = await query.count()
480
- * console.log('Paged: ' + count / 100)
481
- * let paginator = await query.paginator()
482
- * console.log(paginator.items.length)
483
- * if (paginator.hasNextPage) {
484
- * paginator = await paginator.nextPage()
485
- * console.log(paginator.items.length)
486
- * }
487
- * */
488
- query(options?: QueryOptions<entityType>): QueryResult<entityType>;
489
- /**
490
- * Fetches data from the repository, allowing for both standard querying and aggregation in a single request.
470
+ * The method supports pagination and aggregation in a single request. When aggregation options are provided,
471
+ * the result will include both the items from the current page and the results of the requested aggregation.
491
472
  *
492
- * This method supports pagination and aggregation, returning a `QueryResultWithAggregates` object that includes both
493
- * the queried items for the current page and the results of the aggregation.
473
+ * The `query` method is designed for asynchronous iteration using the `for await` statement.
494
474
  *
495
475
  * @template entityType The type of the entity being queried.
496
476
  * @template sumFields The fields to sum, provided as an array of numeric keys from the entity type.
@@ -503,7 +483,29 @@ export interface Repository<entityType> {
503
483
  * @returns {QueryResultWithAggregates<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>} The result of the query, including paginated items and aggregation results.
504
484
  *
505
485
  * @example
506
- * // Performing a query with aggregation:
486
+ * // Basic usage with asynchronous iteration:
487
+ * for await (const task of taskRepo.query()) {
488
+ * // Perform some operation on each task
489
+ * }
490
+ *
491
+ * @example
492
+ * // Querying with pagination:
493
+ * const query = taskRepo.query({
494
+ * where: { completed: false },
495
+ * pageSize: 100,
496
+ * });
497
+ *
498
+ * let paginator = await query.paginator();
499
+ * console.log('Number of items on the current page:', paginator.items.length);
500
+ * console.log('Total pages:', Math.ceil(paginator.aggregate.$count / 100));
501
+ *
502
+ * if (paginator.hasNextPage) {
503
+ * paginator = await paginator.nextPage();
504
+ * console.log('Items on the next page:', paginator.items.length);
505
+ * }
506
+ *
507
+ * @example
508
+ * // Querying with aggregation:
507
509
  * const result = await repo.query({
508
510
  * where: { completed: false },
509
511
  * pageSize: 50,
@@ -511,16 +513,16 @@ export interface Repository<entityType> {
511
513
  * sum: ['salary'],
512
514
  * average: ['age'],
513
515
  * }
514
- * });
516
+ * }).paginator();
515
517
  *
516
- * // Accessing the items from the first page
518
+ * // Accessing paginated items
517
519
  * console.table(result.items);
518
520
  *
519
- * // Accessing the aggregation results
520
- * console.log(result.aggregates.salary.sum); // Total salary sum
521
- * console.log(result.aggregates.age.average); // Average age
521
+ * // Accessing aggregation results
522
+ * console.log('Total salary:', result.aggregates.salary.sum); // Sum of all salaries
523
+ * console.log('Average age:', result.aggregates.age.average); // Average age
522
524
  */
523
- query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptionsWithAggregates<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResultWithAggregates<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
525
+ query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptions<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResult<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
524
526
  /** Returns a count of the items matching the criteria.
525
527
  * @see [EntityFilter](http://remult.dev/docs/entityFilter.html)
526
528
  * @example
@@ -1013,20 +1015,18 @@ export interface FindFirstOptionsBase<entityType> extends LoadOptions<entityType
1013
1015
  /** If set to true and an item is not found, it's created and returned*/
1014
1016
  createIfNotFound?: boolean;
1015
1017
  }
1016
- export interface QueryOptions<entityType> extends FindOptionsBase<entityType> {
1018
+ export interface QueryOptions<entityType, sumFields extends NumericKeys<entityType>[] = never, averageFields extends NumericKeys<entityType>[] = never, minFields extends (keyof MembersOnly<entityType>)[] = never, maxFields extends (keyof MembersOnly<entityType>)[] = never, distinctCountFields extends (keyof MembersOnly<entityType>)[] = never> extends FindOptionsBase<entityType> {
1017
1019
  /** The number of items to return in each step */
1018
1020
  pageSize?: number;
1019
1021
  /** A callback method to indicate the progress of the iteration */
1020
1022
  progress?: {
1021
1023
  progress: (progress: number) => void;
1022
1024
  };
1023
- }
1024
- export interface QueryOptionsWithAggregates<entityType, sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends (keyof MembersOnly<entityType>)[], maxFields extends (keyof MembersOnly<entityType>)[], distinctCountFields extends (keyof MembersOnly<entityType>)[]> extends QueryOptions<entityType> {
1025
- aggregate: Omit<GroupByOptions<entityType, never, sumFields, averageFields, minFields, maxFields, distinctCountFields>, 'group' | 'orderBy' | 'where' | 'limit' | 'page'>;
1025
+ aggregate?: Omit<GroupByOptions<entityType, never, sumFields, averageFields, minFields, maxFields, distinctCountFields>, 'group' | 'orderBy' | 'where' | 'limit' | 'page'>;
1026
1026
  }
1027
1027
  /** The result of a call to the `query` method in the `Repository` object.
1028
1028
  */
1029
- export interface QueryResult<entityType> {
1029
+ export interface QueryResult<entityType, sumFields extends NumericKeys<entityType>[] = never, averageFields extends NumericKeys<entityType>[] = never, minFields extends (keyof MembersOnly<entityType>)[] = never, maxFields extends (keyof MembersOnly<entityType>)[] = never, distinctCountFields extends (keyof MembersOnly<entityType>)[] = never> {
1030
1030
  /** returns an iterator that iterates the rows in the result using a paging mechanism
1031
1031
  * @example
1032
1032
  * for await (const task of taskRepo.query()) {
@@ -1038,16 +1038,12 @@ export interface QueryResult<entityType> {
1038
1038
  };
1039
1039
  /** returns the number of rows that match the query criteria */
1040
1040
  count(): Promise<number>;
1041
- /** Returns a `Paginator` object that is used for efficient paging */
1042
- paginator(): Promise<Paginator<entityType>>;
1043
1041
  /** gets the items in a specific page */
1044
1042
  getPage(pageNumber?: number): Promise<entityType[]>;
1045
1043
  /** Performs an operation on all the items matching the query criteria */
1046
1044
  forEach(what: (item: entityType) => Promise<any>): Promise<number>;
1047
- }
1048
- export interface QueryResultWithAggregates<entityType, sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends (keyof MembersOnly<entityType>)[], maxFields extends (keyof MembersOnly<entityType>)[], distinctCountFields extends (keyof MembersOnly<entityType>)[]> extends QueryResult<entityType> {
1049
1045
  /** Returns a `Paginator` object that is used for efficient paging */
1050
- paginator(): Promise<PaginatorWithAggregates<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
1046
+ paginator(): Promise<Paginator<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
1051
1047
  }
1052
1048
  /** An interface used to paginating using the `query` method in the `Repository` object
1053
1049
  * @example
@@ -1065,18 +1061,15 @@ export interface QueryResultWithAggregates<entityType, sumFields extends Numeric
1065
1061
  * console.log(paginator.items.length)
1066
1062
  * }
1067
1063
  */
1068
- export interface Paginator<entityType> {
1064
+ export interface Paginator<entityType, sumFields extends NumericKeys<entityType>[] = never, averageFields extends NumericKeys<entityType>[] = never, minFields extends (keyof MembersOnly<entityType>)[] = never, maxFields extends (keyof MembersOnly<entityType>)[] = never, distinctCountFields extends (keyof MembersOnly<entityType>)[] = never> {
1069
1065
  /** the items in the current page */
1070
1066
  items: entityType[];
1071
1067
  /** True if next page exists */
1072
1068
  hasNextPage: boolean;
1073
- /** Gets the next page in the `query`'s result set */
1074
- nextPage(): Promise<Paginator<entityType>>;
1075
1069
  /** the count of the total items in the `query`'s result */
1076
1070
  count(): Promise<number>;
1077
- }
1078
- export interface PaginatorWithAggregates<entityType, sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends (keyof MembersOnly<entityType>)[], maxFields extends (keyof MembersOnly<entityType>)[], distinctCountFields extends (keyof MembersOnly<entityType>)[]> extends Paginator<entityType> {
1079
- nextPage(): Promise<PaginatorWithAggregates<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
1071
+ /** Gets the next page in the `query`'s result set */
1072
+ nextPage(): Promise<Paginator<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
1080
1073
  aggregates: GroupByResult<entityType, never, sumFields, averageFields, minFields, maxFields, distinctCountFields>;
1081
1074
  }
1082
1075
  /**