vsrepo 1.3.2 → 1.3.3
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 +9 -0
- package/dist/DynamicRepository.d.ts +406 -0
- package/dist/DynamicRepository.js +54 -0
- package/dist/VSRepoError.d.ts +63 -54
- package/dist/VSRepository.d.ts +1079 -1056
- package/dist/VSRepository.js +29 -16
- package/dist/internal/constants/dinamic-methods-key.constant.js +4 -0
- package/dist/internal/decorators/dynamic-method.decorator.js +14 -0
- package/dist/internal/decorators/types/dynamic-method-config.type.js +2 -0
- package/dist/internal/entities/dynamic-method-metadata.entity.js +24 -0
- package/dist/internal/errors/vs-repo.error.js +5 -1
- package/dist/internal/resolvers/dbAndPrismaArgs.resolve.js +3 -0
- package/dist/internal/resolvers/dynamic-methods-metadata.resolve.js +15 -0
- package/dist/internal/utils/logger.util.js +1 -1
- package/dist/internal/utils/schemas.util.js +11 -1
- package/dist/internal/validation/constructor-config.validate.js +1 -10
- package/dist/internal/validation/dynamic-method-config.validate.js +19 -0
- package/dist/internal/validation/method-options.validate.js +1 -0
- package/package.json +78 -72
- package/scripts/configure-prisma-import.mjs +45 -0
package/dist/VSRepository.d.ts
CHANGED
|
@@ -1,1056 +1,1079 @@
|
|
|
1
|
-
import { Prisma, PrismaClient } from '../generated/prisma/client';
|
|
2
|
-
import { Decimal, JsonValue } from '@prisma/client/runtime/client';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Flattens a type intersection into a single object,
|
|
6
|
-
* avoiding the TypeScript "union type too complex to represent" error.
|
|
7
|
-
*/
|
|
8
|
-
type Simplify<T> = { [K in keyof T]: T[K] } & {};
|
|
9
|
-
|
|
10
|
-
type WidenField<T> =
|
|
11
|
-
T extends bigint ? bigint | number :
|
|
12
|
-
T extends Date ? Date | string :
|
|
13
|
-
T extends Decimal ? Decimal | string | number :
|
|
14
|
-
T extends readonly [infer U, infer V] ? [WidenField<U>, WidenField<V>] :
|
|
15
|
-
T extends Array<infer U> ? WidenField<U>[] :
|
|
16
|
-
T;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Full Prisma Client instance used to build repositories.
|
|
20
|
-
*/
|
|
21
|
-
export type DbClient = PrismaClient;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Prisma transactional client returned by `prisma.$transaction`.
|
|
25
|
-
*/
|
|
26
|
-
export type DbTransaction = Prisma.TransactionClient;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Accepts either the main Prisma client or a transaction client.
|
|
30
|
-
*/
|
|
31
|
-
export type ClientOrTransaction = DbClient | DbTransaction;
|
|
32
|
-
|
|
33
|
-
export * from './VSRepoError';
|
|
34
|
-
|
|
35
|
-
type OrderPattern = {
|
|
36
|
-
[key: string]: 'asc' | 'desc' | { _count: 'asc' | 'desc' } | OrderPattern;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Pagination options accepted by methods with the `Paginated` suffix.
|
|
41
|
-
*
|
|
42
|
-
* @template TCursor Type of the cursor used by the Prisma model.
|
|
43
|
-
*/
|
|
44
|
-
export type PaginationOptions<TCursor = unknown> = {
|
|
45
|
-
/** Number of records to skip. */
|
|
46
|
-
skip?: number;
|
|
47
|
-
/** Maximum number of records to return. */
|
|
48
|
-
take?: number;
|
|
49
|
-
/** Typed cursor for position-based pagination. */
|
|
50
|
-
cursor?: TCursor;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Ordering accepted by repository methods.
|
|
55
|
-
*
|
|
56
|
-
* Can be a single ordering or a list of chained orderings.
|
|
57
|
-
*/
|
|
58
|
-
export type OrderOptions = OrderPattern | OrderPattern[];
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Visibility mode for records with soft-delete.
|
|
62
|
-
*
|
|
63
|
-
* - `"active"` — returns only non-deleted records (default).
|
|
64
|
-
* - `"removed"` — returns only deleted records.
|
|
65
|
-
* - `"all"` — returns all records regardless of their status.
|
|
66
|
-
*/
|
|
67
|
-
export type SeeMode = 'active' | 'removed' | 'all';
|
|
68
|
-
|
|
69
|
-
type ValidMethodPatterns =
|
|
70
|
-
| `existsBy${string}` | `findBy${string}`
|
|
71
|
-
| `findUniqueBy${string}` | `findUniqueOrThrowBy${string}`
|
|
72
|
-
| `findFirstBy${string}` | `findFirst${string}`
|
|
73
|
-
| `findFirstOrThrowBy${string}` | `findFirstOrThrow${string}`
|
|
74
|
-
| `findManyBy${string}` | `findMany${string}`
|
|
75
|
-
| `createManyAndReturn${string}` | `createMany${string}`
|
|
76
|
-
| `create${string}` | `updateManyAndReturnBy${string}` | `updateManyBy${string}`
|
|
77
|
-
| `updateBy${string}` | `upsertBy${string}` | `deleteManyBy${string}`
|
|
78
|
-
| `deleteBy${string}` | `countBy${string}` | `count${string}` | `countWhere${string}`
|
|
79
|
-
| `findWhere${string}` | `findListWhere${string}`
|
|
80
|
-
| `existsWhere${string}` | `updateManyWhere${string}` | `deleteManyWhere${string}`
|
|
81
|
-
| `findOneWhere${string}` | `findOneBy${string}` | `updateManyAndReturnWhere${string}`
|
|
82
|
-
| 'aggregate' | 'groupBy';
|
|
83
|
-
|
|
84
|
-
type StripModifier<S extends string> =
|
|
85
|
-
S extends `${infer Base}NotStartsWithInsensitive` ? Base :
|
|
86
|
-
S extends `${infer Base}StartsWithInsensitive` ? Base :
|
|
87
|
-
S extends `${infer Base}NotEndsWithInsensitive` ? Base :
|
|
88
|
-
S extends `${infer Base}EndsWithInsensitive` ? Base :
|
|
89
|
-
S extends `${infer Base}NotContainsInsensitive` ? Base :
|
|
90
|
-
S extends `${infer Base}ContainsInsensitive` ? Base :
|
|
91
|
-
S extends `${infer Base}NotInInsensitive` ? Base :
|
|
92
|
-
S extends `${infer Base}InInsensitive` ? Base :
|
|
93
|
-
S extends `${infer Base}NotInsensitive` ? Base :
|
|
94
|
-
S extends `${infer Base}NotStartsWith` ? Base :
|
|
95
|
-
S extends `${infer Base}StartsWith` ? Base :
|
|
96
|
-
S extends `${infer Base}NotEndsWith` ? Base :
|
|
97
|
-
S extends `${infer Base}EndsWith` ? Base :
|
|
98
|
-
S extends `${infer Base}NotContains` ? Base :
|
|
99
|
-
S extends `${infer Base}Contains` ? Base :
|
|
100
|
-
S extends `${infer Base}NotIn` ? Base :
|
|
101
|
-
S extends `${infer Base}In` ? Base :
|
|
102
|
-
S extends `${infer Base}NotBetween` ? Base :
|
|
103
|
-
S extends `${infer Base}Between` ? Base :
|
|
104
|
-
S extends `${infer Base}Not` ? Base :
|
|
105
|
-
S extends `${infer Base}LessThanEqual` ? Base :
|
|
106
|
-
S extends `${infer Base}LessThan` ? Base :
|
|
107
|
-
S extends `${infer Base}GreaterThanEqual` ? Base :
|
|
108
|
-
S extends `${infer Base}GreaterThan` ? Base :
|
|
109
|
-
S extends `${infer Base}Insensitive` ? Base :
|
|
110
|
-
S;
|
|
111
|
-
|
|
112
|
-
type ExtractFieldName<S extends string> = Uncapitalize<StripModifier<S>>;
|
|
113
|
-
|
|
114
|
-
type IsArrayFilter<S extends string> = S extends `${string}${'NotIn' | 'In'}` ? true : false;
|
|
115
|
-
|
|
116
|
-
type IsBetweenFilter<S extends string> = S extends `${string}${'NotBetween' | 'Between'}` ? true : false;
|
|
117
|
-
|
|
118
|
-
type ParseRelation<S extends string> =
|
|
119
|
-
S extends `${infer Rel}Without${infer Rest}` ? [Uncapitalize<Rel>, 'isNot', Rest] :
|
|
120
|
-
S extends `${infer Rel}With${infer Rest}` ? [Uncapitalize<Rel>, 'is', Rest] :
|
|
121
|
-
S extends `${infer Rel}Some${infer Rest}` ? [Uncapitalize<Rel>, 'some', Rest] :
|
|
122
|
-
S extends `${infer Rel}Every${infer Rest}` ? [Uncapitalize<Rel>, 'every', Rest] :
|
|
123
|
-
S extends `${infer Rel}None${infer Rest}` ? [Uncapitalize<Rel>, 'none', Rest] : null;
|
|
124
|
-
|
|
125
|
-
type GetFieldType<T, S extends string, I> = WidenField<
|
|
126
|
-
ExtractFieldName<S> extends infer FieldName
|
|
127
|
-
? FieldName extends keyof T
|
|
128
|
-
? IsArrayFilter<S> extends true
|
|
129
|
-
? T[FieldName][]
|
|
130
|
-
: IsBetweenFilter<S> extends true
|
|
131
|
-
? [NonNullable<T[FieldName]>, NonNullable<T[FieldName]>]
|
|
132
|
-
: NonNullable<T[FieldName]> extends object | any[]
|
|
133
|
-
? I extends { whereInput: infer W }
|
|
134
|
-
? FieldName extends keyof NonNullable<W> ? Exclude<NonNullable<W>[FieldName], undefined> : T[FieldName]
|
|
135
|
-
: T[FieldName]
|
|
136
|
-
: T[FieldName]
|
|
137
|
-
: ParseRelation<S> extends [infer Rel extends keyof T, any, infer Rest extends string]
|
|
138
|
-
? GetFieldType<NonNullable<T[Rel]> extends any[] ? NonNullable<T[Rel]>[number] : NonNullable<T[Rel]>, Rest, unknown>
|
|
139
|
-
: unknown
|
|
140
|
-
: unknown
|
|
141
|
-
>;
|
|
142
|
-
|
|
143
|
-
type NoArgModifiers = 'IsNull' | 'IsNotNull' | 'IsTrue' | 'IsFalse' | 'None' | 'Some' | 'Every' | 'Without';
|
|
144
|
-
|
|
145
|
-
type IsNoArgModifier<S extends string> =
|
|
146
|
-
S extends `${string}${'StartsWith' | 'EndsWith'}` ? false :
|
|
147
|
-
S extends `${string}${NoArgModifiers | 'With'}` ? true :
|
|
148
|
-
false;
|
|
149
|
-
|
|
150
|
-
type IsOptional<S extends string> = S extends `${string}Optional` ? true : false;
|
|
151
|
-
type StripOptional<S extends string> = S extends `${infer Base}Optional` ? Base : S;
|
|
152
|
-
|
|
153
|
-
type MapToContractTypes<T, Arr extends string[], I> =
|
|
154
|
-
Arr extends [infer First extends string, ...infer Rest extends string[]]
|
|
155
|
-
? First extends ''
|
|
156
|
-
? MapToContractTypes<T, Rest, I>
|
|
157
|
-
: StripOptional<First> extends infer CleanFirst extends string
|
|
158
|
-
? IsNoArgModifier<CleanFirst> extends true
|
|
159
|
-
? MapToContractTypes<T, Rest, I>
|
|
160
|
-
: IsOptional<First> extends true
|
|
161
|
-
? [GetFieldType<T, CleanFirst, I> | undefined, ...MapToContractTypes<T, Rest, I>]
|
|
162
|
-
: [GetFieldType<T, CleanFirst, I>, ...MapToContractTypes<T, Rest, I>]
|
|
163
|
-
: never
|
|
164
|
-
: [];
|
|
165
|
-
|
|
166
|
-
type SplitAllTokens<S extends string> =
|
|
167
|
-
S extends `${infer L}AND${infer R}` ? [...SplitAllTokens<L>, ...SplitAllTokens<R>] :
|
|
168
|
-
S extends `${infer L}And${infer R}` ? [...SplitAllTokens<L>, ...SplitAllTokens<R>] :
|
|
169
|
-
S extends `${infer L}Or${infer R}` ? [...SplitAllTokens<L>, ...SplitAllTokens<R>] :
|
|
170
|
-
S extends '' ? [] :
|
|
171
|
-
[S];
|
|
172
|
-
|
|
173
|
-
type ExtractFields<T, R extends string, I> =
|
|
174
|
-
R extends '' ? []
|
|
175
|
-
: FilterNonEmpty<MapToContractTypes<T, SplitAllTokens<R>, I>>;
|
|
176
|
-
|
|
177
|
-
type FilterNonEmpty<T extends unknown[]> =
|
|
178
|
-
T extends [infer First, ...infer Rest]
|
|
179
|
-
? [First] extends ['']
|
|
180
|
-
? FilterNonEmpty<Rest>
|
|
181
|
-
: [First, ...FilterNonEmpty<Rest>]
|
|
182
|
-
: [];
|
|
183
|
-
|
|
184
|
-
type ResolveReturnType<M extends string, TSelected> =
|
|
185
|
-
M extends 'existsBy' | 'existsWhere' ? boolean :
|
|
186
|
-
M extends 'createMany' | 'updateManyBy' | 'deleteManyBy' | 'updateManyWhere' | 'deleteManyWhere' ? { count: number } :
|
|
187
|
-
M extends 'findMany' | 'createManyAndReturn' | 'updateManyAndReturnBy' | 'updateManyAndReturnWhere' | 'findListWhere' | 'findByList' ? TSelected[] :
|
|
188
|
-
M extends 'findUnique' | 'findFirst' | 'findWhere' | 'findByOne' | 'findOneBy' | 'findOneWhere' ? TSelected | null :
|
|
189
|
-
M extends 'findUniqueOrThrow' | 'findFirstOrThrow' | 'create' | 'updateBy' | 'upsertBy' | 'deleteBy' ? TSelected :
|
|
190
|
-
M extends 'count' | 'countWhere' ? number : never;
|
|
191
|
-
|
|
192
|
-
type GetUpdateInput<I> = I extends { updateInput: infer U } ? U : unknown;
|
|
193
|
-
type GetCreateInput<I> = I extends { createInput: infer C } ? C : unknown;
|
|
194
|
-
type GetCreateManyInput<I> = I extends { createManyInput: infer CM } ? CM : unknown;
|
|
195
|
-
type GetUpdateManyInput<I> = I extends { updateManyInput: infer UM } ? UM : unknown;
|
|
196
|
-
type GetWhereInput<I> = I extends { whereInput: infer W } ? NonNullable<W> : unknown;
|
|
197
|
-
type GetCursorInput<I> = I extends { cursorInput: infer C } ? C : unknown;
|
|
198
|
-
type GetOrderByInput<I> = I extends { orderByInput: infer OB } ? NonNullable<OB> : OrderOptions;
|
|
199
|
-
|
|
200
|
-
type ExtraArgs<M extends string, R extends string, I> = [
|
|
201
|
-
...(M extends 'upsertBy' ? [update: GetUpdateInput<I>, create: GetCreateInput<I>]
|
|
202
|
-
: M extends 'create' ? [data: GetCreateInput<I>]
|
|
203
|
-
: M extends 'updateBy' ? [data: GetUpdateInput<I>]
|
|
204
|
-
: M extends 'createMany' | 'createManyAndReturn' ? [data: GetCreateManyInput<I>]
|
|
205
|
-
: M extends 'updateManyBy' | 'updateManyAndReturnBy' ? [data: GetUpdateManyInput<I>]
|
|
206
|
-
: M extends 'findWhere' | 'findListWhere' | 'countWhere' | 'existsWhere' | 'deleteManyWhere' | 'findOneWhere' ? [where: GetWhereInput<I>]
|
|
207
|
-
: M extends 'updateManyWhere' | 'updateManyAndReturnWhere' ? [where: GetWhereInput<I>, data: GetUpdateManyInput<I>]
|
|
208
|
-
: []),
|
|
209
|
-
...(R extends `${string}PaginatedAndOrdered` ? [pagination: PaginationOptions<GetCursorInput<I>>, order: GetOrderByInput<I>]
|
|
210
|
-
: R extends `${string}OrderedAndPaginated` ? [order: GetOrderByInput<I>, pagination: PaginationOptions<GetCursorInput<I>>]
|
|
211
|
-
: R extends `${string}Paginated` ? [pagination: PaginationOptions<GetCursorInput<I>>]
|
|
212
|
-
: R extends `${string}Ordered` ? [order: GetOrderByInput<I>]
|
|
213
|
-
: [])
|
|
214
|
-
];
|
|
215
|
-
|
|
216
|
-
type
|
|
217
|
-
|
|
218
|
-
type
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
R extends `${infer F}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
R extends `${infer F}
|
|
256
|
-
StripDistinctFields<
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
K extends `
|
|
332
|
-
K extends `
|
|
333
|
-
K extends `
|
|
334
|
-
K extends `
|
|
335
|
-
K extends `
|
|
336
|
-
K extends `
|
|
337
|
-
K extends `
|
|
338
|
-
K extends `
|
|
339
|
-
K extends `
|
|
340
|
-
K extends `
|
|
341
|
-
K extends `
|
|
342
|
-
K extends `
|
|
343
|
-
K extends
|
|
344
|
-
K extends
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
K extends
|
|
349
|
-
K extends `
|
|
350
|
-
K extends `
|
|
351
|
-
K extends `
|
|
352
|
-
K extends `
|
|
353
|
-
K extends `
|
|
354
|
-
K extends `
|
|
355
|
-
K extends `
|
|
356
|
-
K extends `
|
|
357
|
-
K extends
|
|
358
|
-
K extends
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
K extends
|
|
363
|
-
K extends `
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
K extends `
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
type
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
type
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
/** Type of the
|
|
434
|
-
|
|
435
|
-
/** Type of the `
|
|
436
|
-
|
|
437
|
-
/** Type of the `
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
|
|
443
|
-
*/
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
/**
|
|
452
|
-
|
|
453
|
-
*/
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
*
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
type
|
|
509
|
-
/**
|
|
510
|
-
|
|
511
|
-
/**
|
|
512
|
-
|
|
513
|
-
/**
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
/**
|
|
518
|
-
|
|
519
|
-
*
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
/**
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
/**
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
type
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
: never
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
type
|
|
708
|
-
T,
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
/**
|
|
770
|
-
|
|
771
|
-
options?: MethodOptionsWithInclude<S, IM, TIncludes> & {
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
/**
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
/**
|
|
900
|
-
|
|
901
|
-
*/
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
/**
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
*
|
|
914
|
-
*/
|
|
915
|
-
export type
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
/**
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
/**
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
*
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
*
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
*
|
|
1038
|
-
*
|
|
1039
|
-
*/
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1
|
+
import { Prisma, PrismaClient } from '../generated/prisma/client';
|
|
2
|
+
import { Decimal, JsonValue } from '@prisma/client/runtime/client';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Flattens a type intersection into a single object,
|
|
6
|
+
* avoiding the TypeScript "union type too complex to represent" error.
|
|
7
|
+
*/
|
|
8
|
+
type Simplify<T> = { [K in keyof T]: T[K] } & {};
|
|
9
|
+
|
|
10
|
+
type WidenField<T> =
|
|
11
|
+
T extends bigint ? bigint | number :
|
|
12
|
+
T extends Date ? Date | string :
|
|
13
|
+
T extends Decimal ? Decimal | string | number :
|
|
14
|
+
T extends readonly [infer U, infer V] ? [WidenField<U>, WidenField<V>] :
|
|
15
|
+
T extends Array<infer U> ? WidenField<U>[] :
|
|
16
|
+
T;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Full Prisma Client instance used to build repositories.
|
|
20
|
+
*/
|
|
21
|
+
export type DbClient = PrismaClient;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Prisma transactional client returned by `prisma.$transaction`.
|
|
25
|
+
*/
|
|
26
|
+
export type DbTransaction = Prisma.TransactionClient;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Accepts either the main Prisma client or a transaction client.
|
|
30
|
+
*/
|
|
31
|
+
export type ClientOrTransaction = DbClient | DbTransaction;
|
|
32
|
+
|
|
33
|
+
export * from './VSRepoError';
|
|
34
|
+
|
|
35
|
+
type OrderPattern = {
|
|
36
|
+
[key: string]: 'asc' | 'desc' | { _count: 'asc' | 'desc' } | OrderPattern;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Pagination options accepted by methods with the `Paginated` suffix.
|
|
41
|
+
*
|
|
42
|
+
* @template TCursor Type of the cursor used by the Prisma model.
|
|
43
|
+
*/
|
|
44
|
+
export type PaginationOptions<TCursor = unknown> = {
|
|
45
|
+
/** Number of records to skip. */
|
|
46
|
+
skip?: number;
|
|
47
|
+
/** Maximum number of records to return. */
|
|
48
|
+
take?: number;
|
|
49
|
+
/** Typed cursor for position-based pagination. */
|
|
50
|
+
cursor?: TCursor;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Ordering accepted by repository methods.
|
|
55
|
+
*
|
|
56
|
+
* Can be a single ordering or a list of chained orderings.
|
|
57
|
+
*/
|
|
58
|
+
export type OrderOptions = OrderPattern | OrderPattern[];
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Visibility mode for records with soft-delete.
|
|
62
|
+
*
|
|
63
|
+
* - `"active"` — returns only non-deleted records (default).
|
|
64
|
+
* - `"removed"` — returns only deleted records.
|
|
65
|
+
* - `"all"` — returns all records regardless of their status.
|
|
66
|
+
*/
|
|
67
|
+
export type SeeMode = 'active' | 'removed' | 'all';
|
|
68
|
+
|
|
69
|
+
type ValidMethodPatterns =
|
|
70
|
+
| `existsBy${string}` | `findBy${string}`
|
|
71
|
+
| `findUniqueBy${string}` | `findUniqueOrThrowBy${string}`
|
|
72
|
+
| `findFirstBy${string}` | `findFirst${string}`
|
|
73
|
+
| `findFirstOrThrowBy${string}` | `findFirstOrThrow${string}`
|
|
74
|
+
| `findManyBy${string}` | `findMany${string}`
|
|
75
|
+
| `createManyAndReturn${string}` | `createMany${string}`
|
|
76
|
+
| `create${string}` | `updateManyAndReturnBy${string}` | `updateManyBy${string}`
|
|
77
|
+
| `updateBy${string}` | `upsertBy${string}` | `deleteManyBy${string}`
|
|
78
|
+
| `deleteBy${string}` | `countBy${string}` | `count${string}` | `countWhere${string}`
|
|
79
|
+
| `findWhere${string}` | `findListWhere${string}`
|
|
80
|
+
| `existsWhere${string}` | `updateManyWhere${string}` | `deleteManyWhere${string}`
|
|
81
|
+
| `findOneWhere${string}` | `findOneBy${string}` | `updateManyAndReturnWhere${string}`
|
|
82
|
+
| 'aggregate' | 'groupBy';
|
|
83
|
+
|
|
84
|
+
type StripModifier<S extends string> =
|
|
85
|
+
S extends `${infer Base}NotStartsWithInsensitive` ? Base :
|
|
86
|
+
S extends `${infer Base}StartsWithInsensitive` ? Base :
|
|
87
|
+
S extends `${infer Base}NotEndsWithInsensitive` ? Base :
|
|
88
|
+
S extends `${infer Base}EndsWithInsensitive` ? Base :
|
|
89
|
+
S extends `${infer Base}NotContainsInsensitive` ? Base :
|
|
90
|
+
S extends `${infer Base}ContainsInsensitive` ? Base :
|
|
91
|
+
S extends `${infer Base}NotInInsensitive` ? Base :
|
|
92
|
+
S extends `${infer Base}InInsensitive` ? Base :
|
|
93
|
+
S extends `${infer Base}NotInsensitive` ? Base :
|
|
94
|
+
S extends `${infer Base}NotStartsWith` ? Base :
|
|
95
|
+
S extends `${infer Base}StartsWith` ? Base :
|
|
96
|
+
S extends `${infer Base}NotEndsWith` ? Base :
|
|
97
|
+
S extends `${infer Base}EndsWith` ? Base :
|
|
98
|
+
S extends `${infer Base}NotContains` ? Base :
|
|
99
|
+
S extends `${infer Base}Contains` ? Base :
|
|
100
|
+
S extends `${infer Base}NotIn` ? Base :
|
|
101
|
+
S extends `${infer Base}In` ? Base :
|
|
102
|
+
S extends `${infer Base}NotBetween` ? Base :
|
|
103
|
+
S extends `${infer Base}Between` ? Base :
|
|
104
|
+
S extends `${infer Base}Not` ? Base :
|
|
105
|
+
S extends `${infer Base}LessThanEqual` ? Base :
|
|
106
|
+
S extends `${infer Base}LessThan` ? Base :
|
|
107
|
+
S extends `${infer Base}GreaterThanEqual` ? Base :
|
|
108
|
+
S extends `${infer Base}GreaterThan` ? Base :
|
|
109
|
+
S extends `${infer Base}Insensitive` ? Base :
|
|
110
|
+
S;
|
|
111
|
+
|
|
112
|
+
type ExtractFieldName<S extends string> = Uncapitalize<StripModifier<S>>;
|
|
113
|
+
|
|
114
|
+
type IsArrayFilter<S extends string> = S extends `${string}${'NotIn' | 'In'}` ? true : false;
|
|
115
|
+
|
|
116
|
+
type IsBetweenFilter<S extends string> = S extends `${string}${'NotBetween' | 'Between'}` ? true : false;
|
|
117
|
+
|
|
118
|
+
type ParseRelation<S extends string> =
|
|
119
|
+
S extends `${infer Rel}Without${infer Rest}` ? [Uncapitalize<Rel>, 'isNot', Rest] :
|
|
120
|
+
S extends `${infer Rel}With${infer Rest}` ? [Uncapitalize<Rel>, 'is', Rest] :
|
|
121
|
+
S extends `${infer Rel}Some${infer Rest}` ? [Uncapitalize<Rel>, 'some', Rest] :
|
|
122
|
+
S extends `${infer Rel}Every${infer Rest}` ? [Uncapitalize<Rel>, 'every', Rest] :
|
|
123
|
+
S extends `${infer Rel}None${infer Rest}` ? [Uncapitalize<Rel>, 'none', Rest] : null;
|
|
124
|
+
|
|
125
|
+
type GetFieldType<T, S extends string, I> = WidenField<
|
|
126
|
+
ExtractFieldName<S> extends infer FieldName
|
|
127
|
+
? FieldName extends keyof T
|
|
128
|
+
? IsArrayFilter<S> extends true
|
|
129
|
+
? T[FieldName][]
|
|
130
|
+
: IsBetweenFilter<S> extends true
|
|
131
|
+
? [NonNullable<T[FieldName]>, NonNullable<T[FieldName]>]
|
|
132
|
+
: NonNullable<T[FieldName]> extends object | any[]
|
|
133
|
+
? I extends { whereInput: infer W }
|
|
134
|
+
? FieldName extends keyof NonNullable<W> ? Exclude<NonNullable<W>[FieldName], undefined> : T[FieldName]
|
|
135
|
+
: T[FieldName]
|
|
136
|
+
: T[FieldName]
|
|
137
|
+
: ParseRelation<S> extends [infer Rel extends keyof T, any, infer Rest extends string]
|
|
138
|
+
? GetFieldType<NonNullable<T[Rel]> extends any[] ? NonNullable<T[Rel]>[number] : NonNullable<T[Rel]>, Rest, unknown>
|
|
139
|
+
: unknown
|
|
140
|
+
: unknown
|
|
141
|
+
>;
|
|
142
|
+
|
|
143
|
+
type NoArgModifiers = 'IsNull' | 'IsNotNull' | 'IsTrue' | 'IsFalse' | 'None' | 'Some' | 'Every' | 'Without';
|
|
144
|
+
|
|
145
|
+
type IsNoArgModifier<S extends string> =
|
|
146
|
+
S extends `${string}${'StartsWith' | 'EndsWith'}` ? false :
|
|
147
|
+
S extends `${string}${NoArgModifiers | 'With'}` ? true :
|
|
148
|
+
false;
|
|
149
|
+
|
|
150
|
+
type IsOptional<S extends string> = S extends `${string}Optional` ? true : false;
|
|
151
|
+
type StripOptional<S extends string> = S extends `${infer Base}Optional` ? Base : S;
|
|
152
|
+
|
|
153
|
+
type MapToContractTypes<T, Arr extends string[], I> =
|
|
154
|
+
Arr extends [infer First extends string, ...infer Rest extends string[]]
|
|
155
|
+
? First extends ''
|
|
156
|
+
? MapToContractTypes<T, Rest, I>
|
|
157
|
+
: StripOptional<First> extends infer CleanFirst extends string
|
|
158
|
+
? IsNoArgModifier<CleanFirst> extends true
|
|
159
|
+
? MapToContractTypes<T, Rest, I>
|
|
160
|
+
: IsOptional<First> extends true
|
|
161
|
+
? [GetFieldType<T, CleanFirst, I> | undefined, ...MapToContractTypes<T, Rest, I>]
|
|
162
|
+
: [GetFieldType<T, CleanFirst, I>, ...MapToContractTypes<T, Rest, I>]
|
|
163
|
+
: never
|
|
164
|
+
: [];
|
|
165
|
+
|
|
166
|
+
type SplitAllTokens<S extends string> =
|
|
167
|
+
S extends `${infer L}AND${infer R}` ? [...SplitAllTokens<L>, ...SplitAllTokens<R>] :
|
|
168
|
+
S extends `${infer L}And${infer R}` ? [...SplitAllTokens<L>, ...SplitAllTokens<R>] :
|
|
169
|
+
S extends `${infer L}Or${infer R}` ? [...SplitAllTokens<L>, ...SplitAllTokens<R>] :
|
|
170
|
+
S extends '' ? [] :
|
|
171
|
+
[S];
|
|
172
|
+
|
|
173
|
+
type ExtractFields<T, R extends string, I> =
|
|
174
|
+
R extends '' ? []
|
|
175
|
+
: FilterNonEmpty<MapToContractTypes<T, SplitAllTokens<R>, I>>;
|
|
176
|
+
|
|
177
|
+
type FilterNonEmpty<T extends unknown[]> =
|
|
178
|
+
T extends [infer First, ...infer Rest]
|
|
179
|
+
? [First] extends ['']
|
|
180
|
+
? FilterNonEmpty<Rest>
|
|
181
|
+
: [First, ...FilterNonEmpty<Rest>]
|
|
182
|
+
: [];
|
|
183
|
+
|
|
184
|
+
type ResolveReturnType<M extends string, TSelected> =
|
|
185
|
+
M extends 'existsBy' | 'existsWhere' ? boolean :
|
|
186
|
+
M extends 'createMany' | 'updateManyBy' | 'deleteManyBy' | 'updateManyWhere' | 'deleteManyWhere' ? { count: number } :
|
|
187
|
+
M extends 'findMany' | 'createManyAndReturn' | 'updateManyAndReturnBy' | 'updateManyAndReturnWhere' | 'findListWhere' | 'findByList' ? TSelected[] :
|
|
188
|
+
M extends 'findUnique' | 'findFirst' | 'findWhere' | 'findByOne' | 'findOneBy' | 'findOneWhere' ? TSelected | null :
|
|
189
|
+
M extends 'findUniqueOrThrow' | 'findFirstOrThrow' | 'create' | 'updateBy' | 'upsertBy' | 'deleteBy' ? TSelected :
|
|
190
|
+
M extends 'count' | 'countWhere' ? number : never;
|
|
191
|
+
|
|
192
|
+
type GetUpdateInput<I> = I extends { updateInput: infer U } ? U : unknown;
|
|
193
|
+
type GetCreateInput<I> = I extends { createInput: infer C } ? C : unknown;
|
|
194
|
+
type GetCreateManyInput<I> = I extends { createManyInput: infer CM } ? CM : unknown;
|
|
195
|
+
type GetUpdateManyInput<I> = I extends { updateManyInput: infer UM } ? UM : unknown;
|
|
196
|
+
type GetWhereInput<I> = I extends { whereInput: infer W } ? NonNullable<W> : unknown;
|
|
197
|
+
type GetCursorInput<I> = I extends { cursorInput: infer C } ? C : unknown;
|
|
198
|
+
type GetOrderByInput<I> = I extends { orderByInput: infer OB } ? NonNullable<OB> : OrderOptions;
|
|
199
|
+
|
|
200
|
+
type ExtraArgs<M extends string, R extends string, I> = [
|
|
201
|
+
...(M extends 'upsertBy' ? [update: GetUpdateInput<I>, create: GetCreateInput<I>]
|
|
202
|
+
: M extends 'create' ? [data: GetCreateInput<I>]
|
|
203
|
+
: M extends 'updateBy' ? [data: GetUpdateInput<I>]
|
|
204
|
+
: M extends 'createMany' | 'createManyAndReturn' ? [data: GetCreateManyInput<I>]
|
|
205
|
+
: M extends 'updateManyBy' | 'updateManyAndReturnBy' ? [data: GetUpdateManyInput<I>]
|
|
206
|
+
: M extends 'findWhere' | 'findListWhere' | 'countWhere' | 'existsWhere' | 'deleteManyWhere' | 'findOneWhere' ? [where: GetWhereInput<I>]
|
|
207
|
+
: M extends 'updateManyWhere' | 'updateManyAndReturnWhere' ? [where: GetWhereInput<I>, data: GetUpdateManyInput<I>]
|
|
208
|
+
: []),
|
|
209
|
+
...(R extends `${string}PaginatedAndOrdered` ? [pagination: PaginationOptions<GetCursorInput<I>>, order: GetOrderByInput<I>]
|
|
210
|
+
: R extends `${string}OrderedAndPaginated` ? [order: GetOrderByInput<I>, pagination: PaginationOptions<GetCursorInput<I>>]
|
|
211
|
+
: R extends `${string}Paginated` ? [pagination: PaginationOptions<GetCursorInput<I>>]
|
|
212
|
+
: R extends `${string}Ordered` ? [order: GetOrderByInput<I>]
|
|
213
|
+
: [])
|
|
214
|
+
];
|
|
215
|
+
|
|
216
|
+
export type PrismaModelName = Prisma.ModelName;
|
|
217
|
+
|
|
218
|
+
type PrismaDelegate<M extends PrismaModelName> = Uncapitalize<M> extends keyof DbClient ? DbClient[Uncapitalize<M>] : never;
|
|
219
|
+
|
|
220
|
+
type FullModelType<M extends PrismaModelName> =
|
|
221
|
+
Prisma.Result<PrismaDelegate<M>, {}, 'findMany'> extends Array<infer U> ? U : never;
|
|
222
|
+
|
|
223
|
+
type PrecomputedSelects<M extends PrismaModelName, SelectModels> = {
|
|
224
|
+
[S in keyof SelectModels]: Prisma.Result<PrismaDelegate<M>, { select: SelectModels[S] }, 'findMany'> extends Array<infer U> ? U : never
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
type PrecomputedIncludes<M extends PrismaModelName, IncludeModels> = {
|
|
228
|
+
[I in keyof IncludeModels]: Prisma.Result<PrismaDelegate<M>, { include: IncludeModels[I] }, 'findMany'> extends Array<infer U> ? U : never
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
type SelectedModel<M extends PrismaModelName, S, SelectModels, IM = never, IncludeModels = {}, RI = never> =
|
|
232
|
+
[RI] extends [never]
|
|
233
|
+
? [IM] extends [never]
|
|
234
|
+
? [S] extends [false]
|
|
235
|
+
? FullModelType<M>
|
|
236
|
+
: [S] extends [never]
|
|
237
|
+
? FullModelType<M>
|
|
238
|
+
: [S] extends [keyof SelectModels]
|
|
239
|
+
? PrecomputedSelects<M, SelectModels>[S]
|
|
240
|
+
: FullModelType<M>
|
|
241
|
+
: IM extends keyof IncludeModels
|
|
242
|
+
? PrecomputedIncludes<M, IncludeModels>[IM]
|
|
243
|
+
: FullModelType<M>
|
|
244
|
+
: Prisma.Result<PrismaDelegate<M>, { include: RI }, 'findMany'> extends Array<infer U> ? U : never;
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Strips the `Distinct{Fields}` suffix used by read methods (e.g. `findManyDistinctIdadeAndCargo`).
|
|
248
|
+
* The distinct fields are resolved from the method name at build time, so they never
|
|
249
|
+
* become part of the runtime `where` fields extracted by `ExtractFields`.
|
|
250
|
+
*/
|
|
251
|
+
type StripDistinctFields<R extends string> =
|
|
252
|
+
R extends `${infer F}Distinct${string}` ? F : R;
|
|
253
|
+
|
|
254
|
+
type CleanFields<R extends string> =
|
|
255
|
+
R extends `${infer F}PaginatedAndOrdered` ? StripDistinctFields<F> :
|
|
256
|
+
R extends `${infer F}OrderedAndPaginated` ? StripDistinctFields<F> :
|
|
257
|
+
R extends `${infer F}Paginated` ? StripDistinctFields<F> :
|
|
258
|
+
R extends `${infer F}Ordered` ? StripDistinctFields<F> :
|
|
259
|
+
R extends `${infer F}SkipDuplicates` ? StripDistinctFields<F> :
|
|
260
|
+
StripDistinctFields<R>;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Additional options accepted by repository methods.
|
|
264
|
+
*
|
|
265
|
+
* @template S Available keys in `selectModels`.
|
|
266
|
+
* @template IM Available keys in `includeModels`.
|
|
267
|
+
*/
|
|
268
|
+
export type MethodOptions<S, IM extends PropertyKey = never, M extends PrismaModelName = never, RI = never> = {
|
|
269
|
+
/** Prisma client or transaction to use for the operation. */
|
|
270
|
+
db?: ClientOrTransaction;
|
|
271
|
+
/**
|
|
272
|
+
* Visibility mode for records with soft-delete.
|
|
273
|
+
*
|
|
274
|
+
* Only takes effect if `softRemovekName` is configured on the repository.
|
|
275
|
+
*
|
|
276
|
+
* - `"active"` — returns only non-deleted records (default).
|
|
277
|
+
* - `"removed"` — returns only deleted records.
|
|
278
|
+
* - `"all"` — returns all records, ignoring deletion status.
|
|
279
|
+
*/
|
|
280
|
+
see?: SeeMode;
|
|
281
|
+
} & (
|
|
282
|
+
[IM] extends [never]
|
|
283
|
+
? | {
|
|
284
|
+
/** Select model to apply to the operation. Use `false` to return the full payload. */
|
|
285
|
+
selectModel?: S | false;
|
|
286
|
+
/** Include model to apply to the operation. Cannot be used together with `selectModel`. */
|
|
287
|
+
includeModel?: never;
|
|
288
|
+
/** Raw Prisma `include`. Cannot be used together with `selectModel` or `includeModel`. */
|
|
289
|
+
include?: never;
|
|
290
|
+
}
|
|
291
|
+
| {
|
|
292
|
+
selectModel?: never;
|
|
293
|
+
includeModel?: never;
|
|
294
|
+
include: RI;
|
|
295
|
+
}
|
|
296
|
+
: | { selectModel?: S | false; includeModel?: never; include?: never }
|
|
297
|
+
| { selectModel?: never; includeModel: IM; include?: never }
|
|
298
|
+
| { selectModel?: never; includeModel?: never; include: RI }
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Version of `MethodOptions` derived directly from a configured `VSRepository` instance.
|
|
303
|
+
*
|
|
304
|
+
* @template TRepo Configured `VSRepository` instance (use `typeof myVSRepo`).
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* const userVSRepo = setupVSRepo<User, "user">()(config);
|
|
308
|
+
* type Opts = MethodOptionsModel<typeof userVSRepo>;
|
|
309
|
+
*/
|
|
310
|
+
export type MethodOptionsModel<TRepo> =
|
|
311
|
+
TRepo extends VSRepository<any, infer M, infer Config>
|
|
312
|
+
? MethodOptions<keyof ExtractSelectModels<Config> | false, keyof ExtractIncludeModels<Config>, M>
|
|
313
|
+
: never;
|
|
314
|
+
|
|
315
|
+
type MethodOptionsWithInclude<
|
|
316
|
+
S,
|
|
317
|
+
IM extends PropertyKey,
|
|
318
|
+
TIncludes,
|
|
319
|
+
M extends PrismaModelName,
|
|
320
|
+
RI = never,
|
|
321
|
+
Excluded extends keyof MethodOptions<S, keyof TIncludes, M, RI> = never
|
|
322
|
+
> = DistributiveOmit<MethodOptions<S, keyof TIncludes, M, RI>, Excluded>
|
|
323
|
+
& ({ includeModel: IM } | { includeModel?: never });
|
|
324
|
+
|
|
325
|
+
type MethodFn<MethodName extends string, T, M extends PrismaModelName, R extends string, SelectModels, DefaultSelect extends keyof SelectModels | false, I, IncludeModels> =
|
|
326
|
+
<S extends keyof SelectModels | false = DefaultSelect, IM extends keyof IncludeModels = never, RI extends IncludeModel<M> = never>(
|
|
327
|
+
...args: [...ExtractFields<T, CleanFields<R>, I>, ...ExtraArgs<MethodName, R, I>, options?: MethodOptionsWithInclude<S, IM, IncludeModels, M, RI>]
|
|
328
|
+
) => Promise<ResolveReturnType<MethodName, SelectedModel<M, S, SelectModels, IM, IncludeModels, RI>>>;
|
|
329
|
+
|
|
330
|
+
type GetMappedMethod<K extends string, MethodConf> =
|
|
331
|
+
K extends `findBy${string}` ? (MethodConf extends { fbMode: 'one' } ? 'findByOne' : 'findByList') :
|
|
332
|
+
K extends `findOneBy${string}` ? 'findOneBy' :
|
|
333
|
+
K extends `existsBy${string}` ? 'existsBy' :
|
|
334
|
+
K extends `existsWhere${string}` ? 'existsWhere' :
|
|
335
|
+
K extends `findUniqueOrThrowBy${string}` ? 'findUniqueOrThrow' :
|
|
336
|
+
K extends `findUniqueBy${string}` ? 'findUnique' :
|
|
337
|
+
K extends `findFirstOrThrowBy${string}` | `findFirstOrThrow${string}` ? 'findFirstOrThrow' :
|
|
338
|
+
K extends `findFirstBy${string}` | `findFirst${string}` ? 'findFirst' :
|
|
339
|
+
K extends `findManyBy${string}` | `findMany${string}` ? 'findMany' :
|
|
340
|
+
K extends `createManyAndReturn${string}` ? 'createManyAndReturn' :
|
|
341
|
+
K extends `createMany${string}` ? 'createMany' :
|
|
342
|
+
K extends `create${string}` ? 'create' :
|
|
343
|
+
K extends `updateManyAndReturnBy${string}` ? 'updateManyAndReturnBy' :
|
|
344
|
+
K extends `updateManyAndReturnWhere${string}` ? 'updateManyAndReturnWhere' :
|
|
345
|
+
K extends `updateManyBy${string}` ? 'updateManyBy' :
|
|
346
|
+
K extends `updateManyWhere${string}` ? 'updateManyWhere' :
|
|
347
|
+
K extends `updateBy${string}` ? 'updateBy' :
|
|
348
|
+
K extends `upsertBy${string}` ? 'upsertBy' :
|
|
349
|
+
K extends `deleteManyBy${string}` ? 'deleteManyBy' :
|
|
350
|
+
K extends `deleteManyWhere${string}` ? 'deleteManyWhere' :
|
|
351
|
+
K extends `deleteBy${string}` ? 'deleteBy' :
|
|
352
|
+
K extends `countWhere${string}` ? 'countWhere' :
|
|
353
|
+
K extends `countBy${string}` | `count${string}` ? 'count' :
|
|
354
|
+
K extends `findListWhere${string}` ? 'findListWhere' :
|
|
355
|
+
K extends `findOneWhere${string}` ? 'findOneWhere' :
|
|
356
|
+
K extends `findWhere${string}` ? 'findWhere' :
|
|
357
|
+
K extends 'aggregate' ? 'aggregate' :
|
|
358
|
+
K extends 'groupBy' ? 'groupBy' :
|
|
359
|
+
never;
|
|
360
|
+
|
|
361
|
+
type ExtractPatternBase<K extends string> =
|
|
362
|
+
K extends `${string}By${infer R}` ? R :
|
|
363
|
+
K extends `findFirstOrThrow${infer R}` ? R :
|
|
364
|
+
K extends `findFirst${infer R}` ? R :
|
|
365
|
+
K extends `findMany${infer R}` ? R :
|
|
366
|
+
K extends `createManyAndReturn${infer R}` ? R :
|
|
367
|
+
K extends `createMany${infer R}` ? R :
|
|
368
|
+
K extends `create${infer R}` ? R :
|
|
369
|
+
K extends `countWhere${infer R}` ? R :
|
|
370
|
+
K extends `count${infer R}` ? R :
|
|
371
|
+
K extends `findListWhere${infer R}` ? R :
|
|
372
|
+
K extends `findOneWhere${infer R}` ? R :
|
|
373
|
+
K extends `findWhere${infer R}` ? R :
|
|
374
|
+
K extends `existsWhere${infer R}` ? R :
|
|
375
|
+
K extends `updateManyWhere${infer R}` ? R :
|
|
376
|
+
K extends `updateManyAndReturnWhere${infer R}` ? R :
|
|
377
|
+
K extends `deleteManyWhere${infer R}` ? R : '';
|
|
378
|
+
|
|
379
|
+
type MethodFactory<T, M extends PrismaModelName, K extends string, SelectModels, DefaultSelect extends keyof SelectModels | false, I, MethodConf, IncludeModels> =
|
|
380
|
+
K extends `findWhere${string}`
|
|
381
|
+
? {
|
|
382
|
+
/** @deprecated Use findOneWhere instead. */
|
|
383
|
+
<S extends keyof SelectModels | false = DefaultSelect, IM extends keyof IncludeModels = never, RI extends IncludeModel<M> = never>(
|
|
384
|
+
...args: [...ExtractFields<T, CleanFields<ExtractPatternBase<K>>, I>, ...ExtraArgs<GetMappedMethod<K, MethodConf>, ExtractPatternBase<K>, I>, options?: MethodOptionsWithInclude<S, IM, IncludeModels, M, RI>]
|
|
385
|
+
): Promise<ResolveReturnType<GetMappedMethod<K, MethodConf>, SelectedModel<M, S, SelectModels, IM, IncludeModels, RI>>>;
|
|
386
|
+
}
|
|
387
|
+
: MethodFn<GetMappedMethod<K, MethodConf>, T, M, ExtractPatternBase<K>, SelectModels, DefaultSelect, I, IncludeModels>;
|
|
388
|
+
|
|
389
|
+
type ResolveSelectModel<MethodConf, GlobalConf, SelectModels> =
|
|
390
|
+
MethodConf extends { selectModel: infer S } ? (S extends false ? false : S extends keyof SelectModels ? S : never) :
|
|
391
|
+
GlobalConf extends { defaultSelectModel: infer D } ? (D extends keyof SelectModels ? D : never) : never;
|
|
392
|
+
|
|
393
|
+
type ExtractPkName<T, Config> = Config extends { pkName: infer PK } ? (PK extends keyof T ? PK : never) : never;
|
|
394
|
+
type ExtractSelectModels<Config> = Config extends { selectModels: infer SM } ? SM : {};
|
|
395
|
+
type ExtractIncludeModels<Config> = Config extends { includeModels: infer IM } ? IM : {};
|
|
396
|
+
type ExtractDefaultSelect<Config> = Config extends { defaultSelectModel: infer D } ? D : never;
|
|
397
|
+
type ExtractRelations<Config> = Config extends { relations: infer R } ? (R extends object ? R : {}) : {};
|
|
398
|
+
type ExtractSoftRemovekName<Config> = Config extends { softRemovekName: infer S } ? S : never;
|
|
399
|
+
type ExtractDefaultOrdenation<Config> = Config extends { defaultOrdenation: infer O } ? O : never;
|
|
400
|
+
|
|
401
|
+
type AggregateMethod<M extends PrismaModelName> = <A extends Prisma.TypeMap['model'][M]['operations']['aggregate']['args']>(
|
|
402
|
+
prismaArgs: A,
|
|
403
|
+
options?: { db?: ClientOrTransaction }
|
|
404
|
+
) => Promise<Prisma.Result<PrismaDelegate<M>, A, 'aggregate'>>;
|
|
405
|
+
|
|
406
|
+
type GroupByMethod<M extends PrismaModelName> = <A extends Prisma.TypeMap['model'][M]['operations']['groupBy']['args']>(
|
|
407
|
+
prismaArgs: A,
|
|
408
|
+
options?: { db?: ClientOrTransaction }
|
|
409
|
+
) => Promise<Prisma.Result<PrismaDelegate<M>, A, 'groupBy'>>;
|
|
410
|
+
|
|
411
|
+
type DynamicMethods<T, M extends PrismaModelName, Config, I> = Config extends { methods: infer Methods }
|
|
412
|
+
? {
|
|
413
|
+
[K in keyof Methods as Methods[K] extends { map: true } ? K : never]: K extends string
|
|
414
|
+
? (Methods[K] extends { proxyTo: infer P extends string } ? P : K) extends infer ResolvedKey
|
|
415
|
+
? ResolvedKey extends 'aggregate'
|
|
416
|
+
? AggregateMethod<M>
|
|
417
|
+
: ResolvedKey extends 'groupBy'
|
|
418
|
+
? GroupByMethod<M>
|
|
419
|
+
: ResolvedKey extends string
|
|
420
|
+
? MethodFactory<T, M, ResolvedKey, ExtractSelectModels<Config>, ResolveSelectModel<Methods[K], Config, ExtractSelectModels<Config>>, I, Methods[K], ExtractIncludeModels<Config>>
|
|
421
|
+
: never
|
|
422
|
+
: never
|
|
423
|
+
: never;
|
|
424
|
+
}
|
|
425
|
+
: {};
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Groups the main Prisma input types derived from a model.
|
|
429
|
+
*
|
|
430
|
+
* @template M Prisma model name.
|
|
431
|
+
*/
|
|
432
|
+
export type PrismaModelInputs<M extends PrismaModelName> = {
|
|
433
|
+
/** Type of the `select` argument used in model queries. */
|
|
434
|
+
select: Prisma.TypeMap['model'][M]['operations']['findMany']['args']['select'];
|
|
435
|
+
/** Type of the `include` argument used in model queries. */
|
|
436
|
+
include: Prisma.TypeMap['model'][M]['operations']['findMany']['args']['include'];
|
|
437
|
+
/** Type of the `data` used in `create`. */
|
|
438
|
+
createInput: Prisma.TypeMap['model'][M]['operations']['create']['args']['data'];
|
|
439
|
+
/** Type of the `data` used in `createMany`. */
|
|
440
|
+
createManyInput: Prisma.TypeMap['model'][M]['operations']['createMany']['args']['data'];
|
|
441
|
+
/** Type of the `data` used in `update`. */
|
|
442
|
+
updateInput: Prisma.TypeMap['model'][M]['operations']['update']['args']['data'];
|
|
443
|
+
/** Type of the `data` used in `updateMany`. */
|
|
444
|
+
updateManyInput: Prisma.TypeMap['model'][M]['operations']['updateMany']['args']['data'];
|
|
445
|
+
/** Type of the `where` used in model queries. */
|
|
446
|
+
whereInput: Prisma.TypeMap['model'][M]['operations']['findMany']['args']['where'];
|
|
447
|
+
/** Type of the `orderBy` used in model queries. */
|
|
448
|
+
orderByInput: Prisma.TypeMap['model'][M]['operations']['findMany']['args']['orderBy'];
|
|
449
|
+
/** Type of the cursor used in model queries. */
|
|
450
|
+
cursorInput: Prisma.TypeMap['model'][M]['operations']['findMany']['args']['cursor'];
|
|
451
|
+
/** Type of the `create` payload used in `upsert`. */
|
|
452
|
+
upsertCreateInput: Prisma.TypeMap['model'][M]['operations']['upsert']['args']['create'];
|
|
453
|
+
/** Type of the `update` payload used in `upsert`. */
|
|
454
|
+
upsertUpdateInput: Prisma.TypeMap['model'][M]['operations']['upsert']['args']['update'];
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Type of the `select` object of a Prisma model.
|
|
459
|
+
*/
|
|
460
|
+
export type SelectModel<M extends PrismaModelName> = PrismaModelInputs<M>['select'];
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Map of named, reusable selects for a Prisma model.
|
|
464
|
+
*/
|
|
465
|
+
export type SelectModels<M extends PrismaModelName> = Record<string, SelectModel<M>>;
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Type of the `include` object of a Prisma model.
|
|
469
|
+
*/
|
|
470
|
+
export type IncludeModel<M extends PrismaModelName> = PrismaModelInputs<M>['include'];
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Map of named, reusable includes for a Prisma model.
|
|
474
|
+
*/
|
|
475
|
+
export type IncludeModels<M extends PrismaModelName> = Record<string, IncludeModel<M>>;
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Type of the `where` object of a Prisma model.
|
|
479
|
+
*/
|
|
480
|
+
export type WhereModel<M extends PrismaModelName> = PrismaModelInputs<M>['whereInput'];
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Type of the `cursor` object of a Prisma model.
|
|
484
|
+
*/
|
|
485
|
+
export type CursorModel<M extends PrismaModelName> = PrismaModelInputs<M>['cursorInput'];
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Type of the `orderBy` object of a Prisma model.
|
|
489
|
+
*/
|
|
490
|
+
export type OrdenationModel<M extends PrismaModelName> = PrismaModelInputs<M>['orderByInput'];
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Pagination options with typed cursor for a Prisma model.
|
|
494
|
+
*/
|
|
495
|
+
export type PaginationModel<M extends PrismaModelName> = PaginationOptions<PrismaModelInputs<M>['cursorInput']>;
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Base payload used to create a record in the model's `save`/`upsert`.
|
|
499
|
+
*/
|
|
500
|
+
export type ModelUpsertInput<M extends PrismaModelName> = PrismaModelInputs<M>['upsertCreateInput'];
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Configuration for a dynamic method defined in `methods`.
|
|
504
|
+
*
|
|
505
|
+
* @template M Prisma model name.
|
|
506
|
+
* @template SelectModels Map of select models available in the repository.
|
|
507
|
+
*/
|
|
508
|
+
export type MethodConfig<M extends PrismaModelName, SelectModels = any> = {
|
|
509
|
+
/** Defines whether the method will be exposed on the repository. */
|
|
510
|
+
readonly map: boolean;
|
|
511
|
+
/** Overrides `defaultSelectModel` for this method only. */
|
|
512
|
+
readonly selectModel?: string | false;
|
|
513
|
+
/** Controls whether the method combines (`extending`) or overwrites (`overwrite`) the `requiredWhere`. */
|
|
514
|
+
readonly whereType?: 'overwrite' | 'extending';
|
|
515
|
+
/** Redirects the logic to another valid method pattern. */
|
|
516
|
+
readonly proxyTo?: ValidMethodPatterns;
|
|
517
|
+
/** Adds an extra `where` on top of `requiredWhere`. */
|
|
518
|
+
readonly pushWhere?: WhereModel<M>;
|
|
519
|
+
/** * Defines whether `findBy` returns a single item (`one`) or a list (`list`).
|
|
520
|
+
* @deprecated Use `findOneBy` if you want to return a single result.
|
|
521
|
+
*/
|
|
522
|
+
readonly fbMode?: 'one' | 'list';
|
|
523
|
+
/** Injects a fixed ordering automatically into the query. */
|
|
524
|
+
readonly injectOrdenation?: OrdenationModel<M>;
|
|
525
|
+
/** Injects a fixed pagination automatically into the query. */
|
|
526
|
+
readonly injectPagination?: PaginationModel<M>;
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
type BaseMethodConfig<TSelectKeys extends PropertyKey = string> = {
|
|
530
|
+
/** Enables or disables the base method in the `build`. */
|
|
531
|
+
active?: boolean;
|
|
532
|
+
/** Default select model used by the base method. */
|
|
533
|
+
defaultSelect?: TSelectKeys;
|
|
534
|
+
/** Ignores the `requiredWhere`. */
|
|
535
|
+
ignoreRequiredWhere?: boolean;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Configuration applied during `.build(prisma, config?)`.
|
|
540
|
+
*
|
|
541
|
+
* @template TSelectKeys Valid keys of `selectModels`.
|
|
542
|
+
*/
|
|
543
|
+
export type BuildConfig<TSelectKeys extends PropertyKey = string> = {
|
|
544
|
+
/**
|
|
545
|
+
* Freezes the final repository object with `Object.freeze`.
|
|
546
|
+
* @deprecated No longer has any practical effect in the next version — freeze will be always applied.
|
|
547
|
+
*/
|
|
548
|
+
freeze?: boolean;
|
|
549
|
+
/** Prints internal working logs to the console. */
|
|
550
|
+
showWorking?: boolean;
|
|
551
|
+
/** Customizes the behavior of the automatic base methods. */
|
|
552
|
+
baseMethods?: {
|
|
553
|
+
/** Configuration for the `get` method. */
|
|
554
|
+
get?: BaseMethodConfig<TSelectKeys>;
|
|
555
|
+
/** Configuration for the `getOrThrow` method. */
|
|
556
|
+
getOrThrow?: BaseMethodConfig<TSelectKeys>;
|
|
557
|
+
/** Configuration for the `getList` method (fetch by list of PKs). */
|
|
558
|
+
getList?: BaseMethodConfig<TSelectKeys>;
|
|
559
|
+
/** Configuration for the `remove` method. */
|
|
560
|
+
remove?: BaseMethodConfig<TSelectKeys>;
|
|
561
|
+
/** Configuration for the `save` method. */
|
|
562
|
+
save?: BaseMethodConfig<TSelectKeys>;
|
|
563
|
+
/** Configuration for the `saveList` method (batch save via transaction). */
|
|
564
|
+
saveList?: BaseMethodConfig<TSelectKeys>;
|
|
565
|
+
/** Configuration for the `patch` method. */
|
|
566
|
+
patch?: BaseMethodConfig<TSelectKeys>;
|
|
567
|
+
/** Configuration for the `patchList` method (batch update via transaction). */
|
|
568
|
+
patchList?: BaseMethodConfig<TSelectKeys>;
|
|
569
|
+
/** Configuration for the `merge` method. */
|
|
570
|
+
merge?: BaseMethodConfig<TSelectKeys>;
|
|
571
|
+
/** Configuration for the `removeList` method (batch deletion). Does not accept select. */
|
|
572
|
+
removeList?: Omit<BaseMethodConfig<TSelectKeys>, 'defaultSelect'>;
|
|
573
|
+
/** Configuration for the `getAll` method (full listing). */
|
|
574
|
+
getAll?: BaseMethodConfig<TSelectKeys>;
|
|
575
|
+
/** Configuration for the `total` method (count). Does not accept select. */
|
|
576
|
+
total?: Omit<BaseMethodConfig<TSelectKeys>, 'defaultSelect'>;
|
|
577
|
+
/** Configuration for the `has` method (existence check). Does not accept select. */
|
|
578
|
+
has?: Omit<BaseMethodConfig<TSelectKeys>, 'defaultSelect'>;
|
|
579
|
+
/** Configuration for the `softRemove` method. Only available if `softRemovekName` is configured. */
|
|
580
|
+
softRemove?: BaseMethodConfig<TSelectKeys>;
|
|
581
|
+
/** Configuration for the `softRemoveList` method. Does not accept select. Only available if `softRemovekName` is configured. */
|
|
582
|
+
softRemoveList?: Omit<BaseMethodConfig<TSelectKeys>, 'defaultSelect'>;
|
|
583
|
+
/** Configuration for the `restore` method. Only available if `softRemovekName` is configured. */
|
|
584
|
+
restore?: BaseMethodConfig<TSelectKeys>;
|
|
585
|
+
/** Configuration for the `restoreList` method. Does not accept select. Only available if `softRemovekName` is configured. */
|
|
586
|
+
restoreList?: Omit<BaseMethodConfig<TSelectKeys>, 'defaultSelect'>;
|
|
587
|
+
};
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
type ResolveMethodDefaultSelect<Config, C, Method extends keyof NonNullable<BuildConfig['baseMethods']>, TSelects = ExtractSelectModels<Config>> =
|
|
591
|
+
C extends { baseMethods?: { [_ in Method]?: { defaultSelect?: infer D } } }
|
|
592
|
+
? D extends keyof TSelects
|
|
593
|
+
? D
|
|
594
|
+
: ExtractDefaultSelect<Config> extends keyof TSelects
|
|
595
|
+
? ExtractDefaultSelect<Config>
|
|
596
|
+
: false
|
|
597
|
+
: ExtractDefaultSelect<Config> extends keyof TSelects
|
|
598
|
+
? ExtractDefaultSelect<Config>
|
|
599
|
+
: false;
|
|
600
|
+
|
|
601
|
+
type ResolveCurrentReturn<M extends PrismaModelName, Models, S, D, IM = never, Includes = {}, RI = never> =
|
|
602
|
+
[RI] extends [never]
|
|
603
|
+
? [IM] extends [never]
|
|
604
|
+
? [S] extends [false]
|
|
605
|
+
? FullModelType<M>
|
|
606
|
+
: [S] extends [never]
|
|
607
|
+
? ([D] extends [never] ? FullModelType<M> : SelectedModel<M, D, Models>)
|
|
608
|
+
: SelectedModel<M, S, Models>
|
|
609
|
+
: IM extends keyof Includes
|
|
610
|
+
? PrecomputedIncludes<M, Includes>[IM]
|
|
611
|
+
: FullModelType<M>
|
|
612
|
+
: Prisma.Result<PrismaDelegate<M>, { include: RI }, 'findMany'> extends Array<infer U> ? U : never;
|
|
613
|
+
|
|
614
|
+
// ─── helpers reused within the mapped type ───────────────────────────────────
|
|
615
|
+
// ─── relation payload types ──────────────────────────────────────────────────
|
|
616
|
+
|
|
617
|
+
/**
|
|
618
|
+
* Distributive version of `Omit`, preserving unions when removing properties.
|
|
619
|
+
*/
|
|
620
|
+
export type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : never;
|
|
621
|
+
type ExtractUnionProp<T, K extends PropertyKey> = T extends any ? (K extends keyof T ? T[K] : never) : never;
|
|
622
|
+
|
|
623
|
+
export type ExtractNestedCreateInput<M extends PrismaModelName, K extends PropertyKey> =
|
|
624
|
+
NonNullable<ExtractUnionProp<PrismaModelInputs<M>['createInput'], K>> extends { create?: infer C }
|
|
625
|
+
? Exclude<C, any[]>
|
|
626
|
+
: never;
|
|
627
|
+
|
|
628
|
+
export type RelationPayload<TField, TRelationConfig, M extends PrismaModelName, K extends PropertyKey> = NonNullable<TField> extends any[]
|
|
629
|
+
? ExtractNestedCreateInput<M, K>[]
|
|
630
|
+
: NonNullable<TField> extends object
|
|
631
|
+
? ExtractNestedCreateInput<M, K> | (TRelationConfig extends { mode: 'oto'; restriction: 'set' } | { mode: 'mto'; nullable: true } | { mode: 'mto'; nullAble: true } ? null : never)
|
|
632
|
+
: never;
|
|
633
|
+
|
|
634
|
+
export type TransformCreatePayload<U, T, M extends PrismaModelName, TRelations> =
|
|
635
|
+
Omit<U, keyof TRelations> &
|
|
636
|
+
{
|
|
637
|
+
// Fields that are REQUIRED in this specific branch of the Prisma union
|
|
638
|
+
[K in Extract<keyof TRelations, keyof U> as {} extends Pick<U, K> ? never : K]:
|
|
639
|
+
K extends keyof T ? RelationPayload<T[K], TRelations[K], M, K> : never;
|
|
640
|
+
} &
|
|
641
|
+
{
|
|
642
|
+
// Fields that are OPTIONAL in this branch or do not originally belong to it
|
|
643
|
+
[K in keyof TRelations as K extends keyof U ? ({} extends Pick<U, K> ? K : never) : K]?:
|
|
644
|
+
K extends keyof T ? RelationPayload<T[K], TRelations[K], M, K> : never;
|
|
645
|
+
};
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Payload accepted by `save` when the repository has configured relations.
|
|
649
|
+
*/
|
|
650
|
+
export type UpsertWithRelations<T, M extends PrismaModelName, TRelations> =
|
|
651
|
+
ModelUpsertInput<M> extends infer U
|
|
652
|
+
? U extends any
|
|
653
|
+
? Simplify<TransformCreatePayload<U, T, M, TRelations>>
|
|
654
|
+
: never
|
|
655
|
+
: never;
|
|
656
|
+
|
|
657
|
+
export type CleanNestedInput<T> = T extends any
|
|
658
|
+
? T extends { data: infer D }
|
|
659
|
+
? CleanNestedInput<Exclude<D, any[]>>
|
|
660
|
+
: Omit<T, 'where' | 'data'>
|
|
661
|
+
: never;
|
|
662
|
+
|
|
663
|
+
export type ExtractNestedUpdateInput<M extends PrismaModelName, K extends PropertyKey> =
|
|
664
|
+
NonNullable<ExtractUnionProp<PrismaModelInputs<M>['updateInput'], K>> extends { update?: infer U }
|
|
665
|
+
? CleanNestedInput<Exclude<U, any[]>>
|
|
666
|
+
: never;
|
|
667
|
+
|
|
668
|
+
export type RelationUpdatePayload<TField, TRelationConfig, M extends PrismaModelName, K extends PropertyKey> = NonNullable<TField> extends any[]
|
|
669
|
+
? ExtractNestedUpdateInput<M, K>[]
|
|
670
|
+
: NonNullable<TField> extends object
|
|
671
|
+
? ExtractNestedUpdateInput<M, K> | (TRelationConfig extends { mode: 'oto'; restriction: 'set' } | { mode: 'mto'; nullable: true } | { mode: 'mto'; nullAble: true } ? null : never)
|
|
672
|
+
: never;
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Payload accepted by `merge` when the repository has configured relations (uses update input).
|
|
676
|
+
*/
|
|
677
|
+
export type UpdateWithRelations<T, M extends PrismaModelName, TRelations> =
|
|
678
|
+
DistributiveOmit<PrismaModelInputs<M>['updateInput'], keyof TRelations> & {
|
|
679
|
+
[K in Extract<keyof TRelations, keyof T>]?: RelationUpdatePayload<T[K], TRelations[K], M, K>;
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* Payload accepted by `patch` and `patchList` when the repository has configured relations (uses create input).
|
|
684
|
+
*/
|
|
685
|
+
export type PatchWithRelations<T, M extends PrismaModelName, TRelations> =
|
|
686
|
+
DistributiveOmit<PrismaModelInputs<M>['updateInput'], keyof TRelations> & {
|
|
687
|
+
[K in Extract<keyof TRelations, keyof T>]?: RelationPayload<T[K], TRelations[K], M, K>;
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
/**
|
|
691
|
+
* Extracts the payload type of the `save` method from a configured VSRepository instance.
|
|
692
|
+
*/
|
|
693
|
+
export type SaveObject<TInput, TRepo> =
|
|
694
|
+
TRepo extends VSRepository<infer T, infer M, infer Config>
|
|
695
|
+
? (Config extends { relations: infer R } ? (R extends object ? R : {}) : {}) extends infer TRelations
|
|
696
|
+
? TInput extends infer U
|
|
697
|
+
? U extends any
|
|
698
|
+
? Simplify<TransformCreatePayload<U, T, M, TRelations>>
|
|
699
|
+
: never
|
|
700
|
+
: never
|
|
701
|
+
: never
|
|
702
|
+
: never;
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* Extracts the payload type of the `patch` method from a configured VSRepository instance.
|
|
706
|
+
*/
|
|
707
|
+
export type PatchObject<TInput, TRepo> =
|
|
708
|
+
TRepo extends VSRepository<infer T, infer M, infer Config>
|
|
709
|
+
? (Config extends { relations: infer R } ? (R extends object ? R : {}) : {}) extends infer TRelations
|
|
710
|
+
? DistributiveOmit<TInput, keyof TRelations> & {
|
|
711
|
+
[K in Extract<keyof TRelations, keyof T>]?: RelationPayload<T[K], TRelations[K], M, K>;
|
|
712
|
+
}
|
|
713
|
+
: never
|
|
714
|
+
: never;
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
type _Pk<T, Config> = WidenField<T[ExtractPkName<T, Config> extends keyof T ? ExtractPkName<T, Config> : never]>;
|
|
718
|
+
type _Ret<M extends PrismaModelName, TSelects, S, TDefault, IM = never, TIncludes = {}, RI = never> = ResolveCurrentReturn<M, TSelects, S, TDefault, IM, TIncludes, RI>;
|
|
719
|
+
type _DS<Config, C, Method extends keyof NonNullable<BuildConfig['baseMethods']>, TSelects = ExtractSelectModels<Config>> =
|
|
720
|
+
ResolveMethodDefaultSelect<Config, C, Method, TSelects>;
|
|
721
|
+
type _Sel<Config> = ExtractSelectModels<Config>;
|
|
722
|
+
type _Inc<Config> = ExtractIncludeModels<Config>;
|
|
723
|
+
type _Def<Config> = ExtractDefaultSelect<Config>;
|
|
724
|
+
type _Rel<Config> = ExtractRelations<Config>;
|
|
725
|
+
type _Soft<Config> = ExtractSoftRemovekName<Config>;
|
|
726
|
+
type _DOrd<Config> = ExtractDefaultOrdenation<Config>;
|
|
727
|
+
|
|
728
|
+
// ─── refactored mapped type — optimized for the TS compiler ──────────────────
|
|
729
|
+
|
|
730
|
+
type AllBaseMethods<
|
|
731
|
+
T,
|
|
732
|
+
M extends PrismaModelName,
|
|
733
|
+
Config,
|
|
734
|
+
C extends BuildConfig<any> | undefined,
|
|
735
|
+
TSelects = _Sel<Config>,
|
|
736
|
+
TDefault = _Def<Config>,
|
|
737
|
+
TPk = ExtractPkName<T, Config>,
|
|
738
|
+
TRelations = _Rel<Config>,
|
|
739
|
+
TSoftKey = _Soft<Config>,
|
|
740
|
+
I = PrismaModelInputs<M>,
|
|
741
|
+
TDefaultOrdenation = _DOrd<Config>,
|
|
742
|
+
TIncludes = _Inc<Config>
|
|
743
|
+
> = {
|
|
744
|
+
/** Fetches a record by its primary key (PK). */
|
|
745
|
+
get: <S extends keyof TSelects | false = _DS<Config, C, 'get', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
746
|
+
pk: _Pk<T, Config>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
747
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI> | null>;
|
|
748
|
+
|
|
749
|
+
/** Fetches a record by PK and throws `VSRepoRuntimeError` if not found. */
|
|
750
|
+
getOrThrow: <S extends keyof TSelects | false = _DS<Config, C, 'getOrThrow', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
751
|
+
pk: _Pk<T, Config>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
752
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>>;
|
|
753
|
+
|
|
754
|
+
/** Fetches multiple records by a list of primary keys (PKs). */
|
|
755
|
+
getList: <S extends keyof TSelects | false = _DS<Config, C, 'getList', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
756
|
+
pks: _Pk<T, Config>[], options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
757
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>[]>;
|
|
758
|
+
|
|
759
|
+
/** Deletes a record identified by its primary key (PK). */
|
|
760
|
+
remove: <S extends keyof TSelects | false = _DS<Config, C, 'remove', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
761
|
+
pk: _Pk<T, Config>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
762
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>>;
|
|
763
|
+
|
|
764
|
+
/** Inserts or updates (upsert) a record. */
|
|
765
|
+
save: <S extends keyof TSelects | false = _DS<Config, C, 'save', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
766
|
+
obj: UpsertWithRelations<T, M, TRelations>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
767
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>>;
|
|
768
|
+
|
|
769
|
+
/** Saves an array of objects in a single automatic transaction. */
|
|
770
|
+
saveList: <S extends keyof TSelects | false = _DS<Config, C, 'saveList', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
771
|
+
objs: UpsertWithRelations<T, M, TRelations>[], options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI, 'db'> & { db?: DbTransaction }
|
|
772
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>[]>;
|
|
773
|
+
|
|
774
|
+
/** Partially updates (patch) an existing record by its primary key (PK). */
|
|
775
|
+
patch: <S extends keyof TSelects | false = _DS<Config, C, 'patch', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
776
|
+
pk: _Pk<T, Config>, obj: PatchWithRelations<T, M, TRelations>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
777
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>>;
|
|
778
|
+
|
|
779
|
+
/** Partially updates multiple records via `[pk, obj]` tuples in an automatic transaction. */
|
|
780
|
+
patchList: <S extends keyof TSelects | false = _DS<Config, C, 'patchList', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
781
|
+
tuples: [pk: _Pk<T, Config>, obj: PatchWithRelations<T, M, TRelations>][], options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI, 'db'> & { db?: DbTransaction }
|
|
782
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>[]>;
|
|
783
|
+
|
|
784
|
+
/** Fetches a record by PK and deep-merges it with the provided object **in memory**. */
|
|
785
|
+
merge: <S extends keyof TSelects | false = _DS<Config, C, 'merge', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
786
|
+
pk: _Pk<T, Config>, obj: UpdateWithRelations<T, M, TRelations>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI>
|
|
787
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI> | null>;
|
|
788
|
+
|
|
789
|
+
/** Deletes multiple records by their primary keys. */
|
|
790
|
+
removeList: (pks: _Pk<T, Config>[], options?: { db?: ClientOrTransaction }) => Promise<{ count: number }>;
|
|
791
|
+
|
|
792
|
+
/** Fetches all records (respects `requiredWhere` when set). */
|
|
793
|
+
getAll: <S extends keyof TSelects | false = _DS<Config, C, 'getAll', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
794
|
+
options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI> & {
|
|
795
|
+
pagination?: PaginationOptions<I extends { cursorInput: infer Curs } ? Curs : unknown>;
|
|
796
|
+
/**
|
|
797
|
+
* Ordering to apply to the query.
|
|
798
|
+
* When omitted and `defaultOrdenation` is configured on the repository,
|
|
799
|
+
* the default ordering is applied automatically.
|
|
800
|
+
*/
|
|
801
|
+
order?: I extends { orderByInput: infer OB } ? OB : OrderOptions;
|
|
802
|
+
}
|
|
803
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>[]>;
|
|
804
|
+
|
|
805
|
+
/** Returns the total number of records. */
|
|
806
|
+
total: (options?: { db?: ClientOrTransaction; see?: SeeMode }) => Promise<number>;
|
|
807
|
+
|
|
808
|
+
/** Checks whether a record exists by its primary key (PK). */
|
|
809
|
+
has: (pk: _Pk<T, Config>, options?: { db?: ClientOrTransaction; see?: SeeMode }) => Promise<boolean>;
|
|
810
|
+
|
|
811
|
+
/** Marks a record as deleted (soft-delete). */
|
|
812
|
+
softRemove: <S extends keyof TSelects | false = _DS<Config, C, 'softRemove', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
813
|
+
pk: _Pk<T, Config>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI, 'see'>
|
|
814
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>>;
|
|
815
|
+
|
|
816
|
+
/** Marks multiple records as deleted (soft-delete) in batch. */
|
|
817
|
+
softRemoveList: (pks: _Pk<T, Config>[], options?: { db?: ClientOrTransaction }) => Promise<{ count: number }>;
|
|
818
|
+
|
|
819
|
+
/** Restores a record previously marked as deleted (soft-delete). */
|
|
820
|
+
restore: <S extends keyof TSelects | false = _DS<Config, C, 'restore', TSelects>, IM extends keyof TIncludes = never, RI extends IncludeModel<M> = never>(
|
|
821
|
+
pk: _Pk<T, Config>, options?: MethodOptionsWithInclude<S, IM, TIncludes, M, RI, 'see'>
|
|
822
|
+
) => Promise<_Ret<M, TSelects, S, TDefault, IM, TIncludes, RI>>;
|
|
823
|
+
|
|
824
|
+
/** Restores multiple records previously marked as deleted (soft-delete) in batch. */
|
|
825
|
+
restoreList: (pks: _Pk<T, Config>[], options?: { db?: ClientOrTransaction }) => Promise<{ count: number }>;
|
|
826
|
+
};
|
|
827
|
+
|
|
828
|
+
type InjectedBaseMethods<
|
|
829
|
+
T,
|
|
830
|
+
M extends PrismaModelName,
|
|
831
|
+
Config,
|
|
832
|
+
C extends BuildConfig<any> | undefined,
|
|
833
|
+
TSelects = _Sel<Config>,
|
|
834
|
+
TDefault = _Def<Config>,
|
|
835
|
+
TPk = ExtractPkName<T, Config>,
|
|
836
|
+
TRelations = _Rel<Config>,
|
|
837
|
+
TSoftKey = _Soft<Config>,
|
|
838
|
+
I = PrismaModelInputs<M>,
|
|
839
|
+
TDefaultOrdenation = _DOrd<Config>,
|
|
840
|
+
TIncludes = _Inc<Config>
|
|
841
|
+
> = Pick<
|
|
842
|
+
AllBaseMethods<T, M, Config, C, TSelects, TDefault, TPk, TRelations, TSoftKey, I, TDefaultOrdenation, TIncludes>,
|
|
843
|
+
| (C extends { baseMethods: { get: { active: false } } } ? never : 'get')
|
|
844
|
+
| (C extends { baseMethods: { getOrThrow: { active: false } } } ? never : 'getOrThrow')
|
|
845
|
+
| (C extends { baseMethods: { getList: { active: false } } } ? never : 'getList')
|
|
846
|
+
| (C extends { baseMethods: { remove: { active: false } } } ? never : 'remove')
|
|
847
|
+
| (C extends { baseMethods: { save: { active: false } } } ? never : 'save')
|
|
848
|
+
| (C extends { baseMethods: { saveList: { active: false } } } ? never : 'saveList')
|
|
849
|
+
| (C extends { baseMethods: { patch: { active: false } } } ? never : 'patch')
|
|
850
|
+
| (C extends { baseMethods: { patchList: { active: false } } } ? never : 'patchList')
|
|
851
|
+
| (C extends { baseMethods: { merge: { active: false } } } ? never : 'merge')
|
|
852
|
+
| (C extends { baseMethods: { removeList: { active: false } } } ? never : 'removeList')
|
|
853
|
+
| (C extends { baseMethods: { getAll: { active: false } } } ? never : 'getAll')
|
|
854
|
+
| (C extends { baseMethods: { total: { active: false } } } ? never : 'total')
|
|
855
|
+
| (C extends { baseMethods: { has: { active: false } } } ? never : 'has')
|
|
856
|
+
| ([TSoftKey] extends [never] ? never : C extends { baseMethods: { softRemove: { active: false } } } ? never : 'softRemove')
|
|
857
|
+
| ([TSoftKey] extends [never] ? never : C extends { baseMethods: { softRemoveList: { active: false } } } ? never : 'softRemoveList')
|
|
858
|
+
| ([TSoftKey] extends [never] ? never : C extends { baseMethods: { restore: { active: false } } } ? never : 'restore')
|
|
859
|
+
| ([TSoftKey] extends [never] ? never : C extends { baseMethods: { restoreList: { active: false } } } ? never : 'restoreList')
|
|
860
|
+
>;
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
/**
|
|
864
|
+
* Relation configuration for One-to-Many or Many-to-Many.
|
|
865
|
+
*
|
|
866
|
+
* @template TItem Type of the related entity.
|
|
867
|
+
*/
|
|
868
|
+
export type ManyRelationConfig<TItem> = {
|
|
869
|
+
/** Primary key of the related entity. */
|
|
870
|
+
pk: keyof TItem;
|
|
871
|
+
/** Relation type: `otm` (One-to-Many) or `mtm` (Many-to-Many). */
|
|
872
|
+
mode: 'otm' | 'mtm';
|
|
873
|
+
/** Mutation behavior: `set` (replaces all) or `add` (appends to existing). */
|
|
874
|
+
restriction: 'set' | 'add';
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* One-to-One relation configuration.
|
|
879
|
+
*
|
|
880
|
+
* @template TItem Type of the related entity.
|
|
881
|
+
*/
|
|
882
|
+
export type OneToOneRelationConfig<TItem> = {
|
|
883
|
+
/** Primary key of the related entity. */
|
|
884
|
+
pk: keyof TItem;
|
|
885
|
+
/** Relation type: `oto` (One-to-One). */
|
|
886
|
+
mode: 'oto';
|
|
887
|
+
/** Allowed mutation behavior for saving. */
|
|
888
|
+
restriction: 'set' | 'add';
|
|
889
|
+
};
|
|
890
|
+
|
|
891
|
+
/**
|
|
892
|
+
* Many-to-One relation configuration.
|
|
893
|
+
*
|
|
894
|
+
* @template TItem Type of the related entity.
|
|
895
|
+
*/
|
|
896
|
+
export type ManyToOneRelationConfig<TItem> = {
|
|
897
|
+
/** Primary key of the related entity. */
|
|
898
|
+
pk: keyof TItem;
|
|
899
|
+
/** Relation type: `mto` (Many-to-One). */
|
|
900
|
+
mode: 'mto';
|
|
901
|
+
/** Allowed mutation behavior for saving. */
|
|
902
|
+
restriction: 'set' | 'add';
|
|
903
|
+
/**
|
|
904
|
+
* Enables the ability to unlink the relation, setting the foreign key to null.
|
|
905
|
+
* @deprecated Use `nullable` (lowercase) instead of `nullAble`.
|
|
906
|
+
*/
|
|
907
|
+
nullAble?: boolean;
|
|
908
|
+
/** Enables the ability to unlink the relation, setting the foreign key to null. */
|
|
909
|
+
nullable?: boolean;
|
|
910
|
+
};
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* Automatically infers the possible relation configuration from a field.
|
|
914
|
+
*/
|
|
915
|
+
export type ExtractRelationConfig<TField> = NonNullable<TField> extends infer NonNull
|
|
916
|
+
? NonNull extends Date | Buffer | Uint8Array | Decimal | JsonValue ? never
|
|
917
|
+
: NonNull extends any[] ? (NonNull[number] extends object ? ManyRelationConfig<NonNull[number]> : never)
|
|
918
|
+
: NonNull extends object ? (OneToOneRelationConfig<NonNull> | ManyToOneRelationConfig<NonNull>)
|
|
919
|
+
: never
|
|
920
|
+
: never;
|
|
921
|
+
|
|
922
|
+
/**
|
|
923
|
+
* Map of configurable relations for an entity type.
|
|
924
|
+
*/
|
|
925
|
+
export type RepositoryRelations<T> = {
|
|
926
|
+
[K in keyof T as ExtractRelationConfig<T[K]> extends never ? never : K]?: ExtractRelationConfig<T[K]>;
|
|
927
|
+
};
|
|
928
|
+
|
|
929
|
+
type AnySelect<M extends PrismaModelName> = Prisma.TypeMap['model'][M]['operations']['findMany']['args']['select'];
|
|
930
|
+
|
|
931
|
+
/**
|
|
932
|
+
* Main configuration used in `setupVSRepo<T, M>()(config)`.
|
|
933
|
+
*
|
|
934
|
+
* @template T Type of the entity managed by the repository.
|
|
935
|
+
* @template M Prisma model name.
|
|
936
|
+
* @template SM Map of named select models.
|
|
937
|
+
*/
|
|
938
|
+
export type RepoConfig<T, M extends PrismaModelName, SM extends Record<string, AnySelect<M>> = Record<string, AnySelect<M>>> = {
|
|
939
|
+
tableName: Uncapitalize<M>;
|
|
940
|
+
pkName: keyof T;
|
|
941
|
+
softRemovekName?: keyof T & string;
|
|
942
|
+
selectModels?: SM;
|
|
943
|
+
defaultSelectModel?: Extract<keyof SM, string>;
|
|
944
|
+
includeModels?: IncludeModels<M>;
|
|
945
|
+
requiredWhere?: WhereModel<M>;
|
|
946
|
+
defaultOrdenation?: OrdenationModel<M>;
|
|
947
|
+
relations?: RepositoryRelations<T>;
|
|
948
|
+
methods?: Record<string, MethodConfig<M, SM>>;
|
|
949
|
+
};
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* Final type returned by `.build(prisma)`.
|
|
953
|
+
*
|
|
954
|
+
* Combines dynamic methods, base methods, and custom extensions.
|
|
955
|
+
*/
|
|
956
|
+
type BuiltRepository<T extends object, M extends PrismaModelName, Config extends RepoConfig<T, M, any>, C extends BuildConfig<any> | undefined> = {
|
|
957
|
+
/**
|
|
958
|
+
* Extends the repository with custom methods without losing type inference.
|
|
959
|
+
*/
|
|
960
|
+
extend<E>(extensionFunc: (repo: BuiltRepository<T, M, Config, C>) => E): BuiltRepository<T, M, Config, C> & E;
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* The Prisma Client instance passed to `build`.
|
|
964
|
+
*/
|
|
965
|
+
readonly prisma: DbClient;
|
|
966
|
+
} & DynamicMethods<T, M, Config, PrismaModelInputs<M>> & InjectedBaseMethods<T, M, Config, C>;
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Typed repository factory based on the Prisma model configuration.
|
|
970
|
+
*/
|
|
971
|
+
export declare class VSRepository<T extends object, M extends PrismaModelName, const Config extends RepoConfig<T, M, any> = RepoConfig<T, M, any>> {
|
|
972
|
+
/** Original configuration provided to `setupVSRepo`. */
|
|
973
|
+
readonly config: Config;
|
|
974
|
+
/**
|
|
975
|
+
* Creates a configurable instance of `VSRepository`.
|
|
976
|
+
*/
|
|
977
|
+
constructor(config: Config);
|
|
978
|
+
/**
|
|
979
|
+
* Builds the final repository with base and dynamic methods.
|
|
980
|
+
*/
|
|
981
|
+
build<C extends BuildConfig<keyof ExtractSelectModels<Config>>>(prisma: DbClient, config?: C): BuiltRepository<T, M, Config, C>;
|
|
982
|
+
vsrepocache: never;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
/**
|
|
986
|
+
* Infers the type of an already-configured repository from a `VSRepository` instance.
|
|
987
|
+
*
|
|
988
|
+
* Also allows manually providing the `BuildConfig` and extensions type.
|
|
989
|
+
*/
|
|
990
|
+
export type RepositoryOf<TRepo, C extends BuildConfig<any> | undefined = undefined, E = unknown> =
|
|
991
|
+
TRepo extends VSRepository<infer T, infer M, infer Config>
|
|
992
|
+
? Simplify<BuiltRepository<T, M, Config, C> & E>
|
|
993
|
+
: never;
|
|
994
|
+
|
|
995
|
+
/**
|
|
996
|
+
* Utility type used to validate a repository configuration at compile time.
|
|
997
|
+
*/
|
|
998
|
+
export type ValidateRepoConfig<T extends object, M extends PrismaModelName, Config> = {
|
|
999
|
+
/**
|
|
1000
|
+
* Name of the table mapped by Prisma (usually uncapitalized).
|
|
1001
|
+
*/
|
|
1002
|
+
tableName: Uncapitalize<M>;
|
|
1003
|
+
|
|
1004
|
+
/**
|
|
1005
|
+
* Name of the field that represents the entity's primary key (Primary Key).
|
|
1006
|
+
*/
|
|
1007
|
+
pkName: keyof T;
|
|
1008
|
+
|
|
1009
|
+
/**
|
|
1010
|
+
* Name of the `DateTime` field used for soft-delete.
|
|
1011
|
+
*
|
|
1012
|
+
* When configured, enables the `softRemove`, `softRemoveList`, `restore`, and `restoreList` methods.
|
|
1013
|
+
* The field **must** be of type `DateTime` in the Prisma schema — VSRepository validates this during `build`.
|
|
1014
|
+
*/
|
|
1015
|
+
softRemovekName?: keyof T & string;
|
|
1016
|
+
|
|
1017
|
+
/**
|
|
1018
|
+
* Defines named and reusable data projections (selects).
|
|
1019
|
+
* Allows creating different views of the same entity (e.g., `public`, `minimal`, `internal`).
|
|
1020
|
+
*/
|
|
1021
|
+
selectModels?: SelectModels<M>;
|
|
1022
|
+
|
|
1023
|
+
/**
|
|
1024
|
+
* Defines which select (a key from `selectModels`) will be used automatically
|
|
1025
|
+
* when none is specified in the method call.
|
|
1026
|
+
* It is highly recommended to define it whenever `selectModels` are used.
|
|
1027
|
+
*/
|
|
1028
|
+
defaultSelectModel?: string;
|
|
1029
|
+
|
|
1030
|
+
/**
|
|
1031
|
+
* Defines named and reusable include projections.
|
|
1032
|
+
* Similar to selectModels, but resolves Prisma `include` clauses.
|
|
1033
|
+
*/
|
|
1034
|
+
includeModels?: IncludeModels<M>;
|
|
1035
|
+
|
|
1036
|
+
/**
|
|
1037
|
+
* Defines global filters that will be automatically applied to all repository queries.
|
|
1038
|
+
* Useful for tenant isolation (multi-tenancy) or base restrictions (e.g., `isActive: true`).
|
|
1039
|
+
*/
|
|
1040
|
+
requiredWhere?: WhereModel<M>;
|
|
1041
|
+
|
|
1042
|
+
/**
|
|
1043
|
+
* Default ordering automatically injected into all queries that accept `orderBy`,
|
|
1044
|
+
* unless the method already has `injectOrdenation` configured or uses the `Ordered` suffix.
|
|
1045
|
+
*
|
|
1046
|
+
* Useful for ensuring a consistent sort order across the repository without repeating
|
|
1047
|
+
* the `order` argument on every call.
|
|
1048
|
+
*/
|
|
1049
|
+
defaultOrdenation?: OrdenationModel<M>;
|
|
1050
|
+
|
|
1051
|
+
/**
|
|
1052
|
+
* Configures automatic relation management.
|
|
1053
|
+
* When configured, allows the `save`, `saveList`, `patch`, and `patchList` methods
|
|
1054
|
+
* to automatically handle linking, creation, or cascading deletion of related records.
|
|
1055
|
+
*/
|
|
1056
|
+
relations?: RepositoryRelations<T>;
|
|
1057
|
+
|
|
1058
|
+
/**
|
|
1059
|
+
* Definition of dynamic repository methods.
|
|
1060
|
+
* Behaviors and return types are automatically inferred from the method's name
|
|
1061
|
+
* (e.g., `findOneByEmail`, `findManyPaginated`) or proxied via the `proxyTo` property.
|
|
1062
|
+
*/
|
|
1063
|
+
methods?: {
|
|
1064
|
+
[K in keyof (Config extends { methods: infer Meth } ? Meth : {})]: K extends string
|
|
1065
|
+
? MethodConfig<M, Config extends { selectModels: infer SM } ? SM : any> & (K extends ValidMethodPatterns ? {} : { proxyTo: ValidMethodPatterns })
|
|
1066
|
+
: never;
|
|
1067
|
+
};
|
|
1068
|
+
};
|
|
1069
|
+
|
|
1070
|
+
/**
|
|
1071
|
+
* Function to initialize and configure the `repository`.
|
|
1072
|
+
* The configuration passed here is what will be read when `.build()` is called.
|
|
1073
|
+
*/
|
|
1074
|
+
export declare function setupVSRepo<T extends object, M extends PrismaModelName>(): <
|
|
1075
|
+
const SM extends Record<string, SelectModel<M>>,
|
|
1076
|
+
const Config extends RepoConfig<T, M, SM>
|
|
1077
|
+
>(
|
|
1078
|
+
config: Config & ValidateRepoConfig<T, M, Config>
|
|
1079
|
+
) => VSRepository<T, M, Config>;
|