@ts-rest/nest
Advanced tools
Comparing version 3.14.0 to 3.15.0
63
index.js
@@ -5,2 +5,9 @@ import { getRouteResponses, parseJsonQueryObject, checkZodSchema } from '@ts-rest/core'; | ||
const JsonQuerySymbol = Symbol('JsonQuery'); | ||
const JsonQuery = (jsonQuery = true) => { | ||
return (target) => { | ||
Reflect.defineMetadata(JsonQuerySymbol, jsonQuery, target); | ||
}; | ||
}; | ||
const initNestServer = (router) => { | ||
@@ -14,2 +21,5 @@ return { | ||
}; | ||
const nestControllerContract = (router) => { | ||
return router; | ||
}; | ||
@@ -38,11 +48,5 @@ /****************************************************************************** | ||
const JsonQuerySymbol = Symbol('JsonQuery'); | ||
const JsonQuery = (jsonQuery = true) => { | ||
return (target) => { | ||
Reflect.defineMetadata(JsonQuerySymbol, jsonQuery, target); | ||
}; | ||
}; | ||
const tsRestAppRouteMetadataKey = Symbol('ts-rest-app-route'); | ||
const ApiDecorator = createParamDecorator((_, ctx) => { | ||
const TsRestRequest = createParamDecorator((_, ctx) => { | ||
var _a; | ||
const req = ctx.switchToHttp().getRequest(); | ||
@@ -53,4 +57,3 @@ const appRoute = Reflect.getMetadata(tsRestAppRouteMetadataKey, ctx.getHandler()); | ||
} | ||
const isJsonQuery = !!(Reflect.getMetadata(JsonQuerySymbol, ctx.getHandler()) || | ||
Reflect.getMetadata(JsonQuerySymbol, ctx.getClass())); | ||
const isJsonQuery = !!((_a = Reflect.getMetadata(JsonQuerySymbol, ctx.getHandler())) !== null && _a !== void 0 ? _a : Reflect.getMetadata(JsonQuerySymbol, ctx.getClass())); | ||
const query = isJsonQuery | ||
@@ -79,2 +82,21 @@ ? parseJsonQueryObject(req.query) | ||
}); | ||
const ApiDecorator = TsRestRequest; | ||
let TsRestInterceptor = class TsRestInterceptor { | ||
intercept(context, next) { | ||
const res = context.switchToHttp().getResponse(); | ||
return next.handle().pipe(map((value) => { | ||
if (typeof value === 'object' && | ||
typeof value.status === 'number' && | ||
value.body !== undefined) { | ||
res.status(value.status); | ||
return value.body; | ||
} | ||
return value; | ||
})); | ||
} | ||
}; | ||
TsRestInterceptor = __decorate([ | ||
Injectable() | ||
], TsRestInterceptor); | ||
const getMethodDecorator = (appRoute) => { | ||
@@ -94,24 +116,7 @@ switch (appRoute.method) { | ||
}; | ||
let ApiRouteInterceptor = class ApiRouteInterceptor { | ||
intercept(context, next) { | ||
const res = context.switchToHttp().getResponse(); | ||
return next.handle().pipe(map((value) => { | ||
if (typeof value === 'object' && | ||
typeof value.status === 'number' && | ||
value.body !== undefined) { | ||
res.status(value.status); | ||
return value.body; | ||
} | ||
return value; | ||
})); | ||
} | ||
}; | ||
ApiRouteInterceptor = __decorate([ | ||
Injectable() | ||
], ApiRouteInterceptor); | ||
const Api = (appRoute) => { | ||
const methodDecorator = getMethodDecorator(appRoute); | ||
return applyDecorators(SetMetadata(tsRestAppRouteMetadataKey, appRoute), methodDecorator, UseInterceptors(ApiRouteInterceptor)); | ||
return applyDecorators(SetMetadata(tsRestAppRouteMetadataKey, appRoute), methodDecorator, UseInterceptors(TsRestInterceptor)); | ||
}; | ||
export { Api, ApiDecorator, ApiRouteInterceptor, JsonQuery, JsonQuerySymbol, initNestServer }; | ||
export { Api, ApiDecorator, JsonQuery, JsonQuerySymbol, TsRestInterceptor, TsRestRequest, initNestServer, nestControllerContract, tsRestAppRouteMetadataKey }; |
{ | ||
"name": "@ts-rest/nest", | ||
"version": "3.14.0", | ||
"version": "3.15.0", | ||
"description": "Nest server integration for @ts-rest", | ||
@@ -34,3 +34,3 @@ "license": "MIT", | ||
"zod": "3.x.x", | ||
"@ts-rest/core": "3.14.0" | ||
"@ts-rest/core": "3.15.0" | ||
}, | ||
@@ -37,0 +37,0 @@ "devDependencies": { |
@@ -7,16 +7,21 @@ # ts-rest | ||
<p align="center">RPC-like client and server helpers for a magical end to end typed experience</p> | ||
<p align="center"> | ||
<a href="https://www.npmjs.com/package/@ts-rest/core"> | ||
<img src="https://img.shields.io/npm/v/@ts-rest/core.svg" alt="langue typescript"/> | ||
</a> | ||
<a href="https://www.npmjs.com/package/@ts-rest/core"/> | ||
<img alt="npm" src="https://img.shields.io/npm/dw/@ts-rest/core"/> | ||
<a href="https://github.com/ts-rest/ts-rest/blob/main/LICENSE"></a> | ||
<img alt="GitHub" src="https://img.shields.io/github/license/ts-rest/ts-rest"/> | ||
<img alt="GitHub Workflow Status" src="https://img.shields.io/bundlephobia/minzip/@ts-rest/core?label=%40ts-rest%2Fcore"/> | ||
<img alt="GitHub Workflow Status" src="https://img.shields.io/discord/1055855205960392724"/> | ||
</p> | ||
<p align="center">RPC-like client and server helpers for a magical end to end typed experience</p> | ||
<p align="center"> | ||
<a href="https://www.npmjs.com/package/@ts-rest/core"> | ||
<img src="https://img.shields.io/npm/v/@ts-rest/core.svg" alt="langue typescript"/> | ||
</a> | ||
<img alt="Github Workflow Status" src="https://img.shields.io/github/actions/workflow/status/ts-rest/ts-rest/release.yml?branch=main"/> | ||
<a href="https://www.npmjs.com/package/@ts-rest/core"> | ||
<img alt="npm" src="https://img.shields.io/npm/dw/@ts-rest/core"/> | ||
</a> | ||
<a href="https://github.com/ts-rest/ts-rest/blob/main/LICENSE"> | ||
<img alt="License" src="https://img.shields.io/github/license/ts-rest/ts-rest"/> | ||
</a> | ||
<img alt="Bundle Size" src="https://img.shields.io/bundlephobia/minzip/@ts-rest/core?label=%40ts-rest%2Fcore"/> | ||
<a href="https://discord.com/invite/2Megk85k5a"> | ||
<img alt="Discord" src="https://img.shields.io/discord/1055855205960392724"/> | ||
</a> | ||
</p> | ||
# Introduction | ||
@@ -87,1 +92,15 @@ | ||
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! | ||
<div style={{paddingTop: "25px"}}> | ||
<a | ||
href="https://vercel.com/?utm_source=ts-rest&utm_campaign=oss" | ||
target="_blank" | ||
rel="noreferrer" | ||
> | ||
<img | ||
src="https://ts-rest.com/img/powered-by-vercel.svg" | ||
alt="Powered by Vercel" | ||
height="40" | ||
/> | ||
</a> | ||
</div> |
@@ -0,3 +1,4 @@ | ||
export * from './lib/json-query.decorator'; | ||
export * from './lib/ts-rest-nest'; | ||
export * from './lib/api.decorator'; | ||
export * from './lib/json-query.decorator'; | ||
export * from './lib/ts-rest.interceptor'; | ||
export * from './lib/ts-rest-request.decorator'; |
export declare const JsonQuerySymbol: unique symbol; | ||
/** | ||
* Enable JSON query mode for a controller or a single route | ||
*/ | ||
export declare const JsonQuery: (jsonQuery?: boolean) => ClassDecorator & MethodDecorator; |
@@ -1,18 +0,35 @@ | ||
import { AppRoute, AppRouter, ApiRouteResponse, Without } from '@ts-rest/core'; | ||
import { ApiDecoratorShape } from './api.decorator'; | ||
import { AppRoute, AppRouter, ApiRouteResponse, Without, ApiResponseForRoute } from '@ts-rest/core'; | ||
import { TsRestRequestShape } from './ts-rest-request.decorator'; | ||
type AppRouterMethodShape<T extends AppRoute> = (...args: any[]) => Promise<ApiRouteResponse<T['responses']>>; | ||
type AppRouterControllerShape<T extends AppRouter> = { | ||
[K in keyof T]: T[K] extends AppRouter ? undefined : T[K] extends AppRoute ? AppRouterMethodShape<T[K]> : never; | ||
}; | ||
type AppRouteShape<T extends AppRouter> = { | ||
[K in keyof T]: T[K] extends AppRouter ? AppRouteShape<T[K]> : T[K] extends AppRoute ? ApiDecoratorShape<T[K]> : never; | ||
}; | ||
export type NestControllerShapeFromAppRouter<T extends AppRouter> = Without<AppRouterControllerShape<T>, AppRouter>; | ||
export type NestAppRouteShape<T extends AppRouter> = AppRouteShape<T>; | ||
type AppRouterControllerShape<T extends AppRouter> = Without<{ | ||
[K in keyof T]: T[K] extends AppRoute ? AppRouterMethodShape<T[K]> : never; | ||
}, never>; | ||
type AppRouterRequestShapes<T extends AppRouter> = Without<{ | ||
[K in keyof T]: T[K] extends AppRoute ? TsRestRequestShape<T[K]> : never; | ||
}, never>; | ||
type AppRouterResponseShapes<T extends AppRouter> = Without<{ | ||
[K in keyof T]: T[K] extends AppRoute ? ApiResponseForRoute<T[K]> : never; | ||
}, never>; | ||
type NestControllerShapeFromAppRouter<T extends AppRouter> = Without<AppRouterControllerShape<T>, AppRouter>; | ||
type NestAppRouteShape<T extends AppRouter> = AppRouterRequestShapes<T>; | ||
/** | ||
* @deprecated Use `nestControllerContract`, `NestControllerInterface`, `NestRequestShapes`, and `NestResponseShapes` instead | ||
* @see {@link https://ts-rest.com/docs/nest|ts-rest docs} for more info. | ||
*/ | ||
export declare const initNestServer: <T extends AppRouter>(router: T) => { | ||
controllerShape: NestControllerShapeFromAppRouter<T>; | ||
routeShapes: AppRouteShape<T>; | ||
responseShapes: { [K in keyof T]: T[K] extends AppRoute ? import("@ts-rest/core").ApiResponseForRoute<T[K]> : "not a route"; }; | ||
routeShapes: NestAppRouteShape<T>; | ||
responseShapes: { [K in keyof T]: T[K] extends AppRoute ? ApiResponseForRoute<T[K]> : "not a route"; }; | ||
route: T; | ||
}; | ||
export type NestControllerContract<T extends AppRouter> = Pick<T, { | ||
[K in keyof T]-?: T[K] extends AppRoute ? K : never; | ||
}[keyof T]>; | ||
export type NestControllerInterface<T extends AppRouter> = AppRouterControllerShape<T>; | ||
export type NestRequestShapes<T extends AppRouter> = NestAppRouteShape<T>; | ||
export type NestResponseShapes<T extends AppRouter> = AppRouterResponseShapes<T>; | ||
/** | ||
* Returns the contract containing only non-nested routes required by a NestJS controller | ||
*/ | ||
export declare const nestControllerContract: <T extends AppRouter>(router: T) => NestControllerContract<T>; | ||
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
21149
10
295
105