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/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(database) {
300
- return new _fJoin(this.db, { database, selects: [] });
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 ${this.values.database}`,
392
- this.values.tables?.map(({
437
+ `FROM ${baseTable}`,
438
+ joins.map(({
393
439
  table,
394
440
  local,
395
- remote
396
- }) => `JOIN ${table} ON ${local} = ${remote}`).join(formatted ? "\n" : " ") ?? "",
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 > 0) {
436
- return [values.database, ...values.tables.map((t) => t.table)].reduce((acc, table) => {
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.database].fields);
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
- join(table, field, reference) {
512
- return new _fJoin(this.db, {
513
- ...this.values,
514
- tables: [...this.values.tables || [], { table, local: field, remote: reference }]
515
- });
516
- }
517
- joinUnsafeTypeEnforced(table, field, reference) {
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: `${String(table)}.${String(field)}`,
523
- remote: reference
637
+ local,
638
+ remote,
639
+ alias: tableAlias
524
640
  }]
525
641
  });
526
642
  }
527
- joinUnsafeIgnoreType(table, field, reference) {
528
- return new _fJoin(this.db, {
529
- ...this.values,
530
- tables: [...this.values.tables || [], {
531
- table,
532
- local: `${String(table)}.${String(field)}`,
533
- remote: reference
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: TTables, col1:string, col2:string){
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: TTables, col1:string, col2:string){
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: TTables, col1:string, col2:string){
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: TTables, col1:string, col2:string){
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: TTables, col1:string, col2:string){
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: TTables, col1:string, col2:string){
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
- return new DbSelect(client).from(table);
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
  };
@@ -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 Array<TTables>> = "*" | GetOtherColumns<Tables>;
265
- type GetOtherColumns<Tables extends Array<TTables>> = Tables extends [infer T extends TTables, ...infer R extends Array<TTables>] ? GetColsBaseTable<T> | GetJoinCols<R[number]> : never;
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 TArrSources = [TTables, ...Array<TTables>];
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?: Array<{
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 TTables, ...infer R extends Array<TTables>] ? GetColsBaseTable<T> | GetJoinCols<R[number]> : never;
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, TTables = TSources[number]> = Field extends "*" ? Prettify<IterateTables<TSources, TFields, IncTName>> : Field extends `${infer T extends TTables}.${infer F extends string}` ? Pick<TFields[T], F> : Pick<TFields[TSources[0]], Field>;
305
- type IterateTables<Tables extends Array<TTables>, TFields extends TFieldsType, IncTName extends boolean, acc extends Record<string, any> = {}> = Tables extends [infer T extends TTables, ...infer Rest extends Array<TTables>] ? [IncTName] extends [false] ? IterateTables<Rest, TFields, IncTName, acc & TFields[T]> : IterateTables<Rest, TFields, IncTName, acc & IterateTablesFromFields<T, TFields[T], IncTName>> : acc;
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 TTables, TFields extends Record<string, string>, IncTName extends boolean> = {
308
- [f in keyof TFields as GenName<Table, f, IncTName>]: TFields[f];
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>>(select: TSelect): _fSelect<TSources, TFields, TSelectRT & MergeItems<TSelect, TSources, TFields, false, TSources[number]> extends infer T ? { [K in keyof T]: (TSelectRT & MergeItems<TSelect, TSources, TFields, false, TSources[number]>)[K]; } : never>;
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<string>, acc extends Array<true> = []> = T extends [string, ...infer R extends Array<string>] ? CountKeys<R, [...acc, true]> : acc["length"];
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<string>, TFields extends TFieldsType, acc = {}> = T extends readonly [infer HEAD, ...infer Rest] ? HEAD extends string ? Rest extends Array<string> ? 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]>>)>> : never : acc;
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 TTables> = Extract<DATABASE, {
393
- table: TDBBase;
435
+ type GetFieldsFromTable<TDBBase extends TTableSources> = Extract<DATABASE, {
436
+ table: GetRealTableNames<TDBBase>;
394
437
  }>["fields"];
395
- type GetColsBaseTable<TDBBase extends TTables> = TDBBase extends any ? keyof GetFieldsFromTable<TDBBase> : never;
396
- type GetJoinCols<TDBBase extends TTables> = TDBBase extends any ? IterateFields<TDBBase, IsString<GetColsBaseTable<TDBBase>>> : never;
397
- type IterateFields<TDBBase extends TTables, F extends string> = `${TDBBase}.${F}`;
398
- type Relations<Table extends TTables> = Extract<DATABASE, {
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<TTables>, acc extends TTables = never> = Tables extends [infer T extends TTables, ...infer Rest extends Array<TTables>] ? AvailableJoins<Rest, acc | keyof Relations<T>> : acc;
402
- type SafeJoins<TNewJoin extends TTables, TJoins extends Array<TTables>, TRelations = Relations<TNewJoin>> = {
403
- [k in keyof TRelations as Filter<k, TJoins[number]>]: TRelations[k];
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<T extends [string, string], toFind extends string> = T extends [infer col1, infer col2] ? col1 extends toFind ? col2 : never : never;
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 TTables, Col1 extends keyof _db[Table]["fields"]> = RemoveNullChar<IsString<_db[Table]["fields"][Col1]>>;
435
- type GetJoinOnColsType<Type extends string, TSources extends Array<TTables>> = GetJoinColsType<TSources[number], Type>;
436
- type GetColsFromTableType<TDBBase extends TTables, Type extends string> = FieldsByTypeByTable[Loop<keyof FieldsByTypeByTable, Type>][TDBBase];
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 TTables, Type extends string> = IterateFields<TDBBase, IsString<GetColsFromTableType<TDBBase, Type>>>;
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>(table: Table, field: TCol1, reference: find<TJoinCols, TCol1>): _fJoin<[...TSources, Table], TFields & Record<Table, GetFieldsFromTable<Table>> extends infer T ? { [K in keyof T]: (TFields & Record<Table, GetFieldsFromTable<Table>>)[K]; } : never>;
442
- joinUnsafeTypeEnforced<Table extends AvailableJoins<TSources>, TCol1 extends GetColsBaseTable<Table>, TCol2 extends GetJoinOnColsType<GetColumnType<Table, TCol1>, [...TSources, Table]>>(table: Table, field: TCol1, reference: TCol2): _fJoin<[...TSources, Table], TFields & Record<Table, GetFieldsFromTable<Table>>>;
443
- joinUnsafeIgnoreType<Table extends AvailableJoins<TSources>, TCol2 extends GetJoinCols<TSources[number]>>(table: Table, field: GetColsBaseTable<Table>, reference: TCol2): _fJoin<[...TSources, Table], TFields & Record<Table, GetFieldsFromTable<Table>>>;
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>(table: T): _fJoin<[T], Record<T, GetFieldsFromTable<T>>>;
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 };