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.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
|
|
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 };
|
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(
|
|
298
|
-
return new _fJoin(this.db, {
|
|
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 ${
|
|
390
|
-
|
|
435
|
+
`FROM ${baseTable}`,
|
|
436
|
+
joins.map(({
|
|
391
437
|
table,
|
|
392
438
|
local,
|
|
393
|
-
remote
|
|
394
|
-
|
|
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 >
|
|
434
|
-
return [
|
|
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.
|
|
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
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
|
521
|
-
remote
|
|
635
|
+
local,
|
|
636
|
+
remote,
|
|
637
|
+
alias: tableAlias
|
|
522
638
|
}]
|
|
523
639
|
});
|
|
524
640
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
package/dist/bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import './chunk-
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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");
|