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.d.ts 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 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 };
package/built/extend.js CHANGED
@@ -85,6 +85,41 @@ const DB = {
85
85
  }
86
86
  }
87
87
  },
88
+ "Employee": {
89
+ "fields": {
90
+ "id": "Int",
91
+ "name": "String",
92
+ "managerId": "?Int"
93
+ },
94
+ "relations": {
95
+ "Employee": {
96
+ "managerId": [
97
+ "id"
98
+ ],
99
+ "id": [
100
+ "managerId"
101
+ ]
102
+ },
103
+ "_ManagerSubordinates": {
104
+ "id": [
105
+ "A"
106
+ ]
107
+ }
108
+ }
109
+ },
110
+ "_ManagerSubordinates": {
111
+ "fields": {
112
+ "A": "Int",
113
+ "B": ""
114
+ },
115
+ "relations": {
116
+ "Employee": {
117
+ "A": [
118
+ "id"
119
+ ]
120
+ }
121
+ }
122
+ },
88
123
  "MFId_Category": {
89
124
  "fields": {
90
125
  "id": "Int",
@@ -294,8 +329,14 @@ class DbSelect {
294
329
  constructor(db) {
295
330
  this.db = db;
296
331
  }
297
- from(database) {
298
- return new _fJoin(this.db, { database, selects: [] });
332
+ from(baseTable, alias) {
333
+ return new _fJoin(this.db, {
334
+ tables: [{
335
+ table: baseTable,
336
+ alias
337
+ }],
338
+ selects: []
339
+ });
299
340
  }
300
341
  }
301
342
  class _fRun {
@@ -316,6 +357,9 @@ class _fRun {
316
357
  getFields() {
317
358
  return {};
318
359
  }
360
+ getResultType() {
361
+ return {};
362
+ }
319
363
  getSQL(formatted = false) {
320
364
  function processCondition(condition, formatted2) {
321
365
  return "(" + Object.keys(condition).map((field) => {
@@ -384,14 +428,20 @@ class _fRun {
384
428
  }
385
429
  const whereClause = this.values.where !== void 0 ? processCriteria(this.values.where, "AND", formatted) : void 0;
386
430
  const havingClause = this.values.having !== void 0 ? processCriteria(this.values.having, "AND", formatted) : void 0;
431
+ const [base, ...joins] = this.values.tables;
432
+ const baseTable = base.alias ? `${base.table} AS \`${base.alias}\`` : base.table;
387
433
  return [
388
434
  this.values.selects.length === 0 ? "" : "SELECT " + (this.values.selectDistinct === true ? "DISTINCT " : "") + this.values.selects.join(", "),
389
- `FROM ${this.values.database}`,
390
- this.values.tables?.map(({
435
+ `FROM ${baseTable}`,
436
+ joins.map(({
391
437
  table,
392
438
  local,
393
- remote
394
- }) => `JOIN ${table} ON ${local} = ${remote}`).join(formatted ? "\n" : " ") ?? "",
439
+ remote,
440
+ alias
441
+ }) => {
442
+ const tLocal = (alias || table) + "." + local;
443
+ return `JOIN ${!!alias ? table + " AS `" + alias + "`" : table} ON ${tLocal} = ${remote}`;
444
+ }).join(formatted ? "\n" : " ") ?? "",
395
445
  !whereClause ? "" : `WHERE ${whereClause}`,
396
446
  !this.values.groupBy?.length ? "" : `GROUP BY ${this.values.groupBy.join(", ")}`,
397
447
  !havingClause ? "" : `HAVING ${havingClause}`,
@@ -417,7 +467,58 @@ class _fOrderBy extends _fLimit {
417
467
  }
418
468
  }
419
469
  class _fSelect extends _fOrderBy {
420
- select(select) {
470
+ select(select, alias) {
471
+ const tableColMatch = select.match(/^(\w+)\.(.*?)$/);
472
+ if (tableColMatch) {
473
+ const [, tableName, colName] = tableColMatch;
474
+ const tableObject = this.values.tables.find((t) => (t.alias || t.table) === tableName);
475
+ if (!tableObject) throw new Error(`Table "${tableName}" not found in query`);
476
+ const tableFields = DB[tableObject.table];
477
+ if (!tableFields) {
478
+ throw new Error(`Table "${tableName}" not found in database schema`);
479
+ }
480
+ if (colName === "*") {
481
+ const hasMultipleTables = this.values.tables && this.values.tables.length > 1 || false;
482
+ const expandedSelects = Object.keys(tableFields.fields).map((field) => {
483
+ if (hasMultipleTables) {
484
+ return `${tableName}.${field} AS \`${tableName}.${field}\``;
485
+ }
486
+ return `${field}`;
487
+ });
488
+ return new _fSelect(this.db, {
489
+ ...this.values,
490
+ selects: [...this.values.selects, ...expandedSelects]
491
+ });
492
+ } else if (!alias && !!colName) {
493
+ const currentTablesWithFields = this.values.tables.reduce((acc, table) => {
494
+ const { table: real } = table;
495
+ for (const col in DB[real].fields) {
496
+ acc[col] = acc[col] ? acc[col] + 1 : 1;
497
+ }
498
+ return acc;
499
+ }, {});
500
+ if (!currentTablesWithFields[colName]) {
501
+ throw new Error(`Column "${colName}" not found in database schema`);
502
+ }
503
+ if (currentTablesWithFields[colName] > 1) {
504
+ return new _fSelect(this.db, {
505
+ ...this.values,
506
+ selects: [...this.values.selects, `${select} AS \`${select}\``]
507
+ });
508
+ } else {
509
+ return new _fSelect(this.db, {
510
+ ...this.values,
511
+ selects: [...this.values.selects, `${colName}`]
512
+ });
513
+ }
514
+ }
515
+ }
516
+ if (alias !== void 0) {
517
+ return new _fSelect(this.db, {
518
+ ...this.values,
519
+ selects: [...this.values.selects, `${select} AS \`${alias}\``]
520
+ });
521
+ }
421
522
  return new _fSelect(this.db, {
422
523
  ...this.values,
423
524
  selects: [...this.values.selects, select]
@@ -430,12 +531,15 @@ class _fSelectDistinct extends _fSelect {
430
531
  }
431
532
  selectAll() {
432
533
  const selects = function(values) {
433
- if (values.tables && values.tables.length > 0) {
434
- return [values.database, ...values.tables.map((t) => t.table)].reduce((acc, table) => {
534
+ if (values.tables && values.tables.length > 1) {
535
+ return [
536
+ /*values.baseTable,*/
537
+ ...values.tables.map((t) => t.table)
538
+ ].reduce((acc, table) => {
435
539
  return acc.concat(Object.keys(DB[table].fields).map((field) => `${table}.${field} AS \`${table}.${field}\``));
436
540
  }, []);
437
541
  }
438
- return Object.keys(DB[values.database].fields);
542
+ return Object.keys(DB[values.tables[0].table].fields);
439
543
  }(this.values);
440
544
  return new _fOrderBy(this.db, {
441
545
  ...this.values,
@@ -506,48 +610,58 @@ class _fWhere extends _fGroupBy {
506
610
  }
507
611
  }
508
612
  class _fJoin extends _fWhere {
509
- join(table, field, reference) {
510
- return new _fJoin(this.db, {
511
- ...this.values,
512
- tables: [...this.values.tables || [], { table, local: field, remote: reference }]
513
- });
514
- }
515
- joinUnsafeTypeEnforced(table, field, reference) {
613
+ // Implementation
614
+ join(tableOrOptions, field, reference) {
615
+ let table;
616
+ let local;
617
+ let remote;
618
+ let tableAlias;
619
+ if (typeof tableOrOptions === "object" && "table" in tableOrOptions) {
620
+ table = tableOrOptions.table.trim();
621
+ local = tableOrOptions.src;
622
+ remote = tableOrOptions.on;
623
+ tableAlias = tableOrOptions.alias?.trim();
624
+ } else {
625
+ const parts = tableOrOptions.split(" ");
626
+ table = parts[0];
627
+ tableAlias = parts[1]?.trim();
628
+ local = field;
629
+ remote = reference;
630
+ }
516
631
  return new _fJoin(this.db, {
517
632
  ...this.values,
518
633
  tables: [...this.values.tables || [], {
519
634
  table,
520
- local: `${String(table)}.${String(field)}`,
521
- remote: reference
635
+ local,
636
+ remote,
637
+ alias: tableAlias
522
638
  }]
523
639
  });
524
640
  }
525
- joinUnsafeIgnoreType(table, field, reference) {
526
- return new _fJoin(this.db, {
527
- ...this.values,
528
- tables: [...this.values.tables || [], {
529
- table,
530
- local: `${String(table)}.${String(field)}`,
531
- remote: reference
532
- }]
533
- });
641
+ // Implementation
642
+ joinUnsafeTypeEnforced(tableOrOptions, field, reference) {
643
+ return this.join(tableOrOptions, field, reference);
644
+ }
645
+ // Implementation
646
+ joinUnsafeIgnoreType(tableOrOptions, field, reference) {
647
+ return this.join(tableOrOptions, field, reference);
534
648
  }
535
- // innerJoin(table: TTables, col1:string, col2:string){
649
+ // innerJoin(table: TTableSources, col1:string, col2:string){
536
650
  // return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
537
651
  // }
538
- // leftJoin(table: TTables, col1:string, col2:string){
652
+ // leftJoin(table: TTableSources, col1:string, col2:string){
539
653
  // return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
540
654
  // }
541
- // rightJoin(table: TTables, col1:string, col2:string){
655
+ // rightJoin(table: TTableSources, col1:string, col2:string){
542
656
  // return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
543
657
  // }
544
- // fullJoin(table: TTables, col1:string, col2:string){
658
+ // fullJoin(table: TTableSources, col1:string, col2:string){
545
659
  // return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
546
660
  // }
547
- // crossJoin(table: TTables, col1:string, col2:string){
661
+ // crossJoin(table: TTableSources, col1:string, col2:string){
548
662
  // return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
549
663
  // }
550
- // outerJoin(table: TTables, col1:string, col2:string){
664
+ // outerJoin(table: TTableSources, col1:string, col2:string){
551
665
  // return new _fJoin<TDBBase>(this.db, {...this.values, tables: [...this.values.tables || [], table]});
552
666
  // }
553
667
  }
@@ -555,7 +669,8 @@ var extend_default = {
555
669
  client: {
556
670
  $from(table) {
557
671
  const client = Prisma.getExtensionContext(this);
558
- return new DbSelect(client).from(table);
672
+ const [base, ...aliases] = table.split(" ");
673
+ return new DbSelect(client).from(base.trim(), aliases.join().trim() || void 0);
559
674
  }
560
675
  }
561
676
  };
package/dist/bin.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- require('./chunk-G66FOFCO.cjs');
4
+ require('./chunk-TBO3MX7Q.cjs');
5
5
 
package/dist/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import './chunk-GBXPF5FT.js';
2
+ import './chunk-X3N5N5KQ.js';
@@ -22,7 +22,7 @@ function writeFileSafely(writeLocation, content) {
22
22
  });
23
23
  fs2__default.default.writeFileSync(writeLocation, content);
24
24
  }
25
- var require2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new URL('out.js', document.baseURI).href)));
25
+ var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new URL('out.js', document.baseURI).href)));
26
26
  var SupportedProviders = {
27
27
  sqlite: true,
28
28
  mysql: true,
@@ -102,7 +102,7 @@ generatorHelper.generatorHandler({
102
102
  }
103
103
  return acc;
104
104
  }, {});
105
- const pTSSelPath = path2__default.default.dirname(require2.resolve("prisma-ts-select"));
105
+ const pTSSelPath = path2__default.default.dirname(_require.resolve("@gcm/prisma-ts-select"));
106
106
  internals.logger.info("pTSSelPath", pTSSelPath);
107
107
  const srcDir = path2__default.default.join(pTSSelPath, "extend");
108
108
  const outDir = path2__default.default.join(pTSSelPath, "..", "built");
@@ -2,7 +2,7 @@ import { generatorHandler } from '@prisma/generator-helper';
2
2
  import { logger } from '@prisma/internals';
3
3
  import path2 from 'node:path';
4
4
  import fs2 from 'node:fs';
5
- import { createRequire } from 'module';
5
+ import { createRequire } from 'node:module';
6
6
 
7
7
  // src/generator.ts
8
8
 
@@ -14,7 +14,7 @@ function writeFileSafely(writeLocation, content) {
14
14
  });
15
15
  fs2.writeFileSync(writeLocation, content);
16
16
  }
17
- var require2 = createRequire(import.meta.url);
17
+ var _require = createRequire(import.meta.url);
18
18
  var SupportedProviders = {
19
19
  sqlite: true,
20
20
  mysql: true,
@@ -94,7 +94,7 @@ generatorHandler({
94
94
  }
95
95
  return acc;
96
96
  }, {});
97
- const pTSSelPath = path2.dirname(require2.resolve("prisma-ts-select"));
97
+ const pTSSelPath = path2.dirname(_require.resolve("@gcm/prisma-ts-select"));
98
98
  logger.info("pTSSelPath", pTSSelPath);
99
99
  const srcDir = path2.join(pTSSelPath, "extend");
100
100
  const outDir = path2.join(pTSSelPath, "..", "built");