idb-ts 3.11.1 → 3.13.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.
package/lib/index.d.ts CHANGED
@@ -1,9 +1,52 @@
1
1
  import 'reflect-metadata';
2
2
  type QueryDirection = 'asc' | 'desc';
3
+ type QueryFieldKey<T> = Extract<keyof T, string>;
4
+ type ComparableValue = string | number | bigint | Date;
5
+ type ComparableFieldKey<T> = {
6
+ [K in QueryFieldKey<T>]-?: T[K] extends ComparableValue ? K : never;
7
+ }[QueryFieldKey<T>];
8
+ type NumericFieldKey<T> = {
9
+ [K in QueryFieldKey<T>]-?: T[K] extends number ? K : never;
10
+ }[QueryFieldKey<T>];
11
+ type StringFieldKey<T> = {
12
+ [K in QueryFieldKey<T>]-?: T[K] extends string ? K : never;
13
+ }[QueryFieldKey<T>];
14
+ type ArrayFieldKey<T> = {
15
+ [K in QueryFieldKey<T>]-?: T[K] extends readonly any[] ? K : never;
16
+ }[QueryFieldKey<T>];
17
+ type ArrayElement<T> = T extends readonly (infer U)[] ? U : never;
18
+ type ContainsValue<T> = T extends string ? string : T extends readonly (infer U)[] ? U : never;
19
+ type QueryOperator = 'equals' | 'gt' | 'gte' | 'lt' | 'lte' | 'startsWith' | 'endsWith' | 'contains' | 'matches' | 'between' | 'notBetween' | 'in' | 'notIn' | 'containsAny' | 'containsAll';
20
+ type GroupCountResult<T, K extends Extract<keyof T, string>> = Array<Record<K, T[K]> & {
21
+ count: number;
22
+ }>;
23
+ declare class FieldQueryBuilder<T, K extends QueryFieldKey<T>> {
24
+ private parent;
25
+ private field;
26
+ constructor(parent: QueryBuilder<T>, field: K);
27
+ equals(value: T[K]): QueryBuilder<T>;
28
+ gt(value: T[K] extends ComparableValue ? T[K] : never): QueryBuilder<T>;
29
+ gte(value: T[K] extends ComparableValue ? T[K] : never): QueryBuilder<T>;
30
+ lt(value: T[K] extends ComparableValue ? T[K] : never): QueryBuilder<T>;
31
+ lte(value: T[K] extends ComparableValue ? T[K] : never): QueryBuilder<T>;
32
+ startsWith(this: FieldQueryBuilder<T, StringFieldKey<T>>, value: string): QueryBuilder<T>;
33
+ endsWith(this: FieldQueryBuilder<T, StringFieldKey<T>>, value: string): QueryBuilder<T>;
34
+ contains(this: FieldQueryBuilder<T, StringFieldKey<T>> | FieldQueryBuilder<T, ArrayFieldKey<T>>, value: ContainsValue<T[K]>): QueryBuilder<T>;
35
+ matches(this: FieldQueryBuilder<T, StringFieldKey<T>>, value: RegExp | string): QueryBuilder<T>;
36
+ between(start: T[K] extends ComparableValue ? T[K] : never, end: T[K] extends ComparableValue ? T[K] : never): QueryBuilder<T>;
37
+ notBetween(start: T[K] extends ComparableValue ? T[K] : never, end: T[K] extends ComparableValue ? T[K] : never): QueryBuilder<T>;
38
+ in(values: Array<T[K]>): QueryBuilder<T>;
39
+ notIn(values: Array<T[K]>): QueryBuilder<T>;
40
+ containsAny(this: FieldQueryBuilder<T, ArrayFieldKey<T>>, values: Array<ArrayElement<T[K]>>): QueryBuilder<T>;
41
+ containsAll(this: FieldQueryBuilder<T, ArrayFieldKey<T>>, values: Array<ArrayElement<T[K]>>): QueryBuilder<T>;
42
+ and<K2 extends QueryFieldKey<T>>(field: K2): FieldQueryBuilder<T, K2>;
43
+ or(): QueryBuilder<T>;
44
+ }
3
45
  declare class QueryBuilder<T> {
4
46
  private db;
5
47
  private storeName;
6
- private conditions;
48
+ private transaction?;
49
+ private clauses;
7
50
  private orderField?;
8
51
  private orderDirection;
9
52
  private limitCount?;
@@ -12,20 +55,58 @@ declare class QueryBuilder<T> {
12
55
  private rangeStart?;
13
56
  private rangeEnd?;
14
57
  private currentField?;
15
- constructor(db: IDBDatabase, storeName: string);
16
- where(field: Extract<keyof T, string>): this;
17
- and(field: Extract<keyof T, string>): this;
58
+ private groupField?;
59
+ private pendingConnector;
60
+ constructor(db: IDBDatabase, storeName: string, transaction?: IDBTransaction);
61
+ where<K extends QueryFieldKey<T>>(field: K): FieldQueryBuilder<T, K>;
62
+ where(builder: (query: QueryBuilder<T>) => QueryBuilder<T> | void): this;
63
+ and<K extends QueryFieldKey<T>>(field: K): FieldQueryBuilder<T, K>;
64
+ and(builder: (query: QueryBuilder<T>) => QueryBuilder<T> | void): this;
65
+ or(): this;
66
+ private addNestedGroup;
67
+ clearCurrentField(): void;
68
+ appendCondition(field: string, op: QueryOperator, value: any): void;
69
+ private appendClause;
70
+ private requireCurrentField;
71
+ private addCondition;
18
72
  equals(value: any): this;
19
73
  gt(value: any): this;
20
74
  gte(value: any): this;
21
75
  lt(value: any): this;
22
76
  lte(value: any): this;
77
+ startsWith(value: string): this;
78
+ endsWith(value: string): this;
79
+ contains(value: any): this;
80
+ matches(value: RegExp | string): this;
81
+ between(start: any, end: any): this;
82
+ notBetween(start: any, end: any): this;
83
+ ['in'](values: any[]): this;
84
+ notIn(values: any[]): this;
85
+ containsAny(values: any[]): this;
86
+ containsAll(values: any[]): this;
23
87
  orderBy(field: Extract<keyof T, string>, direction?: QueryDirection): this;
24
88
  limit(n: number): this;
25
89
  offset(n: number): this;
26
90
  useIndex(indexName: string): this;
27
91
  range(start: any, end: any): this;
92
+ groupBy<K extends QueryFieldKey<T>>(field: K): QueryBuilder<T> & {
93
+ count(): Promise<GroupCountResult<T, K>>;
94
+ };
95
+ private loadCandidates;
96
+ private createReadRequest;
97
+ private matchesClause;
98
+ private evaluateClauses;
99
+ private collectMatches;
100
+ private sortResults;
101
+ private applyPagination;
102
+ private aggregateValues;
103
+ private aggregateGroupedCount;
28
104
  execute(): Promise<T[]>;
105
+ count(): Promise<number | GroupCountResult<T, Extract<keyof T, string>>>;
106
+ sum(field: NumericFieldKey<T>): Promise<number>;
107
+ avg(field: NumericFieldKey<T>): Promise<number>;
108
+ min(field: ComparableFieldKey<T>): Promise<T[typeof field] | null>;
109
+ max(field: ComparableFieldKey<T>): Promise<T[typeof field] | null>;
29
110
  }
30
111
  interface KeyPathOptions {
31
112
  autoIncrement?: boolean;
@@ -77,6 +158,11 @@ interface EntityRepository<T> {
77
158
  clear(): Promise<void>;
78
159
  query(): QueryBuilder<T>;
79
160
  }
161
+ interface TransactionController {
162
+ commit(): Promise<void>;
163
+ rollback(): Promise<void>;
164
+ }
165
+ type TransactionalDatabase<T extends Record<string, EntityRepository<any>>> = T & TransactionController;
80
166
  type DatabaseWithRepositories<T extends Record<string, any>> = Database & T;
81
167
  declare class Database {
82
168
  private dbName;
@@ -98,11 +184,14 @@ declare class Database {
98
184
  private cleanupExpiredRecords;
99
185
  private createEntityRepository;
100
186
  private performOperation;
187
+ private createTransactionHandle;
188
+ beginTransaction(entityNames: string[], mode?: IDBTransactionMode): Promise<TransactionalDatabase<Record<string, EntityRepository<any>>>>;
189
+ transaction<T>(callback: (tx: TransactionalDatabase<Record<string, EntityRepository<any>>>) => Promise<T> | T): Promise<T>;
101
190
  close(): void;
102
191
  getAvailableEntities(): string[];
103
192
  getDatabaseVersion(): number;
104
193
  getEntityVersions(): Map<string, number>;
105
194
  getEntityVersion(entityName: string): number | undefined;
106
195
  }
107
- export { Database, KeyPath, CompositeKeyPath, DataClass, Index, Validate, RetentionPolicy, EntityRepository, KeyGenerators };
108
- export type { DatabaseWithRepositories, DataClassOptions, KeyPathOptions, KeyPathMetadata, RetentionPolicyOptions, RetentionPolicyMetadata };
196
+ export { Database, KeyPath, CompositeKeyPath, DataClass, Index, Validate, RetentionPolicy, EntityRepository, KeyGenerators, };
197
+ export type { DatabaseWithRepositories, DataClassOptions, KeyPathOptions, KeyPathMetadata, RetentionPolicyOptions, RetentionPolicyMetadata, };