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/built/extend.cjs
CHANGED
|
@@ -87,6 +87,41 @@ const DB = {
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
|
+
"Employee": {
|
|
91
|
+
"fields": {
|
|
92
|
+
"id": "Int",
|
|
93
|
+
"name": "String",
|
|
94
|
+
"managerId": "?Int"
|
|
95
|
+
},
|
|
96
|
+
"relations": {
|
|
97
|
+
"Employee": {
|
|
98
|
+
"managerId": [
|
|
99
|
+
"id"
|
|
100
|
+
],
|
|
101
|
+
"id": [
|
|
102
|
+
"managerId"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"_ManagerSubordinates": {
|
|
106
|
+
"id": [
|
|
107
|
+
"A"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"_ManagerSubordinates": {
|
|
113
|
+
"fields": {
|
|
114
|
+
"A": "Int",
|
|
115
|
+
"B": ""
|
|
116
|
+
},
|
|
117
|
+
"relations": {
|
|
118
|
+
"Employee": {
|
|
119
|
+
"A": [
|
|
120
|
+
"id"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
},
|
|
90
125
|
"MFId_Category": {
|
|
91
126
|
"fields": {
|
|
92
127
|
"id": "Int",
|
|
@@ -296,8 +331,14 @@ class DbSelect {
|
|
|
296
331
|
constructor(db) {
|
|
297
332
|
this.db = db;
|
|
298
333
|
}
|
|
299
|
-
from(
|
|
300
|
-
return new _fJoin(this.db, {
|
|
334
|
+
from(baseTable, alias) {
|
|
335
|
+
return new _fJoin(this.db, {
|
|
336
|
+
tables: [{
|
|
337
|
+
table: baseTable,
|
|
338
|
+
alias
|
|
339
|
+
}],
|
|
340
|
+
selects: []
|
|
341
|
+
});
|
|
301
342
|
}
|
|
302
343
|
}
|
|
303
344
|
class _fRun {
|
|
@@ -318,6 +359,9 @@ class _fRun {
|
|
|
318
359
|
getFields() {
|
|
319
360
|
return {};
|
|
320
361
|
}
|
|
362
|
+
getResultType() {
|
|
363
|
+
return {};
|
|
364
|
+
}
|
|
321
365
|
getSQL(formatted = false) {
|
|
322
366
|
function processCondition(condition, formatted2) {
|
|
323
367
|
return "(" + Object.keys(condition).map((field) => {
|
|
@@ -386,14 +430,20 @@ class _fRun {
|
|
|
386
430
|
}
|
|
387
431
|
const whereClause = this.values.where !== void 0 ? processCriteria(this.values.where, "AND", formatted) : void 0;
|
|
388
432
|
const havingClause = this.values.having !== void 0 ? processCriteria(this.values.having, "AND", formatted) : void 0;
|
|
433
|
+
const [base, ...joins] = this.values.tables;
|
|
434
|
+
const baseTable = base.alias ? `${base.table} AS \`${base.alias}\`` : base.table;
|
|
389
435
|
return [
|
|
390
436
|
this.values.selects.length === 0 ? "" : "SELECT " + (this.values.selectDistinct === true ? "DISTINCT " : "") + this.values.selects.join(", "),
|
|
391
|
-
`FROM ${
|
|
392
|
-
|
|
437
|
+
`FROM ${baseTable}`,
|
|
438
|
+
joins.map(({
|
|
393
439
|
table,
|
|
394
440
|
local,
|
|
395
|
-
remote
|
|
396
|
-
|
|
441
|
+
remote,
|
|
442
|
+
alias
|
|
443
|
+
}) => {
|
|
444
|
+
const tLocal = (alias || table) + "." + local;
|
|
445
|
+
return `JOIN ${!!alias ? table + " AS `" + alias + "`" : table} ON ${tLocal} = ${remote}`;
|
|
446
|
+
}).join(formatted ? "\n" : " ") ?? "",
|
|
397
447
|
!whereClause ? "" : `WHERE ${whereClause}`,
|
|
398
448
|
!this.values.groupBy?.length ? "" : `GROUP BY ${this.values.groupBy.join(", ")}`,
|
|
399
449
|
!havingClause ? "" : `HAVING ${havingClause}`,
|
|
@@ -419,7 +469,58 @@ class _fOrderBy extends _fLimit {
|
|
|
419
469
|
}
|
|
420
470
|
}
|
|
421
471
|
class _fSelect extends _fOrderBy {
|
|
422
|
-
select(select) {
|
|
472
|
+
select(select, alias) {
|
|
473
|
+
const tableColMatch = select.match(/^(\w+)\.(.*?)$/);
|
|
474
|
+
if (tableColMatch) {
|
|
475
|
+
const [, tableName, colName] = tableColMatch;
|
|
476
|
+
const tableObject = this.values.tables.find((t) => (t.alias || t.table) === tableName);
|
|
477
|
+
if (!tableObject) throw new Error(`Table "${tableName}" not found in query`);
|
|
478
|
+
const tableFields = DB[tableObject.table];
|
|
479
|
+
if (!tableFields) {
|
|
480
|
+
throw new Error(`Table "${tableName}" not found in database schema`);
|
|
481
|
+
}
|
|
482
|
+
if (colName === "*") {
|
|
483
|
+
const hasMultipleTables = this.values.tables && this.values.tables.length > 1 || false;
|
|
484
|
+
const expandedSelects = Object.keys(tableFields.fields).map((field) => {
|
|
485
|
+
if (hasMultipleTables) {
|
|
486
|
+
return `${tableName}.${field} AS \`${tableName}.${field}\``;
|
|
487
|
+
}
|
|
488
|
+
return `${field}`;
|
|
489
|
+
});
|
|
490
|
+
return new _fSelect(this.db, {
|
|
491
|
+
...this.values,
|
|
492
|
+
selects: [...this.values.selects, ...expandedSelects]
|
|
493
|
+
});
|
|
494
|
+
} else if (!alias && !!colName) {
|
|
495
|
+
const currentTablesWithFields = this.values.tables.reduce((acc, table) => {
|
|
496
|
+
const { table: real } = table;
|
|
497
|
+
for (const col in DB[real].fields) {
|
|
498
|
+
acc[col] = acc[col] ? acc[col] + 1 : 1;
|
|
499
|
+
}
|
|
500
|
+
return acc;
|
|
501
|
+
}, {});
|
|
502
|
+
if (!currentTablesWithFields[colName]) {
|
|
503
|
+
throw new Error(`Column "${colName}" not found in database schema`);
|
|
504
|
+
}
|
|
505
|
+
if (currentTablesWithFields[colName] > 1) {
|
|
506
|
+
return new _fSelect(this.db, {
|
|
507
|
+
...this.values,
|
|
508
|
+
selects: [...this.values.selects, `${select} AS \`${select}\``]
|
|
509
|
+
});
|
|
510
|
+
} else {
|
|
511
|
+
return new _fSelect(this.db, {
|
|
512
|
+
...this.values,
|
|
513
|
+
selects: [...this.values.selects, `${colName}`]
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
if (alias !== void 0) {
|
|
519
|
+
return new _fSelect(this.db, {
|
|
520
|
+
...this.values,
|
|
521
|
+
selects: [...this.values.selects, `${select} AS \`${alias}\``]
|
|
522
|
+
});
|
|
523
|
+
}
|
|
423
524
|
return new _fSelect(this.db, {
|
|
424
525
|
...this.values,
|
|
425
526
|
selects: [...this.values.selects, select]
|
|
@@ -432,12 +533,15 @@ class _fSelectDistinct extends _fSelect {
|
|
|
432
533
|
}
|
|
433
534
|
selectAll() {
|
|
434
535
|
const selects = function(values) {
|
|
435
|
-
if (values.tables && values.tables.length >
|
|
436
|
-
return [
|
|
536
|
+
if (values.tables && values.tables.length > 1) {
|
|
537
|
+
return [
|
|
538
|
+
/*values.baseTable,*/
|
|
539
|
+
...values.tables.map((t) => t.table)
|
|
540
|
+
].reduce((acc, table) => {
|
|
437
541
|
return acc.concat(Object.keys(DB[table].fields).map((field) => `${table}.${field} AS \`${table}.${field}\``));
|
|
438
542
|
}, []);
|
|
439
543
|
}
|
|
440
|
-
return Object.keys(DB[values.
|
|
544
|
+
return Object.keys(DB[values.tables[0].table].fields);
|
|
441
545
|
}(this.values);
|
|
442
546
|
return new _fOrderBy(this.db, {
|
|
443
547
|
...this.values,
|
|
@@ -508,48 +612,58 @@ class _fWhere extends _fGroupBy {
|
|
|
508
612
|
}
|
|
509
613
|
}
|
|
510
614
|
class _fJoin extends _fWhere {
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
615
|
+
// Implementation
|
|
616
|
+
join(tableOrOptions, field, reference) {
|
|
617
|
+
let table;
|
|
618
|
+
let local;
|
|
619
|
+
let remote;
|
|
620
|
+
let tableAlias;
|
|
621
|
+
if (typeof tableOrOptions === "object" && "table" in tableOrOptions) {
|
|
622
|
+
table = tableOrOptions.table.trim();
|
|
623
|
+
local = tableOrOptions.src;
|
|
624
|
+
remote = tableOrOptions.on;
|
|
625
|
+
tableAlias = tableOrOptions.alias?.trim();
|
|
626
|
+
} else {
|
|
627
|
+
const parts = tableOrOptions.split(" ");
|
|
628
|
+
table = parts[0];
|
|
629
|
+
tableAlias = parts[1]?.trim();
|
|
630
|
+
local = field;
|
|
631
|
+
remote = reference;
|
|
632
|
+
}
|
|
518
633
|
return new _fJoin(this.db, {
|
|
519
634
|
...this.values,
|
|
520
635
|
tables: [...this.values.tables || [], {
|
|
521
636
|
table,
|
|
522
|
-
local
|
|
523
|
-
remote
|
|
637
|
+
local,
|
|
638
|
+
remote,
|
|
639
|
+
alias: tableAlias
|
|
524
640
|
}]
|
|
525
641
|
});
|
|
526
642
|
}
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
}]
|
|
535
|
-
});
|
|
643
|
+
// Implementation
|
|
644
|
+
joinUnsafeTypeEnforced(tableOrOptions, field, reference) {
|
|
645
|
+
return this.join(tableOrOptions, field, reference);
|
|
646
|
+
}
|
|
647
|
+
// Implementation
|
|
648
|
+
joinUnsafeIgnoreType(tableOrOptions, field, reference) {
|
|
649
|
+
return this.join(tableOrOptions, field, reference);
|
|
536
650
|
}
|
|
537
|
-
// innerJoin(table:
|
|
651
|
+
// innerJoin(table: TTableSources, col1:string, col2:string){
|
|
538
652
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
539
653
|
// }
|
|
540
|
-
// leftJoin(table:
|
|
654
|
+
// leftJoin(table: TTableSources, col1:string, col2:string){
|
|
541
655
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
542
656
|
// }
|
|
543
|
-
// rightJoin(table:
|
|
657
|
+
// rightJoin(table: TTableSources, col1:string, col2:string){
|
|
544
658
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
545
659
|
// }
|
|
546
|
-
// fullJoin(table:
|
|
660
|
+
// fullJoin(table: TTableSources, col1:string, col2:string){
|
|
547
661
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
548
662
|
// }
|
|
549
|
-
// crossJoin(table:
|
|
663
|
+
// crossJoin(table: TTableSources, col1:string, col2:string){
|
|
550
664
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
551
665
|
// }
|
|
552
|
-
// outerJoin(table:
|
|
666
|
+
// outerJoin(table: TTableSources, col1:string, col2:string){
|
|
553
667
|
// return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
|
|
554
668
|
// }
|
|
555
669
|
}
|
|
@@ -557,7 +671,8 @@ var extend_default = {
|
|
|
557
671
|
client: {
|
|
558
672
|
$from(table) {
|
|
559
673
|
const client = extension.Prisma.getExtensionContext(this);
|
|
560
|
-
|
|
674
|
+
const [base, ...aliases] = table.split(" ");
|
|
675
|
+
return new DbSelect(client).from(base.trim(), aliases.join().trim() || void 0);
|
|
561
676
|
}
|
|
562
677
|
}
|
|
563
678
|
};
|
package/built/extend.d.cts
CHANGED
|
@@ -66,6 +66,33 @@ declare const DB: {
|
|
|
66
66
|
};
|
|
67
67
|
};
|
|
68
68
|
};
|
|
69
|
+
readonly Employee: {
|
|
70
|
+
readonly fields: {
|
|
71
|
+
readonly id: "Int";
|
|
72
|
+
readonly name: "String";
|
|
73
|
+
readonly managerId: "?Int";
|
|
74
|
+
};
|
|
75
|
+
readonly relations: {
|
|
76
|
+
readonly Employee: {
|
|
77
|
+
readonly managerId: ["id"];
|
|
78
|
+
readonly id: ["managerId"];
|
|
79
|
+
};
|
|
80
|
+
readonly _ManagerSubordinates: {
|
|
81
|
+
readonly id: ["A"];
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
readonly _ManagerSubordinates: {
|
|
86
|
+
readonly fields: {
|
|
87
|
+
readonly A: "Int";
|
|
88
|
+
readonly B: "";
|
|
89
|
+
};
|
|
90
|
+
readonly relations: {
|
|
91
|
+
readonly Employee: {
|
|
92
|
+
readonly A: ["id"];
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
};
|
|
69
96
|
readonly MFId_Category: {
|
|
70
97
|
readonly fields: {
|
|
71
98
|
readonly id: "Int";
|
|
@@ -261,20 +288,26 @@ type DBType = Record<string, {
|
|
|
261
288
|
}>;
|
|
262
289
|
type Filter<a, b> = a extends b ? a : never;
|
|
263
290
|
type IsString<T> = T extends string ? T : never;
|
|
264
|
-
type ValidSelect<Tables extends
|
|
265
|
-
type
|
|
291
|
+
type ValidSelect<Tables extends TArrSources> = "*" | GetOtherColumns<Tables> | GetTableStar<Tables>;
|
|
292
|
+
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;
|
|
293
|
+
type GetTableStarJoined<T extends TTableSources> = T extends string ? `${T}.*` : `${T[1]}.*`;
|
|
294
|
+
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;
|
|
266
295
|
type TTables = DATABASE["table"];
|
|
267
|
-
type
|
|
296
|
+
type TTableSources = DATABASE["table"] | [table: DATABASE["table"], alias: string];
|
|
297
|
+
type TArrSources = [TTableSources, ...Array<TTableSources>];
|
|
268
298
|
type ClauseType = Array<string | WhereCriteria<TArrSources, Record<string, any>>>;
|
|
269
299
|
type Values = {
|
|
270
|
-
database: TTables;
|
|
271
300
|
selectDistinct?: true;
|
|
272
301
|
selects: Array<string>;
|
|
273
|
-
tables
|
|
302
|
+
tables: [{
|
|
303
|
+
table: TTables;
|
|
304
|
+
alias?: string;
|
|
305
|
+
}, ...Array<{
|
|
274
306
|
table: TTables;
|
|
275
307
|
local: string;
|
|
276
308
|
remote: string;
|
|
277
|
-
|
|
309
|
+
alias?: string;
|
|
310
|
+
}>];
|
|
278
311
|
limit?: number;
|
|
279
312
|
offset?: number;
|
|
280
313
|
where?: ClauseType;
|
|
@@ -289,6 +322,7 @@ declare class _fRun<TSources extends TArrSources, TFields extends TFieldsType, T
|
|
|
289
322
|
run(): Prisma.PrismaPromise<Array<TSelectRT>>;
|
|
290
323
|
getTables(): TSources;
|
|
291
324
|
getFields(): TFields;
|
|
325
|
+
getResultType(): Array<TSelectRT>;
|
|
292
326
|
getSQL(formatted?: boolean): string;
|
|
293
327
|
}
|
|
294
328
|
declare class _fOffset<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fRun<TSources, TFields, TSelectRT> {
|
|
@@ -297,20 +331,29 @@ declare class _fOffset<TSources extends TArrSources, TFields extends TFieldsType
|
|
|
297
331
|
declare class _fLimit<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fRun<TSources, TFields, TSelectRT> {
|
|
298
332
|
limit(limit: number): _fOffset<TSources, TFields, TSelectRT>;
|
|
299
333
|
}
|
|
300
|
-
type OrderBy<Tables extends TArrSources> = Tables extends [infer T extends
|
|
334
|
+
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;
|
|
301
335
|
declare class _fOrderBy<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fLimit<TSources, TFields, TSelectRT> {
|
|
302
|
-
orderBy(orderBy: Array<`${OrderBy<TSources>}${"" | " DESC" | " ASC"}`>): _fLimit<TSources, TFields, TSelectRT>;
|
|
336
|
+
orderBy(orderBy: Array<`${OrderBy<TSources, TSelectRT>}${"" | " DESC" | " ASC"}`>): _fLimit<TSources, TFields, TSelectRT>;
|
|
303
337
|
}
|
|
304
|
-
type MergeItems<Field extends string, TSources extends TArrSources, TFields extends TFieldsType, IncTName extends boolean = false,
|
|
305
|
-
|
|
338
|
+
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<{
|
|
339
|
+
[K in Field]: TFields[T][F];
|
|
340
|
+
}> : never : never : FindColumnInFields<Field, TFields>;
|
|
341
|
+
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;
|
|
342
|
+
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;
|
|
306
343
|
type GenName<T extends string, F extends unknown, IncName extends boolean> = F extends string ? [IncName] extends [false] ? F : `${T}.${F}` : never;
|
|
307
|
-
type IterateTablesFromFields<Table extends
|
|
308
|
-
[f in keyof TFields as GenName<Table
|
|
344
|
+
type IterateTablesFromFields<Table extends TTableSources, TFields extends Record<string, string>, IncTName extends boolean> = {
|
|
345
|
+
[f in keyof TFields as GenName<Table extends string ? Table : `Come back to 6`, f, IncTName>]: TFields[f];
|
|
309
346
|
};
|
|
347
|
+
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;
|
|
348
|
+
type GetColumnNamesFromTable<TDBBase extends TTableSources> = keyof GetFieldsFromTable<GetRealTableNames<TDBBase>>;
|
|
349
|
+
type GetColumnsFromTables<Tables extends Array<TTableSources>> = Tables extends [infer T extends TTableSources, ...infer Rest extends Array<TTableSources>] ? GetColumnNamesFromTable<T> | GetColumnsFromTables<Rest> : never;
|
|
350
|
+
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;
|
|
351
|
+
type IsColumnUnique<Col extends string, Tables extends TArrSources> = Col extends GetDuplicateColumnsPairwise<Tables> ? false : true;
|
|
352
|
+
type GetOtherColumns<Tables extends TArrSources> = Exclude<GetColumnsFromTables<Tables>, GetDuplicateColumnsPairwise<Tables>> | GetJoinCols<Tables[number]>;
|
|
310
353
|
declare class _fSelect<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fOrderBy<TSources, TFields, TSelectRT> {
|
|
311
|
-
select<TSelect extends ValidSelect<TSources
|
|
354
|
+
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>>>>;
|
|
312
355
|
}
|
|
313
|
-
type CountKeys<T extends Array<
|
|
356
|
+
type CountKeys<T extends Array<TTableSources>, acc extends Array<true> = []> = T extends [string, ...infer R extends Array<string>] ? CountKeys<R, [...acc, true]> : acc["length"];
|
|
314
357
|
declare class _fSelectDistinct<TSources extends TArrSources, TFields extends TFieldsType, TSelectRT extends Record<string, any> = {}> extends _fSelect<TSources, TFields, TSelectRT> {
|
|
315
358
|
selectDistinct(): _fSelect<TSources, TFields, TSelectRT>;
|
|
316
359
|
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>;
|
|
@@ -374,7 +417,7 @@ type LogicalOperator = '$AND' | '$OR' | '$NOT' | "$NOR";
|
|
|
374
417
|
type WhereCriteria<T extends TArrSources, TFields extends TFieldsType, F = WhereCriteria_Fields<T, TFields>> = F & {
|
|
375
418
|
[k in LogicalOperator]?: [WhereCriteria<T, TFields, F>, ...Array<WhereCriteria<T, TFields, F>>];
|
|
376
419
|
};
|
|
377
|
-
type WhereCriteria_Fields<T extends Array<
|
|
420
|
+
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;
|
|
378
421
|
type OnlyNull<T, R> = T extends null ? R : never;
|
|
379
422
|
type FindColsWithNull<TFields extends TFieldsType> = Prettify<{
|
|
380
423
|
[Table in keyof TFields]: {
|
|
@@ -389,18 +432,24 @@ declare class _fWhere<TSources extends TArrSources, TFields extends TFieldsType>
|
|
|
389
432
|
where<const TCriteria extends WhereCriteria<TSources, TFields>>(criteria: TCriteria): _fGroupBy<TSources, TFields>;
|
|
390
433
|
whereRaw<RAW extends string>(where: NO_START_WITH_WHERE<RAW>): _fGroupBy<TSources, TFields>;
|
|
391
434
|
}
|
|
392
|
-
type GetFieldsFromTable<TDBBase extends
|
|
393
|
-
table: TDBBase
|
|
435
|
+
type GetFieldsFromTable<TDBBase extends TTableSources> = Extract<DATABASE, {
|
|
436
|
+
table: GetRealTableNames<TDBBase>;
|
|
394
437
|
}>["fields"];
|
|
395
|
-
type GetColsBaseTable<TDBBase extends
|
|
396
|
-
type GetJoinCols<TDBBase extends
|
|
397
|
-
type IterateFields<TDBBase extends
|
|
398
|
-
type Relations<Table extends
|
|
399
|
-
table: Table
|
|
438
|
+
type GetColsBaseTable<TDBBase extends TTableSources> = TDBBase extends string ? keyof GetFieldsFromTable<TDBBase> : keyof GetFieldsFromTable<TDBBase[0]>;
|
|
439
|
+
type GetJoinCols<TDBBase extends TTableSources> = TDBBase extends string ? IterateFields<TDBBase, IsString<GetColsBaseTable<TDBBase>>> : IterateFields<TDBBase[1], IsString<GetColsBaseTable<TDBBase[0]>>>;
|
|
440
|
+
type IterateFields<TDBBase extends TTableSources, F extends string> = `${TDBBase extends string ? TDBBase : TDBBase[1]}.${F}`;
|
|
441
|
+
type Relations<Table extends TTableSources> = Extract<DATABASE, {
|
|
442
|
+
table: GetRealTableNames<Table>;
|
|
400
443
|
}>["relations"];
|
|
401
|
-
type AvailableJoins<Tables extends Array<
|
|
402
|
-
type
|
|
403
|
-
|
|
444
|
+
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;
|
|
445
|
+
type GetRealTableNames<Tables extends TTableSources> = Tables extends any ? Tables extends string ? Tables : Tables[0] : never;
|
|
446
|
+
type GetAliasTableNames<Tables extends TTableSources> = Tables extends any ? Tables extends string ? Tables : Tables[1] : never;
|
|
447
|
+
type SafeJoins<TNewJoin extends TTables, TJoins extends TArrSources, TRelations = Relations<TNewJoin>> = {
|
|
448
|
+
[k in keyof TRelations as Filter<k, GetRealTableNames<TJoins[number]>>]: TRelations[k];
|
|
449
|
+
};
|
|
450
|
+
type ToUnion<TJoins extends TArrSources> = TJoins[number];
|
|
451
|
+
type MapJoinsToKnownTables<TSafeJoins extends Record<string, unknown>, TJoins extends TArrSources> = {
|
|
452
|
+
[k in ToUnion<TJoins> as GetAliasTableNames<k>]: TSafeJoins[GetRealTableNames<k>];
|
|
404
453
|
};
|
|
405
454
|
type CombineToString<A extends unknown, T extends unknown> = A extends string ? T extends string ? `${T}.${A}` : never : never;
|
|
406
455
|
type GetUnionOfRelations<TSafe> = {
|
|
@@ -412,7 +461,7 @@ type GetUnionOfRelations<TSafe> = {
|
|
|
412
461
|
}[keyof TSafe[T]];
|
|
413
462
|
}[keyof TSafe];
|
|
414
463
|
type ValidStringTuple<T> = T extends [string, string] ? T : never;
|
|
415
|
-
type find<
|
|
464
|
+
type find<TJoinCols extends [string, string], toFind extends string> = TJoinCols extends [infer col1, infer col2] ? col1 extends toFind ? col2 : never : never;
|
|
416
465
|
type RemoveNullable<T extends string> = T extends `?${infer R}` ? R : T;
|
|
417
466
|
type SwapKeysAndValues<T extends Record<string, any>> = {
|
|
418
467
|
[K in keyof T as RemoveNullable<T[K]>]: K;
|
|
@@ -420,6 +469,8 @@ type SwapKeysAndValues<T extends Record<string, any>> = {
|
|
|
420
469
|
type Prettify<T> = {
|
|
421
470
|
[K in keyof T]: T[K];
|
|
422
471
|
} & {};
|
|
472
|
+
type ExtractTableName<T extends string> = T extends `${infer Table} ${string}` ? Table : T;
|
|
473
|
+
type ExtractAlias<T extends string> = T extends `${string} ${infer Alias}` ? Alias : never;
|
|
423
474
|
type FieldsByTableByType = Prettify<{
|
|
424
475
|
[Table in TTables]: SwapKeysAndValues<_db[Table]["fields"]>;
|
|
425
476
|
}>;
|
|
@@ -431,21 +482,39 @@ type FieldsByTypeByTable = Prettify<{
|
|
|
431
482
|
[Table in keyof FieldsByTableByType as [FieldsByTableByType[Table][Filter<keyof FieldsByTableByType[Table], Type>]] extends [never] ? never : Table]: FieldsByTableByType[Table][Filter<keyof FieldsByTableByType[Table], Type>];
|
|
432
483
|
};
|
|
433
484
|
}>;
|
|
434
|
-
type GetColumnType<Table extends
|
|
435
|
-
type GetJoinOnColsType<Type extends string, TSources extends
|
|
436
|
-
type GetColsFromTableType<TDBBase extends
|
|
485
|
+
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]>>;
|
|
486
|
+
type GetJoinOnColsType<Type extends string, TSources extends TArrSources> = GetJoinColsType<TSources[number], Type>;
|
|
487
|
+
type GetColsFromTableType<TDBBase extends TTableSources, Type extends string> = FieldsByTypeByTable[Loop<keyof FieldsByTypeByTable, Type>][GetRealTableNames<TDBBase>];
|
|
437
488
|
type Loop<Keys extends string, Type extends string> = Keys extends Type ? Type : never;
|
|
438
|
-
type GetJoinColsType<TDBBase extends
|
|
489
|
+
type GetJoinColsType<TDBBase extends TTableSources, Type extends string> = IterateFields<TDBBase, IsString<GetColsFromTableType<TDBBase, Type>>>;
|
|
439
490
|
type TFieldsType = Record<string, Record<string, any>>;
|
|
440
491
|
declare class _fJoin<TSources extends TArrSources, TFields extends TFieldsType> extends _fWhere<TSources, TFields> {
|
|
441
|
-
join<Table extends AvailableJoins<TSources>, TJoinCols extends [string, string] = ValidStringTuple<GetUnionOfRelations<SafeJoins<Table, TSources>>>, TCol1 extends TJoinCols[0] = never
|
|
442
|
-
|
|
443
|
-
|
|
492
|
+
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: {
|
|
493
|
+
table: Table;
|
|
494
|
+
src: TCol1;
|
|
495
|
+
on: find<TJoinCols, TCol1>;
|
|
496
|
+
alias?: TAlias;
|
|
497
|
+
}): _fJoin<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>>;
|
|
498
|
+
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>>>>;
|
|
499
|
+
joinUnsafeTypeEnforced<const Table extends AvailableJoins<TSources>, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>, TAlias extends string = never>(options: {
|
|
500
|
+
table: Table;
|
|
501
|
+
src: TCol1;
|
|
502
|
+
on: TCol2;
|
|
503
|
+
alias?: TAlias;
|
|
504
|
+
}): _fJoin<[...TSources, [TAlias] extends [undefined] ? Table : [Table, TAlias]], Prettify<TFields & Record<[TAlias] extends [undefined] ? Table : TAlias, GetFieldsFromTable<Table>>>>;
|
|
505
|
+
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>>>>;
|
|
506
|
+
joinUnsafeIgnoreType<const Table extends AvailableJoins<TSources>, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinCols<TSources[number]>, TAlias extends string = never>(options: {
|
|
507
|
+
table: Table;
|
|
508
|
+
src: TCol1;
|
|
509
|
+
on: TCol2;
|
|
510
|
+
alias?: TAlias;
|
|
511
|
+
}): _fJoin<[...TSources, [TAlias] extends [never] ? Table : [Table, TAlias]], TFields & Record<Table, GetFieldsFromTable<Table>>>;
|
|
512
|
+
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>>>;
|
|
444
513
|
}
|
|
445
514
|
declare const _default: {
|
|
446
515
|
client: {
|
|
447
|
-
$from<T extends TTables
|
|
516
|
+
$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>>>;
|
|
448
517
|
};
|
|
449
518
|
};
|
|
450
519
|
|
|
451
|
-
export { type DBType, type GetUnionOfRelations, type JSONArray, type JSONObject, type JSONPrimitive, type JSONValue, type RemoveNullChar, type SafeJoins, type TTables, _default as default };
|
|
520
|
+
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 };
|