@longzai-intelligence-transport/http-adapter-nestjs 0.1.0 → 0.1.2
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/dist/index.d.ts +38 -2
- package/dist/index.js +1 -1
- package/package.json +3 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StreamableFile } from "@nestjs/common";
|
|
2
|
+
import { ApiResponse, HttpMethod, HttpMethod as HttpMethod$1, InferRouteBody, InferRouteFullResponse, InferRouteParams, InferRouteQuery, InferRouteResponse, InferRouteResponse as InferRouteResponse$1, InferRouteReturn, RouteDefinition, RouteDefinition as RouteDefinition$1, RouteGroup, RouteGroup as RouteGroup$1, StreamResponseRoute, createTypedEmpty, createTypedResponse } from "@longzai-intelligence-transport/http-core";
|
|
2
3
|
import { ZodType, core } from "zod";
|
|
3
4
|
|
|
4
5
|
//#region src/decorators/api-route.decorator.d.ts
|
|
@@ -373,6 +374,37 @@ declare function getTypeName(def: core.$ZodTypeDef): string | undefined;
|
|
|
373
374
|
*/
|
|
374
375
|
declare function getDef(schema: core.$ZodType): core.$ZodTypeDef;
|
|
375
376
|
//#endregion
|
|
377
|
+
//#region src/utils/stream-response.util.d.ts
|
|
378
|
+
/**
|
|
379
|
+
* 流式路由响应类型映射(NestJS adapter)
|
|
380
|
+
*
|
|
381
|
+
* 将 core 层的 BinaryStreamMarker 映射为 NestJS 的 StreamableFile。
|
|
382
|
+
* 非流式路由(JsonResponseRoute)映射为 never,保证 typedStream 错用编译报错。
|
|
383
|
+
*
|
|
384
|
+
* @typeParam R - 路由定义类型
|
|
385
|
+
*/
|
|
386
|
+
type InferStreamRouteResponse<R extends RouteDefinition$1> = R extends StreamResponseRoute ? StreamableFile : never;
|
|
387
|
+
/**
|
|
388
|
+
* 类型安全的流式响应函数类型
|
|
389
|
+
*
|
|
390
|
+
* 接受 StreamableFile 并透传返回,与 core 层 createTypedStream 的 BinaryStreamMarker 占位对应。
|
|
391
|
+
*
|
|
392
|
+
* @typeParam R - 路由定义类型
|
|
393
|
+
*/
|
|
394
|
+
type TypedStreamFunction<R extends RouteDefinition$1> = (stream: InferStreamRouteResponse<R>) => InferStreamRouteResponse<R>;
|
|
395
|
+
/**
|
|
396
|
+
* 创建类型安全的流式响应函数
|
|
397
|
+
*
|
|
398
|
+
* 工厂模式:创建时绑定路由定义,返回的函数接受 StreamableFile 并透传。
|
|
399
|
+
* 仅对 StreamResponseRoute 有效;传入 JsonResponseRoute 时函数参数类型为 never,
|
|
400
|
+
* 调用 typedStream(streamableFile) 会编译报错,形成错用保护。
|
|
401
|
+
*
|
|
402
|
+
* @typeParam R - 路由定义类型
|
|
403
|
+
* @param _route - 路由定义(创建时绑定,用于类型约束)
|
|
404
|
+
* @returns 流式响应函数,接受 StreamableFile 并透传
|
|
405
|
+
*/
|
|
406
|
+
declare function createTypedStream<R extends RouteDefinition$1>(_route: R): TypedStreamFunction<R>;
|
|
407
|
+
//#endregion
|
|
376
408
|
//#region src/utils/handler.utils.d.ts
|
|
377
409
|
/**
|
|
378
410
|
* defineHandler 返回值类型
|
|
@@ -396,6 +428,10 @@ type HandlerBindings<R extends RouteDefinition$1> = {
|
|
|
396
428
|
* 类型安全空响应函数
|
|
397
429
|
*/
|
|
398
430
|
readonly typedEmpty: () => ApiResponse<void>;
|
|
431
|
+
/**
|
|
432
|
+
* 类型安全流式响应函数(透传 StreamableFile,仅对流式路由有效)
|
|
433
|
+
*/
|
|
434
|
+
readonly typedStream: TypedStreamFunction<R>;
|
|
399
435
|
};
|
|
400
436
|
/**
|
|
401
437
|
* 一次性合成 Handler 所需的全部绑定
|
|
@@ -426,4 +462,4 @@ type HandlerBindings<R extends RouteDefinition$1> = {
|
|
|
426
462
|
*/
|
|
427
463
|
declare function defineHandler<R extends RouteDefinition$1>(route: R): HandlerBindings<R>;
|
|
428
464
|
//#endregion
|
|
429
|
-
export { type AnyRouteDefinition, ApiRoute, type HandlerBindings, type HttpMethod, type InferRouteBody, type InferRouteFullResponse, type InferRouteParams, type InferRouteQuery, type InferRouteResponse, type InferRouteReturn, type OpenApiSchema, PublicRoute, ROUTE_DEFINITION_KEY, RequireAuth, type RouteDefinition, type RouteGroup, TypedController, TypedRoute, createTypedEmpty, createTypedHandler, createTypedResponse, defineHandler, extractZodDescriptions, getDef, getTypeName, zodToOpenApi };
|
|
465
|
+
export { type AnyRouteDefinition, ApiRoute, type HandlerBindings, type HttpMethod, type InferRouteBody, type InferRouteFullResponse, type InferRouteParams, type InferRouteQuery, type InferRouteResponse, type InferRouteReturn, type InferStreamRouteResponse, type OpenApiSchema, PublicRoute, ROUTE_DEFINITION_KEY, RequireAuth, type RouteDefinition, type RouteGroup, TypedController, TypedRoute, type TypedStreamFunction, createTypedEmpty, createTypedHandler, createTypedResponse, createTypedStream, defineHandler, extractZodDescriptions, getDef, getTypeName, zodToOpenApi };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Controller as e,Delete as t,Get as n,
|
|
1
|
+
import{Controller as e,Delete as t,Get as n,Header as r,Patch as i,Post as a,Put as o,applyDecorators as s}from"@nestjs/common";import{ApiBearerAuth as c,ApiBody as l,ApiOperation as u,ApiParam as d,ApiQuery as f,ApiResponse as p,ApiTags as m}from"@nestjs/swagger";import{createTypedEmpty as ee,createTypedEmpty as h,createTypedResponse as te,createTypedResponse as ne}from"@longzai-intelligence-transport/http-core";function g(e){return e.type}function _(e){return e._zod.def}function v(e,t){return t===`array`}function y(e,t){return t===`object`}function b(e,t){return t===`record`}function x(e,t){return t===`optional`||t===`nullable`}function S(e,t){return t==="default"}function C(e,t){return t===`enum`}function w(e,t){return t===`literal`}function T(e,t){return t===`union`}function E(e,t){return t===`intersection`}function D(e,t){return{type:`array`,items:e.element?t(e.element):{type:`object`}}}function O(e,t){let n={},r=[],i=e.shape;if(i)for(let[e,a]of Object.entries(i)){n[e]=t(a);let i=g(_(a));i!==`optional`&&i!==`nullable`&&r.push(e)}let a={type:`object`,properties:n};return r.length>0&&(a.required=r),a}function k(e,t){return{type:`object`,additionalProperties:e.valueType?t(e.valueType):!0}}function A(e,t){return{...e.innerType?t(e.innerType):{type:`object`},nullable:!0}}function j(e,t){let n=e.defaultValue;return{...e.innerType?t(e.innerType):{type:`object`},default:typeof n==`function`?n():n}}function M(e){return{type:`string`,enum:e.entries?Object.values(e.entries):[]}}function N(e){let t=e.values?.[0];return typeof t==`string`?{type:`string`,enum:[t]}:typeof t==`number`?{type:`number`,enum:[t]}:typeof t==`boolean`?{type:`boolean`,enum:[t]}:{type:`string`}}function P(e,t){return{oneOf:e.options?.map(e=>t(e))??[]}}function F(e,t){let n=[];return e.left&&n.push(t(e.left)),e.right&&n.push(t(e.right)),{allOf:n}}const re={string:{type:`string`},number:{type:`number`},int:{type:`number`},boolean:{type:`boolean`},date:{type:`string`,format:`date-time`}};function I(e){let t=_(e),n=g(t);return n?re[n]||(v(t,n)?D(t,I):y(t,n)?O(t,I):b(t,n)?k(t,I):x(t,n)?A(t,I):S(t,n)?j(t,I):C(t,n)?M(t):w(t,n)?N(t):T(t,n)?P(t,I):E(t,n)?F(t,I):{type:`object`}):{type:`object`}}function L(e){let t={},n=_(e),r=g(n);if(r&&y(n,r)&&n.shape)for(let[e,r]of Object.entries(n.shape)){let n=`description`in r&&typeof r.description==`string`?r.description:void 0;n&&(t[e]=n)}return t}const R=`route_definition`;function z(e,t){t!==!1&&e.push(c())}function B(e,t,n){let r=I(t);e.push(p({status:200,description:n??`成功`,schema:r}))}function V(e,t){if(t)for(let n of t)e.push(p({status:n.status,description:n.description,schema:{type:`object`,properties:{code:{type:`string`},message:{type:`string`},data:{type:`object`,nullable:!0}}}}))}function H(e,t){if(!t)return;let n=I(t);if(n.properties)for(let[t,r]of Object.entries(n.properties))e.push(d({name:t,schema:r,required:!0}))}function U(e,t){if(!t)return;let n=I(t);if(n.properties){let t=n.required||[];for(let[r,i]of Object.entries(n.properties))e.push(f({name:r,schema:i,required:t.includes(r)}))}}function W(e,t){t&&e.push(l({schema:I(t)}))}function G(e,t){let n=[];if(z(n,t?.requireAuth),n.push(u({summary:e.summary,tags:e.tags})),e.responseType===`stream`){let t=e.stream.mimeType??`application/octet-stream`;n.push(p({status:200,content:{[t]:{schema:{type:`string`,format:`binary`}}},...e.stream.fileName?{headers:{"Content-Disposition":{schema:{type:`string`},description:`attachment; filename="${e.stream.fileName}"`}}}:{}}))}else B(n,e.response,t?.successDescription);return V(n,t?.errorResponses),H(n,e.params),U(n,e.query),W(n,e.body),s(...n)}function K(){return c()}function q(){return s()}function J(t){let n=[];return n.push(e(t.prefix)),t.tags&&t.tags.length>0&&n.push(m(...t.tags)),s(...n)}function Y(e){if(e.basePath){let t=e.basePath.startsWith(`/`)?e.basePath:`/${e.basePath}`;return(e.path.endsWith(t)?e.path.slice(0,-t.length):e.path)||`/`}let t=e.path.lastIndexOf(`/`);return t>0?e.path.slice(0,t):e.path}function X(e){return`prefix`in e&&typeof e.prefix==`string`}function Z(t){return()=>{let n=[],r=X(t)?t.prefix:Y(t);return n.push(e(r)),t.tags&&t.tags.length>0&&n.push(m(...t.tags)),s(...n)}}function ie(e){switch(e){case`GET`:return n;case`POST`:return a;case`PUT`:return o;case`PATCH`:return i;case`DELETE`:return t}}function Q(e,t){let n=[ie(e.method)(e.basePath??e.path),G(e,t)];if(e.responseType===`stream`){let t=e.stream.mimeType??`application/octet-stream`;n.push(r(`Content-Type`,t)),e.stream.fileName&&n.push(r(`Content-Disposition`,`attachment; filename="${e.stream.fileName}"`))}return s(...n)}function $(e){return e=>e}function ae(e){return{TypedHandler:Z(e),TypedHandle:()=>Q(e),typedResponse:ne(e),typedEmpty:h(e),typedStream:$(e)}}export{G as ApiRoute,q as PublicRoute,R as ROUTE_DEFINITION_KEY,K as RequireAuth,J as TypedController,Q as TypedRoute,ee as createTypedEmpty,Z as createTypedHandler,te as createTypedResponse,$ as createTypedStream,ae as defineHandler,L as extractZodDescriptions,_ as getDef,g as getTypeName,I as zodToOpenApi};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longzai-intelligence-transport/http-adapter-nestjs",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"adapter",
|
|
6
6
|
"decorator",
|
|
@@ -38,11 +38,12 @@
|
|
|
38
38
|
"clean": "rimraf dist out .cache"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@longzai-intelligence-transport/http-core": "0.1.
|
|
41
|
+
"@longzai-intelligence-transport/http-core": "0.1.2"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@nestjs/common": "^11.1.26",
|
|
45
45
|
"@nestjs/swagger": "^11.4.4",
|
|
46
|
+
"expect-type": "^1.3.0",
|
|
46
47
|
"zod": "^4.4.3"
|
|
47
48
|
},
|
|
48
49
|
"peerDependencies": {
|