Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions packages/app/api-contracts/src/apiContracts.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { ZodSchema, z } from 'zod/v4'
import type { AnyDeleteRoute, AnyGetRoute, AnyPayloadRoute } from './contractService.js'
import type { HttpStatusCode } from './HttpStatusCodes.ts'

export type { HttpStatusCode }
Expand Down Expand Up @@ -264,3 +265,64 @@ export function mapRouteToPath(

return routeDefinition.pathResolver(resolverParams)
}

export type InferGetDetails<Route extends AnyGetRoute> = Route extends GetRouteDefinition<
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never

export type InferDeleteDetails<Route extends AnyDeleteRoute> = Route extends DeleteRouteDefinition<
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never

export type InferPayloadDetails<Route extends AnyPayloadRoute> =
Route extends PayloadRouteDefinition<
infer RequestBodySchema,
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
requestBodySchema: RequestBodySchema
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never

Comment on lines +269 to +325
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Add JSDoc documentation for the new inference types

These type utilities would benefit from documentation explaining their purpose and usage.

Example documentation:

+/**
+ * Extracts type information from a GET route definition including schemas,
+ * parameters, and response metadata
+ * @example
+ * type Details = InferGetDetails<typeof myGetRoute>
+ */
 export type InferGetDetails<Route extends AnyGetRoute> = Route extends GetRouteDefinition<
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export type InferGetDetails<Route extends AnyGetRoute> = Route extends GetRouteDefinition<
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never
export type InferDeleteDetails<Route extends AnyDeleteRoute> = Route extends DeleteRouteDefinition<
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never
export type InferPayloadDetails<Route extends AnyPayloadRoute> =
Route extends PayloadRouteDefinition<
infer RequestBodySchema,
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
requestBodySchema: RequestBodySchema
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never
/**
* Extracts type information from a GET route definition including schemas,
* parameters, and response metadata
* @example
* type Details = InferGetDetails<typeof myGetRoute>
*/
export type InferGetDetails<Route extends AnyGetRoute> = Route extends GetRouteDefinition<
infer SuccessResponseBodySchema,
infer PathParamsSchema,
infer RequestQuerySchema,
infer RequestHeaderSchema,
infer IsNonJSONResponseExpected,
infer IsEmptyResponseExpected
>
? {
responseBodySchema: SuccessResponseBodySchema
pathParamsSchema: PathParamsSchema
requestQuerySchema: RequestQuerySchema
requestHeaderSchema: RequestHeaderSchema
isNonJSONResponseExpected: IsNonJSONResponseExpected
isEmptyResponseExpected: IsEmptyResponseExpected
}
: never
🤖 Prompt for AI Agents
In packages/app/api-contracts/src/apiContracts.ts between lines 269 and 325, the
new type inference utilities lack JSDoc comments explaining their purpose and
usage. Add clear JSDoc documentation above each type definition describing what
the type infers, the generic parameters it accepts, and what the resulting type
represents to improve code readability and maintainability.

export * from './contractService.js'
export * from './headers/createHeaderBuilderMiddleware.js'
export * from './headers/headerBuilder.js'
Loading
Loading