prisma-generator-express 1.66.0 → 1.68.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.
- package/README.md +188 -3432
- package/dist/client/encodeQueryParams.js +3 -1
- package/dist/client/encodeQueryParams.js.map +1 -1
- package/dist/copy/misc.d.ts +1 -0
- package/dist/copy/misc.js +14 -0
- package/dist/copy/misc.js.map +1 -1
- package/dist/copy/operationDefinitions.d.ts +4 -1
- package/dist/copy/operationDefinitions.js +133 -9
- package/dist/copy/operationDefinitions.js.map +1 -1
- package/dist/generators/generateFastifyHandler.d.ts +2 -2
- package/dist/generators/generateFastifyHandler.js +68 -12
- package/dist/generators/generateFastifyHandler.js.map +1 -1
- package/dist/generators/generateHonoHandler.d.ts +2 -2
- package/dist/generators/generateHonoHandler.js +53 -6
- package/dist/generators/generateHonoHandler.js.map +1 -1
- package/dist/generators/generateHonoOpenApi.d.ts +13 -0
- package/dist/generators/generateHonoOpenApi.js +70 -0
- package/dist/generators/generateHonoOpenApi.js.map +1 -0
- package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
- package/dist/generators/generateImportPrismaStatement.js +6 -0
- package/dist/generators/generateImportPrismaStatement.js.map +1 -1
- package/dist/generators/generateMcpApp.d.ts +10 -0
- package/dist/generators/generateMcpApp.js +113 -0
- package/dist/generators/generateMcpApp.js.map +1 -0
- package/dist/generators/generateModelMcp.d.ts +9 -0
- package/dist/generators/generateModelMcp.js +145 -0
- package/dist/generators/generateModelMcp.js.map +1 -0
- package/dist/generators/generateModelMetadata.js +29 -15
- package/dist/generators/generateModelMetadata.js.map +1 -1
- package/dist/generators/generateOperationCore.d.ts +3 -3
- package/dist/generators/generateOperationCore.js +51 -16
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRelationMeta.js +2 -2
- package/dist/generators/generateRelationMeta.js.map +1 -1
- package/dist/generators/generateRouteConfigType.d.ts +2 -2
- package/dist/generators/generateRouteConfigType.js +29 -11
- package/dist/generators/generateRouteConfigType.js.map +1 -1
- package/dist/generators/generateRouter.d.ts +7 -4
- package/dist/generators/generateRouter.js +164 -65
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +7 -4
- package/dist/generators/generateRouterFastify.js +106 -86
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/generators/generateRouterHono.d.ts +7 -4
- package/dist/generators/generateRouterHono.js +59 -414
- package/dist/generators/generateRouterHono.js.map +1 -1
- package/dist/generators/generateRouterPartsHono.d.ts +14 -0
- package/dist/generators/generateRouterPartsHono.js +180 -0
- package/dist/generators/generateRouterPartsHono.js.map +1 -0
- package/dist/generators/generateUnifiedDocs.d.ts +1 -1
- package/dist/generators/generateUnifiedDocs.js +15 -8
- package/dist/generators/generateUnifiedDocs.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.d.ts +2 -2
- package/dist/generators/generateUnifiedHandler.js +42 -18
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/guardOptions.js +12 -7
- package/dist/guardOptions.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +123 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.d.ts +1 -1
- package/dist/utils/copyFiles.js +42 -7
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/importExt.d.ts +1 -1
- package/dist/utils/mcpGate.d.ts +10 -0
- package/dist/utils/mcpGate.js +118 -0
- package/dist/utils/mcpGate.js.map +1 -0
- package/dist/utils/pathCasing.d.ts +4 -0
- package/dist/utils/pathCasing.js +40 -0
- package/dist/utils/pathCasing.js.map +1 -0
- package/dist/utils/resolveImportStyle.js +13 -5
- package/dist/utils/resolveImportStyle.js.map +1 -1
- package/dist/utils/writeFileSafely.js +6 -0
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +22 -5
- package/src/bin.ts +1 -1
- package/src/client/encodeQueryParams.ts +39 -35
- package/src/constants.ts +1 -1
- package/src/copy/autoIncludePlanner.ts +93 -27
- package/src/copy/autoIncludePlannerGuarded.ts +171 -48
- package/src/copy/autoIncludeRuntimeGuarded.ts +25 -7
- package/src/copy/buildModelOpenApi.ts +229 -176
- package/src/copy/concurrency.ts +10 -8
- package/src/copy/docsRenderer.ts +14 -15
- package/src/copy/errorMapper.ts +68 -19
- package/src/copy/guardHelpers.ts +30 -9
- package/src/copy/materializedCount.ts +17 -5
- package/src/copy/mcpRuntime.ts +1017 -0
- package/src/copy/misc.ts +88 -68
- package/src/copy/ndjson.ts +72 -0
- package/src/copy/operationDefinitions.ts +177 -25
- package/src/copy/operationPipeline.ts +267 -0
- package/src/copy/operationRuntime.ts +124 -26
- package/src/copy/operationSchemas.ts +2773 -0
- package/src/copy/pagination.ts +35 -13
- package/src/copy/parseQueryParams.ts +47 -48
- package/src/copy/projectionDefaults.ts +6 -4
- package/src/copy/routeConfig.express.ts +16 -4
- package/src/copy/routeConfig.fastify.ts +16 -2
- package/src/copy/routeConfig.hono.ts +46 -14
- package/src/copy/routeConfig.ts +175 -40
- package/src/copy/routerParts.ts +524 -0
- package/src/copy/scalarTypes.ts +7 -2
- package/src/copy/sse.ts +72 -19
- package/src/generators/generateFastifyHandler.ts +77 -20
- package/src/generators/generateHonoHandler.ts +62 -14
- package/src/generators/generateHonoOpenApi.ts +93 -0
- package/src/generators/generateImportPrismaStatement.ts +93 -81
- package/src/generators/generateMcpApp.ts +133 -0
- package/src/generators/generateModelMcp.ts +208 -0
- package/src/generators/generateModelMetadata.ts +40 -22
- package/src/generators/generateOperationCore.ts +81 -33
- package/src/generators/generateRelationMeta.ts +23 -11
- package/src/generators/generateRouteConfigType.ts +39 -13
- package/src/generators/generateRouter.ts +171 -68
- package/src/generators/generateRouterFastify.ts +117 -89
- package/src/generators/generateRouterHono.ts +84 -464
- package/src/generators/generateRouterPartsHono.ts +220 -0
- package/src/generators/generateUnifiedDocs.ts +29 -8
- package/src/generators/generateUnifiedHandler.ts +47 -24
- package/src/generators/generateUnifiedScalarUI.ts +1 -1
- package/src/guardOptions.ts +105 -92
- package/src/index.ts +161 -6
- package/src/utils/copyFiles.ts +235 -168
- package/src/utils/importExt.ts +2 -2
- package/src/utils/mcpGate.ts +157 -0
- package/src/utils/pathCasing.ts +42 -0
- package/src/utils/resolveImportStyle.ts +37 -15
- package/src/utils/strings.ts +2 -2
- package/src/utils/writeFileSafely.ts +12 -2
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { OPERATION_METADATA } from '../copy/operationDefinitions'
|
|
2
|
+
import type { DMMF } from '@prisma/generator-helper'
|
|
3
|
+
import type { ImportStyle } from '../utils/resolveImportStyle'
|
|
3
4
|
import { importExt } from '../utils/importExt'
|
|
4
|
-
import { WriteStrategy, FindManyPaginatedMode } from '../constants'
|
|
5
|
+
import type { WriteStrategy, FindManyPaginatedMode } from '../constants'
|
|
5
6
|
|
|
6
7
|
export interface ModelCoreOptions {
|
|
7
8
|
model: DMMF.Model
|
|
@@ -17,7 +18,10 @@ function decideWriteOp(
|
|
|
17
18
|
defaultMethod: string,
|
|
18
19
|
strategy: WriteStrategy,
|
|
19
20
|
): WriteOpDecision {
|
|
20
|
-
if (
|
|
21
|
+
if (
|
|
22
|
+
strategy === 'throwOnNonReturning' &&
|
|
23
|
+
(name === 'createMany' || name === 'updateMany')
|
|
24
|
+
) {
|
|
21
25
|
return { throw: true, method: defaultMethod }
|
|
22
26
|
}
|
|
23
27
|
if (strategy === 'forceReturn') {
|
|
@@ -27,7 +31,10 @@ function decideWriteOp(
|
|
|
27
31
|
return { method: defaultMethod }
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
function renderPaginatedBody(
|
|
34
|
+
function renderPaginatedBody(
|
|
35
|
+
modelNameLower: string,
|
|
36
|
+
mode: FindManyPaginatedMode,
|
|
37
|
+
): string {
|
|
31
38
|
if (mode === 'transaction') {
|
|
32
39
|
return `
|
|
33
40
|
const txClient = extended as { $transaction?: <T>(fn: (tx: unknown) => Promise<T>) => Promise<T> }
|
|
@@ -69,16 +76,25 @@ export function generateModelCore(options: ModelCoreOptions): string {
|
|
|
69
76
|
const modelName = options.model.name
|
|
70
77
|
const modelNameLower = modelName.charAt(0).toLowerCase() + modelName.slice(1)
|
|
71
78
|
const writeStrategy = options.writeStrategy
|
|
72
|
-
const paginatedBody = renderPaginatedBody(
|
|
79
|
+
const paginatedBody = renderPaginatedBody(
|
|
80
|
+
modelNameLower,
|
|
81
|
+
options.findManyPaginatedMode,
|
|
82
|
+
)
|
|
73
83
|
|
|
74
84
|
const standardReadOps = [
|
|
75
|
-
'findFirst',
|
|
76
|
-
'
|
|
85
|
+
'findFirst',
|
|
86
|
+
'findUnique',
|
|
87
|
+
'findUniqueOrThrow',
|
|
88
|
+
'findFirstOrThrow',
|
|
89
|
+
'count',
|
|
90
|
+
'aggregate',
|
|
91
|
+
'groupBy',
|
|
77
92
|
]
|
|
78
93
|
|
|
79
94
|
const standardReadHandlers = standardReadOps
|
|
80
|
-
.map(
|
|
81
|
-
|
|
95
|
+
.map(
|
|
96
|
+
(op) => `
|
|
97
|
+
async function default_${op}(ctx: OperationContext): Promise<unknown> {
|
|
82
98
|
const query = ctx.parsedQuery || {}
|
|
83
99
|
const extended = await getExtendedClient(ctx)
|
|
84
100
|
const delegate = getDelegate(extended, '${modelNameLower}')
|
|
@@ -87,38 +103,56 @@ export async function ${op}(ctx: OperationContext): Promise<unknown> {
|
|
|
87
103
|
return delegate.guard(ctx.guardShape, ctx.guardCaller).${op}(query)
|
|
88
104
|
}
|
|
89
105
|
return delegate.${op}(query)
|
|
90
|
-
}
|
|
106
|
+
}`,
|
|
107
|
+
)
|
|
91
108
|
.join('\n')
|
|
92
109
|
|
|
93
110
|
const writeOps = [
|
|
94
111
|
{ name: 'create', method: 'create', requiredFields: ['data'] },
|
|
95
112
|
{ name: 'createMany', method: 'createMany', requiredFields: ['data'] },
|
|
96
|
-
{
|
|
113
|
+
{
|
|
114
|
+
name: 'createManyAndReturn',
|
|
115
|
+
method: 'createManyAndReturn',
|
|
116
|
+
requiredFields: ['data'],
|
|
117
|
+
},
|
|
97
118
|
{ name: 'update', method: 'update', requiredFields: ['where', 'data'] },
|
|
98
|
-
{
|
|
99
|
-
|
|
119
|
+
{
|
|
120
|
+
name: 'updateMany',
|
|
121
|
+
method: 'updateMany',
|
|
122
|
+
requiredFields: ['where', 'data'],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'updateManyAndReturn',
|
|
126
|
+
method: 'updateManyAndReturn',
|
|
127
|
+
requiredFields: ['where', 'data'],
|
|
128
|
+
},
|
|
100
129
|
{ name: 'deleteUnique', method: 'delete', requiredFields: ['where'] },
|
|
101
130
|
{ name: 'deleteMany', method: 'deleteMany', requiredFields: ['where'] },
|
|
102
|
-
{
|
|
131
|
+
{
|
|
132
|
+
name: 'upsert',
|
|
133
|
+
method: 'upsert',
|
|
134
|
+
requiredFields: ['where', 'create', 'update'],
|
|
135
|
+
},
|
|
103
136
|
]
|
|
104
137
|
|
|
105
|
-
const writeHandlers = writeOps
|
|
106
|
-
|
|
138
|
+
const writeHandlers = writeOps
|
|
139
|
+
.map((op) => {
|
|
140
|
+
const decision = decideWriteOp(op.name, op.method, writeStrategy)
|
|
107
141
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
142
|
+
if (decision.throw) {
|
|
143
|
+
return `
|
|
144
|
+
async function default_${op.name}(_ctx: OperationContext): Promise<unknown> {
|
|
111
145
|
throw new HttpError(501, '${op.name} is disabled by writeStrategy="${writeStrategy}"')
|
|
112
146
|
}`
|
|
113
|
-
|
|
147
|
+
}
|
|
114
148
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
149
|
+
const method = decision.method
|
|
150
|
+
const validationLines = op.requiredFields
|
|
151
|
+
.map((field) => ` requireBodyField(body, '${field}')`)
|
|
152
|
+
.join('\n')
|
|
119
153
|
|
|
120
|
-
|
|
121
|
-
|
|
154
|
+
return `
|
|
155
|
+
async function default_${op.name}(ctx: OperationContext): Promise<unknown> {
|
|
122
156
|
const body = validateBody(ctx.body)
|
|
123
157
|
${validationLines}
|
|
124
158
|
const extended = await getExtendedClient(ctx)
|
|
@@ -129,11 +163,24 @@ ${validationLines}
|
|
|
129
163
|
}
|
|
130
164
|
return delegate.${method}(body)
|
|
131
165
|
}`
|
|
132
|
-
|
|
166
|
+
})
|
|
167
|
+
.join('\n')
|
|
168
|
+
|
|
169
|
+
const wrappers = OPERATION_METADATA.filter((op) => op.name !== 'updateEach')
|
|
170
|
+
.map(
|
|
171
|
+
(op) => `
|
|
172
|
+
export async function ${op.coreName}(ctx: OperationContext): Promise<${op.name === 'findManyPaginated' ? '{ data: unknown[]; total: number; hasMore: boolean }' : 'unknown'}> {
|
|
173
|
+
const input = ${op.kind === 'read' ? 'ctx.parsedQuery || {}' : 'validateBody(ctx.body)'}
|
|
174
|
+
${op.requiredBodyFields.map((field) => ` requireBodyField(input, '${field}')`).join('\n')}
|
|
175
|
+
return executeOperationOverride(ctx, '${modelNameLower}', '${op.name}', input, () => default_${op.coreName}(ctx))
|
|
176
|
+
}`,
|
|
177
|
+
)
|
|
178
|
+
.join('\n')
|
|
133
179
|
|
|
134
180
|
return `import {
|
|
135
|
-
OperationContext,
|
|
136
|
-
|
|
181
|
+
type OperationContext,
|
|
182
|
+
executeOperationOverride,
|
|
183
|
+
type PrismaClientLike,
|
|
137
184
|
getExtendedClient,
|
|
138
185
|
getDelegate,
|
|
139
186
|
validateBody,
|
|
@@ -144,7 +191,7 @@ import { applyPaginationLimits, countForPagination } from '../pagination${ext}'
|
|
|
144
191
|
import { assertGuard } from '../guardHelpers${ext}'
|
|
145
192
|
import { mapLimited } from '../concurrency${ext}'
|
|
146
193
|
|
|
147
|
-
|
|
194
|
+
async function default_findMany(ctx: OperationContext): Promise<unknown> {
|
|
148
195
|
const rawQuery = ctx.parsedQuery || {}
|
|
149
196
|
const query = applyPaginationLimits(rawQuery, ctx.paginationConfig, !!ctx.guardShape)
|
|
150
197
|
const extended = await getExtendedClient(ctx)
|
|
@@ -155,10 +202,11 @@ export async function findMany(ctx: OperationContext): Promise<unknown> {
|
|
|
155
202
|
}
|
|
156
203
|
return delegate.findMany(query)
|
|
157
204
|
}
|
|
205
|
+
${wrappers}
|
|
158
206
|
${standardReadHandlers}
|
|
159
207
|
${writeHandlers}
|
|
160
208
|
|
|
161
|
-
|
|
209
|
+
async function default_findManyPaginated(
|
|
162
210
|
ctx: OperationContext,
|
|
163
211
|
): Promise<{ data: unknown[]; total: number; hasMore: boolean }> {
|
|
164
212
|
const rawQuery = ctx.parsedQuery || {}
|
|
@@ -252,4 +300,4 @@ export async function updateEach(
|
|
|
252
300
|
return results
|
|
253
301
|
}
|
|
254
302
|
`
|
|
255
|
-
}
|
|
303
|
+
}
|
|
@@ -32,13 +32,15 @@ function findOppositeField(
|
|
|
32
32
|
const target = models.find((m) => m.name === targetModelName)
|
|
33
33
|
if (!target) return null
|
|
34
34
|
const isSelfRelation = targetModelName === selfModelName
|
|
35
|
-
return
|
|
36
|
-
(
|
|
37
|
-
f
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
return (
|
|
36
|
+
target.fields.find(
|
|
37
|
+
(f) =>
|
|
38
|
+
f.kind === 'object' &&
|
|
39
|
+
f.relationName === relationName &&
|
|
40
|
+
f.type === selfModelName &&
|
|
41
|
+
!(isSelfRelation && f.name === selfFieldName),
|
|
42
|
+
) || null
|
|
43
|
+
)
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
function computeRelation(
|
|
@@ -61,7 +63,13 @@ function computeRelation(
|
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
const opposite = findOppositeField(
|
|
66
|
+
const opposite = findOppositeField(
|
|
67
|
+
models,
|
|
68
|
+
field.type,
|
|
69
|
+
field.relationName,
|
|
70
|
+
selfModelName,
|
|
71
|
+
field.name,
|
|
72
|
+
)
|
|
65
73
|
if (opposite) {
|
|
66
74
|
const oppFrom = (opposite.relationFromFields ?? []) as string[]
|
|
67
75
|
const oppTo = (opposite.relationToFields ?? []) as string[]
|
|
@@ -118,7 +126,9 @@ export interface GenerateRelationMetaOptions {
|
|
|
118
126
|
importStyle: ImportStyle
|
|
119
127
|
}
|
|
120
128
|
|
|
121
|
-
export function generateRelationMeta(
|
|
129
|
+
export function generateRelationMeta(
|
|
130
|
+
options: GenerateRelationMetaOptions,
|
|
131
|
+
): string {
|
|
122
132
|
const ext = importExt(options.importStyle)
|
|
123
133
|
const meta = buildModelMeta(options.model, options.allModels)
|
|
124
134
|
return `import type { ModelRelationMap } from '../autoIncludePlanner${ext}'
|
|
@@ -132,7 +142,9 @@ export interface GenerateRelationModelsIndexOptions {
|
|
|
132
142
|
importStyle: ImportStyle
|
|
133
143
|
}
|
|
134
144
|
|
|
135
|
-
export function generateRelationModelsIndex(
|
|
145
|
+
export function generateRelationModelsIndex(
|
|
146
|
+
options: GenerateRelationModelsIndexOptions,
|
|
147
|
+
): string {
|
|
136
148
|
const ext = importExt(options.importStyle)
|
|
137
149
|
const imports = options.modelNames
|
|
138
150
|
.map((n) => `import { ${n}Relations } from './${n}/${n}Relations${ext}'`)
|
|
@@ -147,4 +159,4 @@ export const relationModels: Record<string, ModelRelationMap> = {
|
|
|
147
159
|
${entries}
|
|
148
160
|
}
|
|
149
161
|
`
|
|
150
|
-
}
|
|
162
|
+
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { ImportStyle } from '../utils/resolveImportStyle'
|
|
1
|
+
import type { ImportStyle } from '../utils/resolveImportStyle'
|
|
2
2
|
import { importExt } from '../utils/importExt'
|
|
3
3
|
import type { Target } from '../constants'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
OPERATION_METADATA,
|
|
6
|
+
READ_OPERATION_NAMES,
|
|
7
|
+
} from '../copy/operationDefinitions'
|
|
5
8
|
|
|
6
|
-
const ROUTER_OPERATIONS = OPERATION_METADATA
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
const ROUTER_OPERATIONS = OPERATION_METADATA.filter(
|
|
10
|
+
(m) => m.name !== 'updateEach',
|
|
11
|
+
).map((m) => m.name)
|
|
9
12
|
|
|
10
13
|
function capitalize(str: string): string {
|
|
11
14
|
return str.charAt(0).toUpperCase() + str.slice(1)
|
|
@@ -13,15 +16,15 @@ function capitalize(str: string): string {
|
|
|
13
16
|
|
|
14
17
|
function requestTypeFor(target: Target): string {
|
|
15
18
|
if (target === 'fastify') return `import('fastify').FastifyRequest`
|
|
16
|
-
if (target === 'hono') return `import('hono').Context<TEnv
|
|
19
|
+
if (target === 'hono') return `import('hono').Context<GeneratedHonoEnv<TEnv>>`
|
|
17
20
|
return `import('express').Request`
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
function configGenericsFor(target: Target): string {
|
|
21
24
|
if (target === 'hono') {
|
|
22
|
-
return `<TCtx = unknown, TPrisma =
|
|
25
|
+
return `<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike, TEnv extends { Variables: Record<string, unknown> } = { Variables: Record<string, unknown> }>`
|
|
23
26
|
}
|
|
24
|
-
return `<TCtx = unknown, TPrisma =
|
|
27
|
+
return `<TCtx = unknown, TPrisma extends PrismaClientLike = PrismaClientLike>`
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
function routeConfigBaseFor(target: Target): string {
|
|
@@ -50,6 +53,7 @@ export function generateRouteConfigType(
|
|
|
50
53
|
guardShapesImport: string | null,
|
|
51
54
|
importStyle: ImportStyle,
|
|
52
55
|
target: Target,
|
|
56
|
+
clientImport?: string,
|
|
53
57
|
): string {
|
|
54
58
|
const ext = importExt(importStyle)
|
|
55
59
|
const m = modelName
|
|
@@ -61,14 +65,33 @@ export function generateRouteConfigType(
|
|
|
61
65
|
const afterRef = afterHookRef(target, hookHandlerType)
|
|
62
66
|
const requestType = requestTypeFor(target)
|
|
63
67
|
|
|
64
|
-
const
|
|
68
|
+
const clientPath = clientImport ? `${clientImport}${ext}` : '@prisma/client'
|
|
69
|
+
const delegate = `${m.charAt(0).toLowerCase() + m.slice(1)}`
|
|
70
|
+
const modelDelegate = clientImport
|
|
71
|
+
? `PrismaClient['${delegate}']`
|
|
72
|
+
: `(TPrisma extends Record<'${delegate}', infer D> ? D : never)`
|
|
73
|
+
const overrideImports = `import type { Prisma${clientImport ? ', PrismaClient' : ''} } from '${clientPath}'\nimport type { OperationOverride } from '../operationRuntime${ext}'\n`
|
|
74
|
+
const overrideType = (op: string) => {
|
|
75
|
+
const method = op === 'findManyPaginated' ? 'findMany' : op
|
|
76
|
+
const args = `Prisma.Args<${modelDelegate}, '${method}'>`
|
|
77
|
+
const result = `Prisma.Result<${modelDelegate}, ${args}, '${method}'>`
|
|
78
|
+
const output =
|
|
79
|
+
op === 'findManyPaginated'
|
|
80
|
+
? `{ data: ${result}; total: number; hasMore: boolean }`
|
|
81
|
+
: result
|
|
82
|
+
const methods =
|
|
83
|
+
op === 'findManyPaginated' ? "'findMany' | 'count'" : `'${method}'`
|
|
84
|
+
return `OperationOverride<${args}, ${output}, TCtx, Readonly<{ ${delegate}: Pick<${modelDelegate}, Extract<keyof ${modelDelegate}, ${methods}>> }>>`
|
|
85
|
+
}
|
|
86
|
+
const typeImports = supportsProgressive
|
|
65
87
|
? `import type { ProgressiveVariantConfig, ProgressiveStage } from '../routeConfig.target${ext}'\n`
|
|
66
88
|
: ''
|
|
67
89
|
|
|
68
90
|
if (!guardShapesImport) {
|
|
69
91
|
return (
|
|
70
|
-
|
|
71
|
-
|
|
92
|
+
overrideImports +
|
|
93
|
+
typeImports +
|
|
94
|
+
`export type ${m}RouteConfig${generics} = Omit<${baseConfig}, ${ROUTER_OPERATIONS.map((op) => `'${op}'`).join(' | ')}> & {\n${ROUTER_OPERATIONS.map((op) => ` ${op}?: (Omit<Exclude<${baseConfig}['${op}'], false | undefined>, 'override'> & { override?: ${overrideType(op)} }) | false`).join('\n')}\n}\n`
|
|
72
95
|
)
|
|
73
96
|
}
|
|
74
97
|
|
|
@@ -95,6 +118,8 @@ export function generateRouteConfigType(
|
|
|
95
118
|
const c = capitalize(routerOp)
|
|
96
119
|
const isRead = READ_OPERATION_NAMES.has(routerOp)
|
|
97
120
|
const commonLines = [
|
|
121
|
+
` override?: ${overrideType(routerOp)}`,
|
|
122
|
+
` authorize?: ${beforeRef}`,
|
|
98
123
|
` before?: ${beforeRef}[]`,
|
|
99
124
|
` after?: ${afterRef}[]`,
|
|
100
125
|
` pagination?: Partial<PaginationConfig>`,
|
|
@@ -133,7 +158,8 @@ export function generateRouteConfigType(
|
|
|
133
158
|
const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ')
|
|
134
159
|
|
|
135
160
|
return (
|
|
136
|
-
|
|
161
|
+
overrideImports +
|
|
162
|
+
typeImports +
|
|
137
163
|
`import type {\n ${opShapeImports}\n} from '${guardShapesImport}${ext}'\n\n` +
|
|
138
164
|
`${shapeOrFnAliases}\n\n` +
|
|
139
165
|
`export type ${m}RouteConfig${generics} = Omit<\n` +
|
|
@@ -144,4 +170,4 @@ export function generateRouteConfigType(
|
|
|
144
170
|
` resolveContext?: (request: ${requestType}) => TCtx | Promise<TCtx>\n` +
|
|
145
171
|
`${overrides}\n}\n`
|
|
146
172
|
)
|
|
147
|
-
}
|
|
173
|
+
}
|