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.
Files changed (130) hide show
  1. package/README.md +188 -3432
  2. package/dist/client/encodeQueryParams.js +3 -1
  3. package/dist/client/encodeQueryParams.js.map +1 -1
  4. package/dist/copy/misc.d.ts +1 -0
  5. package/dist/copy/misc.js +14 -0
  6. package/dist/copy/misc.js.map +1 -1
  7. package/dist/copy/operationDefinitions.d.ts +4 -1
  8. package/dist/copy/operationDefinitions.js +133 -9
  9. package/dist/copy/operationDefinitions.js.map +1 -1
  10. package/dist/generators/generateFastifyHandler.d.ts +2 -2
  11. package/dist/generators/generateFastifyHandler.js +68 -12
  12. package/dist/generators/generateFastifyHandler.js.map +1 -1
  13. package/dist/generators/generateHonoHandler.d.ts +2 -2
  14. package/dist/generators/generateHonoHandler.js +53 -6
  15. package/dist/generators/generateHonoHandler.js.map +1 -1
  16. package/dist/generators/generateHonoOpenApi.d.ts +13 -0
  17. package/dist/generators/generateHonoOpenApi.js +70 -0
  18. package/dist/generators/generateHonoOpenApi.js.map +1 -0
  19. package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
  20. package/dist/generators/generateImportPrismaStatement.js +6 -0
  21. package/dist/generators/generateImportPrismaStatement.js.map +1 -1
  22. package/dist/generators/generateMcpApp.d.ts +10 -0
  23. package/dist/generators/generateMcpApp.js +113 -0
  24. package/dist/generators/generateMcpApp.js.map +1 -0
  25. package/dist/generators/generateModelMcp.d.ts +9 -0
  26. package/dist/generators/generateModelMcp.js +145 -0
  27. package/dist/generators/generateModelMcp.js.map +1 -0
  28. package/dist/generators/generateModelMetadata.js +29 -15
  29. package/dist/generators/generateModelMetadata.js.map +1 -1
  30. package/dist/generators/generateOperationCore.d.ts +3 -3
  31. package/dist/generators/generateOperationCore.js +51 -16
  32. package/dist/generators/generateOperationCore.js.map +1 -1
  33. package/dist/generators/generateRelationMeta.js +2 -2
  34. package/dist/generators/generateRelationMeta.js.map +1 -1
  35. package/dist/generators/generateRouteConfigType.d.ts +2 -2
  36. package/dist/generators/generateRouteConfigType.js +29 -11
  37. package/dist/generators/generateRouteConfigType.js.map +1 -1
  38. package/dist/generators/generateRouter.d.ts +7 -4
  39. package/dist/generators/generateRouter.js +164 -65
  40. package/dist/generators/generateRouter.js.map +1 -1
  41. package/dist/generators/generateRouterFastify.d.ts +7 -4
  42. package/dist/generators/generateRouterFastify.js +106 -86
  43. package/dist/generators/generateRouterFastify.js.map +1 -1
  44. package/dist/generators/generateRouterHono.d.ts +7 -4
  45. package/dist/generators/generateRouterHono.js +59 -414
  46. package/dist/generators/generateRouterHono.js.map +1 -1
  47. package/dist/generators/generateRouterPartsHono.d.ts +14 -0
  48. package/dist/generators/generateRouterPartsHono.js +180 -0
  49. package/dist/generators/generateRouterPartsHono.js.map +1 -0
  50. package/dist/generators/generateUnifiedDocs.d.ts +1 -1
  51. package/dist/generators/generateUnifiedDocs.js +15 -8
  52. package/dist/generators/generateUnifiedDocs.js.map +1 -1
  53. package/dist/generators/generateUnifiedHandler.d.ts +2 -2
  54. package/dist/generators/generateUnifiedHandler.js +42 -18
  55. package/dist/generators/generateUnifiedHandler.js.map +1 -1
  56. package/dist/guardOptions.js +12 -7
  57. package/dist/guardOptions.js.map +1 -1
  58. package/dist/index.d.ts +3 -1
  59. package/dist/index.js +123 -4
  60. package/dist/index.js.map +1 -1
  61. package/dist/utils/copyFiles.d.ts +1 -1
  62. package/dist/utils/copyFiles.js +42 -7
  63. package/dist/utils/copyFiles.js.map +1 -1
  64. package/dist/utils/importExt.d.ts +1 -1
  65. package/dist/utils/mcpGate.d.ts +10 -0
  66. package/dist/utils/mcpGate.js +118 -0
  67. package/dist/utils/mcpGate.js.map +1 -0
  68. package/dist/utils/pathCasing.d.ts +4 -0
  69. package/dist/utils/pathCasing.js +40 -0
  70. package/dist/utils/pathCasing.js.map +1 -0
  71. package/dist/utils/resolveImportStyle.js +13 -5
  72. package/dist/utils/resolveImportStyle.js.map +1 -1
  73. package/dist/utils/writeFileSafely.js +6 -0
  74. package/dist/utils/writeFileSafely.js.map +1 -1
  75. package/package.json +22 -5
  76. package/src/bin.ts +1 -1
  77. package/src/client/encodeQueryParams.ts +39 -35
  78. package/src/constants.ts +1 -1
  79. package/src/copy/autoIncludePlanner.ts +93 -27
  80. package/src/copy/autoIncludePlannerGuarded.ts +171 -48
  81. package/src/copy/autoIncludeRuntimeGuarded.ts +25 -7
  82. package/src/copy/buildModelOpenApi.ts +229 -176
  83. package/src/copy/concurrency.ts +10 -8
  84. package/src/copy/docsRenderer.ts +14 -15
  85. package/src/copy/errorMapper.ts +68 -19
  86. package/src/copy/guardHelpers.ts +30 -9
  87. package/src/copy/materializedCount.ts +17 -5
  88. package/src/copy/mcpRuntime.ts +1017 -0
  89. package/src/copy/misc.ts +88 -68
  90. package/src/copy/ndjson.ts +72 -0
  91. package/src/copy/operationDefinitions.ts +177 -25
  92. package/src/copy/operationPipeline.ts +267 -0
  93. package/src/copy/operationRuntime.ts +124 -26
  94. package/src/copy/operationSchemas.ts +2773 -0
  95. package/src/copy/pagination.ts +35 -13
  96. package/src/copy/parseQueryParams.ts +47 -48
  97. package/src/copy/projectionDefaults.ts +6 -4
  98. package/src/copy/routeConfig.express.ts +16 -4
  99. package/src/copy/routeConfig.fastify.ts +16 -2
  100. package/src/copy/routeConfig.hono.ts +46 -14
  101. package/src/copy/routeConfig.ts +175 -40
  102. package/src/copy/routerParts.ts +524 -0
  103. package/src/copy/scalarTypes.ts +7 -2
  104. package/src/copy/sse.ts +72 -19
  105. package/src/generators/generateFastifyHandler.ts +77 -20
  106. package/src/generators/generateHonoHandler.ts +62 -14
  107. package/src/generators/generateHonoOpenApi.ts +93 -0
  108. package/src/generators/generateImportPrismaStatement.ts +93 -81
  109. package/src/generators/generateMcpApp.ts +133 -0
  110. package/src/generators/generateModelMcp.ts +208 -0
  111. package/src/generators/generateModelMetadata.ts +40 -22
  112. package/src/generators/generateOperationCore.ts +81 -33
  113. package/src/generators/generateRelationMeta.ts +23 -11
  114. package/src/generators/generateRouteConfigType.ts +39 -13
  115. package/src/generators/generateRouter.ts +171 -68
  116. package/src/generators/generateRouterFastify.ts +117 -89
  117. package/src/generators/generateRouterHono.ts +84 -464
  118. package/src/generators/generateRouterPartsHono.ts +220 -0
  119. package/src/generators/generateUnifiedDocs.ts +29 -8
  120. package/src/generators/generateUnifiedHandler.ts +47 -24
  121. package/src/generators/generateUnifiedScalarUI.ts +1 -1
  122. package/src/guardOptions.ts +105 -92
  123. package/src/index.ts +161 -6
  124. package/src/utils/copyFiles.ts +235 -168
  125. package/src/utils/importExt.ts +2 -2
  126. package/src/utils/mcpGate.ts +157 -0
  127. package/src/utils/pathCasing.ts +42 -0
  128. package/src/utils/resolveImportStyle.ts +37 -15
  129. package/src/utils/strings.ts +2 -2
  130. package/src/utils/writeFileSafely.ts +12 -2
@@ -1,7 +1,8 @@
1
- import { DMMF } from '@prisma/generator-helper'
2
- import { ImportStyle } from '../utils/resolveImportStyle'
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 (strategy === 'throwOnNonReturning' && (name === 'createMany' || name === 'updateMany')) {
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(modelNameLower: string, mode: FindManyPaginatedMode): string {
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(modelNameLower, options.findManyPaginatedMode)
79
+ const paginatedBody = renderPaginatedBody(
80
+ modelNameLower,
81
+ options.findManyPaginatedMode,
82
+ )
73
83
 
74
84
  const standardReadOps = [
75
- 'findFirst', 'findUnique', 'findUniqueOrThrow', 'findFirstOrThrow',
76
- 'count', 'aggregate', 'groupBy',
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((op) => `
81
- export async function ${op}(ctx: OperationContext): Promise<unknown> {
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
- { name: 'createManyAndReturn', method: 'createManyAndReturn', requiredFields: ['data'] },
113
+ {
114
+ name: 'createManyAndReturn',
115
+ method: 'createManyAndReturn',
116
+ requiredFields: ['data'],
117
+ },
97
118
  { name: 'update', method: 'update', requiredFields: ['where', 'data'] },
98
- { name: 'updateMany', method: 'updateMany', requiredFields: ['where', 'data'] },
99
- { name: 'updateManyAndReturn', method: 'updateManyAndReturn', requiredFields: ['where', 'data'] },
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
- { name: 'upsert', method: 'upsert', requiredFields: ['where', 'create', 'update'] },
131
+ {
132
+ name: 'upsert',
133
+ method: 'upsert',
134
+ requiredFields: ['where', 'create', 'update'],
135
+ },
103
136
  ]
104
137
 
105
- const writeHandlers = writeOps.map((op) => {
106
- const decision = decideWriteOp(op.name, op.method, writeStrategy)
138
+ const writeHandlers = writeOps
139
+ .map((op) => {
140
+ const decision = decideWriteOp(op.name, op.method, writeStrategy)
107
141
 
108
- if (decision.throw) {
109
- return `
110
- export async function ${op.name}(_ctx: OperationContext): Promise<unknown> {
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
- const method = decision.method
116
- const validationLines = op.requiredFields
117
- .map((field) => ` requireBodyField(body, '${field}')`)
118
- .join('\n')
149
+ const method = decision.method
150
+ const validationLines = op.requiredFields
151
+ .map((field) => ` requireBodyField(body, '${field}')`)
152
+ .join('\n')
119
153
 
120
- return `
121
- export async function ${op.name}(ctx: OperationContext): Promise<unknown> {
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
- }).join('\n')
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
- PrismaClientLike,
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
- export async function findMany(ctx: OperationContext): Promise<unknown> {
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
- export async function findManyPaginated(
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 target.fields.find(
36
- (f) =>
37
- f.kind === 'object' &&
38
- f.relationName === relationName &&
39
- f.type === selfModelName &&
40
- !(isSelfRelation && f.name === selfFieldName),
41
- ) || null
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(models, field.type, field.relationName, selfModelName, field.name)
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(options: GenerateRelationMetaOptions): string {
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(options: GenerateRelationModelsIndexOptions): string {
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 { OPERATION_METADATA, READ_OPERATION_NAMES } from '../copy/operationDefinitions'
4
+ import {
5
+ OPERATION_METADATA,
6
+ READ_OPERATION_NAMES,
7
+ } from '../copy/operationDefinitions'
5
8
 
6
- const ROUTER_OPERATIONS = OPERATION_METADATA
7
- .filter((m) => m.name !== 'updateEach')
8
- .map((m) => m.name)
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 = any, TEnv extends { Variables: Record<string, unknown> } = { Variables: Record<string, unknown> }>`
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 = any>`
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 progressiveTypeImport = supportsProgressive
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
- progressiveTypeImport +
71
- `export type ${m}RouteConfig${generics} = ${baseConfig}\n`
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
- progressiveTypeImport +
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
+ }