@opensaas/stack-cli 0.1.7 → 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 (104) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +348 -0
  3. package/CLAUDE.md +60 -12
  4. package/dist/commands/generate.d.ts.map +1 -1
  5. package/dist/commands/generate.js +13 -13
  6. package/dist/commands/generate.js.map +1 -1
  7. package/dist/commands/mcp.d.ts +6 -0
  8. package/dist/commands/mcp.d.ts.map +1 -0
  9. package/dist/commands/mcp.js +116 -0
  10. package/dist/commands/mcp.js.map +1 -0
  11. package/dist/generator/context.d.ts.map +1 -1
  12. package/dist/generator/context.js +40 -7
  13. package/dist/generator/context.js.map +1 -1
  14. package/dist/generator/index.d.ts +4 -1
  15. package/dist/generator/index.d.ts.map +1 -1
  16. package/dist/generator/index.js +4 -1
  17. package/dist/generator/index.js.map +1 -1
  18. package/dist/generator/lists.d.ts +31 -0
  19. package/dist/generator/lists.d.ts.map +1 -0
  20. package/dist/generator/lists.js +123 -0
  21. package/dist/generator/lists.js.map +1 -0
  22. package/dist/generator/plugin-types.d.ts +10 -0
  23. package/dist/generator/plugin-types.d.ts.map +1 -0
  24. package/dist/generator/plugin-types.js +122 -0
  25. package/dist/generator/plugin-types.js.map +1 -0
  26. package/dist/generator/prisma-config.d.ts +17 -0
  27. package/dist/generator/prisma-config.d.ts.map +1 -0
  28. package/dist/generator/prisma-config.js +40 -0
  29. package/dist/generator/prisma-config.js.map +1 -0
  30. package/dist/generator/prisma-extensions.d.ts +11 -0
  31. package/dist/generator/prisma-extensions.d.ts.map +1 -0
  32. package/dist/generator/prisma-extensions.js +134 -0
  33. package/dist/generator/prisma-extensions.js.map +1 -0
  34. package/dist/generator/prisma.d.ts.map +1 -1
  35. package/dist/generator/prisma.js +5 -2
  36. package/dist/generator/prisma.js.map +1 -1
  37. package/dist/generator/types.d.ts.map +1 -1
  38. package/dist/generator/types.js +201 -17
  39. package/dist/generator/types.js.map +1 -1
  40. package/dist/index.js +3 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcp/lib/documentation-provider.d.ts +43 -0
  43. package/dist/mcp/lib/documentation-provider.d.ts.map +1 -0
  44. package/dist/mcp/lib/documentation-provider.js +163 -0
  45. package/dist/mcp/lib/documentation-provider.js.map +1 -0
  46. package/dist/mcp/lib/features/catalog.d.ts +26 -0
  47. package/dist/mcp/lib/features/catalog.d.ts.map +1 -0
  48. package/dist/mcp/lib/features/catalog.js +291 -0
  49. package/dist/mcp/lib/features/catalog.js.map +1 -0
  50. package/dist/mcp/lib/generators/feature-generator.d.ts +35 -0
  51. package/dist/mcp/lib/generators/feature-generator.d.ts.map +1 -0
  52. package/dist/mcp/lib/generators/feature-generator.js +546 -0
  53. package/dist/mcp/lib/generators/feature-generator.js.map +1 -0
  54. package/dist/mcp/lib/types.d.ts +80 -0
  55. package/dist/mcp/lib/types.d.ts.map +1 -0
  56. package/dist/mcp/lib/types.js +5 -0
  57. package/dist/mcp/lib/types.js.map +1 -0
  58. package/dist/mcp/lib/wizards/wizard-engine.d.ts +71 -0
  59. package/dist/mcp/lib/wizards/wizard-engine.d.ts.map +1 -0
  60. package/dist/mcp/lib/wizards/wizard-engine.js +356 -0
  61. package/dist/mcp/lib/wizards/wizard-engine.js.map +1 -0
  62. package/dist/mcp/server/index.d.ts +8 -0
  63. package/dist/mcp/server/index.d.ts.map +1 -0
  64. package/dist/mcp/server/index.js +202 -0
  65. package/dist/mcp/server/index.js.map +1 -0
  66. package/dist/mcp/server/stack-mcp-server.d.ts +92 -0
  67. package/dist/mcp/server/stack-mcp-server.d.ts.map +1 -0
  68. package/dist/mcp/server/stack-mcp-server.js +265 -0
  69. package/dist/mcp/server/stack-mcp-server.js.map +1 -0
  70. package/package.json +10 -8
  71. package/src/commands/__snapshots__/generate.test.ts.snap +145 -38
  72. package/src/commands/dev.test.ts +0 -1
  73. package/src/commands/generate.test.ts +18 -8
  74. package/src/commands/generate.ts +20 -19
  75. package/src/commands/mcp.ts +135 -0
  76. package/src/generator/__snapshots__/context.test.ts.snap +63 -18
  77. package/src/generator/__snapshots__/prisma.test.ts.snap +8 -16
  78. package/src/generator/__snapshots__/types.test.ts.snap +1267 -95
  79. package/src/generator/context.test.ts +15 -8
  80. package/src/generator/context.ts +40 -7
  81. package/src/generator/index.ts +4 -1
  82. package/src/generator/lists.test.ts +335 -0
  83. package/src/generator/lists.ts +140 -0
  84. package/src/generator/plugin-types.ts +147 -0
  85. package/src/generator/prisma-config.ts +46 -0
  86. package/src/generator/prisma-extensions.ts +159 -0
  87. package/src/generator/prisma.test.ts +0 -10
  88. package/src/generator/prisma.ts +6 -2
  89. package/src/generator/types.test.ts +0 -12
  90. package/src/generator/types.ts +257 -17
  91. package/src/index.ts +4 -0
  92. package/src/mcp/lib/documentation-provider.ts +203 -0
  93. package/src/mcp/lib/features/catalog.ts +301 -0
  94. package/src/mcp/lib/generators/feature-generator.ts +598 -0
  95. package/src/mcp/lib/types.ts +89 -0
  96. package/src/mcp/lib/wizards/wizard-engine.ts +427 -0
  97. package/src/mcp/server/index.ts +240 -0
  98. package/src/mcp/server/stack-mcp-server.ts +301 -0
  99. package/tsconfig.tsbuildinfo +1 -1
  100. package/dist/generator/type-patcher.d.ts +0 -13
  101. package/dist/generator/type-patcher.d.ts.map +0 -1
  102. package/dist/generator/type-patcher.js +0 -68
  103. package/dist/generator/type-patcher.js.map +0 -1
  104. package/src/generator/type-patcher.ts +0 -93
@@ -6,15 +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'
10
- import type { PrismaClient } from './prisma-client'
9
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
10
+ import type { PrismaClient, Prisma } from './prisma-client/client'
11
+ import type { PluginServices } from './plugin-types'
11
12
 
12
- 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 = {
13
30
  id: string
14
31
  name: string | null
15
32
  createdAt: Date
16
33
  updatedAt: Date
17
- }
34
+ } & UserVirtualFields
35
+
36
+ export type User = UserOutput
18
37
 
19
38
  export type UserCreateInput = {
20
39
  name?: string
@@ -32,14 +51,83 @@ export type UserWhereInput = {
32
51
  name?: { equals?: string, not?: string }
33
52
  }
34
53
 
35
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
36
- db: AccessControlledDB<PrismaClient>
54
+ /**
55
+ * Hook types for User list
56
+ * Properly typed to use Prisma's generated input types
57
+ */
58
+ export type UserHooks = {
59
+ resolveInput?: (args:
60
+ | {
61
+ operation: 'create'
62
+ resolvedData: Prisma.UserCreateInput
63
+ item: undefined
64
+ context: import('@opensaas/stack-core').AccessContext
65
+ }
66
+ | {
67
+ operation: 'update'
68
+ resolvedData: Prisma.UserUpdateInput
69
+ item: User
70
+ context: import('@opensaas/stack-core').AccessContext
71
+ }
72
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
73
+ validateInput?: (args: {
74
+ operation: 'create' | 'update'
75
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
76
+ item?: User
77
+ context: import('@opensaas/stack-core').AccessContext
78
+ addValidationError: (msg: string) => void
79
+ }) => Promise<void>
80
+ beforeOperation?: (args: {
81
+ operation: 'create' | 'update' | 'delete'
82
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
83
+ item?: User
84
+ context: import('@opensaas/stack-core').AccessContext
85
+ }) => Promise<void>
86
+ afterOperation?: (args: {
87
+ operation: 'create' | 'update' | 'delete'
88
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
89
+ item?: User
90
+ context: import('@opensaas/stack-core').AccessContext
91
+ }) => Promise<void>
92
+ }
93
+
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
37
128
  session: TSession
38
- prisma: PrismaClient
39
- storage: StorageUtils
40
129
  serverAction: (props: ServerActionProps) => Promise<unknown>
41
130
  sudo: () => Context<TSession>
42
- _isSudo: boolean
43
131
  }"
44
132
  `;
45
133
 
@@ -49,16 +137,35 @@ exports[`Types Generator > generateTypes > should generate CreateInput type 1`]
49
137
  * DO NOT EDIT - This file is automatically generated
50
138
  */
51
139
 
52
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
53
- import type { PrismaClient } from './prisma-client'
140
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
141
+ import type { PrismaClient, Prisma } from './prisma-client/client'
142
+ import type { PluginServices } from './plugin-types'
143
+
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
+ }
54
159
 
55
- export type Post = {
160
+ export type PostOutput = {
56
161
  id: string
57
162
  title: string
58
163
  content: string | null
59
164
  createdAt: Date
60
165
  updatedAt: Date
61
- }
166
+ } & PostVirtualFields
167
+
168
+ export type Post = PostOutput
62
169
 
63
170
  export type PostCreateInput = {
64
171
  title: string
@@ -79,14 +186,83 @@ export type PostWhereInput = {
79
186
  content?: { equals?: string, not?: string }
80
187
  }
81
188
 
82
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
83
- db: AccessControlledDB<PrismaClient>
189
+ /**
190
+ * Hook types for Post list
191
+ * Properly typed to use Prisma's generated input types
192
+ */
193
+ export type PostHooks = {
194
+ resolveInput?: (args:
195
+ | {
196
+ operation: 'create'
197
+ resolvedData: Prisma.PostCreateInput
198
+ item: undefined
199
+ context: import('@opensaas/stack-core').AccessContext
200
+ }
201
+ | {
202
+ operation: 'update'
203
+ resolvedData: Prisma.PostUpdateInput
204
+ item: Post
205
+ context: import('@opensaas/stack-core').AccessContext
206
+ }
207
+ ) => Promise<Prisma.PostCreateInput | Prisma.PostUpdateInput>
208
+ validateInput?: (args: {
209
+ operation: 'create' | 'update'
210
+ resolvedData: Prisma.PostCreateInput | Prisma.PostUpdateInput
211
+ item?: Post
212
+ context: import('@opensaas/stack-core').AccessContext
213
+ addValidationError: (msg: string) => void
214
+ }) => Promise<void>
215
+ beforeOperation?: (args: {
216
+ operation: 'create' | 'update' | 'delete'
217
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
218
+ item?: Post
219
+ context: import('@opensaas/stack-core').AccessContext
220
+ }) => Promise<void>
221
+ afterOperation?: (args: {
222
+ operation: 'create' | 'update' | 'delete'
223
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
224
+ item?: Post
225
+ context: import('@opensaas/stack-core').AccessContext
226
+ }) => Promise<void>
227
+ }
228
+
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
84
263
  session: TSession
85
- prisma: PrismaClient
86
- storage: StorageUtils
87
264
  serverAction: (props: ServerActionProps) => Promise<unknown>
88
265
  sudo: () => Context<TSession>
89
- _isSudo: boolean
90
266
  }"
91
267
  `;
92
268
 
@@ -96,16 +272,35 @@ exports[`Types Generator > generateTypes > should generate UpdateInput type 1`]
96
272
  * DO NOT EDIT - This file is automatically generated
97
273
  */
98
274
 
99
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
100
- import type { PrismaClient } from './prisma-client'
275
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
276
+ import type { PrismaClient, Prisma } from './prisma-client/client'
277
+ import type { PluginServices } from './plugin-types'
278
+
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
+ }
101
294
 
102
- export type Post = {
295
+ export type PostOutput = {
103
296
  id: string
104
297
  title: string
105
298
  content: string | null
106
299
  createdAt: Date
107
300
  updatedAt: Date
108
- }
301
+ } & PostVirtualFields
302
+
303
+ export type Post = PostOutput
109
304
 
110
305
  export type PostCreateInput = {
111
306
  title: string
@@ -126,14 +321,83 @@ export type PostWhereInput = {
126
321
  content?: { equals?: string, not?: string }
127
322
  }
128
323
 
129
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
130
- db: AccessControlledDB<PrismaClient>
324
+ /**
325
+ * Hook types for Post list
326
+ * Properly typed to use Prisma's generated input types
327
+ */
328
+ export type PostHooks = {
329
+ resolveInput?: (args:
330
+ | {
331
+ operation: 'create'
332
+ resolvedData: Prisma.PostCreateInput
333
+ item: undefined
334
+ context: import('@opensaas/stack-core').AccessContext
335
+ }
336
+ | {
337
+ operation: 'update'
338
+ resolvedData: Prisma.PostUpdateInput
339
+ item: Post
340
+ context: import('@opensaas/stack-core').AccessContext
341
+ }
342
+ ) => Promise<Prisma.PostCreateInput | Prisma.PostUpdateInput>
343
+ validateInput?: (args: {
344
+ operation: 'create' | 'update'
345
+ resolvedData: Prisma.PostCreateInput | Prisma.PostUpdateInput
346
+ item?: Post
347
+ context: import('@opensaas/stack-core').AccessContext
348
+ addValidationError: (msg: string) => void
349
+ }) => Promise<void>
350
+ beforeOperation?: (args: {
351
+ operation: 'create' | 'update' | 'delete'
352
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
353
+ item?: Post
354
+ context: import('@opensaas/stack-core').AccessContext
355
+ }) => Promise<void>
356
+ afterOperation?: (args: {
357
+ operation: 'create' | 'update' | 'delete'
358
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
359
+ item?: Post
360
+ context: import('@opensaas/stack-core').AccessContext
361
+ }) => Promise<void>
362
+ }
363
+
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
131
398
  session: TSession
132
- prisma: PrismaClient
133
- storage: StorageUtils
134
399
  serverAction: (props: ServerActionProps) => Promise<unknown>
135
400
  sudo: () => Context<TSession>
136
- _isSudo: boolean
137
401
  }"
138
402
  `;
139
403
 
@@ -143,15 +407,34 @@ exports[`Types Generator > generateTypes > should generate WhereInput type 1`] =
143
407
  * DO NOT EDIT - This file is automatically generated
144
408
  */
145
409
 
146
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
147
- import type { PrismaClient } from './prisma-client'
410
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
411
+ import type { PrismaClient, Prisma } from './prisma-client/client'
412
+ import type { PluginServices } from './plugin-types'
413
+
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
+ }
148
421
 
149
- export type User = {
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 = {
150
431
  id: string
151
432
  name: string | null
152
433
  createdAt: Date
153
434
  updatedAt: Date
154
- }
435
+ } & UserVirtualFields
436
+
437
+ export type User = UserOutput
155
438
 
156
439
  export type UserCreateInput = {
157
440
  name?: string
@@ -169,14 +452,83 @@ export type UserWhereInput = {
169
452
  name?: { equals?: string, not?: string }
170
453
  }
171
454
 
172
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
173
- db: AccessControlledDB<PrismaClient>
455
+ /**
456
+ * Hook types for User list
457
+ * Properly typed to use Prisma's generated input types
458
+ */
459
+ export type UserHooks = {
460
+ resolveInput?: (args:
461
+ | {
462
+ operation: 'create'
463
+ resolvedData: Prisma.UserCreateInput
464
+ item: undefined
465
+ context: import('@opensaas/stack-core').AccessContext
466
+ }
467
+ | {
468
+ operation: 'update'
469
+ resolvedData: Prisma.UserUpdateInput
470
+ item: User
471
+ context: import('@opensaas/stack-core').AccessContext
472
+ }
473
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
474
+ validateInput?: (args: {
475
+ operation: 'create' | 'update'
476
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
477
+ item?: User
478
+ context: import('@opensaas/stack-core').AccessContext
479
+ addValidationError: (msg: string) => void
480
+ }) => Promise<void>
481
+ beforeOperation?: (args: {
482
+ operation: 'create' | 'update' | 'delete'
483
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
484
+ item?: User
485
+ context: import('@opensaas/stack-core').AccessContext
486
+ }) => Promise<void>
487
+ afterOperation?: (args: {
488
+ operation: 'create' | 'update' | 'delete'
489
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
490
+ item?: User
491
+ context: import('@opensaas/stack-core').AccessContext
492
+ }) => Promise<void>
493
+ }
494
+
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
174
529
  session: TSession
175
- prisma: PrismaClient
176
- storage: StorageUtils
177
530
  serverAction: (props: ServerActionProps) => Promise<unknown>
178
531
  sudo: () => Context<TSession>
179
- _isSudo: boolean
180
532
  }"
181
533
  `;
182
534
 
@@ -186,16 +538,35 @@ exports[`Types Generator > generateTypes > should generate type definitions for
186
538
  * DO NOT EDIT - This file is automatically generated
187
539
  */
188
540
 
189
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
190
- import type { PrismaClient } from './prisma-client'
541
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
542
+ import type { PrismaClient, Prisma } from './prisma-client/client'
543
+ import type { PluginServices } from './plugin-types'
191
544
 
192
- 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 = {
193
562
  id: string
194
563
  name: string
195
564
  email: string
196
565
  createdAt: Date
197
566
  updatedAt: Date
198
- }
567
+ } & UserVirtualFields
568
+
569
+ export type User = UserOutput
199
570
 
200
571
  export type UserCreateInput = {
201
572
  name: string
@@ -216,14 +587,83 @@ export type UserWhereInput = {
216
587
  email?: { equals?: string, not?: string }
217
588
  }
218
589
 
219
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
220
- db: AccessControlledDB<PrismaClient>
590
+ /**
591
+ * Hook types for User list
592
+ * Properly typed to use Prisma's generated input types
593
+ */
594
+ export type UserHooks = {
595
+ resolveInput?: (args:
596
+ | {
597
+ operation: 'create'
598
+ resolvedData: Prisma.UserCreateInput
599
+ item: undefined
600
+ context: import('@opensaas/stack-core').AccessContext
601
+ }
602
+ | {
603
+ operation: 'update'
604
+ resolvedData: Prisma.UserUpdateInput
605
+ item: User
606
+ context: import('@opensaas/stack-core').AccessContext
607
+ }
608
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
609
+ validateInput?: (args: {
610
+ operation: 'create' | 'update'
611
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
612
+ item?: User
613
+ context: import('@opensaas/stack-core').AccessContext
614
+ addValidationError: (msg: string) => void
615
+ }) => Promise<void>
616
+ beforeOperation?: (args: {
617
+ operation: 'create' | 'update' | 'delete'
618
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
619
+ item?: User
620
+ context: import('@opensaas/stack-core').AccessContext
621
+ }) => Promise<void>
622
+ afterOperation?: (args: {
623
+ operation: 'create' | 'update' | 'delete'
624
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
625
+ item?: User
626
+ context: import('@opensaas/stack-core').AccessContext
627
+ }) => Promise<void>
628
+ }
629
+
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
221
664
  session: TSession
222
- prisma: PrismaClient
223
- storage: StorageUtils
224
665
  serverAction: (props: ServerActionProps) => Promise<unknown>
225
666
  sudo: () => Context<TSession>
226
- _isSudo: boolean
227
667
  }"
228
668
  `;
229
669
 
@@ -233,15 +673,34 @@ exports[`Types Generator > generateTypes > should generate types for multiple li
233
673
  * DO NOT EDIT - This file is automatically generated
234
674
  */
235
675
 
236
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
237
- import type { PrismaClient } from './prisma-client'
676
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
677
+ import type { PrismaClient, Prisma } from './prisma-client/client'
678
+ import type { PluginServices } from './plugin-types'
679
+
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
+ }
238
695
 
239
- export type User = {
696
+ export type UserOutput = {
240
697
  id: string
241
698
  name: string | null
242
699
  createdAt: Date
243
700
  updatedAt: Date
244
- }
701
+ } & UserVirtualFields
702
+
703
+ export type User = UserOutput
245
704
 
246
705
  export type UserCreateInput = {
247
706
  name?: string
@@ -259,12 +718,70 @@ export type UserWhereInput = {
259
718
  name?: { equals?: string, not?: string }
260
719
  }
261
720
 
262
- export type Post = {
721
+ /**
722
+ * Hook types for User list
723
+ * Properly typed to use Prisma's generated input types
724
+ */
725
+ export type UserHooks = {
726
+ resolveInput?: (args:
727
+ | {
728
+ operation: 'create'
729
+ resolvedData: Prisma.UserCreateInput
730
+ item: undefined
731
+ context: import('@opensaas/stack-core').AccessContext
732
+ }
733
+ | {
734
+ operation: 'update'
735
+ resolvedData: Prisma.UserUpdateInput
736
+ item: User
737
+ context: import('@opensaas/stack-core').AccessContext
738
+ }
739
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
740
+ validateInput?: (args: {
741
+ operation: 'create' | 'update'
742
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
743
+ item?: User
744
+ context: import('@opensaas/stack-core').AccessContext
745
+ addValidationError: (msg: string) => void
746
+ }) => Promise<void>
747
+ beforeOperation?: (args: {
748
+ operation: 'create' | 'update' | 'delete'
749
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
750
+ item?: User
751
+ context: import('@opensaas/stack-core').AccessContext
752
+ }) => Promise<void>
753
+ afterOperation?: (args: {
754
+ operation: 'create' | 'update' | 'delete'
755
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
756
+ item?: User
757
+ context: import('@opensaas/stack-core').AccessContext
758
+ }) => Promise<void>
759
+ }
760
+
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 = {
263
778
  id: string
264
779
  title: string | null
265
780
  createdAt: Date
266
781
  updatedAt: Date
267
- }
782
+ } & PostVirtualFields
783
+
784
+ export type Post = PostOutput
268
785
 
269
786
  export type PostCreateInput = {
270
787
  title?: string
@@ -282,12 +799,70 @@ export type PostWhereInput = {
282
799
  title?: { equals?: string, not?: string }
283
800
  }
284
801
 
285
- export type Comment = {
802
+ /**
803
+ * Hook types for Post list
804
+ * Properly typed to use Prisma's generated input types
805
+ */
806
+ export type PostHooks = {
807
+ resolveInput?: (args:
808
+ | {
809
+ operation: 'create'
810
+ resolvedData: Prisma.PostCreateInput
811
+ item: undefined
812
+ context: import('@opensaas/stack-core').AccessContext
813
+ }
814
+ | {
815
+ operation: 'update'
816
+ resolvedData: Prisma.PostUpdateInput
817
+ item: Post
818
+ context: import('@opensaas/stack-core').AccessContext
819
+ }
820
+ ) => Promise<Prisma.PostCreateInput | Prisma.PostUpdateInput>
821
+ validateInput?: (args: {
822
+ operation: 'create' | 'update'
823
+ resolvedData: Prisma.PostCreateInput | Prisma.PostUpdateInput
824
+ item?: Post
825
+ context: import('@opensaas/stack-core').AccessContext
826
+ addValidationError: (msg: string) => void
827
+ }) => Promise<void>
828
+ beforeOperation?: (args: {
829
+ operation: 'create' | 'update' | 'delete'
830
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
831
+ item?: Post
832
+ context: import('@opensaas/stack-core').AccessContext
833
+ }) => Promise<void>
834
+ afterOperation?: (args: {
835
+ operation: 'create' | 'update' | 'delete'
836
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
837
+ item?: Post
838
+ context: import('@opensaas/stack-core').AccessContext
839
+ }) => Promise<void>
840
+ }
841
+
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 = {
286
859
  id: string
287
860
  content: string | null
288
861
  createdAt: Date
289
862
  updatedAt: Date
290
- }
863
+ } & CommentVirtualFields
864
+
865
+ export type Comment = CommentOutput
291
866
 
292
867
  export type CommentCreateInput = {
293
868
  content?: string
@@ -305,14 +880,119 @@ export type CommentWhereInput = {
305
880
  content?: { equals?: string, not?: string }
306
881
  }
307
882
 
308
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
309
- db: AccessControlledDB<PrismaClient>
883
+ /**
884
+ * Hook types for Comment list
885
+ * Properly typed to use Prisma's generated input types
886
+ */
887
+ export type CommentHooks = {
888
+ resolveInput?: (args:
889
+ | {
890
+ operation: 'create'
891
+ resolvedData: Prisma.CommentCreateInput
892
+ item: undefined
893
+ context: import('@opensaas/stack-core').AccessContext
894
+ }
895
+ | {
896
+ operation: 'update'
897
+ resolvedData: Prisma.CommentUpdateInput
898
+ item: Comment
899
+ context: import('@opensaas/stack-core').AccessContext
900
+ }
901
+ ) => Promise<Prisma.CommentCreateInput | Prisma.CommentUpdateInput>
902
+ validateInput?: (args: {
903
+ operation: 'create' | 'update'
904
+ resolvedData: Prisma.CommentCreateInput | Prisma.CommentUpdateInput
905
+ item?: Comment
906
+ context: import('@opensaas/stack-core').AccessContext
907
+ addValidationError: (msg: string) => void
908
+ }) => Promise<void>
909
+ beforeOperation?: (args: {
910
+ operation: 'create' | 'update' | 'delete'
911
+ resolvedData?: Prisma.CommentCreateInput | Prisma.CommentUpdateInput
912
+ item?: Comment
913
+ context: import('@opensaas/stack-core').AccessContext
914
+ }) => Promise<void>
915
+ afterOperation?: (args: {
916
+ operation: 'create' | 'update' | 'delete'
917
+ resolvedData?: Prisma.CommentCreateInput | Prisma.CommentUpdateInput
918
+ item?: Comment
919
+ context: import('@opensaas/stack-core').AccessContext
920
+ }) => Promise<void>
921
+ }
922
+
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
310
993
  session: TSession
311
- prisma: PrismaClient
312
- storage: StorageUtils
313
994
  serverAction: (props: ServerActionProps) => Promise<unknown>
314
995
  sudo: () => Context<TSession>
315
- _isSudo: boolean
316
996
  }"
317
997
  `;
318
998
 
@@ -322,17 +1002,36 @@ exports[`Types Generator > generateTypes > should handle relationship fields in
322
1002
  * DO NOT EDIT - This file is automatically generated
323
1003
  */
324
1004
 
325
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
326
- import type { PrismaClient } from './prisma-client'
1005
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
1006
+ import type { PrismaClient, Prisma } from './prisma-client/client'
1007
+ import type { PluginServices } from './plugin-types'
1008
+
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
+ }
327
1024
 
328
- export type Post = {
1025
+ export type PostOutput = {
329
1026
  id: string
330
1027
  title: string | null
331
1028
  authorId: string | null
332
- author: User | null
1029
+ author?: UserOutput | null
333
1030
  createdAt: Date
334
1031
  updatedAt: Date
335
- }
1032
+ } & PostVirtualFields
1033
+
1034
+ export type Post = PostOutput
336
1035
 
337
1036
  export type PostCreateInput = {
338
1037
  title?: string
@@ -352,12 +1051,70 @@ export type PostWhereInput = {
352
1051
  title?: { equals?: string, not?: string }
353
1052
  }
354
1053
 
355
- export type User = {
1054
+ /**
1055
+ * Hook types for Post list
1056
+ * Properly typed to use Prisma's generated input types
1057
+ */
1058
+ export type PostHooks = {
1059
+ resolveInput?: (args:
1060
+ | {
1061
+ operation: 'create'
1062
+ resolvedData: Prisma.PostCreateInput
1063
+ item: undefined
1064
+ context: import('@opensaas/stack-core').AccessContext
1065
+ }
1066
+ | {
1067
+ operation: 'update'
1068
+ resolvedData: Prisma.PostUpdateInput
1069
+ item: Post
1070
+ context: import('@opensaas/stack-core').AccessContext
1071
+ }
1072
+ ) => Promise<Prisma.PostCreateInput | Prisma.PostUpdateInput>
1073
+ validateInput?: (args: {
1074
+ operation: 'create' | 'update'
1075
+ resolvedData: Prisma.PostCreateInput | Prisma.PostUpdateInput
1076
+ item?: Post
1077
+ context: import('@opensaas/stack-core').AccessContext
1078
+ addValidationError: (msg: string) => void
1079
+ }) => Promise<void>
1080
+ beforeOperation?: (args: {
1081
+ operation: 'create' | 'update' | 'delete'
1082
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
1083
+ item?: Post
1084
+ context: import('@opensaas/stack-core').AccessContext
1085
+ }) => Promise<void>
1086
+ afterOperation?: (args: {
1087
+ operation: 'create' | 'update' | 'delete'
1088
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
1089
+ item?: Post
1090
+ context: import('@opensaas/stack-core').AccessContext
1091
+ }) => Promise<void>
1092
+ }
1093
+
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 = {
356
1111
  id: string
357
1112
  name: string | null
358
1113
  createdAt: Date
359
1114
  updatedAt: Date
360
- }
1115
+ } & UserVirtualFields
1116
+
1117
+ export type User = UserOutput
361
1118
 
362
1119
  export type UserCreateInput = {
363
1120
  name?: string
@@ -375,14 +1132,101 @@ export type UserWhereInput = {
375
1132
  name?: { equals?: string, not?: string }
376
1133
  }
377
1134
 
378
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
379
- db: AccessControlledDB<PrismaClient>
1135
+ /**
1136
+ * Hook types for User list
1137
+ * Properly typed to use Prisma's generated input types
1138
+ */
1139
+ export type UserHooks = {
1140
+ resolveInput?: (args:
1141
+ | {
1142
+ operation: 'create'
1143
+ resolvedData: Prisma.UserCreateInput
1144
+ item: undefined
1145
+ context: import('@opensaas/stack-core').AccessContext
1146
+ }
1147
+ | {
1148
+ operation: 'update'
1149
+ resolvedData: Prisma.UserUpdateInput
1150
+ item: User
1151
+ context: import('@opensaas/stack-core').AccessContext
1152
+ }
1153
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
1154
+ validateInput?: (args: {
1155
+ operation: 'create' | 'update'
1156
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
1157
+ item?: User
1158
+ context: import('@opensaas/stack-core').AccessContext
1159
+ addValidationError: (msg: string) => void
1160
+ }) => Promise<void>
1161
+ beforeOperation?: (args: {
1162
+ operation: 'create' | 'update' | 'delete'
1163
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
1164
+ item?: User
1165
+ context: import('@opensaas/stack-core').AccessContext
1166
+ }) => Promise<void>
1167
+ afterOperation?: (args: {
1168
+ operation: 'create' | 'update' | 'delete'
1169
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
1170
+ item?: User
1171
+ context: import('@opensaas/stack-core').AccessContext
1172
+ }) => Promise<void>
1173
+ }
1174
+
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
380
1227
  session: TSession
381
- prisma: PrismaClient
382
- storage: StorageUtils
383
1228
  serverAction: (props: ServerActionProps) => Promise<unknown>
384
1229
  sudo: () => Context<TSession>
385
- _isSudo: boolean
386
1230
  }"
387
1231
  `;
388
1232
 
@@ -392,17 +1236,36 @@ exports[`Types Generator > generateTypes > should handle relationship fields in
392
1236
  * DO NOT EDIT - This file is automatically generated
393
1237
  */
394
1238
 
395
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
396
- import type { PrismaClient } from './prisma-client'
1239
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
1240
+ import type { PrismaClient, Prisma } from './prisma-client/client'
1241
+ import type { PluginServices } from './plugin-types'
1242
+
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
+ }
397
1250
 
398
- export type Post = {
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 = {
399
1260
  id: string
400
1261
  title: string | null
401
1262
  authorId: string | null
402
- author: User | null
1263
+ author?: UserOutput | null
403
1264
  createdAt: Date
404
1265
  updatedAt: Date
405
- }
1266
+ } & PostVirtualFields
1267
+
1268
+ export type Post = PostOutput
406
1269
 
407
1270
  export type PostCreateInput = {
408
1271
  title?: string
@@ -422,12 +1285,70 @@ export type PostWhereInput = {
422
1285
  title?: { equals?: string, not?: string }
423
1286
  }
424
1287
 
425
- export type User = {
1288
+ /**
1289
+ * Hook types for Post list
1290
+ * Properly typed to use Prisma's generated input types
1291
+ */
1292
+ export type PostHooks = {
1293
+ resolveInput?: (args:
1294
+ | {
1295
+ operation: 'create'
1296
+ resolvedData: Prisma.PostCreateInput
1297
+ item: undefined
1298
+ context: import('@opensaas/stack-core').AccessContext
1299
+ }
1300
+ | {
1301
+ operation: 'update'
1302
+ resolvedData: Prisma.PostUpdateInput
1303
+ item: Post
1304
+ context: import('@opensaas/stack-core').AccessContext
1305
+ }
1306
+ ) => Promise<Prisma.PostCreateInput | Prisma.PostUpdateInput>
1307
+ validateInput?: (args: {
1308
+ operation: 'create' | 'update'
1309
+ resolvedData: Prisma.PostCreateInput | Prisma.PostUpdateInput
1310
+ item?: Post
1311
+ context: import('@opensaas/stack-core').AccessContext
1312
+ addValidationError: (msg: string) => void
1313
+ }) => Promise<void>
1314
+ beforeOperation?: (args: {
1315
+ operation: 'create' | 'update' | 'delete'
1316
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
1317
+ item?: Post
1318
+ context: import('@opensaas/stack-core').AccessContext
1319
+ }) => Promise<void>
1320
+ afterOperation?: (args: {
1321
+ operation: 'create' | 'update' | 'delete'
1322
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
1323
+ item?: Post
1324
+ context: import('@opensaas/stack-core').AccessContext
1325
+ }) => Promise<void>
1326
+ }
1327
+
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 = {
426
1345
  id: string
427
1346
  name: string | null
428
1347
  createdAt: Date
429
1348
  updatedAt: Date
430
- }
1349
+ } & UserVirtualFields
1350
+
1351
+ export type User = UserOutput
431
1352
 
432
1353
  export type UserCreateInput = {
433
1354
  name?: string
@@ -445,14 +1366,101 @@ export type UserWhereInput = {
445
1366
  name?: { equals?: string, not?: string }
446
1367
  }
447
1368
 
448
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
449
- db: AccessControlledDB<PrismaClient>
1369
+ /**
1370
+ * Hook types for User list
1371
+ * Properly typed to use Prisma's generated input types
1372
+ */
1373
+ export type UserHooks = {
1374
+ resolveInput?: (args:
1375
+ | {
1376
+ operation: 'create'
1377
+ resolvedData: Prisma.UserCreateInput
1378
+ item: undefined
1379
+ context: import('@opensaas/stack-core').AccessContext
1380
+ }
1381
+ | {
1382
+ operation: 'update'
1383
+ resolvedData: Prisma.UserUpdateInput
1384
+ item: User
1385
+ context: import('@opensaas/stack-core').AccessContext
1386
+ }
1387
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
1388
+ validateInput?: (args: {
1389
+ operation: 'create' | 'update'
1390
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
1391
+ item?: User
1392
+ context: import('@opensaas/stack-core').AccessContext
1393
+ addValidationError: (msg: string) => void
1394
+ }) => Promise<void>
1395
+ beforeOperation?: (args: {
1396
+ operation: 'create' | 'update' | 'delete'
1397
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
1398
+ item?: User
1399
+ context: import('@opensaas/stack-core').AccessContext
1400
+ }) => Promise<void>
1401
+ afterOperation?: (args: {
1402
+ operation: 'create' | 'update' | 'delete'
1403
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
1404
+ item?: User
1405
+ context: import('@opensaas/stack-core').AccessContext
1406
+ }) => Promise<void>
1407
+ }
1408
+
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
450
1461
  session: TSession
451
- prisma: PrismaClient
452
- storage: StorageUtils
453
1462
  serverAction: (props: ServerActionProps) => Promise<unknown>
454
1463
  sudo: () => Context<TSession>
455
- _isSudo: boolean
456
1464
  }"
457
1465
  `;
458
1466
 
@@ -462,16 +1470,35 @@ exports[`Types Generator > generateTypes > should handle relationship fields in
462
1470
  * DO NOT EDIT - This file is automatically generated
463
1471
  */
464
1472
 
465
- import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB } from '@opensaas/stack-core'
466
- import type { PrismaClient } from './prisma-client'
1473
+ import type { Session as OpensaasSession, StorageUtils, ServerActionProps, AccessControlledDB, AccessContext } from '@opensaas/stack-core'
1474
+ import type { PrismaClient, Prisma } from './prisma-client/client'
1475
+ import type { PluginServices } from './plugin-types'
1476
+
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
+ }
467
1484
 
468
- export type User = {
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 = {
469
1494
  id: string
470
1495
  name: string | null
471
- posts: Post[]
1496
+ posts?: PostOutput[]
472
1497
  createdAt: Date
473
1498
  updatedAt: Date
474
- }
1499
+ } & UserVirtualFields
1500
+
1501
+ export type User = UserOutput
475
1502
 
476
1503
  export type UserCreateInput = {
477
1504
  name?: string
@@ -491,14 +1518,72 @@ export type UserWhereInput = {
491
1518
  name?: { equals?: string, not?: string }
492
1519
  }
493
1520
 
494
- export type Post = {
1521
+ /**
1522
+ * Hook types for User list
1523
+ * Properly typed to use Prisma's generated input types
1524
+ */
1525
+ export type UserHooks = {
1526
+ resolveInput?: (args:
1527
+ | {
1528
+ operation: 'create'
1529
+ resolvedData: Prisma.UserCreateInput
1530
+ item: undefined
1531
+ context: import('@opensaas/stack-core').AccessContext
1532
+ }
1533
+ | {
1534
+ operation: 'update'
1535
+ resolvedData: Prisma.UserUpdateInput
1536
+ item: User
1537
+ context: import('@opensaas/stack-core').AccessContext
1538
+ }
1539
+ ) => Promise<Prisma.UserCreateInput | Prisma.UserUpdateInput>
1540
+ validateInput?: (args: {
1541
+ operation: 'create' | 'update'
1542
+ resolvedData: Prisma.UserCreateInput | Prisma.UserUpdateInput
1543
+ item?: User
1544
+ context: import('@opensaas/stack-core').AccessContext
1545
+ addValidationError: (msg: string) => void
1546
+ }) => Promise<void>
1547
+ beforeOperation?: (args: {
1548
+ operation: 'create' | 'update' | 'delete'
1549
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
1550
+ item?: User
1551
+ context: import('@opensaas/stack-core').AccessContext
1552
+ }) => Promise<void>
1553
+ afterOperation?: (args: {
1554
+ operation: 'create' | 'update' | 'delete'
1555
+ resolvedData?: Prisma.UserCreateInput | Prisma.UserUpdateInput
1556
+ item?: User
1557
+ context: import('@opensaas/stack-core').AccessContext
1558
+ }) => Promise<void>
1559
+ }
1560
+
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 = {
495
1578
  id: string
496
1579
  title: string | null
497
1580
  authorId: string | null
498
- author: User | null
1581
+ author?: UserOutput | null
499
1582
  createdAt: Date
500
1583
  updatedAt: Date
501
- }
1584
+ } & PostVirtualFields
1585
+
1586
+ export type Post = PostOutput
502
1587
 
503
1588
  export type PostCreateInput = {
504
1589
  title?: string
@@ -518,13 +1603,100 @@ export type PostWhereInput = {
518
1603
  title?: { equals?: string, not?: string }
519
1604
  }
520
1605
 
521
- export type Context<TSession extends OpensaasSession = OpensaasSession> = {
522
- db: AccessControlledDB<PrismaClient>
1606
+ /**
1607
+ * Hook types for Post list
1608
+ * Properly typed to use Prisma's generated input types
1609
+ */
1610
+ export type PostHooks = {
1611
+ resolveInput?: (args:
1612
+ | {
1613
+ operation: 'create'
1614
+ resolvedData: Prisma.PostCreateInput
1615
+ item: undefined
1616
+ context: import('@opensaas/stack-core').AccessContext
1617
+ }
1618
+ | {
1619
+ operation: 'update'
1620
+ resolvedData: Prisma.PostUpdateInput
1621
+ item: Post
1622
+ context: import('@opensaas/stack-core').AccessContext
1623
+ }
1624
+ ) => Promise<Prisma.PostCreateInput | Prisma.PostUpdateInput>
1625
+ validateInput?: (args: {
1626
+ operation: 'create' | 'update'
1627
+ resolvedData: Prisma.PostCreateInput | Prisma.PostUpdateInput
1628
+ item?: Post
1629
+ context: import('@opensaas/stack-core').AccessContext
1630
+ addValidationError: (msg: string) => void
1631
+ }) => Promise<void>
1632
+ beforeOperation?: (args: {
1633
+ operation: 'create' | 'update' | 'delete'
1634
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
1635
+ item?: Post
1636
+ context: import('@opensaas/stack-core').AccessContext
1637
+ }) => Promise<void>
1638
+ afterOperation?: (args: {
1639
+ operation: 'create' | 'update' | 'delete'
1640
+ resolvedData?: Prisma.PostCreateInput | Prisma.PostUpdateInput
1641
+ item?: Post
1642
+ context: import('@opensaas/stack-core').AccessContext
1643
+ }) => Promise<void>
1644
+ }
1645
+
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
523
1698
  session: TSession
524
- prisma: PrismaClient
525
- storage: StorageUtils
526
1699
  serverAction: (props: ServerActionProps) => Promise<unknown>
527
1700
  sudo: () => Context<TSession>
528
- _isSudo: boolean
529
1701
  }"
530
1702
  `;