idb-ts 3.10.0 → 3.12.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,25 +55,73 @@ 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: string): this;
17
- and(field: 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;
23
- orderBy(field: string, direction?: QueryDirection): 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;
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;
32
113
  generator?: 'uuid' | 'timestamp' | 'random' | ((item?: any) => string | number);
33
114
  }
115
+ interface RetentionPolicyOptions {
116
+ seconds: number;
117
+ enabled?: boolean;
118
+ field?: string;
119
+ }
120
+ interface RetentionPolicyMetadata {
121
+ seconds: number;
122
+ enabled: boolean;
123
+ field: string;
124
+ }
34
125
  interface KeyPathMetadata {
35
126
  fields: string | string[];
36
127
  options?: KeyPathOptions;
@@ -42,16 +133,22 @@ declare class KeyGenerators {
42
133
  }
43
134
  declare function KeyPath(options?: KeyPathOptions): PropertyDecorator;
44
135
  declare function CompositeKeyPath(fields: string[], options?: KeyPathOptions): ClassDecorator;
45
- declare function Index(): PropertyDecorator;
136
+ declare function Index(options?: IDBIndexParameters): PropertyDecorator;
137
+ declare function Validate<T = any>(predicate: (value: any, item: T) => boolean, message: string): PropertyDecorator;
138
+ declare function RetentionPolicy(options: RetentionPolicyOptions): ClassDecorator;
46
139
  interface DataClassOptions {
47
140
  version?: number;
48
141
  }
49
142
  declare function DataClass(options?: DataClassOptions): ClassDecorator;
50
143
  interface EntityRepository<T> {
51
144
  create(item: T): Promise<void>;
145
+ createMany(items: T[]): Promise<void>;
52
146
  read(key: string | string[] | number): Promise<T | undefined>;
53
147
  update(item: T): Promise<void>;
148
+ updateMany(items: T[]): Promise<void>;
54
149
  delete(key: string | string[] | number): Promise<void>;
150
+ deleteMany(keys: Array<string | string[] | number>): Promise<void>;
151
+ deleteWhere(predicate: (query: QueryBuilder<T>) => QueryBuilder<T> | void): Promise<void>;
55
152
  list(): Promise<T[]>;
56
153
  listPaginated(page: number, pageSize: number): Promise<T[]>;
57
154
  findByIndex(indexName: string, value: any): Promise<T[]>;
@@ -61,6 +158,11 @@ interface EntityRepository<T> {
61
158
  clear(): Promise<void>;
62
159
  query(): QueryBuilder<T>;
63
160
  }
161
+ interface TransactionController {
162
+ commit(): Promise<void>;
163
+ rollback(): Promise<void>;
164
+ }
165
+ type TransactionalDatabase<T extends Record<string, EntityRepository<any>>> = T & TransactionController;
64
166
  type DatabaseWithRepositories<T extends Record<string, any>> = Database & T;
65
167
  declare class Database {
66
168
  private dbName;
@@ -68,17 +170,28 @@ declare class Database {
68
170
  private db;
69
171
  private entityRepositories;
70
172
  private dbVersion;
173
+ private retentionTimer;
174
+ private retentionCleanupRunning;
175
+ private retentionPolicies;
71
176
  private constructor();
72
177
  private calculateDatabaseVersion;
73
178
  static build<T extends Record<string, EntityRepository<any>>>(dbName: string, classes: Function[]): Promise<DatabaseWithRepositories<T>>;
74
179
  private initDB;
75
180
  private generateEntityRepositories;
181
+ private calculateRetentionCleanupIntervalMs;
182
+ private startRetentionCleanup;
183
+ private runRetentionCleanup;
184
+ private cleanupExpiredRecords;
76
185
  private createEntityRepository;
77
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>;
190
+ close(): void;
78
191
  getAvailableEntities(): string[];
79
192
  getDatabaseVersion(): number;
80
193
  getEntityVersions(): Map<string, number>;
81
194
  getEntityVersion(entityName: string): number | undefined;
82
195
  }
83
- export { Database, KeyPath, CompositeKeyPath, DataClass, Index, EntityRepository, KeyGenerators };
84
- export type { DatabaseWithRepositories, DataClassOptions, KeyPathOptions, KeyPathMetadata };
196
+ export { Database, KeyPath, CompositeKeyPath, DataClass, Index, Validate, RetentionPolicy, EntityRepository, KeyGenerators, };
197
+ export type { DatabaseWithRepositories, DataClassOptions, KeyPathOptions, KeyPathMetadata, RetentionPolicyOptions, RetentionPolicyMetadata, };