@ez4/database 0.18.0 → 0.19.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.
@@ -1,5 +1,5 @@
1
- import type { Transaction } from './transaction.js';
2
- import type { Parameters } from './parameters.js';
1
+ import type { ParametersUtils } from './parameters.js';
2
+ import type { TransactionUtils } from './transaction.js';
3
3
  import type { TableClients } from './table.js';
4
4
  import type { Database } from './database.js';
5
5
  /**
@@ -13,12 +13,12 @@ export type Client<T extends Database.Service> = TableClients<T> & {
13
13
  * @param parameters Parameters in use by the given query.
14
14
  * @returns Returns the results for the given query.
15
15
  */
16
- rawQuery(query: string, parameters?: Parameters.Type<T>): Promise<Record<string, unknown>[]>;
16
+ rawQuery(query: string, parameters?: ParametersUtils.Type<T>): Promise<Record<string, unknown>[]>;
17
17
  /**
18
18
  * Prepare and execute the given transaction.
19
19
  *
20
20
  * @param operation Transaction operation.
21
21
  * @returns Returns the transaction result if the given transaction is interactive.
22
22
  */
23
- transaction<O extends Transaction.Type<T, R>, R>(operation: O): Promise<Transaction.Result<O>>;
23
+ transaction<O extends TransactionUtils.Type<T, R>, R>(operation: O): Promise<TransactionUtils.Result<O>>;
24
24
  };
@@ -1,22 +1,53 @@
1
- /**
2
- * Transaction type.
3
- */
4
- export declare const enum TransactionType {
5
- Interactive = "interactive",
6
- Static = "static"
7
- }
8
- /**
9
- * Parameters type.
10
- */
11
- export declare const enum ParametersType {
12
- NameAndIndex = "both",
13
- OnlyIndex = "index"
14
- }
1
+ import type { ParametersMode } from './parameters.js';
2
+ import type { TransactionMode } from './transaction.js';
3
+ import type { InsensitiveMode } from './insensitive.js';
4
+ import type { PaginationMode } from './pagination.js';
5
+ import type { OrderMode } from './order.js';
6
+ import type { TableMetadata } from './table.js';
7
+ import type { Database } from './database.js';
15
8
  /**
16
9
  * Database engine.
17
10
  */
18
11
  export type DatabaseEngine = {
19
- transaction: TransactionType;
20
- parameters: ParametersType;
12
+ parametersMode: ParametersMode;
13
+ transactionMode: TransactionMode;
14
+ insensitiveMode: InsensitiveMode;
15
+ paginationMode: PaginationMode;
16
+ orderMode: OrderMode;
21
17
  name: string;
22
18
  };
19
+ /**
20
+ * Engine utils.
21
+ */
22
+ export declare namespace EngineUtils {
23
+ /**
24
+ * Get the parameters mode from the given database service.
25
+ */
26
+ type GetParametersMode<T extends Database.Service> = T['engine'] extends {
27
+ parametersMode: infer M;
28
+ } ? M : never;
29
+ /**
30
+ * Get the transaction mode from the given database service.
31
+ */
32
+ type GetTransactionMode<T extends Database.Service> = T['engine'] extends {
33
+ transactionMode: infer M;
34
+ } ? M : never;
35
+ /**
36
+ * Get the insensitive mode from the given table service.
37
+ */
38
+ type GetInsensitiveMode<T extends TableMetadata> = T['engine'] extends {
39
+ insensitiveMode: infer M;
40
+ } ? M : never;
41
+ /**
42
+ * Get the pagination mode from the given table metadata.
43
+ */
44
+ type GetPaginationMode<T extends TableMetadata> = T['engine'] extends {
45
+ paginationMode: infer M;
46
+ } ? M : never;
47
+ /**
48
+ * Get the order mode from the given database service.
49
+ */
50
+ type GetOrderMode<T extends Database.Service> = T['engine'] extends {
51
+ orderMode: infer M;
52
+ } ? M : never;
53
+ }
@@ -0,0 +1,20 @@
1
+ import type { TableMetadata } from './table.js';
2
+ import type { EngineUtils } from './engine.js';
3
+ /**
4
+ * Insensitive mode.
5
+ */
6
+ export declare const enum InsensitiveMode {
7
+ Unsupported = "unsupported",
8
+ Enabled = "enabled"
9
+ }
10
+ /**
11
+ * Insensitive utils.
12
+ */
13
+ export declare namespace InsensitiveUtils {
14
+ /**
15
+ * Get the insensitive input based on the given table metadata.
16
+ */
17
+ type Input<T extends TableMetadata> = EngineUtils.GetInsensitiveMode<T> extends InsensitiveMode.Enabled ? {
18
+ insensitive?: boolean;
19
+ } : {};
20
+ }
@@ -1,3 +1,7 @@
1
+ import type { AnyObject } from '@ez4/utils';
2
+ import type { DecomposeIndexName } from './indexes.js';
3
+ import type { DatabaseEngine } from './engine.js';
4
+ import type { Database } from './database.js';
1
5
  /**
2
6
  * Query order types.
3
7
  */
@@ -5,3 +9,32 @@ export declare const enum Order {
5
9
  Asc = "asc",
6
10
  Desc = "desc"
7
11
  }
12
+ /**
13
+ * Order mode.
14
+ */
15
+ export declare const enum OrderMode {
16
+ IndexColumns = "index",
17
+ AnyColumns = "any"
18
+ }
19
+ /**
20
+ * Order utils.
21
+ */
22
+ export declare namespace OrderUtils {
23
+ /**
24
+ * Order input for index columns.
25
+ */
26
+ type IndexInput<I extends Database.Indexes> = {
27
+ [P in DecomposeIndexName<keyof I>]?: Order;
28
+ };
29
+ /**
30
+ * Order input for any columns.
31
+ */
32
+ type AnyInput<T extends Database.Schema> = {
33
+ [P in keyof T]?: Order;
34
+ };
35
+ /**
36
+ * Order input type based on the
37
+ */
38
+ export type Input<T extends AnyObject, E extends DatabaseEngine> = E['orderMode'] extends OrderMode.AnyColumns ? AnyInput<T['schema']> : IndexInput<T['indexes']>;
39
+ export {};
40
+ }
@@ -0,0 +1,46 @@
1
+ import type { TableMetadata } from './table.js';
2
+ import type { EngineUtils } from './engine.js';
3
+ /**
4
+ * Pagination mode.
5
+ */
6
+ export declare const enum PaginationMode {
7
+ Cursor = "cursor",
8
+ Offset = "offset"
9
+ }
10
+ /**
11
+ * Pagination utils.
12
+ */
13
+ export declare namespace PaginationUtils {
14
+ /**
15
+ * Get the pagination range based on the given table metadata.
16
+ */
17
+ type Range<T extends TableMetadata> = EngineUtils.GetPaginationMode<T> extends PaginationMode.Cursor ? {
18
+ cursor?: string;
19
+ limit?: number;
20
+ } : {
21
+ skip?: number;
22
+ take?: number;
23
+ };
24
+ /**
25
+ * Get the pagination begin based on the given table metadata.
26
+ */
27
+ type Begin<T extends TableMetadata> = EngineUtils.GetPaginationMode<T> extends PaginationMode.Cursor ? {
28
+ cursor?: string;
29
+ } : {
30
+ skip?: number;
31
+ };
32
+ /**
33
+ * Get the pagination end based on the given table metadata.
34
+ */
35
+ type End<T extends TableMetadata> = EngineUtils.GetPaginationMode<T> extends PaginationMode.Cursor ? {
36
+ limit?: number;
37
+ } : {
38
+ take?: number;
39
+ };
40
+ /**
41
+ * Get the pagination result based on the given table metadata.
42
+ */
43
+ type Result<T extends TableMetadata> = EngineUtils.GetPaginationMode<T> extends PaginationMode.Cursor ? {
44
+ cursor?: string;
45
+ } : {};
46
+ }
@@ -1,18 +1,18 @@
1
- import type { ParametersType } from './engine.js';
1
+ import type { EngineUtils } from './engine.js';
2
2
  import type { Database } from './database.js';
3
3
  /**
4
- * Parameters builder types.
4
+ * Parameters mode.
5
5
  */
6
- export declare namespace Parameters {
7
- /**
8
- * Determines the parameters type based on the given database service.
9
- */
10
- export type Type<T extends Database.Service> = EngineParametersType<T> extends ParametersType.NameAndIndex ? unknown[] | Record<string, unknown> : unknown[];
6
+ export declare const enum ParametersMode {
7
+ NameAndIndex = "both",
8
+ OnlyIndex = "index"
9
+ }
10
+ /**
11
+ * Parameters utils.
12
+ */
13
+ export declare namespace ParametersUtils {
11
14
  /**
12
- * Extract the parameters from the given database service.
15
+ * Get the parameters type based on the given database service.
13
16
  */
14
- type EngineParametersType<T extends Database.Service> = T['engine'] extends {
15
- parameters: infer R;
16
- } ? R : never;
17
- export {};
17
+ type Type<T extends Database.Service> = EngineUtils.GetParametersMode<T> extends ParametersMode.NameAndIndex ? unknown[] | Record<string, unknown> : unknown[];
18
18
  }
@@ -1,150 +1,147 @@
1
1
  import type { DecomposeIndexName, PrimaryIndexes, UniqueIndexes } from './indexes.js';
2
2
  import type { RelationMetadata } from './relations.js';
3
+ import type { InsensitiveUtils } from './insensitive.js';
4
+ import type { PaginationUtils } from './pagination.js';
5
+ import type { TableMetadata } from './table.js';
6
+ import type { OrderUtils } from './order.js';
3
7
  import type { Database } from './database.js';
4
- import type { Order } from './order.js';
5
8
  import type { AnyObject, PartialProperties, PartialObject, FlatObject, OptionalObject, StrictObject, IsNullable, IsObjectEmpty, IsObject, IsArray } from '@ez4/utils';
6
9
  /**
7
10
  * Query builder types.
8
11
  */
9
12
  export declare namespace Query {
10
- export type InsertOneInput<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = {
11
- select?: StrictSelectInput<T, S, R>;
12
- data: InsertDataInput<T, R>;
13
- };
14
- export type UpdateOneInput<T extends Database.Schema, S extends AnyObject, I extends Database.Indexes, R extends RelationMetadata> = {
15
- select?: StrictSelectInput<T, S, R>;
16
- include?: StrictIncludeInput<S, R>;
17
- data: OptionalObject<UpdateDataInput<T, R>>;
18
- where: WhereInput<T, I, R>;
19
- };
20
- export type FindOneInput<T extends Database.Schema, S extends AnyObject, I extends Database.Indexes, R extends RelationMetadata> = {
21
- select: StrictSelectInput<T, S, R>;
22
- include?: StrictIncludeInput<S, R>;
23
- where: WhereInput<T, I, R>;
24
- };
25
- export type UpsertOneInput<T extends Database.Schema, S extends AnyObject, I extends Database.Indexes, R extends RelationMetadata> = {
26
- select?: StrictSelectInput<T, S, R>;
27
- include?: StrictIncludeInput<S, R>;
28
- update: OptionalObject<UpdateDataInput<T, R>>;
29
- insert: InsertDataInput<T, R>;
30
- where: WhereInput<T, I, R>;
31
- };
32
- export type DeleteOneInput<T extends Database.Schema, S extends AnyObject, I extends Database.Indexes, R extends RelationMetadata> = {
33
- select?: StrictSelectInput<T, S, R>;
34
- include?: StrictIncludeInput<S, R>;
35
- where: WhereInput<T, I, R>;
36
- };
37
- export type InsertManyInput<T extends Database.Schema = {}> = {
38
- data: T[];
39
- };
40
- export type UpdateManyInput<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = {
41
- select?: StrictSelectInput<T, S, R>;
42
- include?: StrictIncludeInput<S, R>;
43
- data: OptionalObject<UpdateDataInput<T, R>>;
44
- where?: WhereInput<T, {}, R>;
45
- limit?: number;
46
- };
47
- export type FindManyInput<T extends Database.Schema, S extends AnyObject, I extends Database.Indexes, R extends RelationMetadata, C extends boolean> = {
13
+ export type InsertOneInput<S extends AnyObject, T extends TableMetadata> = {
14
+ select?: StrictSelectInput<S, T>;
15
+ data: InsertDataInput<T>;
16
+ };
17
+ export type UpdateOneInput<S extends AnyObject, T extends TableMetadata> = {
18
+ select?: StrictSelectInput<S, T>;
19
+ include?: StrictIncludeInput<T>;
20
+ data: OptionalObject<UpdateDataInput<T>>;
21
+ where: WhereInput<T, true>;
22
+ };
23
+ export type FindOneInput<S extends AnyObject, T extends TableMetadata> = {
24
+ select: StrictSelectInput<S, T>;
25
+ include?: StrictIncludeInput<T>;
26
+ where: WhereInput<T, true>;
27
+ };
28
+ export type UpsertOneInput<S extends AnyObject, T extends TableMetadata> = {
29
+ select?: StrictSelectInput<S, T>;
30
+ include?: StrictIncludeInput<T>;
31
+ update: OptionalObject<UpdateDataInput<T>>;
32
+ insert: InsertDataInput<T>;
33
+ where: WhereInput<T, true>;
34
+ };
35
+ export type DeleteOneInput<S extends AnyObject, T extends TableMetadata> = {
36
+ select?: StrictSelectInput<S, T>;
37
+ include?: StrictIncludeInput<T>;
38
+ where: WhereInput<T, true>;
39
+ };
40
+ export type InsertManyInput<T extends TableMetadata> = {
41
+ data: T['schema'][];
42
+ };
43
+ export type UpdateManyInput<S extends AnyObject, T extends TableMetadata> = PaginationUtils.End<T> & {
44
+ select?: StrictSelectInput<S, T>;
45
+ include?: StrictIncludeInput<T>;
46
+ data: OptionalObject<UpdateDataInput<T>>;
47
+ where?: WhereInput<T>;
48
+ };
49
+ export type FindManyInput<S extends AnyObject, T extends TableMetadata, C extends boolean> = PaginationUtils.Range<T> & {
48
50
  count?: C;
49
- select: StrictSelectInput<T, S, R>;
50
- include?: StrictIncludeInput<S, R>;
51
- where?: WhereInput<T, {}, R>;
52
- order?: OrderInput<I>;
53
- cursor?: number | string;
54
- limit?: number;
55
- };
56
- export type DeleteManyInput<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = {
57
- select?: StrictSelectInput<T, S, R>;
58
- include?: StrictIncludeInput<S, R>;
59
- where?: WhereInput<T, {}, R>;
60
- limit?: number;
61
- };
62
- export type CountInput<T extends Database.Schema, R extends RelationMetadata> = {
63
- where?: WhereInput<T, {}, R>;
64
- };
65
- export type InsertOneResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? void : Record<T, S, R>;
66
- export type UpdateOneResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? void : Record<T, S, R> | undefined;
67
- export type FindOneResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? void : Record<T, S, R> | undefined;
68
- export type UpsertOneResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? void : Record<T, S, R> | undefined;
69
- export type DeleteOneResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? void : Record<T, S, R> | undefined;
70
- export type UpdateManyResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? void : Record<T, S, R>[];
51
+ select: StrictSelectInput<S, T>;
52
+ include?: StrictIncludeInput<T>;
53
+ where?: WhereInput<T>;
54
+ order?: OrderInput<T>;
55
+ };
56
+ export type DeleteManyInput<S extends AnyObject, T extends TableMetadata> = PaginationUtils.End<T> & {
57
+ select?: StrictSelectInput<S, T>;
58
+ include?: StrictIncludeInput<T>;
59
+ where?: WhereInput<T>;
60
+ };
61
+ export type CountInput<T extends TableMetadata> = {
62
+ where?: WhereInput<T>;
63
+ };
64
+ export type InsertOneResult<S extends AnyObject, T extends TableMetadata> = S extends never ? void : Record<S, T>;
65
+ export type UpdateOneResult<S extends AnyObject, T extends TableMetadata> = S extends never ? void : Record<S, T> | undefined;
66
+ export type FindOneResult<S extends AnyObject, T extends TableMetadata> = S extends never ? void : Record<S, T> | undefined;
67
+ export type UpsertOneResult<S extends AnyObject, T extends TableMetadata> = S extends never ? void : Record<S, T>;
68
+ export type DeleteOneResult<S extends AnyObject, T extends TableMetadata> = S extends never ? void : Record<S, T> | undefined;
69
+ export type UpdateManyResult<S extends AnyObject, T extends TableMetadata> = S extends never ? void : Record<S, T>[];
71
70
  export type InsertManyResult = void;
72
- export type FindManyResult<T extends Database.Schema, S extends Database.Schema, R extends RelationMetadata, C extends boolean> = C extends true ? {
73
- records: Record<T, S, R>[];
74
- cursor?: number | string;
71
+ export type FindManyResult<S extends AnyObject, T extends TableMetadata, C extends boolean> = PaginationUtils.Result<T> & (C extends true ? {
72
+ records: Record<S, T>[];
75
73
  total: number;
76
74
  } : {
77
- records: Record<T, S, R>[];
78
- cursor?: number | string;
79
- };
80
- export type DeleteManyResult<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = Record<T, S, R>[];
81
- export type Record<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = S extends never ? undefined : PartialObject<SelectFields<T, R>, S, false>;
82
- export type SelectInput<T extends Database.Schema, R extends RelationMetadata> = PartialProperties<SelectFields<T, R>>;
83
- export type StrictSelectInput<T extends Database.Schema, S extends AnyObject, R extends RelationMetadata> = StrictObject<S, FlatObject<SelectFields<T, R>>>;
84
- export type InsertDataInput<T extends Database.Schema, R extends RelationMetadata> = Omit<IsObjectEmpty<R['changes']> extends true ? T : T & R['changes'], IndexFields<R>>;
85
- export type UpdateDataInput<T extends Database.Schema, R extends RelationMetadata> = AtomicDataInput<Omit<IsObjectEmpty<R['changes']> extends true ? T : T & FlatObject<R['changes']>, IndexFields<R>>>;
86
- export type StrictIncludeInput<S extends AnyObject, R extends RelationMetadata> = IsObjectEmpty<R['filters']> extends true ? never : IncludeFilters<R['filters'], S>;
87
- export type OrderInput<I extends Database.Indexes> = {
88
- [P in DecomposeIndexName<keyof I>]?: Order;
89
- };
90
- export type WhereInput<T extends Database.Schema, I extends Database.Indexes, R extends RelationMetadata> = WhereInputFilters<T, I, R> & {
91
- NOT?: WhereInput<T, {}, R>;
92
- AND?: WhereInput<T, {}, R>[];
93
- OR?: WhereInput<T, {}, R>[];
75
+ records: Record<S, T>[];
76
+ });
77
+ export type DeleteManyResult<S extends AnyObject, T extends TableMetadata> = Record<S, T>[];
78
+ export type Record<S extends AnyObject, T extends TableMetadata> = S extends never ? undefined : PartialObject<SelectFields<T['schema'], T['relations']>, S, false>;
79
+ export type SelectInput<T extends TableMetadata> = PartialProperties<SelectFields<T['schema'], T['relations']>>;
80
+ export type StrictSelectInput<S extends AnyObject, T extends TableMetadata> = StrictObject<S, FlatObject<SelectFields<T['schema'], T['relations']>>>;
81
+ export type InsertDataInput<T extends TableMetadata> = Omit<IsObjectEmpty<T['relations']['changes']> extends true ? T['schema'] : T['schema'] & T['relations']['changes'], IndexFields<T['relations']>>;
82
+ export type UpdateDataInput<T extends TableMetadata> = AtomicDataInput<Omit<IsObjectEmpty<T['relations']['changes']> extends true ? T['schema'] : T['schema'] & FlatObject<T['relations']['changes']>, IndexFields<T['relations']>>>;
83
+ export type OrderInput<T extends TableMetadata, O extends AnyObject = T['schema']> = OrderUtils.Input<O, T['engine']>;
84
+ export type StrictIncludeInput<T extends TableMetadata> = IsObjectEmpty<T['relations']['filters']> extends true ? never : {
85
+ [P in keyof T['relations']['filters']]?: PaginationUtils.Range<T> & {
86
+ where?: WhereRelationField<T['relations']['filters'][P], T>;
87
+ order?: OrderInput<T, T['relations']['filters'][P]>;
88
+ };
89
+ };
90
+ export type WhereInput<T extends TableMetadata, I extends boolean = false> = WhereInputFilters<T, I extends true ? T['indexes'] : {}> & {
91
+ NOT?: WhereInput<T>;
92
+ AND?: WhereInput<T>[];
93
+ OR?: WhereInput<T>[];
94
94
  };
95
95
  type IndexFields<R extends RelationMetadata> = string extends R['indexes'] ? never : R['indexes'];
96
96
  type SelectFields<T extends Database.Schema, R extends RelationMetadata> = IsObjectEmpty<R['selects']> extends true ? T : T & R['selects'];
97
- type IncludeFilters<T extends AnyObject, S extends AnyObject> = {
98
- [P in keyof T]?: P extends keyof S ? (IsObject<T[P]> extends true ? null | WhereRelationField<NonNullable<T[P]>> : never) : never;
99
- };
100
- type WhereOperations<T> = WhereNegate<T> | WhereEqual<T> | WhereGreaterThan<T> | WhereGreaterThanOrEqual<T> | WhereLessThan<T> | WhereLessThanOrEqual<T> | WhereIn<T> | WhereBetween<T> | WhereIsMissing | WhereIsNull | WhereStartsWith | WhereContains<T>;
101
- type WhereField<T> = IsObject<T> extends false ? T | WhereOperations<T> : IsNullable<T> extends true ? null | WhereObjectField<NonNullable<T>> : WhereObjectField<NonNullable<T>>;
102
- type WhereObjectField<T extends AnyObject> = {
103
- [P in keyof T]?: WhereField<T[P]>;
97
+ type WhereOperations<V, T extends TableMetadata> = WhereNegate<V, T> | WhereEqual<V> | WhereGreaterThan<V> | WhereGreaterThanOrEqual<V> | WhereLessThan<V> | WhereLessThanOrEqual<V> | WhereIn<V> | WhereBetween<V> | WhereIsMissing | WhereIsNull | WhereStartsWith<T> | WhereContains<V, T>;
98
+ type WhereField<V, T extends TableMetadata> = IsObject<V> extends false ? V | WhereOperations<V, T> : IsNullable<V> extends true ? null | WhereObjectField<NonNullable<V>, T> : WhereObjectField<NonNullable<V>, T>;
99
+ type WhereObjectField<V extends AnyObject, T extends TableMetadata> = {
100
+ [P in keyof V]?: WhereField<V[P], T>;
104
101
  };
105
- type WhereRelationField<T extends AnyObject> = WhereObjectField<T> & {
106
- NOT?: WhereRelationField<T>;
107
- AND?: WhereRelationField<T>[];
108
- OR?: WhereRelationField<T>[];
102
+ type WhereRelationField<V extends AnyObject, T extends TableMetadata> = WhereObjectField<V, T> & {
103
+ NOT?: WhereRelationField<V, T>;
104
+ AND?: WhereRelationField<V, T>[];
105
+ OR?: WhereRelationField<V, T>[];
109
106
  };
110
- type WhereRelationFilters<T extends AnyObject> = {
111
- [P in keyof T]?: IsObject<T[P]> extends true ? IsObjectEmpty<T[P]> extends false ? null | WhereRelationField<T[P]> : null | {} : never;
107
+ type WhereRelationFilters<V extends AnyObject, T extends TableMetadata> = {
108
+ [P in keyof V]?: IsObject<V[P]> extends true ? IsObjectEmpty<V[P]> extends false ? null | WhereRelationField<V[P], T> : null | {} : never;
112
109
  };
113
110
  type WhereIndexFields<I extends Database.Indexes> = PrimaryIndexes<I> & UniqueIndexes<I>;
114
- type WhereRequiredFilters<T extends AnyObject, I extends Database.Indexes> = {
111
+ type WhereRequiredFilters<V extends AnyObject, I extends Database.Indexes> = {
115
112
  [P in keyof WhereIndexFields<I>]: {
116
- [N in DecomposeIndexName<P>]: T[N];
113
+ [N in DecomposeIndexName<P>]: V[N];
117
114
  };
118
115
  }[keyof WhereIndexFields<I>];
119
- type WhereOptionalFilters<T extends AnyObject, I extends Database.Indexes> = {
120
- [P in Exclude<keyof T, keyof WhereIndexFields<I>>]?: WhereField<T[P]>;
116
+ type WhereOptionalFilters<V extends AnyObject, T extends TableMetadata, I extends Database.Indexes> = {
117
+ [P in Exclude<keyof V, keyof WhereIndexFields<I>>]?: WhereField<V[P], T>;
121
118
  };
122
- type WhereCommonFilters<T extends AnyObject, I extends Database.Indexes> = IsObjectEmpty<I> extends true ? WhereObjectField<T> : WhereRequiredFilters<T, I> & WhereOptionalFilters<T, I>;
123
- type WhereInputFilters<T extends Database.Schema, I extends Database.Indexes, R extends RelationMetadata> = WhereCommonFilters<T, I> & WhereRelationFilters<R['filters']>;
124
- export type WhereOperators = keyof (WhereNegate<any> & WhereEqual<any> & WhereGreaterThan<any> & WhereGreaterThanOrEqual<any> & WhereLessThan<any> & WhereLessThanOrEqual<any> & WhereIn<any> & WhereBetween<any> & WhereIsMissing & WhereIsNull & WhereStartsWith & WhereContains<any>);
125
- type WhereNegate<T> = {
126
- not: T | WhereOperations<T>;
119
+ type WhereCommonFilters<V extends AnyObject, T extends TableMetadata, I extends Database.Indexes> = IsObjectEmpty<I> extends true ? WhereObjectField<V, T> : WhereRequiredFilters<V, I> & WhereOptionalFilters<V, T, I>;
120
+ type WhereInputFilters<T extends TableMetadata, I extends Database.Indexes> = WhereCommonFilters<T['schema'], T, I> & WhereRelationFilters<T['relations']['filters'], T>;
121
+ export type WhereOperators = keyof (WhereNegate<any, never> & WhereEqual<any> & WhereGreaterThan<any> & WhereGreaterThanOrEqual<any> & WhereLessThan<any> & WhereLessThanOrEqual<any> & WhereIn<any> & WhereBetween<any> & WhereIsMissing & WhereIsNull & WhereStartsWith<never> & WhereContains<any, never>);
122
+ type WhereNegate<V, T extends TableMetadata> = {
123
+ not: V | WhereOperations<V, T>;
127
124
  };
128
- type WhereEqual<T> = {
129
- equal: T;
125
+ type WhereEqual<V> = {
126
+ equal: V;
130
127
  };
131
- type WhereGreaterThan<T> = {
132
- gt: T;
128
+ type WhereGreaterThan<V> = {
129
+ gt: V;
133
130
  };
134
- type WhereGreaterThanOrEqual<T> = {
135
- gte: T;
131
+ type WhereGreaterThanOrEqual<V> = {
132
+ gte: V;
136
133
  };
137
- type WhereLessThan<T> = {
138
- lt: T;
134
+ type WhereLessThan<V> = {
135
+ lt: V;
139
136
  };
140
- type WhereLessThanOrEqual<T> = {
141
- lte: T;
137
+ type WhereLessThanOrEqual<V> = {
138
+ lte: V;
142
139
  };
143
- type WhereIn<T> = {
144
- isIn: IsArray<T> extends true ? T : IsObject<T> extends true ? T : T[];
140
+ type WhereIn<V> = {
141
+ isIn: IsArray<V> extends true ? V : IsObject<V> extends true ? V : V[];
145
142
  };
146
- type WhereBetween<T> = {
147
- isBetween: [T, T];
143
+ type WhereBetween<V> = {
144
+ isBetween: [V, V];
148
145
  };
149
146
  type WhereIsMissing = {
150
147
  isMissing: boolean;
@@ -152,11 +149,11 @@ export declare namespace Query {
152
149
  type WhereIsNull = {
153
150
  isNull: boolean;
154
151
  };
155
- type WhereStartsWith = {
152
+ type WhereStartsWith<T extends TableMetadata> = InsensitiveUtils.Input<T> & {
156
153
  startsWith: string;
157
154
  };
158
- type WhereContains<T> = {
159
- contains: IsObject<T> extends true ? Partial<T> : T;
155
+ type WhereContains<V, T extends TableMetadata> = (V extends string ? InsensitiveUtils.Input<T> : {}) & {
156
+ contains: IsObject<V> extends true ? Partial<V> : V;
160
157
  };
161
158
  export type AtomicOperators = keyof (AtomicIncrement & AtomicDecrement & AtomicMultiply & AtomicDivide);
162
159
  type AtomicDataInput<T extends AnyObject> = AtomicRequiredFields<T> & AtomicOptionalFields<T>;
@@ -7,9 +7,9 @@ import type { TableSchemas } from './schemas.js';
7
7
  */
8
8
  export type RelationMetadata = {
9
9
  indexes: string;
10
- filters: Record<string, unknown>;
11
- selects: Record<string, unknown>;
12
- changes: Record<string, unknown>;
10
+ filters: Record<string, {}>;
11
+ selects: Record<string, {}>;
12
+ changes: Record<string, {}>;
13
13
  };
14
14
  /**
15
15
  * Given a relation source name `T`, it produces the source table name.
@@ -45,7 +45,7 @@ type TableRelation<T, S extends Record<string, Database.Schema>, I extends Recor
45
45
  } ? N extends string ? R extends AnyObject ? {
46
46
  [P in N]: {
47
47
  indexes: RequiredRelationIndexes<PropertyType<N, S>, I, R>;
48
- filters: FilterableRelationSchemas<S, I, R>;
48
+ filters: FilterableRelationSchemas<S, R>;
49
49
  changes: RequiredRelationSchemas<PropertyType<N, S>, S, I, R, true> & OptionalRelationSchemas<PropertyType<N, S>, S, I, R, true>;
50
50
  selects: RequiredRelationSchemas<PropertyType<N, S>, S, I, R, false> & OptionalRelationSchemas<PropertyType<N, S>, S, I, R, false>;
51
51
  };
@@ -59,8 +59,8 @@ type RequiredRelationIndexes<T extends Database.Schema, I extends Record<string,
59
59
  /**
60
60
  * Produce an object containing all filterable relation schemas.
61
61
  */
62
- type FilterableRelationSchemas<S extends Record<string, Database.Schema>, I extends Record<string, Database.Indexes>, R extends AnyObject> = {
63
- [C in keyof R as RelationTargetAlias<C>]: IsPrimaryIndex<R[C], I> extends false ? Omit<PropertyType<RelationSourceTable<R[C]>, S>, RelationSourceColumn<R[C]>> : PropertyType<RelationSourceTable<R[C]>, S>;
62
+ type FilterableRelationSchemas<S extends Record<string, Database.Schema>, R extends AnyObject> = {
63
+ [C in keyof R as RelationTargetAlias<C>]: Omit<PropertyType<RelationSourceTable<R[C]>, S>, RelationTargetColumn<R[C]>>;
64
64
  };
65
65
  /**
66
66
  * Produce an object containing only required relation schemas.