@opensaas/stack-cli 0.3.0 → 0.4.0

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.
Files changed (43) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +141 -0
  3. package/dist/commands/generate.d.ts.map +1 -1
  4. package/dist/commands/generate.js +4 -13
  5. package/dist/commands/generate.js.map +1 -1
  6. package/dist/generator/context.d.ts.map +1 -1
  7. package/dist/generator/context.js +20 -5
  8. package/dist/generator/context.js.map +1 -1
  9. package/dist/generator/index.d.ts +1 -1
  10. package/dist/generator/index.d.ts.map +1 -1
  11. package/dist/generator/index.js +1 -1
  12. package/dist/generator/index.js.map +1 -1
  13. package/dist/generator/lists.d.ts.map +1 -1
  14. package/dist/generator/lists.js +33 -1
  15. package/dist/generator/lists.js.map +1 -1
  16. package/dist/generator/prisma-extensions.d.ts +11 -0
  17. package/dist/generator/prisma-extensions.d.ts.map +1 -0
  18. package/dist/generator/prisma-extensions.js +134 -0
  19. package/dist/generator/prisma-extensions.js.map +1 -0
  20. package/dist/generator/prisma.d.ts.map +1 -1
  21. package/dist/generator/prisma.js +4 -0
  22. package/dist/generator/prisma.js.map +1 -1
  23. package/dist/generator/types.d.ts.map +1 -1
  24. package/dist/generator/types.js +151 -17
  25. package/dist/generator/types.js.map +1 -1
  26. package/package.json +9 -9
  27. package/src/commands/__snapshots__/generate.test.ts.snap +92 -21
  28. package/src/commands/generate.ts +8 -19
  29. package/src/generator/__snapshots__/context.test.ts.snap +60 -15
  30. package/src/generator/__snapshots__/types.test.ts.snap +689 -95
  31. package/src/generator/context.test.ts +3 -1
  32. package/src/generator/context.ts +20 -5
  33. package/src/generator/index.ts +1 -1
  34. package/src/generator/lists.ts +39 -1
  35. package/src/generator/prisma-extensions.ts +159 -0
  36. package/src/generator/prisma.ts +5 -0
  37. package/src/generator/types.ts +204 -17
  38. package/tsconfig.tsbuildinfo +1 -1
  39. package/dist/generator/type-patcher.d.ts +0 -13
  40. package/dist/generator/type-patcher.d.ts.map +0 -1
  41. package/dist/generator/type-patcher.js +0 -68
  42. package/dist/generator/type-patcher.js.map +0 -1
  43. package/src/generator/type-patcher.ts +0 -93
@@ -6,16 +6,34 @@ exports[`Types Generator > generateTypes > should generate Context type with all
6
6
  * DO NOT EDIT - This file is automatically generated
7
7
  */
8
8
 
9
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
9
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
10
10
  import type { PrismaClient, Prisma } from './prisma-client/client'
11
11
  import type { PluginServices } from './plugin-types'
12
12
 
13
- export type User = {
13
+ /**
14
+ * Virtual fields for User - computed fields not in database
15
+ * These are added to query results via resolveOutput hooks
16
+ */
17
+ export type UserVirtualFields = {
18
+ // No virtual fields defined
19
+ }
20
+
21
+ /**
22
+ * Transformed fields for User - fields with resultExtension transformations
23
+ * These override Prisma's base types with transformed types via result extensions
24
+ */
25
+ export type UserTransformedFields = {
26
+ // No transformed fields defined
27
+ }
28
+
29
+ export type UserOutput = {
14
30
  id: string
15
31
  name: string | null
16
32
  createdAt: Date
17
33
  updatedAt: Date
18
- }
34
+ } & UserVirtualFields
35
+
36
+ export type User = UserOutput
19
37
 
20
38
  export type UserCreateInput = {
21
39
  name?: string
@@ -73,15 +91,43 @@ export type UserHooks = {
73
91
  }) => Promise<void>
74
92
  }
75
93
 
76
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
77
- db: AccessControlledDB<PrismaClient>
94
+ /**
95
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
96
+ * Types change based on select/include - relationships only present when explicitly included
97
+ * Virtual fields and transformed fields are added to the base model type
98
+ */
99
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
100
+ 'user'
101
+ > & {
102
+ user: {
103
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
104
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
105
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
106
+ findMany: <T extends Prisma.UserFindManyArgs>(
107
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
108
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
109
+ create: <T extends Prisma.UserCreateArgs>(
110
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
111
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
112
+ update: <T extends Prisma.UserUpdateArgs>(
113
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
114
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
115
+ delete: <T extends Prisma.UserDeleteArgs>(
116
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
117
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
118
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
124
+ * Extends AccessContext and overrides db property to include virtual fields in output types
125
+ */
126
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
127
+ db: CustomDB
78
128
  session: TSession
79
- prisma: PrismaClient
80
- storage: StorageUtils
81
- plugins: PluginServices
82
129
  serverAction: (props: ServerActionProps) => Promise<unknown>
83
130
  sudo: () => Context<TSession>
84
- _isSudo: boolean
85
131
  }"
86
132
  `;
87
133
 
@@ -91,17 +137,35 @@ exports[`Types Generator > generateTypes > should generate CreateInput type 1`]
91
137
  * DO NOT EDIT - This file is automatically generated
92
138
  */
93
139
 
94
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
140
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
95
141
  import type { PrismaClient, Prisma } from './prisma-client/client'
96
142
  import type { PluginServices } from './plugin-types'
97
143
 
98
- export type Post = {
144
+ /**
145
+ * Virtual fields for Post - computed fields not in database
146
+ * These are added to query results via resolveOutput hooks
147
+ */
148
+ export type PostVirtualFields = {
149
+ // No virtual fields defined
150
+ }
151
+
152
+ /**
153
+ * Transformed fields for Post - fields with resultExtension transformations
154
+ * These override Prisma's base types with transformed types via result extensions
155
+ */
156
+ export type PostTransformedFields = {
157
+ // No transformed fields defined
158
+ }
159
+
160
+ export type PostOutput = {
99
161
  id: string
100
162
  title: string
101
163
  content: string | null
102
164
  createdAt: Date
103
165
  updatedAt: Date
104
- }
166
+ } & PostVirtualFields
167
+
168
+ export type Post = PostOutput
105
169
 
106
170
  export type PostCreateInput = {
107
171
  title: string
@@ -162,15 +226,43 @@ export type PostHooks = {
162
226
  }) => Promise<void>
163
227
  }
164
228
 
165
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
166
- db: AccessControlledDB<PrismaClient>
229
+ /**
230
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
231
+ * Types change based on select/include - relationships only present when explicitly included
232
+ * Virtual fields and transformed fields are added to the base model type
233
+ */
234
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
235
+ 'post'
236
+ > & {
237
+ post: {
238
+ findUnique: <T extends Prisma.PostFindUniqueArgs>(
239
+ args: Prisma.SelectSubset<T, Prisma.PostFindUniqueArgs>
240
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
241
+ findMany: <T extends Prisma.PostFindManyArgs>(
242
+ args?: Prisma.SelectSubset<T, Prisma.PostFindManyArgs>
243
+ ) => Promise<Array<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>>
244
+ create: <T extends Prisma.PostCreateArgs>(
245
+ args: Prisma.SelectSubset<T, Prisma.PostCreateArgs>
246
+ ) => Promise<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>
247
+ update: <T extends Prisma.PostUpdateArgs>(
248
+ args: Prisma.SelectSubset<T, Prisma.PostUpdateArgs>
249
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
250
+ delete: <T extends Prisma.PostDeleteArgs>(
251
+ args: Prisma.SelectSubset<T, Prisma.PostDeleteArgs>
252
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
253
+ count: (args?: Prisma.PostCountArgs) => Promise<number>
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
259
+ * Extends AccessContext and overrides db property to include virtual fields in output types
260
+ */
261
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
262
+ db: CustomDB
167
263
  session: TSession
168
- prisma: PrismaClient
169
- storage: StorageUtils
170
- plugins: PluginServices
171
264
  serverAction: (props: ServerActionProps) => Promise<unknown>
172
265
  sudo: () => Context<TSession>
173
- _isSudo: boolean
174
266
  }"
175
267
  `;
176
268
 
@@ -180,17 +272,35 @@ exports[`Types Generator > generateTypes > should generate UpdateInput type 1`]
180
272
  * DO NOT EDIT - This file is automatically generated
181
273
  */
182
274
 
183
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
275
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
184
276
  import type { PrismaClient, Prisma } from './prisma-client/client'
185
277
  import type { PluginServices } from './plugin-types'
186
278
 
187
- export type Post = {
279
+ /**
280
+ * Virtual fields for Post - computed fields not in database
281
+ * These are added to query results via resolveOutput hooks
282
+ */
283
+ export type PostVirtualFields = {
284
+ // No virtual fields defined
285
+ }
286
+
287
+ /**
288
+ * Transformed fields for Post - fields with resultExtension transformations
289
+ * These override Prisma's base types with transformed types via result extensions
290
+ */
291
+ export type PostTransformedFields = {
292
+ // No transformed fields defined
293
+ }
294
+
295
+ export type PostOutput = {
188
296
  id: string
189
297
  title: string
190
298
  content: string | null
191
299
  createdAt: Date
192
300
  updatedAt: Date
193
- }
301
+ } & PostVirtualFields
302
+
303
+ export type Post = PostOutput
194
304
 
195
305
  export type PostCreateInput = {
196
306
  title: string
@@ -251,15 +361,43 @@ export type PostHooks = {
251
361
  }) => Promise<void>
252
362
  }
253
363
 
254
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
255
- db: AccessControlledDB<PrismaClient>
364
+ /**
365
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
366
+ * Types change based on select/include - relationships only present when explicitly included
367
+ * Virtual fields and transformed fields are added to the base model type
368
+ */
369
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
370
+ 'post'
371
+ > & {
372
+ post: {
373
+ findUnique: <T extends Prisma.PostFindUniqueArgs>(
374
+ args: Prisma.SelectSubset<T, Prisma.PostFindUniqueArgs>
375
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
376
+ findMany: <T extends Prisma.PostFindManyArgs>(
377
+ args?: Prisma.SelectSubset<T, Prisma.PostFindManyArgs>
378
+ ) => Promise<Array<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>>
379
+ create: <T extends Prisma.PostCreateArgs>(
380
+ args: Prisma.SelectSubset<T, Prisma.PostCreateArgs>
381
+ ) => Promise<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>
382
+ update: <T extends Prisma.PostUpdateArgs>(
383
+ args: Prisma.SelectSubset<T, Prisma.PostUpdateArgs>
384
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
385
+ delete: <T extends Prisma.PostDeleteArgs>(
386
+ args: Prisma.SelectSubset<T, Prisma.PostDeleteArgs>
387
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
388
+ count: (args?: Prisma.PostCountArgs) => Promise<number>
389
+ }
390
+ }
391
+
392
+ /**
393
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
394
+ * Extends AccessContext and overrides db property to include virtual fields in output types
395
+ */
396
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
397
+ db: CustomDB
256
398
  session: TSession
257
- prisma: PrismaClient
258
- storage: StorageUtils
259
- plugins: PluginServices
260
399
  serverAction: (props: ServerActionProps) => Promise<unknown>
261
400
  sudo: () => Context<TSession>
262
- _isSudo: boolean
263
401
  }"
264
402
  `;
265
403
 
@@ -269,16 +407,34 @@ exports[`Types Generator > generateTypes > should generate WhereInput type 1`] =
269
407
  * DO NOT EDIT - This file is automatically generated
270
408
  */
271
409
 
272
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
410
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
273
411
  import type { PrismaClient, Prisma } from './prisma-client/client'
274
412
  import type { PluginServices } from './plugin-types'
275
413
 
276
- export type User = {
414
+ /**
415
+ * Virtual fields for User - computed fields not in database
416
+ * These are added to query results via resolveOutput hooks
417
+ */
418
+ export type UserVirtualFields = {
419
+ // No virtual fields defined
420
+ }
421
+
422
+ /**
423
+ * Transformed fields for User - fields with resultExtension transformations
424
+ * These override Prisma's base types with transformed types via result extensions
425
+ */
426
+ export type UserTransformedFields = {
427
+ // No transformed fields defined
428
+ }
429
+
430
+ export type UserOutput = {
277
431
  id: string
278
432
  name: string | null
279
433
  createdAt: Date
280
434
  updatedAt: Date
281
- }
435
+ } & UserVirtualFields
436
+
437
+ export type User = UserOutput
282
438
 
283
439
  export type UserCreateInput = {
284
440
  name?: string
@@ -336,15 +492,43 @@ export type UserHooks = {
336
492
  }) => Promise<void>
337
493
  }
338
494
 
339
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
340
- db: AccessControlledDB<PrismaClient>
495
+ /**
496
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
497
+ * Types change based on select/include - relationships only present when explicitly included
498
+ * Virtual fields and transformed fields are added to the base model type
499
+ */
500
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
501
+ 'user'
502
+ > & {
503
+ user: {
504
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
505
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
506
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
507
+ findMany: <T extends Prisma.UserFindManyArgs>(
508
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
509
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
510
+ create: <T extends Prisma.UserCreateArgs>(
511
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
512
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
513
+ update: <T extends Prisma.UserUpdateArgs>(
514
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
515
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
516
+ delete: <T extends Prisma.UserDeleteArgs>(
517
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
518
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
519
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
525
+ * Extends AccessContext and overrides db property to include virtual fields in output types
526
+ */
527
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
528
+ db: CustomDB
341
529
  session: TSession
342
- prisma: PrismaClient
343
- storage: StorageUtils
344
- plugins: PluginServices
345
530
  serverAction: (props: ServerActionProps) => Promise<unknown>
346
531
  sudo: () => Context<TSession>
347
- _isSudo: boolean
348
532
  }"
349
533
  `;
350
534
 
@@ -354,17 +538,35 @@ exports[`Types Generator > generateTypes > should generate type definitions for
354
538
  * DO NOT EDIT - This file is automatically generated
355
539
  */
356
540
 
357
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
541
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
358
542
  import type { PrismaClient, Prisma } from './prisma-client/client'
359
543
  import type { PluginServices } from './plugin-types'
360
544
 
361
- export type User = {
545
+ /**
546
+ * Virtual fields for User - computed fields not in database
547
+ * These are added to query results via resolveOutput hooks
548
+ */
549
+ export type UserVirtualFields = {
550
+ // No virtual fields defined
551
+ }
552
+
553
+ /**
554
+ * Transformed fields for User - fields with resultExtension transformations
555
+ * These override Prisma's base types with transformed types via result extensions
556
+ */
557
+ export type UserTransformedFields = {
558
+ // No transformed fields defined
559
+ }
560
+
561
+ export type UserOutput = {
362
562
  id: string
363
563
  name: string
364
564
  email: string
365
565
  createdAt: Date
366
566
  updatedAt: Date
367
- }
567
+ } & UserVirtualFields
568
+
569
+ export type User = UserOutput
368
570
 
369
571
  export type UserCreateInput = {
370
572
  name: string
@@ -425,15 +627,43 @@ export type UserHooks = {
425
627
  }) => Promise<void>
426
628
  }
427
629
 
428
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
429
- db: AccessControlledDB<PrismaClient>
630
+ /**
631
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
632
+ * Types change based on select/include - relationships only present when explicitly included
633
+ * Virtual fields and transformed fields are added to the base model type
634
+ */
635
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
636
+ 'user'
637
+ > & {
638
+ user: {
639
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
640
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
641
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
642
+ findMany: <T extends Prisma.UserFindManyArgs>(
643
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
644
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
645
+ create: <T extends Prisma.UserCreateArgs>(
646
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
647
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
648
+ update: <T extends Prisma.UserUpdateArgs>(
649
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
650
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
651
+ delete: <T extends Prisma.UserDeleteArgs>(
652
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
653
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
654
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
655
+ }
656
+ }
657
+
658
+ /**
659
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
660
+ * Extends AccessContext and overrides db property to include virtual fields in output types
661
+ */
662
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
663
+ db: CustomDB
430
664
  session: TSession
431
- prisma: PrismaClient
432
- storage: StorageUtils
433
- plugins: PluginServices
434
665
  serverAction: (props: ServerActionProps) => Promise<unknown>
435
666
  sudo: () => Context<TSession>
436
- _isSudo: boolean
437
667
  }"
438
668
  `;
439
669
 
@@ -443,16 +673,34 @@ exports[`Types Generator > generateTypes > should generate types for multiple li
443
673
  * DO NOT EDIT - This file is automatically generated
444
674
  */
445
675
 
446
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
676
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
447
677
  import type { PrismaClient, Prisma } from './prisma-client/client'
448
678
  import type { PluginServices } from './plugin-types'
449
679
 
450
- export type User = {
680
+ /**
681
+ * Virtual fields for User - computed fields not in database
682
+ * These are added to query results via resolveOutput hooks
683
+ */
684
+ export type UserVirtualFields = {
685
+ // No virtual fields defined
686
+ }
687
+
688
+ /**
689
+ * Transformed fields for User - fields with resultExtension transformations
690
+ * These override Prisma's base types with transformed types via result extensions
691
+ */
692
+ export type UserTransformedFields = {
693
+ // No transformed fields defined
694
+ }
695
+
696
+ export type UserOutput = {
451
697
  id: string
452
698
  name: string | null
453
699
  createdAt: Date
454
700
  updatedAt: Date
455
- }
701
+ } & UserVirtualFields
702
+
703
+ export type User = UserOutput
456
704
 
457
705
  export type UserCreateInput = {
458
706
  name?: string
@@ -510,12 +758,30 @@ export type UserHooks = {
510
758
  }) => Promise<void>
511
759
  }
512
760
 
513
- export type Post = {
761
+ /**
762
+ * Virtual fields for Post - computed fields not in database
763
+ * These are added to query results via resolveOutput hooks
764
+ */
765
+ export type PostVirtualFields = {
766
+ // No virtual fields defined
767
+ }
768
+
769
+ /**
770
+ * Transformed fields for Post - fields with resultExtension transformations
771
+ * These override Prisma's base types with transformed types via result extensions
772
+ */
773
+ export type PostTransformedFields = {
774
+ // No transformed fields defined
775
+ }
776
+
777
+ export type PostOutput = {
514
778
  id: string
515
779
  title: string | null
516
780
  createdAt: Date
517
781
  updatedAt: Date
518
- }
782
+ } & PostVirtualFields
783
+
784
+ export type Post = PostOutput
519
785
 
520
786
  export type PostCreateInput = {
521
787
  title?: string
@@ -573,12 +839,30 @@ export type PostHooks = {
573
839
  }) => Promise<void>
574
840
  }
575
841
 
576
- export type Comment = {
842
+ /**
843
+ * Virtual fields for Comment - computed fields not in database
844
+ * These are added to query results via resolveOutput hooks
845
+ */
846
+ export type CommentVirtualFields = {
847
+ // No virtual fields defined
848
+ }
849
+
850
+ /**
851
+ * Transformed fields for Comment - fields with resultExtension transformations
852
+ * These override Prisma's base types with transformed types via result extensions
853
+ */
854
+ export type CommentTransformedFields = {
855
+ // No transformed fields defined
856
+ }
857
+
858
+ export type CommentOutput = {
577
859
  id: string
578
860
  content: string | null
579
861
  createdAt: Date
580
862
  updatedAt: Date
581
- }
863
+ } & CommentVirtualFields
864
+
865
+ export type Comment = CommentOutput
582
866
 
583
867
  export type CommentCreateInput = {
584
868
  content?: string
@@ -636,15 +920,79 @@ export type CommentHooks = {
636
920
  }) => Promise<void>
637
921
  }
638
922
 
639
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
640
- db: AccessControlledDB<PrismaClient>
923
+ /**
924
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
925
+ * Types change based on select/include - relationships only present when explicitly included
926
+ * Virtual fields and transformed fields are added to the base model type
927
+ */
928
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
929
+ 'user' | 'post' | 'comment'
930
+ > & {
931
+ user: {
932
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
933
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
934
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
935
+ findMany: <T extends Prisma.UserFindManyArgs>(
936
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
937
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
938
+ create: <T extends Prisma.UserCreateArgs>(
939
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
940
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
941
+ update: <T extends Prisma.UserUpdateArgs>(
942
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
943
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
944
+ delete: <T extends Prisma.UserDeleteArgs>(
945
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
946
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
947
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
948
+ }
949
+ post: {
950
+ findUnique: <T extends Prisma.PostFindUniqueArgs>(
951
+ args: Prisma.SelectSubset<T, Prisma.PostFindUniqueArgs>
952
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
953
+ findMany: <T extends Prisma.PostFindManyArgs>(
954
+ args?: Prisma.SelectSubset<T, Prisma.PostFindManyArgs>
955
+ ) => Promise<Array<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>>
956
+ create: <T extends Prisma.PostCreateArgs>(
957
+ args: Prisma.SelectSubset<T, Prisma.PostCreateArgs>
958
+ ) => Promise<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>
959
+ update: <T extends Prisma.PostUpdateArgs>(
960
+ args: Prisma.SelectSubset<T, Prisma.PostUpdateArgs>
961
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
962
+ delete: <T extends Prisma.PostDeleteArgs>(
963
+ args: Prisma.SelectSubset<T, Prisma.PostDeleteArgs>
964
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
965
+ count: (args?: Prisma.PostCountArgs) => Promise<number>
966
+ }
967
+ comment: {
968
+ findUnique: <T extends Prisma.CommentFindUniqueArgs>(
969
+ args: Prisma.SelectSubset<T, Prisma.CommentFindUniqueArgs>
970
+ ) => Promise<(Omit<Prisma.CommentGetPayload<T>, keyof CommentTransformedFields> & CommentTransformedFields & CommentVirtualFields) | null>
971
+ findMany: <T extends Prisma.CommentFindManyArgs>(
972
+ args?: Prisma.SelectSubset<T, Prisma.CommentFindManyArgs>
973
+ ) => Promise<Array<Omit<Prisma.CommentGetPayload<T>, keyof CommentTransformedFields> & CommentTransformedFields & CommentVirtualFields>>
974
+ create: <T extends Prisma.CommentCreateArgs>(
975
+ args: Prisma.SelectSubset<T, Prisma.CommentCreateArgs>
976
+ ) => Promise<Omit<Prisma.CommentGetPayload<T>, keyof CommentTransformedFields> & CommentTransformedFields & CommentVirtualFields>
977
+ update: <T extends Prisma.CommentUpdateArgs>(
978
+ args: Prisma.SelectSubset<T, Prisma.CommentUpdateArgs>
979
+ ) => Promise<(Omit<Prisma.CommentGetPayload<T>, keyof CommentTransformedFields> & CommentTransformedFields & CommentVirtualFields) | null>
980
+ delete: <T extends Prisma.CommentDeleteArgs>(
981
+ args: Prisma.SelectSubset<T, Prisma.CommentDeleteArgs>
982
+ ) => Promise<(Omit<Prisma.CommentGetPayload<T>, keyof CommentTransformedFields> & CommentTransformedFields & CommentVirtualFields) | null>
983
+ count: (args?: Prisma.CommentCountArgs) => Promise<number>
984
+ }
985
+ }
986
+
987
+ /**
988
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
989
+ * Extends AccessContext and overrides db property to include virtual fields in output types
990
+ */
991
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
992
+ db: CustomDB
641
993
  session: TSession
642
- prisma: PrismaClient
643
- storage: StorageUtils
644
- plugins: PluginServices
645
994
  serverAction: (props: ServerActionProps) => Promise<unknown>
646
995
  sudo: () => Context<TSession>
647
- _isSudo: boolean
648
996
  }"
649
997
  `;
650
998
 
@@ -654,18 +1002,36 @@ exports[`Types Generator > generateTypes > should handle relationship fields in
654
1002
  * DO NOT EDIT - This file is automatically generated
655
1003
  */
656
1004
 
657
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
1005
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
658
1006
  import type { PrismaClient, Prisma } from './prisma-client/client'
659
1007
  import type { PluginServices } from './plugin-types'
660
1008
 
661
- export type Post = {
1009
+ /**
1010
+ * Virtual fields for Post - computed fields not in database
1011
+ * These are added to query results via resolveOutput hooks
1012
+ */
1013
+ export type PostVirtualFields = {
1014
+ // No virtual fields defined
1015
+ }
1016
+
1017
+ /**
1018
+ * Transformed fields for Post - fields with resultExtension transformations
1019
+ * These override Prisma's base types with transformed types via result extensions
1020
+ */
1021
+ export type PostTransformedFields = {
1022
+ // No transformed fields defined
1023
+ }
1024
+
1025
+ export type PostOutput = {
662
1026
  id: string
663
1027
  title: string | null
664
1028
  authorId: string | null
665
- author: User | null
1029
+ author?: UserOutput | null
666
1030
  createdAt: Date
667
1031
  updatedAt: Date
668
- }
1032
+ } & PostVirtualFields
1033
+
1034
+ export type Post = PostOutput
669
1035
 
670
1036
  export type PostCreateInput = {
671
1037
  title?: string
@@ -725,12 +1091,30 @@ export type PostHooks = {
725
1091
  }) => Promise<void>
726
1092
  }
727
1093
 
728
- export type User = {
1094
+ /**
1095
+ * Virtual fields for User - computed fields not in database
1096
+ * These are added to query results via resolveOutput hooks
1097
+ */
1098
+ export type UserVirtualFields = {
1099
+ // No virtual fields defined
1100
+ }
1101
+
1102
+ /**
1103
+ * Transformed fields for User - fields with resultExtension transformations
1104
+ * These override Prisma's base types with transformed types via result extensions
1105
+ */
1106
+ export type UserTransformedFields = {
1107
+ // No transformed fields defined
1108
+ }
1109
+
1110
+ export type UserOutput = {
729
1111
  id: string
730
1112
  name: string | null
731
1113
  createdAt: Date
732
1114
  updatedAt: Date
733
- }
1115
+ } & UserVirtualFields
1116
+
1117
+ export type User = UserOutput
734
1118
 
735
1119
  export type UserCreateInput = {
736
1120
  name?: string
@@ -788,15 +1172,61 @@ export type UserHooks = {
788
1172
  }) => Promise<void>
789
1173
  }
790
1174
 
791
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
792
- db: AccessControlledDB<PrismaClient>
1175
+ /**
1176
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
1177
+ * Types change based on select/include - relationships only present when explicitly included
1178
+ * Virtual fields and transformed fields are added to the base model type
1179
+ */
1180
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
1181
+ 'post' | 'user'
1182
+ > & {
1183
+ post: {
1184
+ findUnique: <T extends Prisma.PostFindUniqueArgs>(
1185
+ args: Prisma.SelectSubset<T, Prisma.PostFindUniqueArgs>
1186
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1187
+ findMany: <T extends Prisma.PostFindManyArgs>(
1188
+ args?: Prisma.SelectSubset<T, Prisma.PostFindManyArgs>
1189
+ ) => Promise<Array<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>>
1190
+ create: <T extends Prisma.PostCreateArgs>(
1191
+ args: Prisma.SelectSubset<T, Prisma.PostCreateArgs>
1192
+ ) => Promise<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>
1193
+ update: <T extends Prisma.PostUpdateArgs>(
1194
+ args: Prisma.SelectSubset<T, Prisma.PostUpdateArgs>
1195
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1196
+ delete: <T extends Prisma.PostDeleteArgs>(
1197
+ args: Prisma.SelectSubset<T, Prisma.PostDeleteArgs>
1198
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1199
+ count: (args?: Prisma.PostCountArgs) => Promise<number>
1200
+ }
1201
+ user: {
1202
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
1203
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
1204
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1205
+ findMany: <T extends Prisma.UserFindManyArgs>(
1206
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
1207
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
1208
+ create: <T extends Prisma.UserCreateArgs>(
1209
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
1210
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
1211
+ update: <T extends Prisma.UserUpdateArgs>(
1212
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
1213
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1214
+ delete: <T extends Prisma.UserDeleteArgs>(
1215
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
1216
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1217
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
1218
+ }
1219
+ }
1220
+
1221
+ /**
1222
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
1223
+ * Extends AccessContext and overrides db property to include virtual fields in output types
1224
+ */
1225
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
1226
+ db: CustomDB
793
1227
  session: TSession
794
- prisma: PrismaClient
795
- storage: StorageUtils
796
- plugins: PluginServices
797
1228
  serverAction: (props: ServerActionProps) => Promise<unknown>
798
1229
  sudo: () => Context<TSession>
799
- _isSudo: boolean
800
1230
  }"
801
1231
  `;
802
1232
 
@@ -806,18 +1236,36 @@ exports[`Types Generator > generateTypes > should handle relationship fields in
806
1236
  * DO NOT EDIT - This file is automatically generated
807
1237
  */
808
1238
 
809
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
1239
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
810
1240
  import type { PrismaClient, Prisma } from './prisma-client/client'
811
1241
  import type { PluginServices } from './plugin-types'
812
1242
 
813
- export type Post = {
1243
+ /**
1244
+ * Virtual fields for Post - computed fields not in database
1245
+ * These are added to query results via resolveOutput hooks
1246
+ */
1247
+ export type PostVirtualFields = {
1248
+ // No virtual fields defined
1249
+ }
1250
+
1251
+ /**
1252
+ * Transformed fields for Post - fields with resultExtension transformations
1253
+ * These override Prisma's base types with transformed types via result extensions
1254
+ */
1255
+ export type PostTransformedFields = {
1256
+ // No transformed fields defined
1257
+ }
1258
+
1259
+ export type PostOutput = {
814
1260
  id: string
815
1261
  title: string | null
816
1262
  authorId: string | null
817
- author: User | null
1263
+ author?: UserOutput | null
818
1264
  createdAt: Date
819
1265
  updatedAt: Date
820
- }
1266
+ } & PostVirtualFields
1267
+
1268
+ export type Post = PostOutput
821
1269
 
822
1270
  export type PostCreateInput = {
823
1271
  title?: string
@@ -877,12 +1325,30 @@ export type PostHooks = {
877
1325
  }) => Promise<void>
878
1326
  }
879
1327
 
880
- export type User = {
1328
+ /**
1329
+ * Virtual fields for User - computed fields not in database
1330
+ * These are added to query results via resolveOutput hooks
1331
+ */
1332
+ export type UserVirtualFields = {
1333
+ // No virtual fields defined
1334
+ }
1335
+
1336
+ /**
1337
+ * Transformed fields for User - fields with resultExtension transformations
1338
+ * These override Prisma's base types with transformed types via result extensions
1339
+ */
1340
+ export type UserTransformedFields = {
1341
+ // No transformed fields defined
1342
+ }
1343
+
1344
+ export type UserOutput = {
881
1345
  id: string
882
1346
  name: string | null
883
1347
  createdAt: Date
884
1348
  updatedAt: Date
885
- }
1349
+ } & UserVirtualFields
1350
+
1351
+ export type User = UserOutput
886
1352
 
887
1353
  export type UserCreateInput = {
888
1354
  name?: string
@@ -940,15 +1406,61 @@ export type UserHooks = {
940
1406
  }) => Promise<void>
941
1407
  }
942
1408
 
943
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
944
- db: AccessControlledDB<PrismaClient>
1409
+ /**
1410
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
1411
+ * Types change based on select/include - relationships only present when explicitly included
1412
+ * Virtual fields and transformed fields are added to the base model type
1413
+ */
1414
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
1415
+ 'post' | 'user'
1416
+ > & {
1417
+ post: {
1418
+ findUnique: <T extends Prisma.PostFindUniqueArgs>(
1419
+ args: Prisma.SelectSubset<T, Prisma.PostFindUniqueArgs>
1420
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1421
+ findMany: <T extends Prisma.PostFindManyArgs>(
1422
+ args?: Prisma.SelectSubset<T, Prisma.PostFindManyArgs>
1423
+ ) => Promise<Array<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>>
1424
+ create: <T extends Prisma.PostCreateArgs>(
1425
+ args: Prisma.SelectSubset<T, Prisma.PostCreateArgs>
1426
+ ) => Promise<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>
1427
+ update: <T extends Prisma.PostUpdateArgs>(
1428
+ args: Prisma.SelectSubset<T, Prisma.PostUpdateArgs>
1429
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1430
+ delete: <T extends Prisma.PostDeleteArgs>(
1431
+ args: Prisma.SelectSubset<T, Prisma.PostDeleteArgs>
1432
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1433
+ count: (args?: Prisma.PostCountArgs) => Promise<number>
1434
+ }
1435
+ user: {
1436
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
1437
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
1438
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1439
+ findMany: <T extends Prisma.UserFindManyArgs>(
1440
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
1441
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
1442
+ create: <T extends Prisma.UserCreateArgs>(
1443
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
1444
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
1445
+ update: <T extends Prisma.UserUpdateArgs>(
1446
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
1447
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1448
+ delete: <T extends Prisma.UserDeleteArgs>(
1449
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
1450
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1451
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
1452
+ }
1453
+ }
1454
+
1455
+ /**
1456
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
1457
+ * Extends AccessContext and overrides db property to include virtual fields in output types
1458
+ */
1459
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
1460
+ db: CustomDB
945
1461
  session: TSession
946
- prisma: PrismaClient
947
- storage: StorageUtils
948
- plugins: PluginServices
949
1462
  serverAction: (props: ServerActionProps) => Promise<unknown>
950
1463
  sudo: () => Context<TSession>
951
- _isSudo: boolean
952
1464
  }"
953
1465
  `;
954
1466
 
@@ -958,17 +1470,35 @@ exports[`Types Generator > generateTypes > should handle relationship fields in
958
1470
  * DO NOT EDIT - This file is automatically generated
959
1471
  */
960
1472
 
961
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
1473
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
962
1474
  import type { PrismaClient, Prisma } from './prisma-client/client'
963
1475
  import type { PluginServices } from './plugin-types'
964
1476
 
965
- export type User = {
1477
+ /**
1478
+ * Virtual fields for User - computed fields not in database
1479
+ * These are added to query results via resolveOutput hooks
1480
+ */
1481
+ export type UserVirtualFields = {
1482
+ // No virtual fields defined
1483
+ }
1484
+
1485
+ /**
1486
+ * Transformed fields for User - fields with resultExtension transformations
1487
+ * These override Prisma's base types with transformed types via result extensions
1488
+ */
1489
+ export type UserTransformedFields = {
1490
+ // No transformed fields defined
1491
+ }
1492
+
1493
+ export type UserOutput = {
966
1494
  id: string
967
1495
  name: string | null
968
- posts: Post[]
1496
+ posts?: PostOutput[]
969
1497
  createdAt: Date
970
1498
  updatedAt: Date
971
- }
1499
+ } & UserVirtualFields
1500
+
1501
+ export type User = UserOutput
972
1502
 
973
1503
  export type UserCreateInput = {
974
1504
  name?: string
@@ -1028,14 +1558,32 @@ export type UserHooks = {
1028
1558
  }) => Promise<void>
1029
1559
  }
1030
1560
 
1031
- export type Post = {
1561
+ /**
1562
+ * Virtual fields for Post - computed fields not in database
1563
+ * These are added to query results via resolveOutput hooks
1564
+ */
1565
+ export type PostVirtualFields = {
1566
+ // No virtual fields defined
1567
+ }
1568
+
1569
+ /**
1570
+ * Transformed fields for Post - fields with resultExtension transformations
1571
+ * These override Prisma's base types with transformed types via result extensions
1572
+ */
1573
+ export type PostTransformedFields = {
1574
+ // No transformed fields defined
1575
+ }
1576
+
1577
+ export type PostOutput = {
1032
1578
  id: string
1033
1579
  title: string | null
1034
1580
  authorId: string | null
1035
- author: User | null
1581
+ author?: UserOutput | null
1036
1582
  createdAt: Date
1037
1583
  updatedAt: Date
1038
- }
1584
+ } & PostVirtualFields
1585
+
1586
+ export type Post = PostOutput
1039
1587
 
1040
1588
  export type PostCreateInput = {
1041
1589
  title?: string
@@ -1095,14 +1643,60 @@ export type PostHooks = {
1095
1643
  }) => Promise<void>
1096
1644
  }
1097
1645
 
1098
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
1099
- db: AccessControlledDB<PrismaClient>
1646
+ /**
1647
+ * Custom DB type that uses Prisma's conditional types with virtual and transformed field support
1648
+ * Types change based on select/include - relationships only present when explicitly included
1649
+ * Virtual fields and transformed fields are added to the base model type
1650
+ */
1651
+ export type CustomDB = Omit<AccessControlledDB<PrismaClient>,
1652
+ 'user' | 'post'
1653
+ > & {
1654
+ user: {
1655
+ findUnique: <T extends Prisma.UserFindUniqueArgs>(
1656
+ args: Prisma.SelectSubset<T, Prisma.UserFindUniqueArgs>
1657
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1658
+ findMany: <T extends Prisma.UserFindManyArgs>(
1659
+ args?: Prisma.SelectSubset<T, Prisma.UserFindManyArgs>
1660
+ ) => Promise<Array<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>>
1661
+ create: <T extends Prisma.UserCreateArgs>(
1662
+ args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>
1663
+ ) => Promise<Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields>
1664
+ update: <T extends Prisma.UserUpdateArgs>(
1665
+ args: Prisma.SelectSubset<T, Prisma.UserUpdateArgs>
1666
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1667
+ delete: <T extends Prisma.UserDeleteArgs>(
1668
+ args: Prisma.SelectSubset<T, Prisma.UserDeleteArgs>
1669
+ ) => Promise<(Omit<Prisma.UserGetPayload<T>, keyof UserTransformedFields> & UserTransformedFields & UserVirtualFields) | null>
1670
+ count: (args?: Prisma.UserCountArgs) => Promise<number>
1671
+ }
1672
+ post: {
1673
+ findUnique: <T extends Prisma.PostFindUniqueArgs>(
1674
+ args: Prisma.SelectSubset<T, Prisma.PostFindUniqueArgs>
1675
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1676
+ findMany: <T extends Prisma.PostFindManyArgs>(
1677
+ args?: Prisma.SelectSubset<T, Prisma.PostFindManyArgs>
1678
+ ) => Promise<Array<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>>
1679
+ create: <T extends Prisma.PostCreateArgs>(
1680
+ args: Prisma.SelectSubset<T, Prisma.PostCreateArgs>
1681
+ ) => Promise<Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields>
1682
+ update: <T extends Prisma.PostUpdateArgs>(
1683
+ args: Prisma.SelectSubset<T, Prisma.PostUpdateArgs>
1684
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1685
+ delete: <T extends Prisma.PostDeleteArgs>(
1686
+ args: Prisma.SelectSubset<T, Prisma.PostDeleteArgs>
1687
+ ) => Promise<(Omit<Prisma.PostGetPayload<T>, keyof PostTransformedFields> & PostTransformedFields & PostVirtualFields) | null>
1688
+ count: (args?: Prisma.PostCountArgs) => Promise<number>
1689
+ }
1690
+ }
1691
+
1692
+ /**
1693
+ * Context type compatible with AccessContext but with CustomDB for virtual field typing
1694
+ * Extends AccessContext and overrides db property to include virtual fields in output types
1695
+ */
1696
+ export type Context<TSession extends OpensaasSession = OpensaasSession> = Omit<AccessContext<PrismaClient>, 'db' | 'session'> & {
1697
+ db: CustomDB
1100
1698
  session: TSession
1101
- prisma: PrismaClient
1102
- storage: StorageUtils
1103
- plugins: PluginServices
1104
1699
  serverAction: (props: ServerActionProps) => Promise<unknown>
1105
1700
  sudo: () => Context<TSession>
1106
- _isSudo: boolean
1107
1701
  }"
1108
1702
  `;