@ts-rest/nest
Advanced tools
Comparing version 3.16.0 to 3.16.1
83
index.js
@@ -1,7 +0,10 @@ | ||
import { SetMetadata, createParamDecorator, BadRequestException, Injectable, UseInterceptors, applyDecorators, Put, Patch, Post, Get, Delete } from '@nestjs/common'; | ||
import { parseJsonQueryObject, checkZodSchema, zodErrorResponse, isAppRouteResponse, validateResponse } from '@ts-rest/core'; | ||
import { SetMetadata, Injectable, UseInterceptors, applyDecorators, Put, Patch, Post, Get, Delete, createParamDecorator, BadRequestException } from '@nestjs/common'; | ||
import { map } from 'rxjs'; | ||
import { isAppRouteResponse, validateResponse, parseJsonQueryObject, checkZodSchema, zodErrorResponse } from '@ts-rest/core'; | ||
import { Reflector } from '@nestjs/core'; | ||
const JsonQuerySymbol = Symbol('JsonQuery'); | ||
const TsRestAppRouteMetadataKey = Symbol('ts-rest-app-route'); | ||
const JsonQuerySymbol = Symbol('ts-rest-json-query'); | ||
const ValidateResponsesSymbol = Symbol('ts-rest-validate-responses'); | ||
const JsonQuery = (jsonQuery = true) => { | ||
@@ -23,36 +26,2 @@ return SetMetadata(JsonQuerySymbol, jsonQuery); | ||
const tsRestAppRouteMetadataKey = Symbol('ts-rest-app-route'); | ||
const TsRestRequest = createParamDecorator((_, ctx) => { | ||
var _a; | ||
const req = ctx.switchToHttp().getRequest(); | ||
const appRoute = Reflect.getMetadata(tsRestAppRouteMetadataKey, ctx.getHandler()); | ||
if (!appRoute) { | ||
throw new Error('Make sure your route is decorated with @TsRest()'); | ||
} | ||
const isJsonQuery = !!((_a = Reflect.getMetadata(JsonQuerySymbol, ctx.getHandler())) !== null && _a !== void 0 ? _a : Reflect.getMetadata(JsonQuerySymbol, ctx.getClass())); | ||
const query = isJsonQuery | ||
? parseJsonQueryObject(req.query) | ||
: req.query; | ||
const queryResult = checkZodSchema(query, appRoute.query); | ||
if (!queryResult.success) { | ||
throw new BadRequestException(zodErrorResponse(queryResult.error)); | ||
} | ||
const bodyResult = checkZodSchema(req.body, appRoute.method === 'GET' ? null : appRoute.body); | ||
if (!bodyResult.success) { | ||
throw new BadRequestException(zodErrorResponse(bodyResult.error)); | ||
} | ||
const pathParamsResult = checkZodSchema(req.params, appRoute.pathParams, { | ||
passThroughExtraKeys: true, | ||
}); | ||
if (!pathParamsResult.success) { | ||
throw new BadRequestException(zodErrorResponse(pathParamsResult.error)); | ||
} | ||
return { | ||
query: queryResult.data, | ||
params: pathParamsResult.data, | ||
body: bodyResult.data, | ||
}; | ||
}); | ||
const ApiDecorator = TsRestRequest; | ||
/****************************************************************************** | ||
@@ -90,3 +59,3 @@ Copyright (c) Microsoft Corporation. | ||
const res = context.switchToHttp().getResponse(); | ||
const appRoute = this.reflector.get(tsRestAppRouteMetadataKey, context.getHandler()); | ||
const appRoute = this.reflector.get(TsRestAppRouteMetadataKey, context.getHandler()); | ||
if (!appRoute) { | ||
@@ -116,3 +85,2 @@ throw new Error('Make sure your route is decorated with @TsRest()'); | ||
const ValidateResponsesSymbol = Symbol('ts-rest-validate-responses'); | ||
const TsRest = (appRouteOrOptions, options = {}) => { | ||
@@ -124,3 +92,3 @@ const decorators = []; | ||
decorators.push(...[ | ||
SetMetadata(tsRestAppRouteMetadataKey, appRouteOrOptions), | ||
SetMetadata(TsRestAppRouteMetadataKey, appRouteOrOptions), | ||
getMethodDecorator(appRouteOrOptions), | ||
@@ -156,2 +124,35 @@ UseInterceptors(TsRestInterceptor), | ||
export { Api, ApiDecorator, JsonQuery, JsonQuerySymbol, TsRest, TsRestInterceptor, TsRestRequest, ValidateResponsesSymbol, initNestServer, nestControllerContract, tsRestAppRouteMetadataKey }; | ||
const TsRestRequest = createParamDecorator((_, ctx) => { | ||
var _a; | ||
const req = ctx.switchToHttp().getRequest(); | ||
const appRoute = Reflect.getMetadata(TsRestAppRouteMetadataKey, ctx.getHandler()); | ||
if (!appRoute) { | ||
throw new Error('Make sure your route is decorated with @TsRest()'); | ||
} | ||
const isJsonQuery = !!((_a = Reflect.getMetadata(JsonQuerySymbol, ctx.getHandler())) !== null && _a !== void 0 ? _a : Reflect.getMetadata(JsonQuerySymbol, ctx.getClass())); | ||
const query = isJsonQuery | ||
? parseJsonQueryObject(req.query) | ||
: req.query; | ||
const queryResult = checkZodSchema(query, appRoute.query); | ||
if (!queryResult.success) { | ||
throw new BadRequestException(zodErrorResponse(queryResult.error)); | ||
} | ||
const bodyResult = checkZodSchema(req.body, appRoute.method === 'GET' ? null : appRoute.body); | ||
if (!bodyResult.success) { | ||
throw new BadRequestException(zodErrorResponse(bodyResult.error)); | ||
} | ||
const pathParamsResult = checkZodSchema(req.params, appRoute.pathParams, { | ||
passThroughExtraKeys: true, | ||
}); | ||
if (!pathParamsResult.success) { | ||
throw new BadRequestException(zodErrorResponse(pathParamsResult.error)); | ||
} | ||
return { | ||
query: queryResult.data, | ||
params: pathParamsResult.data, | ||
body: bodyResult.data, | ||
}; | ||
}); | ||
const ApiDecorator = TsRestRequest; | ||
export { Api, ApiDecorator, JsonQuery, JsonQuerySymbol, TsRest, TsRestAppRouteMetadataKey, TsRestInterceptor, TsRestRequest, ValidateResponsesSymbol, initNestServer, nestControllerContract }; |
{ | ||
"name": "@ts-rest/nest", | ||
"version": "3.16.0", | ||
"version": "3.16.1", | ||
"description": "Nest server integration for @ts-rest", | ||
@@ -22,20 +22,14 @@ "license": "MIT", | ||
}, | ||
"peerDependencies": { | ||
"@nestjs/common": "^9.0.0", | ||
"@nestjs/core": "^9.0.0", | ||
"rxjs": "^7.1.0", | ||
"zod": "^3.0.0", | ||
"@ts-rest/core": "3.16.1" | ||
}, | ||
"peerDependenciesMeta": { | ||
"zod": { | ||
"optional": true | ||
}, | ||
"rxjs": { | ||
"optional": true | ||
} | ||
}, | ||
"peerDependencies": { | ||
"@nestjs/common": "9.x.x", | ||
"rxjs": "7.x.x", | ||
"zod": "3.x.x", | ||
"@ts-rest/core": "3.16.0", | ||
"@nestjs/core": "9.0.11" | ||
}, | ||
"devDependencies": { | ||
"express-serve-static-core": "^0.1.1" | ||
}, | ||
"typedoc": { | ||
@@ -49,3 +43,10 @@ "entryPoint": "./src/index.ts", | ||
"types": "./src/index.d.ts", | ||
"exports": { | ||
".": { | ||
"types": "./src/index.d.ts", | ||
"import": "./index.js", | ||
"require": "./index.cjs" | ||
} | ||
}, | ||
"dependencies": {} | ||
} |
@@ -0,1 +1,2 @@ | ||
export * from './lib/constants'; | ||
export * from './lib/json-query.decorator'; | ||
@@ -2,0 +3,0 @@ export * from './lib/ts-rest-nest'; |
@@ -1,2 +0,2 @@ | ||
export declare const JsonQuerySymbol: unique symbol; | ||
import { JsonQuerySymbol } from './constants'; | ||
/** | ||
@@ -3,0 +3,0 @@ * Enable JSON query mode for a controller or a single route |
import { AppRoute, AppRouteMutation, PathParamsWithCustomValidators, Without, ZodInferOrType } from '@ts-rest/core'; | ||
export declare const tsRestAppRouteMetadataKey: unique symbol; | ||
type BodyWithoutFileIfMultiPart<T extends AppRouteMutation> = T['contentType'] extends 'multipart/form-data' ? Without<ZodInferOrType<T['body']>, File> : ZodInferOrType<T['body']>; | ||
@@ -4,0 +3,0 @@ export type TsRestRequestShape<TRoute extends AppRoute> = Without<{ |
import { AppRoute } from '@ts-rest/core'; | ||
export declare const ValidateResponsesSymbol: unique symbol; | ||
export type TsRestOptions = { | ||
@@ -7,2 +6,6 @@ jsonQuery?: boolean; | ||
}; | ||
type TsRestType = { | ||
(appRoute: AppRoute, options?: TsRestOptions): MethodDecorator; | ||
(options: TsRestOptions): ClassDecorator; | ||
}; | ||
/** | ||
@@ -13,3 +16,3 @@ * As a class decorator, you can configure ts-rest options. As a method decorator, you can assign the route and also configure options | ||
*/ | ||
export declare const TsRest: (appRouteOrOptions: AppRoute | TsRestOptions, options?: TsRestOptions) => <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol | undefined, descriptor?: TypedPropertyDescriptor<Y> | undefined) => void; | ||
export declare const TsRest: TsRestType; | ||
/** | ||
@@ -19,1 +22,2 @@ * @deprecated Use TsRest decorator instead | ||
export declare const Api: (appRoute: AppRoute) => MethodDecorator; | ||
export {}; |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
25102
0
12
384