prisma-ts-select 0.0.33 → 0.0.34
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/README.md +318 -53
- package/assets/groupBy.gif +0 -0
- package/assets/joinUnsafeIgnoreType.gif +0 -0
- package/assets/joinUnsafeTypeEnforced.gif +0 -0
- package/assets/typesafe-join.gif +0 -0
- package/assets/typesafe-join.png +0 -0
- package/assets/whereNotNull.gif +0 -0
- package/assets/whereisNull.gif +0 -0
- package/built/extend.cjs +150 -35
- package/built/extend.d.cts +104 -35
- package/built/extend.d.ts +104 -35
- package/built/extend.js +150 -35
- package/dist/bin.cjs +1 -1
- package/dist/bin.js +1 -1
- package/dist/{chunk-G66FOFCO.cjs → chunk-TBO3MX7Q.cjs} +2 -2
- package/dist/{chunk-GBXPF5FT.js → chunk-X3N5N5KQ.js} +3 -3
- package/dist/extend/extend.cjs +115 -35
- package/dist/extend/extend.d.cts +77 -35
- package/dist/extend/extend.d.ts +77 -35
- package/dist/extend/extend.js +115 -35
- package/dist/generator.cjs +1 -1
- package/dist/generator.js +1 -1
- package/package.json +10 -3
package/dist/extend/extend.cjs
CHANGED
|
@@ -8,8 +8,14 @@ class DbSelect {
|
|
|
8
8
|
constructor(db) {
|
|
9
9
|
this.db = db;
|
|
10
10
|
}
|
|
11
|
-
from(
|
|
12
|
-
return new _fJoin(this.db, {
|
|
11
|
+
from(baseTable, alias) {
|
|
12
|
+
return new _fJoin(this.db, {
|
|
13
|
+
tables: [{
|
|
14
|
+
table: baseTable,
|
|
15
|
+
alias
|
|
16
|
+
}],
|
|
17
|
+
selects: []
|
|
18
|
+
});
|
|
13
19
|
}
|
|
14
20
|
}
|
|
15
21
|
class _fRun {
|
|
@@ -30,6 +36,9 @@ class _fRun {
|
|
|
30
36
|
getFields() {
|
|
31
37
|
return {};
|
|
32
38
|
}
|
|
39
|
+
getResultType() {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
33
42
|
getSQL(formatted = false) {
|
|
34
43
|
function processCondition(condition, formatted2) {
|
|
35
44
|
return "(" + Object.keys(condition).map((field) => {
|
|
@@ -98,14 +107,20 @@ class _fRun {
|
|
|
98
107
|
}
|
|
99
108
|
const whereClause = this.values.where !== void 0 ? processCriteria(this.values.where, "AND", formatted) : void 0;
|
|
100
109
|
const havingClause = this.values.having !== void 0 ? processCriteria(this.values.having, "AND", formatted) : void 0;
|
|
110
|
+
const [base, ...joins] = this.values.tables;
|
|
111
|
+
const baseTable = base.alias ? `${base.table} AS \`${base.alias}\`` : base.table;
|
|
101
112
|
return [
|
|
102
113
|
this.values.selects.length === 0 ? "" : "SELECT " + (this.values.selectDistinct === true ? "DISTINCT " : "") + this.values.selects.join(", "),
|
|
103
|
-
`FROM ${
|
|
104
|
-
|
|
114
|
+
`FROM ${baseTable}`,
|
|
115
|
+
joins.map(({
|
|
105
116
|
table,
|
|
106
117
|
local,
|
|
107
|
-
remote
|
|
108
|
-
|
|
118
|
+
remote,
|
|
119
|
+
alias
|
|
120
|
+
}) => {
|
|
121
|
+
const tLocal = (alias || table) + "." + local;
|
|
122
|
+
return `JOIN ${!!alias ? table + " AS `" + alias + "`" : table} ON ${tLocal} = ${remote}`;
|
|
123
|
+
}).join(formatted ? "\n" : " ") ?? "",
|
|
109
124
|
!whereClause ? "" : `WHERE ${whereClause}`,
|
|
110
125
|
!this.values.groupBy?.length ? "" : `GROUP BY ${this.values.groupBy.join(", ")}`,
|
|
111
126
|
!havingClause ? "" : `HAVING ${havingClause}`,
|
|
@@ -131,7 +146,58 @@ class _fOrderBy extends _fLimit {
|
|
|
131
146
|
}
|
|
132
147
|
}
|
|
133
148
|
class _fSelect extends _fOrderBy {
|
|
134
|
-
select(select) {
|
|
149
|
+
select(select, alias) {
|
|
150
|
+
const tableColMatch = select.match(/^(\w+)\.(.*?)$/);
|
|
151
|
+
if (tableColMatch) {
|
|
152
|
+
const [, tableName, colName] = tableColMatch;
|
|
153
|
+
const tableObject = this.values.tables.find((t) => (t.alias || t.table) === tableName);
|
|
154
|
+
if (!tableObject) throw new Error(`Table "${tableName}" not found in query`);
|
|
155
|
+
const tableFields = DB[tableObject.table];
|
|
156
|
+
if (!tableFields) {
|
|
157
|
+
throw new Error(`Table "${tableName}" not found in database schema`);
|
|
158
|
+
}
|
|
159
|
+
if (colName === "*") {
|
|
160
|
+
const hasMultipleTables = this.values.tables && this.values.tables.length > 1 || false;
|
|
161
|
+
const expandedSelects = Object.keys(tableFields.fields).map((field) => {
|
|
162
|
+
if (hasMultipleTables) {
|
|
163
|
+
return `${tableName}.${field} AS \`${tableName}.${field}\``;
|
|
164
|
+
}
|
|
165
|
+
return `${field}`;
|
|
166
|
+
});
|
|
167
|
+
return new _fSelect(this.db, {
|
|
168
|
+
...this.values,
|
|
169
|
+
selects: [...this.values.selects, ...expandedSelects]
|
|
170
|
+
});
|
|
171
|
+
} else if (!alias && !!colName) {
|
|
172
|
+
const currentTablesWithFields = this.values.tables.reduce((acc, table) => {
|
|
173
|
+
const { table: real } = table;
|
|
174
|
+
for (const col in DB[real].fields) {
|
|
175
|
+
acc[col] = acc[col] ? acc[col] + 1 : 1;
|
|
176
|
+
}
|
|
177
|
+
return acc;
|
|
178
|
+
}, {});
|
|
179
|
+
if (!currentTablesWithFields[colName]) {
|
|
180
|
+
throw new Error(`Column "${colName}" not found in database schema`);
|
|
181
|
+
}
|
|
182
|
+
if (currentTablesWithFields[colName] > 1) {
|
|
183
|
+
return new _fSelect(this.db, {
|
|
184
|
+
...this.values,
|
|
185
|
+
selects: [...this.values.selects, `${select} AS \`${select}\``]
|
|
186
|
+
});
|
|
187
|
+
} else {
|
|
188
|
+
return new _fSelect(this.db, {
|
|
189
|
+
...this.values,
|
|
190
|
+
selects: [...this.values.selects, `${colName}`]
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (alias !== void 0) {
|
|
196
|
+
return new _fSelect(this.db, {
|
|
197
|
+
...this.values,
|
|
198
|
+
selects: [...this.values.selects, `${select} AS \`${alias}\``]
|
|
199
|
+
});
|
|
200
|
+
}
|
|
135
201
|
return new _fSelect(this.db, {
|
|
136
202
|
...this.values,
|
|
137
203
|
selects: [...this.values.selects, select]
|
|
@@ -144,12 +210,15 @@ class _fSelectDistinct extends _fSelect {
|
|
|
144
210
|
}
|
|
145
211
|
selectAll() {
|
|
146
212
|
const selects = function(values) {
|
|
147
|
-
if (values.tables && values.tables.length >
|
|
148
|
-
return [
|
|
213
|
+
if (values.tables && values.tables.length > 1) {
|
|
214
|
+
return [
|
|
215
|
+
/*values.baseTable,*/
|
|
216
|
+
...values.tables.map((t) => t.table)
|
|
217
|
+
].reduce((acc, table) => {
|
|
149
218
|
return acc.concat(Object.keys(DB[table].fields).map((field) => `${table}.${field} AS \`${table}.${field}\``));
|
|
150
219
|
}, []);
|
|
151
220
|
}
|
|
152
|
-
return Object.keys(DB[values.
|
|
221
|
+
return Object.keys(DB[values.tables[0].table].fields);
|
|
153
222
|
}(this.values);
|
|
154
223
|
return new _fOrderBy(this.db, {
|
|
155
224
|
...this.values,
|
|
@@ -220,48 +289,58 @@ class _fWhere extends _fGroupBy {
|
|
|
220
289
|
}
|
|
221
290
|
}
|
|
222
291
|
class _fJoin extends _fWhere {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
292
|
+
// Implementation
|
|
293
|
+
join(tableOrOptions, field, reference) {
|
|
294
|
+
let table;
|
|
295
|
+
let local;
|
|
296
|
+
let remote;
|
|
297
|
+
let tableAlias;
|
|
298
|
+
if (typeof tableOrOptions === "object" && "table" in tableOrOptions) {
|
|
299
|
+
table = tableOrOptions.table.trim();
|
|
300
|
+
local = tableOrOptions.src;
|
|
301
|
+
remote = tableOrOptions.on;
|
|
302
|
+
tableAlias = tableOrOptions.alias?.trim();
|
|
303
|
+
} else {
|
|
304
|
+
const parts = tableOrOptions.split(" ");
|
|
305
|
+
table = parts[0];
|
|
306
|
+
tableAlias = parts[1]?.trim();
|
|
307
|
+
local = field;
|
|
308
|
+
remote = reference;
|
|
309
|
+
}
|
|
230
310
|
return new _fJoin(this.db, {
|
|
231
311
|
...this.values,
|
|
232
312
|
tables: [...this.values.tables || [], {
|
|
233
313
|
table,
|
|
234
|
-
local
|
|
235
|
-
remote
|
|
314
|
+
local,
|
|
315
|
+
remote,
|
|
316
|
+
alias: tableAlias
|
|
236
317
|
}]
|
|
237
318
|
});
|
|
238
319
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}]
|
|
247
|
-
});
|
|
320
|
+
// Implementation
|
|
321
|
+
joinUnsafeTypeEnforced(tableOrOptions, field, reference) {
|
|
322
|
+
return this.join(tableOrOptions, field, reference);
|
|
323
|
+
}
|
|
324
|
+
// Implementation
|
|
325
|
+
joinUnsafeIgnoreType(tableOrOptions, field, reference) {
|
|
326
|
+
return this.join(tableOrOptions, field, reference);
|
|
248
327
|
}
|
|
249
|
-
// innerJoin(table:
|
|
328
|
+
// innerJoin(table: TTableSources, col1:string, col2:string){
|
|
250
329
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
251
330
|
// }
|
|
252
|
-
// leftJoin(table:
|
|
331
|
+
// leftJoin(table: TTableSources, col1:string, col2:string){
|
|
253
332
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
254
333
|
// }
|
|
255
|
-
// rightJoin(table:
|
|
334
|
+
// rightJoin(table: TTableSources, col1:string, col2:string){
|
|
256
335
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
257
336
|
// }
|
|
258
|
-
// fullJoin(table:
|
|
337
|
+
// fullJoin(table: TTableSources, col1:string, col2:string){
|
|
259
338
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
260
339
|
// }
|
|
261
|
-
// crossJoin(table:
|
|
340
|
+
// crossJoin(table: TTableSources, col1:string, col2:string){
|
|
262
341
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
263
342
|
// }
|
|
264
|
-
// outerJoin(table:
|
|
343
|
+
// outerJoin(table: TTableSources, col1:string, col2:string){
|
|
265
344
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
266
345
|
// }
|
|
267
346
|
}
|
|
@@ -269,7 +348,8 @@ var extend_default = {
|
|
|
269
348
|
client: {
|
|
270
349
|
$from(table) {
|
|
271
350
|
const client = extension.Prisma.getExtensionContext(this);
|
|
272
|
-
|
|
351
|
+
const [base, ...aliases] = table.split(" ");
|
|
352
|
+
return new DbSelect(client).from(base.trim(), aliases.join().trim() || void 0);
|
|
273
353
|
}
|
|
274
354
|
}
|
|
275
355
|
};
|
package/dist/extend/extend.d.cts
CHANGED
|
@@ -32,20 +32,26 @@ type DBType = Record<string, {
|
|
|
32
32
|
}>;
|
|
33
33
|
type Filter<a, b> = a extends b ? a : never;
|
|
34
34
|
type IsString<T> = T extends string ? T : never;
|
|
35
|
-
type ValidSelect<Tables extends
|
|
36
|
-
type
|
|
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]}.*`;
|
|
38
|
+
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;
|
|
37
39
|
type TTables = DATABASE["table"];
|
|
38
|
-
type
|
|
40
|
+
type TTableSources = DATABASE["table"] | [table: DATABASE["table"], alias: string];
|
|
41
|
+
type TArrSources = [TTableSources, ...Array<TTableSources>];
|
|
39
42
|
type ClauseType = Array<string | WhereCriteria<TArrSources, Record<string, any>>>;
|
|
40
43
|
type Values = {
|
|
41
|
-
database: TTables;
|
|
42
44
|
selectDistinct?: true;
|
|
43
45
|
selects: Array<string>;
|
|
44
|
-
tables
|
|
46
|
+
tables: [{
|
|
47
|
+
table: TTables;
|
|
48
|
+
alias?: string;
|
|
49
|
+
}, ...Array<{
|
|
45
50
|
table: TTables;
|
|
46
51
|
local: string;
|
|
47
52
|
remote: string;
|
|
48
|
-
|
|
53
|
+
alias?: string;
|
|
54
|
+
}>];
|
|
49
55
|
limit?: number;
|
|
50
56
|
offset?: number;
|
|
51
57
|
where?: ClauseType;
|
|
@@ -60,6 +66,7 @@ declare class _fRun<TSources extends TArrSources, TFields extends TFieldsType, T
|
|
|
60
66
|
run(): Prisma.PrismaPromise<Array<TSelectRT>>;
|
|
61
67
|
getTables(): TSources;
|
|
62
68
|
getFields(): TFields;
|
|
69
|
+
getResultType(): Array<TSelectRT>;
|
|
63
70
|
getSQL(formatted?: boolean): string;
|
|
64
71
|
}
|
|
65
72
|
declare class _fOffset<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fRun<TSources, TFields, TSelectRT> {
|
|
@@ -68,20 +75,29 @@ declare class _fOffset<TSources extends TArrSources, TFields extends TFieldsType
|
|
|
68
75
|
declare class _fLimit<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fRun<TSources, TFields, TSelectRT> {
|
|
69
76
|
limit(limit: number): _fOffset<TSources, TFields, TSelectRT>;
|
|
70
77
|
}
|
|
71
|
-
type OrderBy<Tables extends TArrSources> = Tables extends [infer T extends
|
|
78
|
+
type OrderBy<Tables extends TArrSources, TSelectRT extends Record<string, any> = {}> = Tables extends [infer T extends TTableSources, ...Array<TTableSources>] ? GetColsBaseTable<T> | GetJoinCols<Tables[number]> | (keyof TSelectRT & string) : never;
|
|
72
79
|
declare class _fOrderBy<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fLimit<TSources, TFields, TSelectRT> {
|
|
73
|
-
orderBy(orderBy: Array<`${OrderBy<TSources>}${"" | " DESC" | " ASC"}`>): _fLimit<TSources, TFields, TSelectRT>;
|
|
80
|
+
orderBy(orderBy: Array<`${OrderBy<TSources, TSelectRT>}${"" | " DESC" | " ASC"}`>): _fLimit<TSources, TFields, TSelectRT>;
|
|
74
81
|
}
|
|
75
|
-
type MergeItems<Field extends string, TSources extends TArrSources, TFields extends TFieldsType, IncTName extends boolean = false,
|
|
76
|
-
|
|
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<{
|
|
83
|
+
[K in Field]: TFields[T][F];
|
|
84
|
+
}> : never : never : FindColumnInFields<Field, TFields>;
|
|
85
|
+
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
|
+
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;
|
|
77
87
|
type GenName<T extends string, F extends unknown, IncName extends boolean> = F extends string ? [IncName] extends [false] ? F : `${T}.${F}` : never;
|
|
78
|
-
type IterateTablesFromFields<Table extends
|
|
79
|
-
[f in keyof TFields as GenName<Table
|
|
88
|
+
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];
|
|
80
90
|
};
|
|
91
|
+
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>>;
|
|
93
|
+
type GetColumnsFromTables<Tables extends Array<TTableSources>> = Tables extends [infer T extends TTableSources, ...infer Rest extends Array<TTableSources>] ? GetColumnNamesFromTable<T> | GetColumnsFromTables<Rest> : never;
|
|
94
|
+
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
|
+
type IsColumnUnique<Col extends string, Tables extends TArrSources> = Col extends GetDuplicateColumnsPairwise<Tables> ? false : true;
|
|
96
|
+
type GetOtherColumns<Tables extends TArrSources> = Exclude<GetColumnsFromTables<Tables>, GetDuplicateColumnsPairwise<Tables>> | GetJoinCols<Tables[number]>;
|
|
81
97
|
declare class _fSelect<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fOrderBy<TSources, TFields, TSelectRT> {
|
|
82
|
-
select<TSelect extends ValidSelect<TSources
|
|
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>>>>;
|
|
83
99
|
}
|
|
84
|
-
type CountKeys<T extends Array<
|
|
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"];
|
|
85
101
|
declare class _fSelectDistinct<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fSelect<TSources, TFields, TSelectRT> {
|
|
86
102
|
selectDistinct(): _fSelect<TSources, TFields, TSelectRT>;
|
|
87
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>;
|
|
@@ -145,7 +161,7 @@ type LogicalOperator = '$AND' | '$OR' | '$NOT' | "$NOR";
|
|
|
145
161
|
type WhereCriteria<T extends TArrSources, TFields extends TFieldsType, F = WhereCriteria_Fields<T, TFields>> = F & {
|
|
146
162
|
[k in LogicalOperator]?: [WhereCriteria<T, TFields, F>, ...Array<WhereCriteria<T, TFields, F>>];
|
|
147
163
|
};
|
|
148
|
-
type WhereCriteria_Fields<T extends Array<
|
|
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;
|
|
149
165
|
type OnlyNull<T, R> = T extends null ? R : never;
|
|
150
166
|
type FindColsWithNull<TFields extends TFieldsType> = Prettify<{
|
|
151
167
|
[Table in keyof TFields]: {
|
|
@@ -160,18 +176,24 @@ declare class _fWhere<TSources extends TArrSources, TFields extends TFieldsType>
|
|
|
160
176
|
where<const TCriteria extends WhereCriteria<TSources, TFields>>(criteria: TCriteria): _fGroupBy<TSources, TFields>;
|
|
161
177
|
whereRaw<RAW extends string>(where: NO_START_WITH_WHERE<RAW>): _fGroupBy<TSources, TFields>;
|
|
162
178
|
}
|
|
163
|
-
type GetFieldsFromTable<TDBBase extends
|
|
164
|
-
table: TDBBase
|
|
179
|
+
type GetFieldsFromTable<TDBBase extends TTableSources> = Extract<DATABASE, {
|
|
180
|
+
table: GetRealTableNames<TDBBase>;
|
|
165
181
|
}>["fields"];
|
|
166
|
-
type GetColsBaseTable<TDBBase extends
|
|
167
|
-
type GetJoinCols<TDBBase extends
|
|
168
|
-
type IterateFields<TDBBase extends
|
|
169
|
-
type Relations<Table extends
|
|
170
|
-
table: Table
|
|
182
|
+
type GetColsBaseTable<TDBBase extends TTableSources> = TDBBase extends string ? keyof GetFieldsFromTable<TDBBase> : keyof GetFieldsFromTable<TDBBase[0]>;
|
|
183
|
+
type GetJoinCols<TDBBase extends TTableSources> = TDBBase extends string ? IterateFields<TDBBase, IsString<GetColsBaseTable<TDBBase>>> : IterateFields<TDBBase[1], IsString<GetColsBaseTable<TDBBase[0]>>>;
|
|
184
|
+
type IterateFields<TDBBase extends TTableSources, F extends string> = `${TDBBase extends string ? TDBBase : TDBBase[1]}.${F}`;
|
|
185
|
+
type Relations<Table extends TTableSources> = Extract<DATABASE, {
|
|
186
|
+
table: GetRealTableNames<Table>;
|
|
171
187
|
}>["relations"];
|
|
172
|
-
type AvailableJoins<Tables extends Array<
|
|
173
|
-
type
|
|
174
|
-
|
|
188
|
+
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
|
+
type GetRealTableNames<Tables extends TTableSources> = Tables extends any ? Tables extends string ? Tables : Tables[0] : never;
|
|
190
|
+
type GetAliasTableNames<Tables extends TTableSources> = Tables extends any ? Tables extends string ? Tables : Tables[1] : never;
|
|
191
|
+
type SafeJoins<TNewJoin extends TTables, TJoins extends TArrSources, TRelations = Relations<TNewJoin>> = {
|
|
192
|
+
[k in keyof TRelations as Filter<k, GetRealTableNames<TJoins[number]>>]: TRelations[k];
|
|
193
|
+
};
|
|
194
|
+
type ToUnion<TJoins extends TArrSources> = TJoins[number];
|
|
195
|
+
type MapJoinsToKnownTables<TSafeJoins extends Record<string, unknown>, TJoins extends TArrSources> = {
|
|
196
|
+
[k in ToUnion<TJoins> as GetAliasTableNames<k>]: TSafeJoins[GetRealTableNames<k>];
|
|
175
197
|
};
|
|
176
198
|
type CombineToString<A extends unknown, T extends unknown> = A extends string ? T extends string ? `${T}.${A}` : never : never;
|
|
177
199
|
type GetUnionOfRelations<TSafe> = {
|
|
@@ -183,7 +205,7 @@ type GetUnionOfRelations<TSafe> = {
|
|
|
183
205
|
}[keyof TSafe[T]];
|
|
184
206
|
}[keyof TSafe];
|
|
185
207
|
type ValidStringTuple<T> = T extends [string, string] ? T : never;
|
|
186
|
-
type find<
|
|
208
|
+
type find<TJoinCols extends [string, string], toFind extends string> = TJoinCols extends [infer col1, infer col2] ? col1 extends toFind ? col2 : never : never;
|
|
187
209
|
type RemoveNullable<T extends string> = T extends `?${infer R}` ? R : T;
|
|
188
210
|
type SwapKeysAndValues<T extends Record<string, any>> = {
|
|
189
211
|
[K in keyof T as RemoveNullable<T[K]>]: K;
|
|
@@ -191,6 +213,8 @@ type SwapKeysAndValues<T extends Record<string, any>> = {
|
|
|
191
213
|
type Prettify<T> = {
|
|
192
214
|
[K in keyof T]: T[K];
|
|
193
215
|
} & {};
|
|
216
|
+
type ExtractTableName<T extends string> = T extends `${infer Table} ${string}` ? Table : T;
|
|
217
|
+
type ExtractAlias<T extends string> = T extends `${string} ${infer Alias}` ? Alias : never;
|
|
194
218
|
type FieldsByTableByType = Prettify<{
|
|
195
219
|
[Table in TTables]: SwapKeysAndValues<_db[Table]["fields"]>;
|
|
196
220
|
}>;
|
|
@@ -202,21 +226,39 @@ type FieldsByTypeByTable = Prettify<{
|
|
|
202
226
|
[Table in keyof FieldsByTableByType as [FieldsByTableByType[Table][Filter<keyof FieldsByTableByType[Table], Type>]] extends [never] ? never : Table]: FieldsByTableByType[Table][Filter<keyof FieldsByTableByType[Table], Type>];
|
|
203
227
|
};
|
|
204
228
|
}>;
|
|
205
|
-
type GetColumnType<Table extends
|
|
206
|
-
type GetJoinOnColsType<Type extends string, TSources extends
|
|
207
|
-
type GetColsFromTableType<TDBBase extends
|
|
229
|
+
type GetColumnType<Table extends TTableSources, Col1 extends keyof _db[Table extends string ? Table : `Come back to 8`]["fields"]> = RemoveNullChar<IsString<_db[Table extends string ? Table : `Come back to 9`]["fields"][Col1]>>;
|
|
230
|
+
type GetJoinOnColsType<Type extends string, TSources extends TArrSources> = GetJoinColsType<TSources[number], Type>;
|
|
231
|
+
type GetColsFromTableType<TDBBase extends TTableSources, Type extends string> = FieldsByTypeByTable[Loop<keyof FieldsByTypeByTable, Type>][GetRealTableNames<TDBBase>];
|
|
208
232
|
type Loop<Keys extends string, Type extends string> = Keys extends Type ? Type : never;
|
|
209
|
-
type GetJoinColsType<TDBBase extends
|
|
233
|
+
type GetJoinColsType<TDBBase extends TTableSources, Type extends string> = IterateFields<TDBBase, IsString<GetColsFromTableType<TDBBase, Type>>>;
|
|
210
234
|
type TFieldsType = Record<string, Record<string, any>>;
|
|
211
235
|
declare class _fJoin<TSources extends TArrSources, TFields extends TFieldsType> extends _fWhere<TSources, TFields> {
|
|
212
|
-
join<Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<SafeJoins<Table, TSources>>>, TCol1 extends TJoinCols[0] = never
|
|
213
|
-
|
|
214
|
-
|
|
236
|
+
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
|
+
table: Table;
|
|
238
|
+
src: TCol1;
|
|
239
|
+
on: find<TJoinCols, TCol1>;
|
|
240
|
+
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: {
|
|
244
|
+
table: Table;
|
|
245
|
+
src: TCol1;
|
|
246
|
+
on: TCol2;
|
|
247
|
+
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: {
|
|
251
|
+
table: Table;
|
|
252
|
+
src: TCol1;
|
|
253
|
+
on: TCol2;
|
|
254
|
+
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>>>;
|
|
215
257
|
}
|
|
216
258
|
declare const _default: {
|
|
217
259
|
client: {
|
|
218
|
-
$from<T extends TTables
|
|
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>>>;
|
|
219
261
|
};
|
|
220
262
|
};
|
|
221
263
|
|
|
222
|
-
export { type DBType, type GetUnionOfRelations, type JSONArray, type JSONObject, type JSONPrimitive, type JSONValue, type RemoveNullChar, type SafeJoins, type TTables, _default as default };
|
|
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 };
|