prisma-ts-select 0.0.34 → 0.1.3

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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1343 -362
  3. package/assets/groupBy.gif +0 -0
  4. package/assets/joinUnsafeIgnoreType.gif +0 -0
  5. package/assets/joinUnsafeTypeEnforced.gif +0 -0
  6. package/assets/typesafe-join.gif +0 -0
  7. package/assets/typesafe-join.png +0 -0
  8. package/assets/{whereisNull.gif → whereIsNull.gif} +0 -0
  9. package/assets/whereNotNull.gif +0 -0
  10. package/dist/bin.cjs +1 -1
  11. package/dist/bin.js +1 -1
  12. package/dist/chunk-47KZVQLD.js +283 -0
  13. package/dist/chunk-54D2J5AR.cjs +291 -0
  14. package/dist/extend/dialects/index.d.ts +13 -0
  15. package/dist/extend/dialects/index.js +194 -0
  16. package/dist/extend/dialects/mysql-v6.d.ts +103 -0
  17. package/dist/extend/dialects/mysql-v6.js +157 -0
  18. package/dist/extend/dialects/mysql-v7.d.ts +6 -0
  19. package/dist/extend/dialects/mysql-v7.js +143 -0
  20. package/dist/extend/dialects/mysql.d.ts +93 -0
  21. package/dist/extend/dialects/mysql.js +161 -0
  22. package/dist/extend/dialects/postgresql-v6.d.ts +101 -0
  23. package/dist/extend/dialects/postgresql-v6.js +147 -0
  24. package/dist/extend/dialects/postgresql-v7.d.ts +101 -0
  25. package/dist/extend/dialects/postgresql-v7.js +147 -0
  26. package/dist/extend/dialects/postgresql.d.ts +92 -0
  27. package/dist/extend/dialects/postgresql.js +158 -0
  28. package/dist/extend/dialects/shared.d.ts +10 -0
  29. package/dist/extend/dialects/shared.js +14 -0
  30. package/dist/extend/dialects/sqlite.d.ts +68 -0
  31. package/dist/extend/dialects/sqlite.js +146 -0
  32. package/dist/extend/dialects/types.d.ts +13 -0
  33. package/dist/extend/dialects/types.js +4 -0
  34. package/dist/extend/extend.d.ts +292 -46
  35. package/dist/extend/extend.js +769 -162
  36. package/dist/extend/sql-expr-BaKWzJ-r.d.ts +10 -0
  37. package/dist/extend/types-B0F8m0ok.d.ts +8 -0
  38. package/dist/generator.cjs +1 -1
  39. package/dist/generator.js +1 -1
  40. package/package.json +44 -42
  41. package/built/extend.cjs +0 -680
  42. package/built/extend.d.cts +0 -520
  43. package/built/extend.d.ts +0 -520
  44. package/built/extend.js +0 -678
  45. package/dist/chunk-TBO3MX7Q.cjs +0 -195
  46. package/dist/chunk-X3N5N5KQ.js +0 -187
  47. package/dist/extend/extend.cjs +0 -357
  48. package/dist/extend/extend.d.cts +0 -264
@@ -0,0 +1,13 @@
1
+ type Dialect = {
2
+ name: "sqlite" | "mysql" | "postgresql";
3
+ quote: (identifier: string, isAlias?: boolean) => string;
4
+ needsBooleanCoercion: () => boolean;
5
+ quoteTableIdentifier: (name: string, isAlias: boolean) => string;
6
+ quoteQualifiedColumn: (ref: string) => string;
7
+ quoteOrderByClause: (clause: string) => string;
8
+ };
9
+ declare const SUPPORTED_PROVIDERS: readonly ["sqlite", "mysql", "postgresql"];
10
+ type SupportedProvider = typeof SUPPORTED_PROVIDERS[keyof typeof SUPPORTED_PROVIDERS];
11
+ type FunctionRegistry = Record<string, (...args: unknown[]) => unknown>;
12
+
13
+ export { type Dialect, type FunctionRegistry, SUPPORTED_PROVIDERS, type SupportedProvider };
@@ -0,0 +1,4 @@
1
+ // src/dialects/types.ts
2
+ var SUPPORTED_PROVIDERS = ["sqlite", "mysql", "postgresql"];
3
+
4
+ export { SUPPORTED_PROVIDERS };
@@ -1,5 +1,7 @@
1
- import { Prisma } from '@prisma/client/extension';
2
- import { PrismaClient } from '@prisma/client';
1
+ import { Decimal } from '@prisma/client/runtime/client';
2
+ import { S as SQLExpr, L as LitToType } from './sql-expr-BaKWzJ-r.js';
3
+
4
+ type PrismaClient = any;
3
5
 
4
6
  declare const DB: DBType;
5
7
  type TDB = typeof DB;
@@ -19,7 +21,7 @@ type DATABASE = {
19
21
  type JSONPrimitive = string | number | boolean | null;
20
22
  type JSONValue = JSONPrimitive | JSONObject | JSONArray;
21
23
  type JSONObject = {
22
- [member: string]: JSONValue;
24
+ [member: string]: JSONValue | undefined;
23
25
  };
24
26
  type JSONArray = Array<JSONValue>;
25
27
  type StrTypeToTSType<str> = str extends string ? (GetTSType<RemoveNullChar<str>> | IsNullable<str>) : never;
@@ -32,26 +34,35 @@ type DBType = Record<string, {
32
34
  }>;
33
35
  type Filter<a, b> = a extends b ? a : never;
34
36
  type IsString<T> = T extends string ? T : never;
35
- type ValidSelect<Tables extends TArrSources> = "*" | GetOtherColumns<Tables> | GetTableStar<Tables>;
36
- type GetTableStar<Tables extends TArrSources> = Tables extends [infer T extends TTableSources, ...Array<TTableSources>] ? T extends string ? `${T}.*` | GetTableStarJoined<Tables[number]> : `${T[1]}.*` | GetTableStarJoined<Tables[number]> : never;
37
- type GetTableStarJoined<T extends TTableSources> = T extends string ? `${T}.*` : `${T[1]}.*`;
37
+ type ValidSelect<Tables extends TArrSources, TFields extends TFieldsType = {}> = "*" | GetOtherColumns<Tables> | GetTableStar<Tables> | GetCTEColumns<Tables, TFields>;
38
+ type GetTableStar<Tables extends TArrSources> = Tables extends [infer T extends TTableSources, ...Array<TTableSources>] ? T extends TVirtualTableSource ? GetTableStarJoined<Tables[number]> : T extends string ? `${T}.*` | GetTableStarJoined<Tables[number]> : `${T[1]}.*` | GetTableStarJoined<Tables[number]> : never;
39
+ type GetTableStarJoined<T extends TTableSources> = T extends TVirtualTableSource ? never : T extends string ? `${T}.*` : `${T[1]}.*`;
38
40
  type ExtractColumnType<Column extends string, TSources extends TArrSources, TFields extends TFieldsType> = Column extends `${infer T}.${infer F}` ? T extends keyof TFields ? F extends keyof TFields[T] ? TFields[T][F] : never : never : Column extends keyof TFields[TSources[0] extends string ? TSources[0] : `Come back to 1`] ? TFields[TSources[0] extends string ? TSources[0] : `Come back To 2`][Column] : never;
39
41
  type TTables = DATABASE["table"];
40
- type TTableSources = DATABASE["table"] | [table: DATABASE["table"], alias: string];
42
+ type TVirtualTableSource = readonly ["__cte__", name: string];
43
+ type TTableSources = DATABASE["table"] | [table: DATABASE["table"], alias: string] | TVirtualTableSource;
41
44
  type TArrSources = [TTableSources, ...Array<TTableSources>];
42
45
  type ClauseType = Array<string | WhereCriteria<TArrSources, Record<string, any>>>;
46
+ type JoinType = "INNER" | "LEFT" | "LEFT OUTER" | "RIGHT" | "RIGHT OUTER" | "FULL" | "FULL OUTER" | "CROSS";
43
47
  type Values = {
44
48
  selectDistinct?: true;
45
49
  selects: Array<string>;
46
50
  tables: [{
47
- table: TTables;
51
+ table: string;
48
52
  alias?: string;
49
53
  }, ...Array<{
50
- table: TTables;
54
+ table: string;
51
55
  local: string;
52
56
  remote: string;
53
57
  alias?: string;
58
+ joinWhere?: ClauseType;
59
+ joinType?: JoinType;
54
60
  }>];
61
+ withs?: Array<{
62
+ name: string;
63
+ sql: string;
64
+ columns?: string[];
65
+ }>;
55
66
  limit?: number;
56
67
  offset?: number;
57
68
  where?: ClauseType;
@@ -63,7 +74,7 @@ declare class _fRun<TSources extends TArrSources, TFields extends TFieldsType, T
63
74
  protected db: PrismaClient;
64
75
  protected values: Values;
65
76
  constructor(db: PrismaClient, values: Values);
66
- run(): Prisma.PrismaPromise<Array<TSelectRT>>;
77
+ run(): Promise<TSelectRT[]>;
67
78
  getTables(): TSources;
68
79
  getFields(): TFields;
69
80
  getResultType(): Array<TSelectRT>;
@@ -79,34 +90,45 @@ type OrderBy<Tables extends TArrSources, TSelectRT extends Record<string, any> =
79
90
  declare class _fOrderBy<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fLimit<TSources, TFields, TSelectRT> {
80
91
  orderBy(orderBy: Array<`${OrderBy<TSources, TSelectRT>}${"" | " DESC" | " ASC"}`>): _fLimit<TSources, TFields, TSelectRT>;
81
92
  }
82
- type MergeItems<Field extends string, TSources extends TArrSources, TFields extends TFieldsType, IncTName extends boolean = false, TLTables extends string = TablesArray2Name<TSources>[number]> = Field extends "*" ? Prettify<IterateTables<TSources, TFields, IncTName>> : Field extends `${infer T}.*` ? T extends keyof TFields ? [TSources] extends [[T]] ? TFields[T] : T extends string ? IterateTablesFromFields<T, TFields[T], true> : never : never : Field extends `${infer T extends TLTables}.${infer F extends string}` ? T extends keyof TFields ? F extends keyof TFields[T] ? IsColumnUnique<F, TSources> extends true ? Prettify<Pick<TFields[T], F>> : Prettify<{
93
+ type MergeItems<Field extends string, TSources extends TArrSources, TFields extends TFieldsType, IncTName extends boolean = false, TLTables extends string = TablesArray2Name<TSources>[number]> = Field extends "*" ? Prettify<IterateTables<TSources, TFields, IncTName>> : Field extends `${infer T}.*` ? T extends keyof TFields ? [TSources] extends [[T]] ? TFields[T] : T extends string ? IterateTablesFromFields<T, TFields[T], true> : never : never : Field extends `${infer T extends TLTables}.${infer F extends string}` ? T extends keyof TFields ? F extends keyof TFields[T] ? [IsCTE<T, TSources>] extends [never] ? IsColumnUnique<F, TSources> extends true ? Prettify<Pick<TFields[T], F>> : Prettify<{
94
+ [K in Field]: TFields[T][F];
95
+ }> : Prettify<{
83
96
  [K in Field]: TFields[T][F];
84
97
  }> : never : never : FindColumnInFields<Field, TFields>;
85
98
  type FindColumnInFields<Column extends string, TFields extends TFieldsType, Tables extends keyof TFields = keyof TFields> = Tables extends keyof TFields ? TFields[Tables] extends Record<Column, any> ? Pick<TFields[Tables], Column> : never : never;
86
99
  type IterateTables<Tables extends Array<TTableSources>, TFields extends TFieldsType, IncTName extends boolean, acc extends Record<string, any> = {}> = Tables extends [infer T extends TTableSources, ...infer Rest extends Array<TTableSources>] ? [IncTName] extends [false] ? IterateTables<Rest, TFields, IncTName, acc & TFields[T extends string ? T : T[1]]> : IterateTables<Rest, TFields, IncTName, acc & IterateTablesFromFields<T, TFields[T extends string ? T : T[1]], IncTName>> : acc;
87
100
  type GenName<T extends string, F extends unknown, IncName extends boolean> = F extends string ? [IncName] extends [false] ? F : `${T}.${F}` : never;
88
101
  type IterateTablesFromFields<Table extends TTableSources, TFields extends Record<string, string>, IncTName extends boolean> = {
89
- [f in keyof TFields as GenName<Table extends string ? Table : `Come back to 6`, f, IncTName>]: TFields[f];
102
+ [f in keyof TFields as GenName<Table extends string ? Table : Table extends readonly [any, infer Name extends string] ? Name : never, f, IncTName>]: TFields[f];
90
103
  };
91
104
  type TablesArray2Name<TSources extends Array<TTableSources>, acc extends Array<string> = []> = TSources extends [infer T extends TTableSources, ...infer Rest extends Array<TTableSources>] ? TablesArray2Name<Rest, [...acc, GetAliasTableNames<T>]> : acc;
92
- type GetColumnNamesFromTable<TDBBase extends TTableSources> = keyof GetFieldsFromTable<GetRealTableNames<TDBBase>>;
105
+ type GetColumnNamesFromTable<TDBBase extends TTableSources> = TDBBase extends TVirtualTableSource ? never : keyof GetFieldsFromTable<GetRealTableNames<TDBBase>>;
93
106
  type GetColumnsFromTables<Tables extends Array<TTableSources>> = Tables extends [infer T extends TTableSources, ...infer Rest extends Array<TTableSources>] ? GetColumnNamesFromTable<T> | GetColumnsFromTables<Rest> : never;
94
107
  type GetDuplicateColumnsPairwise<Tables extends TArrSources> = Tables extends [infer T1 extends TTableSources, infer T2 extends TTableSources, ...infer Rest extends Array<TTableSources>] ? (GetColumnNamesFromTable<T1> & GetColumnNamesFromTable<T2>) | GetDuplicateColumnsPairwise<[T1, ...Rest]> | GetDuplicateColumnsPairwise<[T2, ...Rest]> : never;
95
108
  type IsColumnUnique<Col extends string, Tables extends TArrSources> = Col extends GetDuplicateColumnsPairwise<Tables> ? false : true;
96
109
  type GetOtherColumns<Tables extends TArrSources> = Exclude<GetColumnsFromTables<Tables>, GetDuplicateColumnsPairwise<Tables>> | GetJoinCols<Tables[number]>;
97
110
  declare class _fSelect<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fOrderBy<TSources, TFields, TSelectRT> {
98
- select<const TSelect extends ValidSelect<TSources>, TAlias extends string = never>(select: TSelect, alias?: TAlias): [TAlias] extends [never] ? _fSelect<TSources, TFields, Prettify<TSelectRT & MergeItems<TSelect, TSources, TFields>>> : _fSelect<TSources, TFields, Prettify<TSelectRT & Record<TAlias, ExtractColumnType<TSelect, TSources, TFields>>>>;
111
+ select<T>(fn: (ctx: SelectFnContext<TSources, TFields>) => SQLExpr<T>): _fSelect<TSources, TFields, Prettify<TSelectRT & Record<string, T>>>;
112
+ select<T, A extends string>(fn: (ctx: SelectFnContext<TSources, TFields>) => SQLExpr<T>, alias: A): _fSelect<TSources, TFields, Prettify<TSelectRT & Record<A, T>>>;
113
+ select<const TSelect extends ValidSelect<TSources, TFields>>(select: TSelect): _fSelect<TSources, TFields, Prettify<TSelectRT & MergeItems<TSelect, TSources, TFields, CountKeys<TSources> extends 1 ? false : true>>>;
114
+ select<const TSelect extends ValidSelect<TSources, TFields>, TAlias extends string>(select: TSelect, alias: TAlias): _fSelect<TSources, TFields, Prettify<TSelectRT & Record<TAlias, ExtractColumnType<TSelect, TSources, TFields>>>>;
99
115
  }
100
- type CountKeys<T extends Array<TTableSources>, acc extends Array<true> = []> = T extends [string, ...infer R extends Array<string>] ? CountKeys<R, [...acc, true]> : acc["length"];
116
+ type CountKeys<T extends Array<TTableSources>, acc extends Array<true> = []> = T extends [TTableSources, ...infer R extends Array<TTableSources>] ? CountKeys<R, [...acc, true]> : acc["length"];
117
+ type StripTablePrefix<S extends string> = S extends `${string}.${infer Col}` ? Col : S;
101
118
  declare class _fSelectDistinct<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fSelect<TSources, TFields, TSelectRT> {
102
119
  selectDistinct(): _fSelect<TSources, TFields, TSelectRT>;
103
- selectAll<TableCount = CountKeys<TSources>>(): _fOrderBy<TSources, TFields, IterateTables<TSources, TFields, TableCount extends 1 ? false : true, {}> extends infer T ? { [K in keyof T]: IterateTables<TSources, TFields, TableCount extends 1 ? false : true, {}>[K]; } : never>;
120
+ selectAll<TableCount = CountKeys<TSources>>(): _fOrderBy<TSources, TFields, IterateTables<TSources, TFields, TableCount extends 1 ? false : true, {}> extends infer T ? { [K in keyof T]: T[K]; } : never>;
121
+ selectAllOmit<const TSelect extends GetOtherColumns<TSources>, TableCount = CountKeys<TSources>>(omit: Array<TSelect>): _fOrderBy<TSources, TFields, Omit<IterateTables<TSources, TFields, TableCount extends 1 ? false : true, {}> extends infer T_1 ? { [K_1 in keyof T_1]: T_1[K_1]; } : never, TSelect | StripTablePrefix<TSelect>> extends infer T ? { [K in keyof T]: T[K]; } : never>;
104
122
  }
105
- declare class _fHaving<TSources extends TArrSources, TFields extends TFieldsType> extends _fSelectDistinct<TSources, TFields> {
106
- having<const TCriteria extends WhereCriteria<TSources, TFields>>(criteria: TCriteria): _fSelectDistinct<TSources, TFields, {}>;
123
+ declare class _fHaving<TSources extends TArrSources, TFields extends TFieldsType> extends _fSelect<TSources, TFields> {
124
+ selectDistinct(): _fSelect<TSources, TFields, {}>;
125
+ having<const TCriteria extends WhereCriteria<TSources, TFields>>(criteria: TCriteria): _fHaving<TSources, TFields>;
126
+ having(fn: (ctx: SelectFnContext<TSources, TFields>) => Array<ExprCondPair>): _fHaving<TSources, TFields>;
107
127
  }
108
- declare class _fGroupBy<TSources extends TArrSources, TFields extends TFieldsType> extends _fHaving<TSources, TFields> {
109
- groupBy<TSelect extends GetOtherColumns<TSources>>(groupBy: Array<TSelect>): _fHaving<TSources, TFields>;
128
+ declare class _fGroupBy<TSources extends TArrSources, TFields extends TFieldsType> extends _fSelectDistinct<TSources, TFields> {
129
+ having<const TCriteria extends WhereCriteria<TSources, TFields>>(criteria: TCriteria): _fSelectDistinct<TSources, TFields>;
130
+ having(fn: (ctx: SelectFnContext<TSources, TFields>) => Array<ExprCondPair>): _fSelectDistinct<TSources, TFields>;
131
+ groupBy<TSelect extends GetOtherColumns<TSources> | GetCTEColumns<TSources, TFields>>(groupBy: Array<TSelect>): _fHaving<TSources, TFields>;
110
132
  }
111
133
  type OptionalRecord<K extends PropertyKey, V> = {
112
134
  [key in K]?: V;
@@ -114,17 +136,57 @@ type OptionalRecord<K extends PropertyKey, V> = {
114
136
  type OptionalObject<K extends Record<PropertyKey, unknown>> = {
115
137
  [key in keyof K]?: K[key];
116
138
  };
117
- type COND_NUMERIC<key extends PropertyKey, keyType> = OptionalRecord<key, keyType> | OptionalRecord<key, {
139
+ type NonEmptyArray<T> = [T, ...Array<T>];
140
+ type COND_NUMERIC_OP = '>' | '>=' | '<' | '<=' | '!=' | '=';
141
+ type NumericCondValue = number | bigint | {
142
+ op: COND_NUMERIC_OP;
143
+ value: number | bigint;
144
+ } | {
145
+ op: 'IN' | 'NOT IN';
146
+ values: Array<number | bigint>;
147
+ } | {
148
+ op: 'BETWEEN';
149
+ values: [low: number | bigint, high: number | bigint];
150
+ };
151
+ type StringCondValue = string | {
152
+ op: 'LIKE' | 'NOT LIKE';
153
+ value: string;
154
+ } | {
155
+ op: '!=';
156
+ value: string;
157
+ } | {
158
+ op: 'IN' | 'NOT IN';
159
+ values: Array<string>;
160
+ };
161
+ type DateCondValue = Date | {
162
+ op: COND_NUMERIC_OP;
163
+ value: Date;
164
+ } | {
165
+ op: 'BETWEEN';
166
+ values: [Date, Date];
167
+ } | {
168
+ op: 'IN' | 'NOT IN';
169
+ values: Array<Date>;
170
+ };
171
+ type BoolExprCondValue = boolean | {
172
+ op: '!=';
173
+ value: boolean;
174
+ };
175
+ type ExprCondPair = [SQLExpr<number | null>, NumericCondValue] | [SQLExpr<bigint | null>, NumericCondValue] | [SQLExpr<Decimal | null>, NumericCondValue] | [SQLExpr<string | null>, StringCondValue] | [SQLExpr<Date | null>, DateCondValue] | [SQLExpr<boolean | null>, BoolExprCondValue];
176
+ type COND_NUMERIC<key extends PropertyKey, keyType> = OptionalRecord<key, keyType> | OptionalRecord<key, NonEmptyArray<keyType>> | OptionalRecord<key, {
118
177
  op: 'IN' | 'NOT IN';
119
178
  values: Array<keyType>;
120
179
  }> | OptionalRecord<key, {
121
180
  op: 'BETWEEN';
122
181
  values: [keyType, keyType];
123
182
  }> | OptionalRecord<key, {
124
- op: '>' | '>=' | '<' | '<=' | '!=';
183
+ op: COND_NUMERIC_OP;
125
184
  value: keyType;
126
- }>;
127
- type COND_STRING<key extends PropertyKey> = OptionalRecord<key, string> | OptionalRecord<key, {
185
+ }> | OptionalRecord<key, NonEmptyArray<{
186
+ op: COND_NUMERIC_OP;
187
+ value: keyType;
188
+ }>>;
189
+ type COND_STRING<key extends PropertyKey> = OptionalRecord<key, string> | OptionalRecord<key, NonEmptyArray<string>> | OptionalRecord<key, {
128
190
  op: 'IN' | 'NOT IN';
129
191
  values: Array<string>;
130
192
  }> | OptionalRecord<key, {
@@ -133,17 +195,23 @@ type COND_STRING<key extends PropertyKey> = OptionalRecord<key, string> | Option
133
195
  }> | OptionalRecord<key, {
134
196
  op: '!=';
135
197
  value: string;
136
- }>;
137
- type COND_DATETIME<key extends PropertyKey, keyType> = OptionalRecord<key, keyType> | OptionalRecord<key, {
198
+ }> | OptionalRecord<key, NonEmptyArray<{
199
+ op: 'LIKE' | 'NOT LIKE' | '!=' | '=';
200
+ value: string;
201
+ }>>;
202
+ type COND_DATETIME<key extends PropertyKey, keyType> = OptionalRecord<key, keyType> | OptionalRecord<key, NonEmptyArray<keyType>> | OptionalRecord<key, {
138
203
  op: 'IN' | 'NOT IN';
139
204
  values: Array<keyType>;
140
205
  }> | OptionalRecord<key, {
141
206
  op: 'BETWEEN';
142
207
  values: [keyType, keyType];
143
208
  }> | OptionalRecord<key, {
144
- op: '>' | '>=' | '<' | '<=' | '!=';
209
+ op: COND_NUMERIC_OP;
145
210
  value: keyType;
146
- }>;
211
+ }> | OptionalRecord<key, NonEmptyArray<{
212
+ op: COND_NUMERIC_OP;
213
+ value: keyType;
214
+ }>>;
147
215
  type COND_BOOLEAN<key extends PropertyKey, keyType> = OptionalRecord<key, keyType> | OptionalRecord<key, {
148
216
  op: '!=';
149
217
  value: keyType;
@@ -158,10 +226,18 @@ type TableFieldType<Table extends string, Fields extends Record<string, any>> =
158
226
  [f in keyof Fields as CombineToString<f, Table>]: Fields[f];
159
227
  };
160
228
  type LogicalOperator = '$AND' | '$OR' | '$NOT' | "$NOR";
161
- type WhereCriteria<T extends TArrSources, TFields extends TFieldsType, F = WhereCriteria_Fields<T, TFields>> = F & {
162
- [k in LogicalOperator]?: [WhereCriteria<T, TFields, F>, ...Array<WhereCriteria<T, TFields, F>>];
229
+ type WhereCriteriaSingle<TFields extends Record<string, unknown>> = WhereCriteria_Fields_Single<TFields> & {
230
+ [k in LogicalOperator]?: [WhereCriteria_Fields_Single<TFields>, ...Array<WhereCriteria_Fields_Single<TFields>>];
163
231
  };
164
- type WhereCriteria_Fields<T extends Array<TTableSources>, TFields extends TFieldsType, acc = {}> = T extends readonly [infer HEAD, ...infer Rest] ? HEAD extends string ? Rest extends Array<TTableSources> ? WhereCriteria_Fields<Rest, TFields, OptionalObject<acc & (TableFieldType<HEAD, TFields[HEAD]> | SQLCondition<TableFieldType<HEAD, TFields[HEAD]>>)>> : WhereCriteria_Fields<[], TFields, OptionalObject<acc & (TableFieldType<HEAD, TFields[HEAD]> | SQLCondition<TableFieldType<HEAD, TFields[HEAD]>>)>> : HEAD extends [infer R_NAME extends string, infer A_NAME extends string] ? Rest extends Array<TTableSources> ? WhereCriteria_Fields<Rest, TFields, OptionalObject<acc & (TableFieldType<A_NAME, TFields[R_NAME]> | SQLCondition<TableFieldType<A_NAME, TFields[R_NAME]>>)>> : WhereCriteria_Fields<[], TFields, OptionalObject<acc & (TableFieldType<A_NAME, TFields[R_NAME]> | SQLCondition<TableFieldType<A_NAME, TFields[R_NAME]>>)>> : never : acc;
232
+ type WhereCriteria_Fields_Single<TFields extends Record<string, unknown>> = OptionalObject<(TFields)> | OptionalObject<SQLCondition<TFields>>;
233
+ type WhereCriteriaMulti<T extends TArrSources, TFields extends TFieldsType, F = WhereCriteria_Fields<T, TFields>> = F & {
234
+ [k in LogicalOperator]?: [WhereCriteriaMulti<T, TFields, F>, ...Array<WhereCriteriaMulti<T, TFields, F>>];
235
+ };
236
+ type WhereCriteria<T extends TArrSources, TFields extends TFieldsType> = T['length'] extends 1 ? T[0] extends TVirtualTableSource ? WhereCriteriaMulti<T, TFields> : WhereCriteriaSingle<TFields[GetAliasTableNames<T[0]>]> : WhereCriteriaMulti<T, TFields>;
237
+ type JoinWhereCriteria<Table extends string, TAlias extends string | never> = [
238
+ TAlias
239
+ ] extends [never] ? WhereCriteriaMulti<[Table], Record<Table, GetFieldsFromTable<Table>>> : WhereCriteriaMulti<[[Table, TAlias]], Record<TAlias, GetFieldsFromTable<Table>>>;
240
+ type WhereCriteria_Fields<T extends Array<TTableSources>, TFields extends TFieldsType, acc = {}> = T extends readonly [infer HEAD, ...infer Rest] ? HEAD extends string ? Rest extends Array<TTableSources> ? WhereCriteria_Fields<Rest, TFields, OptionalObject<acc & (TableFieldType<HEAD, TFields[HEAD]> | SQLCondition<TableFieldType<HEAD, TFields[HEAD]>>)>> : WhereCriteria_Fields<[], TFields, OptionalObject<acc & (TableFieldType<HEAD, TFields[HEAD]> | SQLCondition<TableFieldType<HEAD, TFields[HEAD]>>)>> : HEAD extends readonly ["__cte__", infer CTE_NAME extends string] ? Rest extends Array<TTableSources> ? WhereCriteria_Fields<Rest, TFields, OptionalObject<acc & (TableFieldType<CTE_NAME, TFields[CTE_NAME]> | SQLCondition<TableFieldType<CTE_NAME, TFields[CTE_NAME]>>)>> : WhereCriteria_Fields<[], TFields, OptionalObject<acc & (TableFieldType<CTE_NAME, TFields[CTE_NAME]> | SQLCondition<TableFieldType<CTE_NAME, TFields[CTE_NAME]>>)>> : HEAD extends [infer R_NAME extends string, infer A_NAME extends string] ? Rest extends Array<TTableSources> ? WhereCriteria_Fields<Rest, TFields, OptionalObject<acc & (TableFieldType<A_NAME, TFields[R_NAME]> | SQLCondition<TableFieldType<A_NAME, TFields[R_NAME]>>)>> : WhereCriteria_Fields<[], TFields, OptionalObject<acc & (TableFieldType<A_NAME, TFields[R_NAME]> | SQLCondition<TableFieldType<A_NAME, TFields[R_NAME]>>)>> : never : acc;
165
241
  type OnlyNull<T, R> = T extends null ? R : never;
166
242
  type FindColsWithNull<TFields extends TFieldsType> = Prettify<{
167
243
  [Table in keyof TFields]: {
@@ -171,15 +247,16 @@ type FindColsWithNull<TFields extends TFieldsType> = Prettify<{
171
247
  type NO_START_WITH_WHERE<RAW extends string> = Uppercase<TRIM<RAW>> extends `WHERE ${string}` ? "Please do not start with `WHERE`" : RAW;
172
248
  type TRIM<S extends string> = S extends ` ${infer S2}` ? TRIM<S2> : S;
173
249
  declare class _fWhere<TSources extends TArrSources, TFields extends TFieldsType> extends _fGroupBy<TSources, TFields> {
174
- whereNotNull<const TColWithNull extends FindColsWithNull<TFields>>(col: TColWithNull): _fWhere<TSources, TColWithNull extends `${infer table}.${infer col}` ? Omit<TFields, table> & (Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, Exclude<Pick<TFields, table>[table][col], null>>> extends infer T_1 ? { [K_1 in keyof T_1]: Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, Exclude<Pick<TFields, table>[table][col], null>>>[K_1]; } : never) extends infer T ? { [K in keyof T]: (Omit<TFields, table> & (Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, Exclude<Pick<TFields, table>[table][col], null>>> extends infer T_1 ? { [K_1 in keyof T_1]: Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, Exclude<Pick<TFields, table>[table][col], null>>>[K_1]; } : never))[K]; } : never : never>;
175
- whereIsNull<const TColWithNull extends FindColsWithNull<TFields>>(col: TColWithNull): _fWhere<TSources, TColWithNull extends `${infer table}.${infer col}` ? Omit<TFields, table> & (Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, null>> extends infer T_1 ? { [K_1 in keyof T_1]: Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, null>>[K_1]; } : never) extends infer T ? { [K in keyof T]: (Omit<TFields, table> & (Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, null>> extends infer T_1 ? { [K_1 in keyof T_1]: Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, null>>[K_1]; } : never))[K]; } : never : never>;
250
+ whereNotNull<const TColWithNull extends FindColsWithNull<TFields>>(col: TColWithNull): _fWhere<TSources, TColWithNull extends `${infer table}.${infer col}` ? Omit<TFields, table> & (Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, Exclude<Pick<TFields, table>[table][col], null>>> extends infer T_1 ? { [K_1 in keyof T_1]: T_1[K_1]; } : never) extends infer T ? { [K in keyof T]: T[K]; } : never : never>;
251
+ whereIsNull<const TColWithNull extends FindColsWithNull<TFields>>(col: TColWithNull): _fWhere<TSources, TColWithNull extends `${infer table}.${infer col}` ? Omit<TFields, table> & (Record<table, Omit<Pick<TFields, table>[table], col> & Record<col, null>> extends infer T_1 ? { [K_1 in keyof T_1]: T_1[K_1]; } : never) extends infer T ? { [K in keyof T]: T[K]; } : never : never>;
252
+ where(fn: (ctx: SelectFnContext<TSources, TFields>) => Array<ExprCondPair>): _fGroupBy<TSources, TFields>;
176
253
  where<const TCriteria extends WhereCriteria<TSources, TFields>>(criteria: TCriteria): _fGroupBy<TSources, TFields>;
177
254
  whereRaw<RAW extends string>(where: NO_START_WITH_WHERE<RAW>): _fGroupBy<TSources, TFields>;
178
255
  }
179
256
  type GetFieldsFromTable<TDBBase extends TTableSources> = Extract<DATABASE, {
180
257
  table: GetRealTableNames<TDBBase>;
181
258
  }>["fields"];
182
- type GetColsBaseTable<TDBBase extends TTableSources> = TDBBase extends string ? keyof GetFieldsFromTable<TDBBase> : keyof GetFieldsFromTable<TDBBase[0]>;
259
+ type GetColsBaseTable<TDBBase extends TTableSources> = TDBBase extends string ? keyof GetFieldsFromTable<TDBBase> & string : keyof GetFieldsFromTable<TDBBase[0]> & string;
183
260
  type GetJoinCols<TDBBase extends TTableSources> = TDBBase extends string ? IterateFields<TDBBase, IsString<GetColsBaseTable<TDBBase>>> : IterateFields<TDBBase[1], IsString<GetColsBaseTable<TDBBase[0]>>>;
184
261
  type IterateFields<TDBBase extends TTableSources, F extends string> = `${TDBBase extends string ? TDBBase : TDBBase[1]}.${F}`;
185
262
  type Relations<Table extends TTableSources> = Extract<DATABASE, {
@@ -188,6 +265,7 @@ type Relations<Table extends TTableSources> = Extract<DATABASE, {
188
265
  type AvailableJoins<Tables extends Array<TTableSources>, acc extends TTableSources = never> = Tables extends [infer T extends TTableSources, ...infer Rest extends Array<TTableSources>] ? AvailableJoins<Rest, acc | keyof Relations<T>> : acc;
189
266
  type GetRealTableNames<Tables extends TTableSources> = Tables extends any ? Tables extends string ? Tables : Tables[0] : never;
190
267
  type GetAliasTableNames<Tables extends TTableSources> = Tables extends any ? Tables extends string ? Tables : Tables[1] : never;
268
+ type IsTargetCTE<TJTable> = TJTable extends TVirtualTableSource ? string : never;
191
269
  type SafeJoins<TNewJoin extends TTables, TJoins extends TArrSources, TRelations = Relations<TNewJoin>> = {
192
270
  [k in keyof TRelations as Filter<k, GetRealTableNames<TJoins[number]>>]: TRelations[k];
193
271
  };
@@ -232,33 +310,201 @@ type GetColsFromTableType<TDBBase extends TTableSources, Type extends string> =
232
310
  type Loop<Keys extends string, Type extends string> = Keys extends Type ? Type : never;
233
311
  type GetJoinColsType<TDBBase extends TTableSources, Type extends string> = IterateFields<TDBBase, IsString<GetColsFromTableType<TDBBase, Type>>>;
234
312
  type TFieldsType = Record<string, Record<string, any>>;
235
- declare class _fJoin<TSources extends TArrSources, TFields extends TFieldsType> extends _fWhere<TSources, TFields> {
313
+ type MakeNullable<T extends Record<string, any>> = {
314
+ [K in keyof T]: T[K] | null;
315
+ };
316
+ type NullifyTableFields<TFields extends TFieldsType> = {
317
+ [T in keyof TFields]: MakeNullable<TFields[T]>;
318
+ };
319
+ type InferCTEShape<T> = T extends _fRun<any, any, infer TSelectRT> ? TSelectRT : never;
320
+ type CTENames<TSources extends TArrSources> = TSources[number] extends infer S ? S extends readonly ["__cte__", infer Name extends string] ? Name : never : never;
321
+ type GetCTEColumns<TSources extends TArrSources, TFields extends TFieldsType> = CTENames<TSources> extends infer CTE extends string & keyof TFields ? `${CTE}.${string & keyof TFields[CTE]}` : never;
322
+ type IsCTE<T extends string, TSources extends TArrSources> = TSources[number] extends infer S ? S extends readonly ["__cte__", T] ? true : never : never;
323
+ type _fJoinReturn<TSources extends TArrSources, TFields extends TFieldsType, TCTEs extends Record<string, Record<string, any>> = {}> = _fJoin<TSources, TFields, TCTEs>;
324
+ type GetColumnsOfType<TSources extends TArrSources, TFields extends TFieldsType, T> = GetOtherColumns<TSources> extends infer K ? K extends string ? NonNullable<ExtractColumnType<K, TSources, TFields>> extends T ? K : never : never : never;
325
+ type ColEntries<TSources extends TArrSources, TFields extends TFieldsType> = GetOtherColumns<TSources> extends infer K ? K extends string ? [K, ExtractColumnType<K, TSources, TFields>] : never : never;
326
+ type LitValue = string | number | boolean | null;
327
+ type BaseSelectFnContext<_TSources extends TArrSources, _TFields extends TFieldsType> = {
328
+ lit: <T extends LitValue>(v: T) => SQLExpr<LitToType<T>>;
329
+ min: <TTable extends string, TCol extends string & keyof _TFields[TTable]>(col: `${TTable}.${TCol}`) => SQLExpr<_TFields[TTable][TCol]>;
330
+ max: <TTable extends string, TCol extends string & keyof _TFields[TTable]>(col: `${TTable}.${TCol}`) => SQLExpr<_TFields[TTable][TCol]>;
331
+ replace: (col: GetColumnsOfType<_TSources, _TFields, string> | SQLExpr<string>, from: string, to: string) => SQLExpr<string>;
332
+ upper: (col: GetColumnsOfType<_TSources, _TFields, string> | SQLExpr<string>) => SQLExpr<string>;
333
+ lower: (col: GetColumnsOfType<_TSources, _TFields, string> | SQLExpr<string>) => SQLExpr<string>;
334
+ trim: (col: GetColumnsOfType<_TSources, _TFields, string> | SQLExpr<string>) => SQLExpr<string>;
335
+ ltrim: (col: GetColumnsOfType<_TSources, _TFields, string> | SQLExpr<string>) => SQLExpr<string>;
336
+ rtrim: (col: GetColumnsOfType<_TSources, _TFields, string> | SQLExpr<string>) => SQLExpr<string>;
337
+ cond: (criteria: WhereCriteria<_TSources, _TFields>) => SQLExpr<boolean>;
338
+ coalesce: <T>(...args: [GetColumnsOfType<_TSources, _TFields, T> | SQLExpr<T>, ...Array<GetColumnsOfType<_TSources, _TFields, T> | SQLExpr<T>>]) => SQLExpr<T>;
339
+ nullif: <T>(expr1: SQLExpr<T>, expr2: SQLExpr<T>) => SQLExpr<T | null>;
340
+ caseWhen: <T, TElse extends SQLExpr<T> | undefined = undefined>(cases: [{
341
+ when: WhereCriteria<_TSources, _TFields>;
342
+ then: SQLExpr<T>;
343
+ }, ...Array<{
344
+ when: WhereCriteria<_TSources, _TFields>;
345
+ then: SQLExpr<T>;
346
+ }>], elseVal?: TElse) => TElse extends SQLExpr<T> ? SQLExpr<T> : SQLExpr<T | null>;
347
+ };
348
+ type SelectFnContext<_TSources extends TArrSources, _TFields extends TFieldsType> = BaseSelectFnContext<_TSources, _TFields>;
349
+ type ImplicitJoinsFrom<TSources extends TArrSources> = AvailableJoins<TSources> & `_${string}`;
350
+ type AvailableM2MTargets<TSources extends TArrSources> = keyof Relations<ImplicitJoinsFrom<TSources>> extends infer T ? T extends TTables & string ? T extends `_${string}` ? never : T : never : never;
351
+ type GetJunctionTable<TSource extends TTables, TTarget extends TTables> = keyof Relations<TSource> & keyof Relations<TTarget> & `_${string}` & TTables;
352
+ type AvailableRefNames<TSources extends TArrSources> = ImplicitJoinsFrom<TSources> extends `_${infer R}` ? R : never;
353
+ declare class _fJoin<TSources extends TArrSources, TFields extends TFieldsType, TCTEs extends Record<string, Record<string, any>> = {}> extends _fWhere<TSources, TFields> {
354
+ join<const TName extends keyof TCTEs & string>(cteName: TName, local: keyof TCTEs[TName] & string, remote: GetJoinCols<TSources[number]>, opts?: {
355
+ joinType?: JoinType;
356
+ }): _fJoin<[...TSources, readonly ["__cte__", TName]], TFields & Record<TName, TCTEs[TName]>, TCTEs>;
236
357
  join<const Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never, TAlias extends string = never>(options: {
237
358
  table: Table;
238
359
  src: TCol1;
239
360
  on: find<TJoinCols, TCol1>;
240
361
  alias?: TAlias;
241
- }): _fJoin<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>>;
242
- join<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never>(table: TableInput, field: TCol1, reference: find<TJoinCols, TCol1>): _fJoin<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>>;
243
- joinUnsafeTypeEnforced<const Table extends AvailableJoins<TSources>, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
362
+ where?: JoinWhereCriteria<Table, TAlias>;
363
+ joinType?: JoinType;
364
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
365
+ join<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TJTable = Table extends keyof TCTEs ? TVirtualTableSource : [Extract<TSources[number], string>] extends [never] ? TVirtualTableSource : never, TCol1 extends (TJoinCols[0] | IsTargetCTE<TJTable>) = never>(table: TableInput, field: TCol1, reference: find<TJoinCols, TCol1> | IsTargetCTE<TJTable>, options?: {
366
+ where?: JoinWhereCriteria<Table, TAlias>;
367
+ joinType?: JoinType;
368
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
369
+ private _joinImpl;
370
+ joinUnsafeTypeEnforced<const Table extends TTables | `${TTables} ${string}`, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
244
371
  table: Table;
245
372
  src: TCol1;
246
373
  on: TCol2;
247
374
  alias?: TAlias;
248
- }): _fJoin<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>>;
249
- joinUnsafeTypeEnforced<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]> = GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoin<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>>;
250
- joinUnsafeIgnoreType<const Table extends AvailableJoins<TSources>, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
375
+ where?: JoinWhereCriteria<Table, TAlias>;
376
+ joinType?: JoinType;
377
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
378
+ joinUnsafeTypeEnforced<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]> = GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: TableInput, field: TCol1, reference: TCol2, options?: {
379
+ where?: JoinWhereCriteria<Table, TAlias>;
380
+ joinType?: JoinType;
381
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
382
+ joinUnsafeIgnoreType<const Table extends TTables, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
251
383
  table: Table;
252
384
  src: TCol1;
253
385
  on: TCol2;
254
386
  alias?: TAlias;
255
- }): _fJoin<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>>;
256
- joinUnsafeIgnoreType<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]> = GetJoinCols<TSources[number]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoin<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>>;
387
+ where?: JoinWhereCriteria<Table, TAlias>;
388
+ joinType?: JoinType;
389
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>, TCTEs>;
390
+ joinUnsafeIgnoreType<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]> = GetJoinCols<TSources[number]>>(table: TableInput, field: TCol1, reference: TCol2, options?: {
391
+ where?: JoinWhereCriteria<Table, TAlias>;
392
+ joinType?: JoinType;
393
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>, TCTEs>;
394
+ manyToManyJoin<const TTableInput extends `${AvailableM2MTargets<TSources>}` | `${AvailableM2MTargets<TSources>} ${string}`, TTarget extends AvailableM2MTargets<TSources> = ExtractTableName<TTableInput> & AvailableM2MTargets<TSources>, TAlias extends string | never = ExtractAlias<TTableInput>, const TRefName extends AvailableRefNames<TSources> | undefined = undefined, TJunction extends TTables = TRefName extends string ? `_${TRefName}` & TTables : GetJunctionTable<GetRealTableNames<TSources[number]>, TTarget>>(targetTable: TTableInput, options?: {
395
+ source?: `${GetAliasTableNames<TSources[number]>}.${string}`;
396
+ refName?: TRefName;
397
+ }): _fJoin<[
398
+ ...TSources,
399
+ TJunction,
400
+ [TAlias] extends [never] ? TTarget : [TTarget, TAlias]
401
+ ], Prettify<TFields & Record<TJunction, GetFieldsFromTable<TJunction>> & Record<[TAlias] extends [never] ? TTarget : TAlias, GetFieldsFromTable<TTarget>>>>;
402
+ innerJoin<const Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never, TAlias extends string = never>(options: {
403
+ table: Table;
404
+ src: TCol1;
405
+ on: find<TJoinCols, TCol1>;
406
+ alias?: TAlias;
407
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
408
+ innerJoin<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never>(table: TableInput, field: TCol1, reference: find<TJoinCols, TCol1>): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
409
+ leftJoin<const Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never, TAlias extends string = never>(options: {
410
+ table: Table;
411
+ src: TCol1;
412
+ on: find<TJoinCols, TCol1>;
413
+ alias?: TAlias;
414
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
415
+ leftJoin<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never>(table: TableInput, field: TCol1, reference: find<TJoinCols, TCol1>): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
416
+ rightJoin<const Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never, TAlias extends string = never>(options: {
417
+ table: Table;
418
+ src: TCol1;
419
+ on: find<TJoinCols, TCol1>;
420
+ alias?: TAlias;
421
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
422
+ rightJoin<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never>(table: TableInput, field: TCol1, reference: find<TJoinCols, TCol1>): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
423
+ fullJoin<const Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never, TAlias extends string = never>(options: {
424
+ table: Table;
425
+ src: TCol1;
426
+ on: find<TJoinCols, TCol1>;
427
+ alias?: TAlias;
428
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [undefined] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
429
+ fullJoin<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<MapJoinsToKnownTables<SafeJoins<Table, TSources>, TSources>>>, TCol1 extends TJoinCols[0] = never>(table: TableInput, field: TCol1, reference: find<TJoinCols, TCol1>): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [never] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
430
+ crossJoin<const TableInput extends `${AvailableJoins<TSources>}` | `${AvailableJoins<TSources>} ${string}`, Table extends AvailableJoins<TSources> = ExtractTableName<TableInput> & AvailableJoins<TSources>, TAlias extends string | never = ExtractAlias<TableInput>>(table: TableInput): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
431
+ innerJoinUnsafeTypeEnforced<const Table extends TTables | `${TTables} ${string}`, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
432
+ table: Table;
433
+ src: TCol1;
434
+ on: TCol2;
435
+ alias?: TAlias;
436
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
437
+ innerJoinUnsafeTypeEnforced<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]> = GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
438
+ innerJoinUnsafeIgnoreType<const Table extends TTables, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
439
+ table: Table;
440
+ src: TCol1;
441
+ on: TCol2;
442
+ alias?: TAlias;
443
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>, TCTEs>;
444
+ innerJoinUnsafeIgnoreType<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]> = GetJoinCols<TSources[number]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>, TCTEs>;
445
+ leftJoinUnsafeTypeEnforced<const Table extends TTables | `${TTables} ${string}`, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
446
+ table: Table;
447
+ src: TCol1;
448
+ on: TCol2;
449
+ alias?: TAlias;
450
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
451
+ leftJoinUnsafeTypeEnforced<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]> = GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
452
+ leftJoinUnsafeIgnoreType<const Table extends TTables, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
453
+ table: Table;
454
+ src: TCol1;
455
+ on: TCol2;
456
+ alias?: TAlias;
457
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, MakeNullable<GetFieldsFromTable<Table>>>, TCTEs>;
458
+ leftJoinUnsafeIgnoreType<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]> = GetJoinCols<TSources[number]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, MakeNullable<GetFieldsFromTable<Table>>>, TCTEs>;
459
+ rightJoinUnsafeTypeEnforced<const Table extends TTables | `${TTables} ${string}`, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
460
+ table: Table;
461
+ src: TCol1;
462
+ on: TCol2;
463
+ alias?: TAlias;
464
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
465
+ rightJoinUnsafeTypeEnforced<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]> = GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
466
+ rightJoinUnsafeIgnoreType<const Table extends TTables, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
467
+ table: Table;
468
+ src: TCol1;
469
+ on: TCol2;
470
+ alias?: TAlias;
471
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], NullifyTableFields<TFields> & Record<Table, GetFieldsFromTable<Table>>, TCTEs>;
472
+ rightJoinUnsafeIgnoreType<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]> = GetJoinCols<TSources[number]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], NullifyTableFields<TFields> & Record<Table, GetFieldsFromTable<Table>>, TCTEs>;
473
+ fullJoinUnsafeTypeEnforced<const Table extends TTables | `${TTables} ${string}`, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
474
+ table: Table;
475
+ src: TCol1;
476
+ on: TCol2;
477
+ alias?: TAlias;
478
+ }): _fJoinReturn<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [undefined] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
479
+ fullJoinUnsafeTypeEnforced<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]> = GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<NullifyTableFields<TFields> & Record<[TAlias] extends [undefined] ? Table : TAlias, MakeNullable<GetFieldsFromTable<Table>>>>, TCTEs>;
480
+ fullJoinUnsafeIgnoreType<const Table extends TTables, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
481
+ table: Table;
482
+ src: TCol1;
483
+ on: TCol2;
484
+ alias?: TAlias;
485
+ }): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], NullifyTableFields<TFields> & Record<Table, MakeNullable<GetFieldsFromTable<Table>>>, TCTEs>;
486
+ fullJoinUnsafeIgnoreType<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>, TCol1 extends GetColsBaseTable<Table> = GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]> = GetJoinCols<TSources[number]>>(table: TableInput, field: TCol1, reference: TCol2): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], NullifyTableFields<TFields> & Record<Table, MakeNullable<GetFieldsFromTable<Table>>>, TCTEs>;
487
+ crossJoinUnsafeTypeEnforced<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>>(table: TableInput): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
488
+ crossJoinUnsafeIgnoreType<const TableInput extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<TableInput>, TAlias extends string | never = ExtractAlias<TableInput>>(table: TableInput): _fJoinReturn<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [never] ? Table : TAlias, GetFieldsFromTable<Table>>>, TCTEs>;
489
+ }
490
+ declare class DbWith<TCTEs extends Record<string, Record<string, any>>> {
491
+ private db;
492
+ private _withs;
493
+ constructor(db: PrismaClient, _withs: Array<{
494
+ name: string;
495
+ sql: string;
496
+ columns?: string[];
497
+ }>);
498
+ with<const TName extends string, TQuery extends _fRun<any, any, any>>(name: TName, query: TQuery): DbWith<TCTEs & Record<TName, InferCTEShape<TQuery>>>;
499
+ from<const TName extends keyof TCTEs & string>(cteName: TName): _fJoinReturn<[readonly ["__cte__", TName]], Record<TName, TCTEs[TName]>, TCTEs>;
500
+ from<const TDBBase extends TTables, const TAlias extends string = never, TRT extends TArrSources = [TAlias] extends [never] ? [TDBBase] : [[TDBBase, TAlias]]>(baseTable: TDBBase, alias?: TAlias): _fJoinReturn<TRT, Record<GetAliasTableNames<TRT[0]>, GetFieldsFromTable<TDBBase>>, TCTEs>;
257
501
  }
258
- declare const _default: {
502
+ declare const extendedPrismaClient: {
503
+ name: string;
259
504
  client: {
260
- $from<const T extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<T>, TAlias extends string | never = ExtractAlias<T>>(table: T): _fJoin<[TAlias] extends [never] ? [Table] : [[Table, TAlias]], Record<GetAliasTableNames<([TAlias] extends [never] ? [Table] : [[Table, TAlias]])[0]>, GetFieldsFromTable<Table>>>;
505
+ $from<const T extends TTables | `${TTables} ${string}`, Table extends TTables = ExtractTableName<T>, TAlias extends string | never = ExtractAlias<T>>(table: T): _fJoinReturn<[TAlias] extends [never] ? [Table] : [[Table, TAlias]], Record<GetAliasTableNames<([TAlias] extends [never] ? [Table] : [[Table, TAlias]])[0]>, GetFieldsFromTable<Table>>, {}>;
506
+ $with<const TName extends string, TQuery extends _fRun<any, any, any>>(name: TName, query: TQuery): DbWith<Record<TName, InferCTEShape<TQuery>>>;
261
507
  };
262
508
  };
263
509
 
264
- export { type DBType, type GetUnionOfRelations, type JSONArray, type JSONObject, type JSONPrimitive, type JSONValue, type MapJoinsToKnownTables, type RemoveNullChar, type SafeJoins, type TTableSources, type TTables, _default as default };
510
+ export { type ColEntries, type DBType, type GetColumnsOfType, type GetUnionOfRelations, type InferCTEShape, type JSONArray, type JSONObject, type JSONPrimitive, type JSONValue, type MapJoinsToKnownTables, type RemoveNullChar, type SafeJoins, type SelectFnContext, type TTableSources, type TTables, type _fJoinReturn, extendedPrismaClient as default };