vafast 0.5.5 → 0.5.7
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/README.md +418 -163
- package/dist/{defineRoute-BNqVD0_t.d.mts → defineRoute-FhAN4ivP.d.mts} +20 -3
- package/dist/defineRoute.d.mts +2 -2
- package/dist/defineRoute.mjs +18 -6
- package/dist/defineRoute.mjs.map +1 -1
- package/dist/{index-DCJOWsRE.d.mts → index-XcXGKQqt.d.mts} +3 -3
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +4 -4
- package/dist/{middleware-BR-R4p0M.d.mts → middleware-CrD2gfzt.d.mts} +3 -3
- package/dist/middleware.d.mts +1 -1
- package/dist/middleware.mjs +1 -1
- package/dist/monitoring/index.d.mts +3 -3
- package/dist/monitoring/native-monitor.d.mts +3 -3
- package/dist/{response-BNLzz4Tq.d.mts → response-CJcO5s7Q.d.mts} +23 -13
- package/dist/{response-CQ1IgWei.mjs → response-dgNpkPIp.mjs} +27 -17
- package/dist/response-dgNpkPIp.mjs.map +1 -0
- package/dist/{route-registry-DZv4vAjT.d.mts → route-registry-YIco7opr.d.mts} +2 -2
- package/dist/server/index.d.mts +3 -3
- package/dist/server/index.mjs +3 -3
- package/dist/server/server-factory.d.mts +3 -3
- package/dist/server/server-factory.mjs +3 -3
- package/dist/server/server.d.mts +2 -2
- package/dist/server/server.mjs +2 -2
- package/dist/{server-Bicf_7Hx.d.mts → server-8X5Hgu7h.d.mts} +2 -2
- package/dist/{server-CZLmrJSk.mjs → server-AJWK-vUI.mjs} +2 -2
- package/dist/{server-CZLmrJSk.mjs.map → server-AJWK-vUI.mjs.map} +1 -1
- package/dist/{server-Bm0BGm01.mjs → server-BCjY3a63.mjs} +5 -6
- package/dist/server-BCjY3a63.mjs.map +1 -0
- package/dist/{sse-CWNz0ky7.mjs → sse-CAOZ-rXY.mjs} +2 -3
- package/dist/{sse-CWNz0ky7.mjs.map → sse-CAOZ-rXY.mjs.map} +1 -1
- package/dist/{sse-DYuFPif9.d.mts → sse-DyI21Jqk.d.mts} +2 -2
- package/dist/utils/index.d.mts +4 -4
- package/dist/utils/index.mjs +2 -2
- package/dist/utils/response.d.mts +1 -1
- package/dist/utils/response.mjs +1 -1
- package/dist/utils/route-registry.d.mts +2 -2
- package/dist/utils/sse.d.mts +2 -2
- package/dist/utils/sse.mjs +1 -1
- package/package.json +1 -1
- package/dist/response-CQ1IgWei.mjs.map +0 -1
- package/dist/server-Bm0BGm01.mjs.map +0 -1
|
@@ -186,10 +186,27 @@ declare function withContext<TContext extends object>(): <const TSchema$1 extend
|
|
|
186
186
|
responses?: Record<string, unknown>;
|
|
187
187
|
};
|
|
188
188
|
}) => LeafRouteConfig<TMethod, TPath, TSchema$1, TReturn, TMiddleware>;
|
|
189
|
+
/** 带原始类型信息的路由数组 */
|
|
190
|
+
type RoutesWithSource<T extends readonly RouteConfigResult[]> = ProcessedRoute[] & {
|
|
191
|
+
__source: T;
|
|
192
|
+
};
|
|
189
193
|
/**
|
|
190
194
|
* 定义路由数组,支持嵌套路由
|
|
195
|
+
*
|
|
196
|
+
* 使用 `const T` 泛型自动保留字面量类型,无需手动添加 `as const`
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* const routes = defineRoutes([
|
|
201
|
+
* defineRoute({ method: 'GET', path: '/users', handler: ... }),
|
|
202
|
+
* defineRoute({ method: 'POST', path: '/users', handler: ... }),
|
|
203
|
+
* ])
|
|
204
|
+
*
|
|
205
|
+
* // 类型推断自动工作,无需 as const
|
|
206
|
+
* type Api = InferEden<typeof routes>
|
|
207
|
+
* ```
|
|
191
208
|
*/
|
|
192
|
-
declare function defineRoutes(routes:
|
|
209
|
+
declare function defineRoutes<const T extends readonly RouteConfigResult[]>(routes: T): RoutesWithSource<T>;
|
|
193
210
|
/** 可推断的路由类型(供 vafast-api-client 使用) */
|
|
194
211
|
type InferableRoute<TMethod extends string = string, TPath extends string = string, TReturn = unknown, TSchema$1 extends RouteSchema = RouteSchema> = {
|
|
195
212
|
readonly method: TMethod;
|
|
@@ -204,5 +221,5 @@ type InferableRoute<TMethod extends string = string, TPath extends string = stri
|
|
|
204
221
|
readonly middleware?: ReadonlyArray<AnyMiddleware>;
|
|
205
222
|
};
|
|
206
223
|
//#endregion
|
|
207
|
-
export { RouteSchema as a,
|
|
208
|
-
//# sourceMappingURL=defineRoute-
|
|
224
|
+
export { RouteSchema as a, defineMiddleware as c, withContext as d, ProcessedRoute as i, defineRoute as l, InferableRoute as n, RoutesWithSource as o, LeafRouteConfig as r, TypedMiddleware as s, HandlerContext as t, defineRoutes as u };
|
|
225
|
+
//# sourceMappingURL=defineRoute-FhAN4ivP.d.mts.map
|
package/dist/defineRoute.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as RouteSchema, c as
|
|
2
|
-
export { HandlerContext, InferableRoute, LeafRouteConfig, ProcessedRoute, RouteSchema, TypedMiddleware, defineMiddleware, defineRoute, defineRoutes, withContext };
|
|
1
|
+
import { a as RouteSchema, c as defineMiddleware, d as withContext, i as ProcessedRoute, l as defineRoute, n as InferableRoute, o as RoutesWithSource, r as LeafRouteConfig, s as TypedMiddleware, t as HandlerContext, u as defineRoutes } from "./defineRoute-FhAN4ivP.mjs";
|
|
2
|
+
export { HandlerContext, InferableRoute, LeafRouteConfig, ProcessedRoute, RouteSchema, RoutesWithSource, TypedMiddleware, defineMiddleware, defineRoute, defineRoutes, withContext };
|
package/dist/defineRoute.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as parseCookies, l as parseHeaders, r as parseBody, u as parseQuery } from "./parsers-BrG_mRLq.mjs";
|
|
2
2
|
import { a as validateAllSchemas, i as precompileSchemas } from "./validators-CkfvNBbK.mjs";
|
|
3
|
-
import { i as json, l as VafastError } from "./response-
|
|
3
|
+
import { i as json, l as VafastError } from "./response-dgNpkPIp.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/defineRoute.ts
|
|
6
6
|
/**
|
|
@@ -88,13 +88,11 @@ function wrapHandler(schema, userHandler) {
|
|
|
88
88
|
} catch (error) {
|
|
89
89
|
if (error instanceof VafastError) throw error;
|
|
90
90
|
if (error instanceof Error && error.message.includes("验证失败")) return json({
|
|
91
|
-
|
|
92
|
-
error: "Validation Error",
|
|
91
|
+
code: 400,
|
|
93
92
|
message: error.message
|
|
94
93
|
}, 400);
|
|
95
94
|
return json({
|
|
96
|
-
|
|
97
|
-
error: "Internal Error",
|
|
95
|
+
code: 500,
|
|
98
96
|
message: error instanceof Error ? error.message : "未知错误"
|
|
99
97
|
}, 500);
|
|
100
98
|
}
|
|
@@ -164,9 +162,23 @@ function flattenRoutes(routes, parentPath = "", parentMiddleware = []) {
|
|
|
164
162
|
}
|
|
165
163
|
/**
|
|
166
164
|
* 定义路由数组,支持嵌套路由
|
|
165
|
+
*
|
|
166
|
+
* 使用 `const T` 泛型自动保留字面量类型,无需手动添加 `as const`
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const routes = defineRoutes([
|
|
171
|
+
* defineRoute({ method: 'GET', path: '/users', handler: ... }),
|
|
172
|
+
* defineRoute({ method: 'POST', path: '/users', handler: ... }),
|
|
173
|
+
* ])
|
|
174
|
+
*
|
|
175
|
+
* // 类型推断自动工作,无需 as const
|
|
176
|
+
* type Api = InferEden<typeof routes>
|
|
177
|
+
* ```
|
|
167
178
|
*/
|
|
168
179
|
function defineRoutes(routes) {
|
|
169
|
-
|
|
180
|
+
const processed = flattenRoutes(routes);
|
|
181
|
+
return Object.assign(processed, { __source: routes });
|
|
170
182
|
}
|
|
171
183
|
|
|
172
184
|
//#endregion
|
package/dist/defineRoute.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineRoute.mjs","names":[],"sources":["../src/defineRoute.ts"],"sourcesContent":["/**\n * 路由定义 - Schema 在路由级别定义,支持嵌套路由和中间件类型推断\n *\n * @example\n * ```typescript\n * // 定义带类型的中间件(函数式风格,通过 next 传递上下文)\n * const authMiddleware = defineMiddleware<{ user: User }>((req, next) => {\n * const user = getUser(req)\n * return next({ user }) // 通过 next 参数传递上下文\n * })\n *\n * // 路由自动推断中间件注入的类型\n * const routes = defineRoutes([\n * defineRoute({\n * path: '/api',\n * middleware: [authMiddleware],\n * children: [\n * defineRoute({\n * method: 'GET',\n * path: '/profile',\n * handler: ({ user }) => ({ name: user.name }) // ✅ user 有类型\n * })\n * ]\n * })\n * ])\n * ```\n */\n\nimport type { TSchema, Static } from \"@sinclair/typebox\";\nimport { parseBody, parseQuery, parseHeaders, parseCookies } from \"./utils/parsers\";\nimport { validateAllSchemas, precompileSchemas } from \"./utils/validators/validators\";\nimport { json } from \"./utils/response\";\nimport { VafastError } from \"./middleware\";\n\n// ============= Schema 类型 =============\n\n/** 路由 Schema 配置 */\nexport interface RouteSchema {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 从 Schema 推断类型 */\ntype InferSchemaType<T extends RouteSchema> = {\n body: T[\"body\"] extends TSchema ? Static<T[\"body\"]> : unknown;\n query: T[\"query\"] extends TSchema ? Static<T[\"query\"]> : Record<string, string>;\n params: T[\"params\"] extends TSchema ? Static<T[\"params\"]> : Record<string, string>;\n headers: T[\"headers\"] extends TSchema ? Static<T[\"headers\"]> : Record<string, string>;\n cookies: T[\"cookies\"] extends TSchema ? Static<T[\"cookies\"]> : Record<string, string>;\n};\n\n// ============= 中间件类型系统 =============\n\n/** 带类型标记的中间件 */\nexport interface TypedMiddleware<TContext extends object = object> {\n (req: Request, next: (ctx?: TContext) => Promise<Response>): Response | Promise<Response>;\n /** 类型标记(仅编译时使用) */\n __context?: TContext;\n}\n\n/** 普通中间件(无类型注入) */\ntype PlainMiddleware = (req: Request, next: () => Promise<Response>) => Response | Promise<Response>;\n\n/** 任意中间件类型 */\ntype AnyMiddleware = TypedMiddleware<object> | PlainMiddleware;\n\n/** 从中间件提取上下文类型 */\ntype ExtractMiddlewareContext<T> = T extends TypedMiddleware<infer C> ? C : object;\n\n/** 合并中间件数组的上下文类型 */\ntype MergeMiddlewareContexts<T extends readonly unknown[]> =\n T extends readonly [infer First, ...infer Rest]\n ? ExtractMiddlewareContext<First> & MergeMiddlewareContexts<Rest>\n : object;\n\n// ============= Handler 上下文 =============\n\n/** Handler 上下文(包含 schema 推断) */\nexport interface HandlerContext<TSchema extends RouteSchema = RouteSchema> {\n req: Request;\n body: InferSchemaType<TSchema>[\"body\"];\n query: InferSchemaType<TSchema>[\"query\"];\n params: InferSchemaType<TSchema>[\"params\"];\n headers: InferSchemaType<TSchema>[\"headers\"];\n cookies: InferSchemaType<TSchema>[\"cookies\"];\n}\n\n/** Handler 上下文(带中间件注入的额外类型) */\ntype HandlerContextWithExtra<TSchema extends RouteSchema, TExtra> =\n HandlerContext<TSchema> & TExtra;\n\n// ============= 路由配置类型 =============\n\n/** HTTP 方法 */\ntype HTTPMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\";\n\n/** 叶子路由配置(有 method 和 handler) */\nexport interface LeafRouteConfig<\n TMethod extends HTTPMethod = HTTPMethod,\n TPath extends string = string,\n TSchema extends RouteSchema = RouteSchema,\n TReturn = unknown,\n TMiddleware extends readonly AnyMiddleware[] = readonly AnyMiddleware[]\n> {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n readonly handler: (\n ctx: HandlerContextWithExtra<TSchema, MergeMiddlewareContexts<TMiddleware>>\n ) => TReturn | Promise<TReturn>;\n readonly middleware?: TMiddleware;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n}\n\n/** 嵌套路由配置(有 children,无 method 和 handler) */\ninterface NestedRouteConfig<\n TPath extends string = string,\n TMiddleware extends readonly AnyMiddleware[] = readonly AnyMiddleware[]\n> {\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly middleware?: TMiddleware;\n readonly children: ReadonlyArray<RouteConfigResult>;\n}\n\n/** defineRoute 返回的类型 */\ntype RouteConfigResult =\n | LeafRouteConfig<HTTPMethod, string, RouteSchema, unknown, readonly AnyMiddleware[]>\n | NestedRouteConfig<string, readonly AnyMiddleware[]>;\n\n/** 处理后的扁平路由 */\nexport interface ProcessedRoute {\n method: HTTPMethod;\n path: string;\n name?: string;\n description?: string;\n schema?: RouteSchema;\n handler: (req: Request) => Promise<Response>;\n middleware?: readonly AnyMiddleware[];\n docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n /** 允许任意扩展(兼容 Route 类型) */\n [key: string]: unknown;\n}\n\n// ============= defineMiddleware =============\n\n/**\n * 定义带类型的中间件(函数式风格)\n *\n * 通过 next() 参数传递上下文,更符合函数式编程风格\n *\n * @example\n * ```typescript\n * type AuthContext = { user: { id: string; name: string } }\n *\n * const authMiddleware = defineMiddleware<AuthContext>((req, next) => {\n * const user = getUserFromToken(req)\n * return next({ user }) // 通过 next 传递上下文\n * })\n * ```\n */\nexport function defineMiddleware<TContext extends object = object>(\n handler: (\n req: Request,\n next: (ctx?: TContext) => Promise<Response>\n ) => Promise<Response>\n): TypedMiddleware<TContext> {\n // 包装成标准中间件签名\n const middleware = ((req: Request, originalNext: () => Promise<Response>) => {\n // 包装 next,接收上下文参数并存储到 req.__locals\n const nextWithContext = (ctx?: TContext): Promise<Response> => {\n if (ctx) {\n const target = req as unknown as { __locals?: object };\n target.__locals = { ...(target.__locals || {}), ...ctx };\n }\n return originalNext();\n };\n return handler(req, nextWithContext);\n }) as TypedMiddleware<TContext>;\n\n return middleware;\n}\n\n// ============= 响应处理 =============\n\n/** 自动转换返回值为 Response */\nfunction autoResponse(result: unknown): Response {\n if (result instanceof Response) return result;\n if (result === null || result === undefined) return new Response(null, { status: 204 });\n if (typeof result === \"string\") {\n return new Response(result, { headers: { \"Content-Type\": \"text/plain; charset=utf-8\" } });\n }\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return new Response(String(result), { headers: { \"Content-Type\": \"text/plain; charset=utf-8\" } });\n }\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj && (\"status\" in obj || \"headers\" in obj)) {\n const { data, status = 200, headers = {} } = obj;\n if (data === null || data === undefined) {\n return new Response(null, { status: status === 200 ? 204 : (status as number), headers: headers as HeadersInit });\n }\n return json(data, status as number, headers as Record<string, string>);\n }\n return json(result);\n }\n return new Response(null, { status: 204 });\n}\n\n/** 创建包装后的 handler */\nfunction wrapHandler<TSchema extends RouteSchema>(\n schema: TSchema | undefined,\n userHandler: (ctx: HandlerContext<TSchema>) => unknown | Promise<unknown>\n): (req: Request) => Promise<Response> {\n if (schema && (schema.body || schema.query || schema.params || schema.headers || schema.cookies)) {\n precompileSchemas(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params = ((req as unknown as Record<string, unknown>).params as Record<string, string>) || {};\n\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n try {\n body = await parseBody(req);\n } catch {\n // 忽略解析错误\n }\n }\n\n const data = { body, query, params, headers, cookies };\n if (schema && (schema.body || schema.query || schema.params || schema.headers || schema.cookies)) {\n validateAllSchemas(schema, data);\n }\n\n // 获取中间件注入的上下文\n const extraCtx = (req as unknown as { __locals?: unknown }).__locals || {};\n\n const result = await userHandler({\n req,\n body: body as HandlerContext<TSchema>[\"body\"],\n query: query as HandlerContext<TSchema>[\"query\"],\n params: params as HandlerContext<TSchema>[\"params\"],\n headers: headers as HandlerContext<TSchema>[\"headers\"],\n cookies: cookies as HandlerContext<TSchema>[\"cookies\"],\n ...extraCtx,\n } as HandlerContext<TSchema>);\n\n return autoResponse(result);\n } catch (error) {\n // 如果是 VafastError,重新抛出让错误处理中间件处理\n if (error instanceof VafastError) {\n throw error;\n }\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return json({ success: false, error: \"Validation Error\", message: error.message }, 400);\n }\n return json({ success: false, error: \"Internal Error\", message: error instanceof Error ? error.message : \"未知错误\" }, 500);\n }\n };\n}\n\n// ============= 判断路由类型 =============\n\n/** 判断是否为叶子路由 */\nfunction isLeafRoute(route: RouteConfigResult): route is LeafRouteConfig {\n return \"method\" in route && \"handler\" in route;\n}\n\n/** 判断是否为嵌套路由 */\nfunction isNestedRoute(route: RouteConfigResult): route is NestedRouteConfig {\n return \"children\" in route;\n}\n\n// ============= defineRoute 函数(支持重载) =============\n\n/**\n * 定义叶子路由(有 method 和 handler),支持中间件类型推断和显式上下文类型\n *\n * @example\n * ```typescript\n * // 方式1:通过中间件自动推断上下文\n * defineRoute({\n * method: 'GET',\n * path: '/profile',\n * middleware: [authMiddleware],\n * handler: ({ user }) => { ... } // user 来自 authMiddleware\n * })\n *\n * // 方式2:显式声明上下文类型(用于父级中间件注入的场景)\n * defineRoute({\n * method: 'GET',\n * path: '/profile',\n * context: {} as { userInfo: UserInfo },\n * handler: ({ userInfo }) => { ... } // userInfo 有类型\n * })\n * ```\n */\nexport function defineRoute<\n const TSchema extends RouteSchema,\n TReturn,\n const TMiddleware extends readonly AnyMiddleware[],\n TContext extends object = object,\n TMethod extends HTTPMethod = HTTPMethod,\n TPath extends string = string\n>(config: {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n /** 显式声明上下文类型(用于父级中间件注入的场景) */\n readonly context?: TContext;\n readonly handler: (\n ctx: HandlerContextWithExtra<TSchema, TContext & MergeMiddlewareContexts<TMiddleware>>\n ) => TReturn | Promise<TReturn>;\n readonly middleware?: TMiddleware;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n}): LeafRouteConfig<TMethod, TPath, TSchema, TReturn, TMiddleware>;\n\n/**\n * 定义嵌套路由(有 children),支持中间件类型推断\n */\nexport function defineRoute<\n const TMiddleware extends readonly AnyMiddleware[],\n TPath extends string = string\n>(config: {\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly middleware?: TMiddleware;\n readonly children: ReadonlyArray<RouteConfigResult>;\n}): NestedRouteConfig<TPath, TMiddleware>;\n\n/**\n * defineRoute 实现\n */\nexport function defineRoute(config: {\n readonly method?: HTTPMethod;\n readonly path: string;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: RouteSchema;\n readonly context?: object;\n readonly handler?: (ctx: HandlerContext<RouteSchema>) => unknown | Promise<unknown>;\n readonly middleware?: readonly AnyMiddleware[];\n readonly children?: ReadonlyArray<RouteConfigResult>;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n}): RouteConfigResult {\n return config as RouteConfigResult;\n}\n\n// ============= withContext 工厂函数 =============\n\n/**\n * 创建带预设上下文类型的路由定义器\n *\n * 用于父级中间件注入上下文的场景,定义一次,多处复用\n *\n * @example\n * ```typescript\n * // 1. 在 middleware/index.ts 中定义\n * export const defineAuthRoute = withContext<{ userInfo: UserInfo }>()\n *\n * // 2. 在路由文件中使用\n * defineAuthRoute({\n * method: 'GET',\n * path: '/profile',\n * handler: ({ userInfo }) => {\n * // userInfo 自动有类型!\n * return { id: userInfo.id }\n * }\n * })\n * ```\n */\nexport function withContext<TContext extends object>() {\n return <\n const TSchema extends RouteSchema,\n TReturn,\n const TMiddleware extends readonly AnyMiddleware[],\n TMethod extends HTTPMethod = HTTPMethod,\n TPath extends string = string\n >(config: {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n readonly handler: (\n ctx: HandlerContextWithExtra<TSchema, TContext & MergeMiddlewareContexts<TMiddleware>>\n ) => TReturn | Promise<TReturn>;\n readonly middleware?: TMiddleware;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n }): LeafRouteConfig<TMethod, TPath, TSchema, TReturn, TMiddleware> => {\n return config as LeafRouteConfig<TMethod, TPath, TSchema, TReturn, TMiddleware>;\n };\n}\n\n// ============= 扁平化嵌套路由 =============\n\n/**\n * 递归扁平化路由,合并路径和中间件\n */\nfunction flattenRoutes(\n routes: ReadonlyArray<RouteConfigResult>,\n parentPath: string = \"\",\n parentMiddleware: readonly AnyMiddleware[] = []\n): ProcessedRoute[] {\n const result: ProcessedRoute[] = [];\n\n for (const route of routes) {\n const fullPath = parentPath + route.path;\n const mergedMiddleware = [...parentMiddleware, ...(route.middleware || [])];\n\n if (isLeafRoute(route)) {\n result.push({\n method: route.method,\n path: fullPath,\n name: route.name,\n description: route.description,\n schema: route.schema,\n handler: wrapHandler(route.schema, route.handler as (ctx: HandlerContext<RouteSchema>) => unknown),\n middleware: mergedMiddleware.length > 0 ? mergedMiddleware : undefined,\n docs: route.docs,\n });\n } else if (isNestedRoute(route)) {\n result.push(...flattenRoutes(route.children, fullPath, mergedMiddleware));\n }\n }\n\n return result;\n}\n\n// ============= defineRoutes 函数 =============\n\n/**\n * 定义路由数组,支持嵌套路由\n */\nexport function defineRoutes(routes: ReadonlyArray<RouteConfigResult>): ProcessedRoute[] {\n return flattenRoutes(routes);\n}\n\n// ============= 用于 API Client 的类型推断 =============\n\n/** 可推断的路由类型(供 vafast-api-client 使用) */\nexport type InferableRoute<\n TMethod extends string = string,\n TPath extends string = string,\n TReturn = unknown,\n TSchema extends RouteSchema = RouteSchema\n> = {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n readonly handler: {\n __returnType: TReturn;\n __schema: TSchema;\n };\n readonly middleware?: ReadonlyArray<AnyMiddleware>;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"defineRoute.mjs","names":[],"sources":["../src/defineRoute.ts"],"sourcesContent":["/**\n * 路由定义 - Schema 在路由级别定义,支持嵌套路由和中间件类型推断\n *\n * @example\n * ```typescript\n * // 定义带类型的中间件(函数式风格,通过 next 传递上下文)\n * const authMiddleware = defineMiddleware<{ user: User }>((req, next) => {\n * const user = getUser(req)\n * return next({ user }) // 通过 next 参数传递上下文\n * })\n *\n * // 路由自动推断中间件注入的类型\n * const routes = defineRoutes([\n * defineRoute({\n * path: '/api',\n * middleware: [authMiddleware],\n * children: [\n * defineRoute({\n * method: 'GET',\n * path: '/profile',\n * handler: ({ user }) => ({ name: user.name }) // ✅ user 有类型\n * })\n * ]\n * })\n * ])\n * ```\n */\n\nimport type { TSchema, Static } from \"@sinclair/typebox\";\nimport { parseBody, parseQuery, parseHeaders, parseCookies } from \"./utils/parsers\";\nimport { validateAllSchemas, precompileSchemas } from \"./utils/validators/validators\";\nimport { json } from \"./utils/response\";\nimport { VafastError } from \"./middleware\";\n\n// ============= Schema 类型 =============\n\n/** 路由 Schema 配置 */\nexport interface RouteSchema {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 从 Schema 推断类型 */\ntype InferSchemaType<T extends RouteSchema> = {\n body: T[\"body\"] extends TSchema ? Static<T[\"body\"]> : unknown;\n query: T[\"query\"] extends TSchema ? Static<T[\"query\"]> : Record<string, string>;\n params: T[\"params\"] extends TSchema ? Static<T[\"params\"]> : Record<string, string>;\n headers: T[\"headers\"] extends TSchema ? Static<T[\"headers\"]> : Record<string, string>;\n cookies: T[\"cookies\"] extends TSchema ? Static<T[\"cookies\"]> : Record<string, string>;\n};\n\n// ============= 中间件类型系统 =============\n\n/** 带类型标记的中间件 */\nexport interface TypedMiddleware<TContext extends object = object> {\n (req: Request, next: (ctx?: TContext) => Promise<Response>): Response | Promise<Response>;\n /** 类型标记(仅编译时使用) */\n __context?: TContext;\n}\n\n/** 普通中间件(无类型注入) */\ntype PlainMiddleware = (req: Request, next: () => Promise<Response>) => Response | Promise<Response>;\n\n/** 任意中间件类型 */\ntype AnyMiddleware = TypedMiddleware<object> | PlainMiddleware;\n\n/** 从中间件提取上下文类型 */\ntype ExtractMiddlewareContext<T> = T extends TypedMiddleware<infer C> ? C : object;\n\n/** 合并中间件数组的上下文类型 */\ntype MergeMiddlewareContexts<T extends readonly unknown[]> =\n T extends readonly [infer First, ...infer Rest]\n ? ExtractMiddlewareContext<First> & MergeMiddlewareContexts<Rest>\n : object;\n\n// ============= Handler 上下文 =============\n\n/** Handler 上下文(包含 schema 推断) */\nexport interface HandlerContext<TSchema extends RouteSchema = RouteSchema> {\n req: Request;\n body: InferSchemaType<TSchema>[\"body\"];\n query: InferSchemaType<TSchema>[\"query\"];\n params: InferSchemaType<TSchema>[\"params\"];\n headers: InferSchemaType<TSchema>[\"headers\"];\n cookies: InferSchemaType<TSchema>[\"cookies\"];\n}\n\n/** Handler 上下文(带中间件注入的额外类型) */\ntype HandlerContextWithExtra<TSchema extends RouteSchema, TExtra> =\n HandlerContext<TSchema> & TExtra;\n\n// ============= 路由配置类型 =============\n\n/** HTTP 方法 */\ntype HTTPMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\";\n\n/** 叶子路由配置(有 method 和 handler) */\nexport interface LeafRouteConfig<\n TMethod extends HTTPMethod = HTTPMethod,\n TPath extends string = string,\n TSchema extends RouteSchema = RouteSchema,\n TReturn = unknown,\n TMiddleware extends readonly AnyMiddleware[] = readonly AnyMiddleware[]\n> {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n readonly handler: (\n ctx: HandlerContextWithExtra<TSchema, MergeMiddlewareContexts<TMiddleware>>\n ) => TReturn | Promise<TReturn>;\n readonly middleware?: TMiddleware;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n}\n\n/** 嵌套路由配置(有 children,无 method 和 handler) */\ninterface NestedRouteConfig<\n TPath extends string = string,\n TMiddleware extends readonly AnyMiddleware[] = readonly AnyMiddleware[]\n> {\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly middleware?: TMiddleware;\n readonly children: ReadonlyArray<RouteConfigResult>;\n}\n\n/** defineRoute 返回的类型 */\ntype RouteConfigResult =\n | LeafRouteConfig<HTTPMethod, string, RouteSchema, unknown, readonly AnyMiddleware[]>\n | NestedRouteConfig<string, readonly AnyMiddleware[]>;\n\n/** 处理后的扁平路由 */\nexport interface ProcessedRoute {\n method: HTTPMethod;\n path: string;\n name?: string;\n description?: string;\n schema?: RouteSchema;\n handler: (req: Request) => Promise<Response>;\n middleware?: readonly AnyMiddleware[];\n docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n /** 允许任意扩展(兼容 Route 类型) */\n [key: string]: unknown;\n}\n\n// ============= defineMiddleware =============\n\n/**\n * 定义带类型的中间件(函数式风格)\n *\n * 通过 next() 参数传递上下文,更符合函数式编程风格\n *\n * @example\n * ```typescript\n * type AuthContext = { user: { id: string; name: string } }\n *\n * const authMiddleware = defineMiddleware<AuthContext>((req, next) => {\n * const user = getUserFromToken(req)\n * return next({ user }) // 通过 next 传递上下文\n * })\n * ```\n */\nexport function defineMiddleware<TContext extends object = object>(\n handler: (\n req: Request,\n next: (ctx?: TContext) => Promise<Response>\n ) => Promise<Response>\n): TypedMiddleware<TContext> {\n // 包装成标准中间件签名\n const middleware = ((req: Request, originalNext: () => Promise<Response>) => {\n // 包装 next,接收上下文参数并存储到 req.__locals\n const nextWithContext = (ctx?: TContext): Promise<Response> => {\n if (ctx) {\n const target = req as unknown as { __locals?: object };\n target.__locals = { ...(target.__locals || {}), ...ctx };\n }\n return originalNext();\n };\n return handler(req, nextWithContext);\n }) as TypedMiddleware<TContext>;\n\n return middleware;\n}\n\n// ============= 响应处理 =============\n\n/** 自动转换返回值为 Response */\nfunction autoResponse(result: unknown): Response {\n if (result instanceof Response) return result;\n if (result === null || result === undefined) return new Response(null, { status: 204 });\n if (typeof result === \"string\") {\n return new Response(result, { headers: { \"Content-Type\": \"text/plain; charset=utf-8\" } });\n }\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return new Response(String(result), { headers: { \"Content-Type\": \"text/plain; charset=utf-8\" } });\n }\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj && (\"status\" in obj || \"headers\" in obj)) {\n const { data, status = 200, headers = {} } = obj;\n if (data === null || data === undefined) {\n return new Response(null, { status: status === 200 ? 204 : (status as number), headers: headers as HeadersInit });\n }\n return json(data, status as number, headers as Record<string, string>);\n }\n return json(result);\n }\n return new Response(null, { status: 204 });\n}\n\n/** 创建包装后的 handler */\nfunction wrapHandler<TSchema extends RouteSchema>(\n schema: TSchema | undefined,\n userHandler: (ctx: HandlerContext<TSchema>) => unknown | Promise<unknown>\n): (req: Request) => Promise<Response> {\n if (schema && (schema.body || schema.query || schema.params || schema.headers || schema.cookies)) {\n precompileSchemas(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params = ((req as unknown as Record<string, unknown>).params as Record<string, string>) || {};\n\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n try {\n body = await parseBody(req);\n } catch {\n // 忽略解析错误\n }\n }\n\n const data = { body, query, params, headers, cookies };\n if (schema && (schema.body || schema.query || schema.params || schema.headers || schema.cookies)) {\n validateAllSchemas(schema, data);\n }\n\n // 获取中间件注入的上下文\n const extraCtx = (req as unknown as { __locals?: unknown }).__locals || {};\n\n const result = await userHandler({\n req,\n body: body as HandlerContext<TSchema>[\"body\"],\n query: query as HandlerContext<TSchema>[\"query\"],\n params: params as HandlerContext<TSchema>[\"params\"],\n headers: headers as HandlerContext<TSchema>[\"headers\"],\n cookies: cookies as HandlerContext<TSchema>[\"cookies\"],\n ...extraCtx,\n } as HandlerContext<TSchema>);\n\n return autoResponse(result);\n } catch (error) {\n // 如果是 VafastError,重新抛出让错误处理中间件处理\n if (error instanceof VafastError) {\n throw error;\n }\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return json({ code: 400, message: error.message }, 400);\n }\n return json({ code: 500, message: error instanceof Error ? error.message : \"未知错误\" }, 500);\n }\n };\n}\n\n// ============= 判断路由类型 =============\n\n/** 判断是否为叶子路由 */\nfunction isLeafRoute(route: RouteConfigResult): route is LeafRouteConfig {\n return \"method\" in route && \"handler\" in route;\n}\n\n/** 判断是否为嵌套路由 */\nfunction isNestedRoute(route: RouteConfigResult): route is NestedRouteConfig {\n return \"children\" in route;\n}\n\n// ============= defineRoute 函数(支持重载) =============\n\n/**\n * 定义叶子路由(有 method 和 handler),支持中间件类型推断和显式上下文类型\n *\n * @example\n * ```typescript\n * // 方式1:通过中间件自动推断上下文\n * defineRoute({\n * method: 'GET',\n * path: '/profile',\n * middleware: [authMiddleware],\n * handler: ({ user }) => { ... } // user 来自 authMiddleware\n * })\n *\n * // 方式2:显式声明上下文类型(用于父级中间件注入的场景)\n * defineRoute({\n * method: 'GET',\n * path: '/profile',\n * context: {} as { userInfo: UserInfo },\n * handler: ({ userInfo }) => { ... } // userInfo 有类型\n * })\n * ```\n */\nexport function defineRoute<\n const TSchema extends RouteSchema,\n TReturn,\n const TMiddleware extends readonly AnyMiddleware[],\n TContext extends object = object,\n TMethod extends HTTPMethod = HTTPMethod,\n TPath extends string = string\n>(config: {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n /** 显式声明上下文类型(用于父级中间件注入的场景) */\n readonly context?: TContext;\n readonly handler: (\n ctx: HandlerContextWithExtra<TSchema, TContext & MergeMiddlewareContexts<TMiddleware>>\n ) => TReturn | Promise<TReturn>;\n readonly middleware?: TMiddleware;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n}): LeafRouteConfig<TMethod, TPath, TSchema, TReturn, TMiddleware>;\n\n/**\n * 定义嵌套路由(有 children),支持中间件类型推断\n */\nexport function defineRoute<\n const TMiddleware extends readonly AnyMiddleware[],\n TPath extends string = string\n>(config: {\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly middleware?: TMiddleware;\n readonly children: ReadonlyArray<RouteConfigResult>;\n}): NestedRouteConfig<TPath, TMiddleware>;\n\n/**\n * defineRoute 实现\n */\nexport function defineRoute(config: {\n readonly method?: HTTPMethod;\n readonly path: string;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: RouteSchema;\n readonly context?: object;\n readonly handler?: (ctx: HandlerContext<RouteSchema>) => unknown | Promise<unknown>;\n readonly middleware?: readonly AnyMiddleware[];\n readonly children?: ReadonlyArray<RouteConfigResult>;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n}): RouteConfigResult {\n return config as RouteConfigResult;\n}\n\n// ============= withContext 工厂函数 =============\n\n/**\n * 创建带预设上下文类型的路由定义器\n *\n * 用于父级中间件注入上下文的场景,定义一次,多处复用\n *\n * @example\n * ```typescript\n * // 1. 在 middleware/index.ts 中定义\n * export const defineAuthRoute = withContext<{ userInfo: UserInfo }>()\n *\n * // 2. 在路由文件中使用\n * defineAuthRoute({\n * method: 'GET',\n * path: '/profile',\n * handler: ({ userInfo }) => {\n * // userInfo 自动有类型!\n * return { id: userInfo.id }\n * }\n * })\n * ```\n */\nexport function withContext<TContext extends object>() {\n return <\n const TSchema extends RouteSchema,\n TReturn,\n const TMiddleware extends readonly AnyMiddleware[],\n TMethod extends HTTPMethod = HTTPMethod,\n TPath extends string = string\n >(config: {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n readonly handler: (\n ctx: HandlerContextWithExtra<TSchema, TContext & MergeMiddlewareContexts<TMiddleware>>\n ) => TReturn | Promise<TReturn>;\n readonly middleware?: TMiddleware;\n readonly docs?: {\n tags?: string[];\n security?: unknown[];\n responses?: Record<string, unknown>;\n };\n }): LeafRouteConfig<TMethod, TPath, TSchema, TReturn, TMiddleware> => {\n return config as LeafRouteConfig<TMethod, TPath, TSchema, TReturn, TMiddleware>;\n };\n}\n\n// ============= 扁平化嵌套路由 =============\n\n/**\n * 递归扁平化路由,合并路径和中间件\n */\nfunction flattenRoutes(\n routes: ReadonlyArray<RouteConfigResult>,\n parentPath: string = \"\",\n parentMiddleware: readonly AnyMiddleware[] = []\n): ProcessedRoute[] {\n const result: ProcessedRoute[] = [];\n\n for (const route of routes) {\n const fullPath = parentPath + route.path;\n const mergedMiddleware = [...parentMiddleware, ...(route.middleware || [])];\n\n if (isLeafRoute(route)) {\n result.push({\n method: route.method,\n path: fullPath,\n name: route.name,\n description: route.description,\n schema: route.schema,\n handler: wrapHandler(route.schema, route.handler as (ctx: HandlerContext<RouteSchema>) => unknown),\n middleware: mergedMiddleware.length > 0 ? mergedMiddleware : undefined,\n docs: route.docs,\n });\n } else if (isNestedRoute(route)) {\n result.push(...flattenRoutes(route.children, fullPath, mergedMiddleware));\n }\n }\n\n return result;\n}\n\n// ============= defineRoutes 函数 =============\n\n/** 带原始类型信息的路由数组 */\nexport type RoutesWithSource<T extends readonly RouteConfigResult[]> = ProcessedRoute[] & { __source: T };\n\n/**\n * 定义路由数组,支持嵌套路由\n * \n * 使用 `const T` 泛型自动保留字面量类型,无需手动添加 `as const`\n * \n * @example\n * ```typescript\n * const routes = defineRoutes([\n * defineRoute({ method: 'GET', path: '/users', handler: ... }),\n * defineRoute({ method: 'POST', path: '/users', handler: ... }),\n * ])\n * \n * // 类型推断自动工作,无需 as const\n * type Api = InferEden<typeof routes>\n * ```\n */\nexport function defineRoutes<const T extends readonly RouteConfigResult[]>(\n routes: T\n): RoutesWithSource<T> {\n const processed = flattenRoutes(routes);\n // 附加原始类型信息(仅用于类型推断,运行时不使用)\n return Object.assign(processed, { __source: routes }) as RoutesWithSource<T>;\n}\n\n// ============= 用于 API Client 的类型推断 =============\n\n/** 可推断的路由类型(供 vafast-api-client 使用) */\nexport type InferableRoute<\n TMethod extends string = string,\n TPath extends string = string,\n TReturn = unknown,\n TSchema extends RouteSchema = RouteSchema\n> = {\n readonly method: TMethod;\n readonly path: TPath;\n readonly name?: string;\n readonly description?: string;\n readonly schema?: TSchema;\n readonly handler: {\n __returnType: TReturn;\n __schema: TSchema;\n };\n readonly middleware?: ReadonlyArray<AnyMiddleware>;\n};\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as ProcessedRoute } from "./defineRoute-
|
|
1
|
+
import { i as ProcessedRoute } from "./defineRoute-FhAN4ivP.mjs";
|
|
2
2
|
import { r as NestedComponentRoute, t as ComponentRoute } from "./component-route-Di7R40-2.mjs";
|
|
3
|
-
import { t as Server } from "./server-
|
|
3
|
+
import { t as Server } from "./server-8X5Hgu7h.mjs";
|
|
4
4
|
import { t as ComponentServer } from "./component-server-fR4UV6Jq.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/server/server-factory.d.ts
|
|
@@ -45,4 +45,4 @@ declare class ServerFactory {
|
|
|
45
45
|
}
|
|
46
46
|
//#endregion
|
|
47
47
|
export { ServerFactory as t };
|
|
48
|
-
//# sourceMappingURL=index-
|
|
48
|
+
//# sourceMappingURL=index-XcXGKQqt.d.mts.map
|
package/dist/index.d.mts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { a as RouteSchema, c as
|
|
1
|
+
import { a as RouteSchema, c as defineMiddleware, d as withContext, i as ProcessedRoute, l as defineRoute, n as InferableRoute, o as RoutesWithSource, r as LeafRouteConfig, s as TypedMiddleware, t as HandlerContext, u as defineRoutes } from "./defineRoute-FhAN4ivP.mjs";
|
|
2
2
|
import { i as ResponseBody, n as Method, r as Middleware, t as Handler } from "./types-B8Z3cMtZ.mjs";
|
|
3
3
|
import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "./component-route-Di7R40-2.mjs";
|
|
4
4
|
import { t as BaseServer } from "./base-server-Contwrlf.mjs";
|
|
5
|
-
import { t as Server } from "./server-
|
|
5
|
+
import { t as Server } from "./server-8X5Hgu7h.mjs";
|
|
6
6
|
import { t as DependencyManager } from "./dependency-manager-DIN9X0Gj.mjs";
|
|
7
7
|
import { t as ComponentServer } from "./component-server-fR4UV6Jq.mjs";
|
|
8
|
-
import { t as ServerFactory } from "./index-
|
|
9
|
-
import { n as composeMiddleware, t as VafastError } from "./middleware-
|
|
8
|
+
import { t as ServerFactory } from "./index-XcXGKQqt.mjs";
|
|
9
|
+
import { n as composeMiddleware, t as VafastError } from "./middleware-CrD2gfzt.mjs";
|
|
10
10
|
import { a as parseBody, c as parseCookiesFast, d as parseHeaders, f as parseQuery, i as getHeader, p as parseQueryFast, r as getCookie, s as parseCookies } from "./parsers-8hIAx0OV.mjs";
|
|
11
|
-
import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "./response-
|
|
11
|
+
import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "./response-CJcO5s7Q.mjs";
|
|
12
12
|
import { t as goAwait } from "./go-await-DPtVBug4.mjs";
|
|
13
13
|
import { n as base64urlEncode, t as base64urlDecode } from "./base64url-DNUGwekK.mjs";
|
|
14
14
|
import { t as HtmlRenderer } from "./html-renderer-DhQxRuyi.mjs";
|
|
15
15
|
import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f as validateSchema, l as precompileSchemas, o as ValidationResult, p as validateSchemaOrThrow, s as createValidator, t as SchemaConfig, u as validateAllSchemas } from "./validators-BFC6S_fr.mjs";
|
|
16
16
|
import { i as registerFormats, n as hasFormat, r as registerFormat, t as Patterns } from "./formats-DDDSFWP0.mjs";
|
|
17
|
-
import { a as createSSEHandler, i as SSEMarker, r as SSEHandler, t as SSEEvent } from "./sse-
|
|
18
|
-
import { a as getAllRoutes, c as getRoutesByMethod, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "./route-registry-
|
|
17
|
+
import { a as createSSEHandler, i as SSEMarker, r as SSEHandler, t as SSEEvent } from "./sse-DyI21Jqk.mjs";
|
|
18
|
+
import { a as getAllRoutes, c as getRoutesByMethod, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "./route-registry-YIco7opr.mjs";
|
|
19
19
|
import { n as getApiSpec, t as generateAITools } from "./contract-BL3JflJ7.mjs";
|
|
20
20
|
import "./utils/index.mjs";
|
|
21
21
|
import { normalizePath } from "./router.mjs";
|
|
22
22
|
import { i as ServeResult, o as serve, r as ServeOptions, t as FetchHandler } from "./serve-DlzxgOhz.mjs";
|
|
23
23
|
import "./serve.mjs";
|
|
24
24
|
import { FormatRegistry, Type } from "@sinclair/typebox";
|
|
25
|
-
export { BaseServer, ComponentRoute, ComponentServer, DependencyManager, type FetchHandler, FlattenedComponentRoute, FormatRegistry, Handler, HandlerContext, HtmlRenderer, InferableRoute, LeafRouteConfig, Method, Middleware, NestedComponentRoute, Patterns, ProcessedRoute, ResponseBody, RouteMeta, RouteRegistry, RouteSchema, SSEEvent, SSEHandler, SSEMarker, SchemaConfig, type ServeOptions, type ServeResult, Server, ServerFactory, Type, TypedMiddleware, VafastError, ValidationError, ValidationResult, base64urlDecode, base64urlEncode, composeMiddleware, createRouteRegistry, createSSEHandler, createValidator, defineMiddleware, defineRoute, defineRoutes, empty, err, filterRoutes, generateAITools, getAllRoutes, getApiSpec, getCookie, getHeader, getRoute, getRouteRegistry, getRoutesByMethod, getValidatorCacheStats, goAwait, hasFormat, html, json, normalizePath, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, precompileSchemas, redirect, registerFormat, registerFormats, serve, stream, text, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow, withContext };
|
|
25
|
+
export { BaseServer, ComponentRoute, ComponentServer, DependencyManager, type FetchHandler, FlattenedComponentRoute, FormatRegistry, Handler, HandlerContext, HtmlRenderer, InferableRoute, LeafRouteConfig, Method, Middleware, NestedComponentRoute, Patterns, ProcessedRoute, ResponseBody, RouteMeta, RouteRegistry, RouteSchema, RoutesWithSource, SSEEvent, SSEHandler, SSEMarker, SchemaConfig, type ServeOptions, type ServeResult, Server, ServerFactory, Type, TypedMiddleware, VafastError, ValidationError, ValidationResult, base64urlDecode, base64urlEncode, composeMiddleware, createRouteRegistry, createSSEHandler, createValidator, defineMiddleware, defineRoute, defineRoutes, empty, err, filterRoutes, generateAITools, getAllRoutes, getApiSpec, getCookie, getHeader, getRoute, getRouteRegistry, getRoutesByMethod, getValidatorCacheStats, goAwait, hasFormat, html, json, normalizePath, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, precompileSchemas, redirect, registerFormat, registerFormats, serve, stream, text, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow, withContext };
|
package/dist/index.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { a as parseCookies, d as parseQueryFast, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, t as getCookie, u as parseQuery } from "./parsers-BrG_mRLq.mjs";
|
|
2
2
|
import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "./validators-CkfvNBbK.mjs";
|
|
3
|
-
import { c as text, i as json, l as VafastError, n as err, o as redirect, r as html, s as stream, t as empty, u as composeMiddleware } from "./response-
|
|
3
|
+
import { c as text, i as json, l as VafastError, n as err, o as redirect, r as html, s as stream, t as empty, u as composeMiddleware } from "./response-dgNpkPIp.mjs";
|
|
4
4
|
import { defineMiddleware, defineRoute, defineRoutes, withContext } from "./defineRoute.mjs";
|
|
5
5
|
import { t as BaseServer } from "./base-server-CE0mfqPY.mjs";
|
|
6
6
|
import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as getRoutesByMethod, t as RouteRegistry } from "./route-registry-BzExlM2t.mjs";
|
|
7
|
-
import { t as Server } from "./server-
|
|
7
|
+
import { t as Server } from "./server-BCjY3a63.mjs";
|
|
8
8
|
import { t as HtmlRenderer } from "./html-renderer-D1zzDVQM.mjs";
|
|
9
9
|
import { t as DependencyManager } from "./dependency-manager-CGMZJTer.mjs";
|
|
10
10
|
import { t as ComponentServer } from "./component-server-Cya46YN3.mjs";
|
|
11
|
-
import { t as ServerFactory } from "./server-
|
|
11
|
+
import { t as ServerFactory } from "./server-AJWK-vUI.mjs";
|
|
12
12
|
import { t as goAwait } from "./go-await-B1U27PgB.mjs";
|
|
13
13
|
import { n as base64urlEncode, t as base64urlDecode } from "./base64url-Cc77f1ms.mjs";
|
|
14
14
|
import { Patterns, hasFormat, registerFormat, registerFormats } from "./utils/formats.mjs";
|
|
15
|
-
import { t as createSSEHandler } from "./sse-
|
|
15
|
+
import { t as createSSEHandler } from "./sse-CAOZ-rXY.mjs";
|
|
16
16
|
import { n as getApiSpec, t as generateAITools } from "./contract-BKqc9fFH.mjs";
|
|
17
17
|
import "./utils/index.mjs";
|
|
18
18
|
import { normalizePath } from "./router.mjs";
|
|
@@ -5,11 +5,11 @@ import { r as Middleware, t as Handler } from "./types-B8Z3cMtZ.mjs";
|
|
|
5
5
|
/** Vafast 自定义错误类型 */
|
|
6
6
|
declare class VafastError extends Error {
|
|
7
7
|
status: number;
|
|
8
|
-
|
|
8
|
+
code: number;
|
|
9
9
|
expose: boolean;
|
|
10
10
|
constructor(message: string, options?: {
|
|
11
11
|
status?: number;
|
|
12
|
-
|
|
12
|
+
code?: number;
|
|
13
13
|
expose?: boolean;
|
|
14
14
|
cause?: unknown;
|
|
15
15
|
});
|
|
@@ -20,4 +20,4 @@ declare class VafastError extends Error {
|
|
|
20
20
|
declare function composeMiddleware(middleware: Middleware[], finalHandler: Handler): (req: Request) => Promise<Response>;
|
|
21
21
|
//#endregion
|
|
22
22
|
export { composeMiddleware as n, VafastError as t };
|
|
23
|
-
//# sourceMappingURL=middleware-
|
|
23
|
+
//# sourceMappingURL=middleware-CrD2gfzt.d.mts.map
|
package/dist/middleware.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as composeMiddleware, t as VafastError } from "./middleware-
|
|
1
|
+
import { n as composeMiddleware, t as VafastError } from "./middleware-CrD2gfzt.mjs";
|
|
2
2
|
export { VafastError, composeMiddleware };
|
package/dist/middleware.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
2
|
-
import "../server-
|
|
3
|
-
import "../index-
|
|
1
|
+
import "../defineRoute-FhAN4ivP.mjs";
|
|
2
|
+
import "../server-8X5Hgu7h.mjs";
|
|
3
|
+
import "../index-XcXGKQqt.mjs";
|
|
4
4
|
import { MemoryInfo, MonitoredServer, MonitoringConfig, MonitoringMetrics, MonitoringStatus, PathStats, StatusCodeDistribution, TimeWindowStats, createMonitoredServer, withMonitoring } from "./native-monitor.mjs";
|
|
5
5
|
export { type MemoryInfo, type MonitoredServer, type MonitoringConfig, type MonitoringMetrics, type MonitoringStatus, type PathStats, type StatusCodeDistribution, type TimeWindowStats, createMonitoredServer, withMonitoring };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
2
|
-
import { t as Server } from "../server-
|
|
3
|
-
import "../index-
|
|
1
|
+
import "../defineRoute-FhAN4ivP.mjs";
|
|
2
|
+
import { t as Server } from "../server-8X5Hgu7h.mjs";
|
|
3
|
+
import "../index-XcXGKQqt.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/monitoring/native-monitor.d.ts
|
|
6
6
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as VafastError } from "./middleware-
|
|
1
|
+
import { t as VafastError } from "./middleware-CrD2gfzt.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/response.d.ts
|
|
4
4
|
/** 生成 JSON 响应 */
|
|
@@ -21,28 +21,38 @@ declare function stream(stream: ReadableStream, status?: number, headers?: Heade
|
|
|
21
21
|
/**
|
|
22
22
|
* 创建错误响应
|
|
23
23
|
*
|
|
24
|
+
* @param message - 错误信息
|
|
25
|
+
* @param status - HTTP 状态码,默认 500
|
|
26
|
+
* @param code - 业务错误码,默认等于 status
|
|
27
|
+
*
|
|
24
28
|
* @example
|
|
25
29
|
* ```typescript
|
|
26
|
-
* //
|
|
27
|
-
* throw err('用户不存在', 404
|
|
30
|
+
* // 使用默认 code(等于 HTTP status)
|
|
31
|
+
* throw err('用户不存在', 404)
|
|
32
|
+
* // 响应: HTTP 404, { code: 404, message: "用户不存在" }
|
|
33
|
+
*
|
|
34
|
+
* // 使用自定义业务 code
|
|
35
|
+
* throw err('用户不存在', 404, 10001)
|
|
36
|
+
* // 响应: HTTP 404, { code: 10001, message: "用户不存在" }
|
|
28
37
|
*
|
|
29
38
|
* // 预定义错误
|
|
30
39
|
* throw err.notFound('用户不存在')
|
|
40
|
+
* throw err.notFound('用户不存在', 10001) // 带业务码
|
|
31
41
|
* throw err.badRequest('参数错误')
|
|
32
42
|
* throw err.unauthorized('请先登录')
|
|
33
43
|
* ```
|
|
34
44
|
*/
|
|
35
|
-
declare function err(message: string, status?: number,
|
|
45
|
+
declare function err(message: string, status?: number, code?: number): VafastError;
|
|
36
46
|
declare namespace err {
|
|
37
|
-
var badRequest: (message?: string) => VafastError;
|
|
38
|
-
var unauthorized: (message?: string) => VafastError;
|
|
39
|
-
var forbidden: (message?: string) => VafastError;
|
|
40
|
-
var notFound: (message?: string) => VafastError;
|
|
41
|
-
var conflict: (message?: string) => VafastError;
|
|
42
|
-
var unprocessable: (message?: string) => VafastError;
|
|
43
|
-
var tooMany: (message?: string) => VafastError;
|
|
44
|
-
var internal: (message?: string) => VafastError;
|
|
47
|
+
var badRequest: (message?: string, code?: number) => VafastError;
|
|
48
|
+
var unauthorized: (message?: string, code?: number) => VafastError;
|
|
49
|
+
var forbidden: (message?: string, code?: number) => VafastError;
|
|
50
|
+
var notFound: (message?: string, code?: number) => VafastError;
|
|
51
|
+
var conflict: (message?: string, code?: number) => VafastError;
|
|
52
|
+
var unprocessable: (message?: string, code?: number) => VafastError;
|
|
53
|
+
var tooMany: (message?: string, code?: number) => VafastError;
|
|
54
|
+
var internal: (message?: string, code?: number) => VafastError;
|
|
45
55
|
}
|
|
46
56
|
//#endregion
|
|
47
57
|
export { mapResponse as a, text as c, json as i, err as n, redirect as o, html as r, stream as s, empty as t };
|
|
48
|
-
//# sourceMappingURL=response-
|
|
58
|
+
//# sourceMappingURL=response-CJcO5s7Q.d.mts.map
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
/** Vafast 自定义错误类型 */
|
|
4
4
|
var VafastError = class extends Error {
|
|
5
5
|
status;
|
|
6
|
-
|
|
6
|
+
code;
|
|
7
7
|
expose;
|
|
8
8
|
constructor(message, options = {}) {
|
|
9
9
|
super(message);
|
|
10
10
|
this.name = "VafastError";
|
|
11
11
|
this.status = options.status ?? 500;
|
|
12
|
-
this.
|
|
12
|
+
this.code = options.code ?? options.status ?? 500;
|
|
13
13
|
this.expose = options.expose ?? false;
|
|
14
14
|
if (options.cause) this.cause = options.cause;
|
|
15
15
|
}
|
|
@@ -40,11 +40,11 @@ const errorHandler = async (req, next) => {
|
|
|
40
40
|
} catch (err$1) {
|
|
41
41
|
console.error("未处理的错误:", err$1);
|
|
42
42
|
if (err$1 instanceof VafastError) return json({
|
|
43
|
-
|
|
43
|
+
code: err$1.code,
|
|
44
44
|
message: err$1.expose ? err$1.message : "发生了一个错误"
|
|
45
45
|
}, err$1.status);
|
|
46
46
|
return json({
|
|
47
|
-
|
|
47
|
+
code: 500,
|
|
48
48
|
message: "出现了一些问题"
|
|
49
49
|
}, 500);
|
|
50
50
|
}
|
|
@@ -142,41 +142,51 @@ function stream(stream$1, status = 200, headers = {}) {
|
|
|
142
142
|
/**
|
|
143
143
|
* 创建错误响应
|
|
144
144
|
*
|
|
145
|
+
* @param message - 错误信息
|
|
146
|
+
* @param status - HTTP 状态码,默认 500
|
|
147
|
+
* @param code - 业务错误码,默认等于 status
|
|
148
|
+
*
|
|
145
149
|
* @example
|
|
146
150
|
* ```typescript
|
|
147
|
-
* //
|
|
148
|
-
* throw err('用户不存在', 404
|
|
151
|
+
* // 使用默认 code(等于 HTTP status)
|
|
152
|
+
* throw err('用户不存在', 404)
|
|
153
|
+
* // 响应: HTTP 404, { code: 404, message: "用户不存在" }
|
|
154
|
+
*
|
|
155
|
+
* // 使用自定义业务 code
|
|
156
|
+
* throw err('用户不存在', 404, 10001)
|
|
157
|
+
* // 响应: HTTP 404, { code: 10001, message: "用户不存在" }
|
|
149
158
|
*
|
|
150
159
|
* // 预定义错误
|
|
151
160
|
* throw err.notFound('用户不存在')
|
|
161
|
+
* throw err.notFound('用户不存在', 10001) // 带业务码
|
|
152
162
|
* throw err.badRequest('参数错误')
|
|
153
163
|
* throw err.unauthorized('请先登录')
|
|
154
164
|
* ```
|
|
155
165
|
*/
|
|
156
|
-
function err(message, status = 500,
|
|
166
|
+
function err(message, status = 500, code) {
|
|
157
167
|
return new VafastError(message, {
|
|
158
168
|
status,
|
|
159
|
-
|
|
169
|
+
code: code ?? status,
|
|
160
170
|
expose: true
|
|
161
171
|
});
|
|
162
172
|
}
|
|
163
173
|
/** 400 Bad Request */
|
|
164
|
-
err.badRequest = (message = "请求参数错误") => err(message, 400,
|
|
174
|
+
err.badRequest = (message = "请求参数错误", code) => err(message, 400, code);
|
|
165
175
|
/** 401 Unauthorized */
|
|
166
|
-
err.unauthorized = (message = "未授权") => err(message, 401,
|
|
176
|
+
err.unauthorized = (message = "未授权", code) => err(message, 401, code);
|
|
167
177
|
/** 403 Forbidden */
|
|
168
|
-
err.forbidden = (message = "禁止访问") => err(message, 403,
|
|
178
|
+
err.forbidden = (message = "禁止访问", code) => err(message, 403, code);
|
|
169
179
|
/** 404 Not Found */
|
|
170
|
-
err.notFound = (message = "资源不存在") => err(message, 404,
|
|
180
|
+
err.notFound = (message = "资源不存在", code) => err(message, 404, code);
|
|
171
181
|
/** 409 Conflict */
|
|
172
|
-
err.conflict = (message = "资源冲突") => err(message, 409,
|
|
182
|
+
err.conflict = (message = "资源冲突", code) => err(message, 409, code);
|
|
173
183
|
/** 422 Unprocessable Entity */
|
|
174
|
-
err.unprocessable = (message = "无法处理的实体") => err(message, 422,
|
|
184
|
+
err.unprocessable = (message = "无法处理的实体", code) => err(message, 422, code);
|
|
175
185
|
/** 429 Too Many Requests */
|
|
176
|
-
err.tooMany = (message = "请求过于频繁") => err(message, 429,
|
|
186
|
+
err.tooMany = (message = "请求过于频繁", code) => err(message, 429, code);
|
|
177
187
|
/** 500 Internal Server Error */
|
|
178
|
-
err.internal = (message = "服务器内部错误") => err(message, 500,
|
|
188
|
+
err.internal = (message = "服务器内部错误", code) => err(message, 500, code);
|
|
179
189
|
|
|
180
190
|
//#endregion
|
|
181
191
|
export { mapResponse as a, text as c, json as i, VafastError as l, err as n, redirect as o, html as r, stream as s, empty as t, composeMiddleware as u };
|
|
182
|
-
//# sourceMappingURL=response-
|
|
192
|
+
//# sourceMappingURL=response-dgNpkPIp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-dgNpkPIp.mjs","names":["err","stream"],"sources":["../src/middleware.ts","../src/utils/response.ts"],"sourcesContent":["// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n code: number;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n code?: number;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.code = options.code ?? options.status ?? 500;\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n code: err.code,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ code: 500, message: \"出现了一些问题\" }, 500);\n }\n};\n","// src/response.ts\n\nimport { VafastError } from \"../middleware\";\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n\n// ==================== 错误响应工具 ====================\n\n/**\n * 创建错误响应\n *\n * @param message - 错误信息\n * @param status - HTTP 状态码,默认 500\n * @param code - 业务错误码,默认等于 status\n *\n * @example\n * ```typescript\n * // 使用默认 code(等于 HTTP status)\n * throw err('用户不存在', 404)\n * // 响应: HTTP 404, { code: 404, message: \"用户不存在\" }\n *\n * // 使用自定义业务 code\n * throw err('用户不存在', 404, 10001)\n * // 响应: HTTP 404, { code: 10001, message: \"用户不存在\" }\n *\n * // 预定义错误\n * throw err.notFound('用户不存在')\n * throw err.notFound('用户不存在', 10001) // 带业务码\n * throw err.badRequest('参数错误')\n * throw err.unauthorized('请先登录')\n * ```\n */\nexport function err(message: string, status = 500, code?: number) {\n return new VafastError(message, { status, code: code ?? status, expose: true });\n}\n\n/** 400 Bad Request */\nerr.badRequest = (message = \"请求参数错误\", code?: number) =>\n err(message, 400, code);\n\n/** 401 Unauthorized */\nerr.unauthorized = (message = \"未授权\", code?: number) =>\n err(message, 401, code);\n\n/** 403 Forbidden */\nerr.forbidden = (message = \"禁止访问\", code?: number) =>\n err(message, 403, code);\n\n/** 404 Not Found */\nerr.notFound = (message = \"资源不存在\", code?: number) =>\n err(message, 404, code);\n\n/** 409 Conflict */\nerr.conflict = (message = \"资源冲突\", code?: number) =>\n err(message, 409, code);\n\n/** 422 Unprocessable Entity */\nerr.unprocessable = (message = \"无法处理的实体\", code?: number) =>\n err(message, 422, code);\n\n/** 429 Too Many Requests */\nerr.tooMany = (message = \"请求过于频繁\", code?: number) =>\n err(message, 429, code);\n\n/** 500 Internal Server Error */\nerr.internal = (message = \"服务器内部错误\", code?: number) =>\n err(message, 500, code);\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as RouteSchema, i as ProcessedRoute } from "./defineRoute-
|
|
1
|
+
import { a as RouteSchema, i as ProcessedRoute } from "./defineRoute-FhAN4ivP.mjs";
|
|
2
2
|
import { n as Method } from "./types-B8Z3cMtZ.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/route-registry.d.ts
|
|
@@ -187,4 +187,4 @@ declare function filterRoutes<K extends string>(field: K): (RouteMeta & Record<K
|
|
|
187
187
|
declare function getRoutesByMethod(method: string): RouteMeta[];
|
|
188
188
|
//#endregion
|
|
189
189
|
export { getAllRoutes as a, getRoutesByMethod as c, filterRoutes as i, setGlobalRegistry as l, RouteRegistry as n, getRoute as o, createRouteRegistry as r, getRouteRegistry as s, RouteMeta as t };
|
|
190
|
-
//# sourceMappingURL=route-registry-
|
|
190
|
+
//# sourceMappingURL=route-registry-YIco7opr.d.mts.map
|
package/dist/server/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
1
|
+
import "../defineRoute-FhAN4ivP.mjs";
|
|
2
2
|
import { t as BaseServer } from "../base-server-Contwrlf.mjs";
|
|
3
|
-
import { t as Server } from "../server-
|
|
3
|
+
import { t as Server } from "../server-8X5Hgu7h.mjs";
|
|
4
4
|
import { t as ComponentServer } from "../component-server-fR4UV6Jq.mjs";
|
|
5
|
-
import { t as ServerFactory } from "../index-
|
|
5
|
+
import { t as ServerFactory } from "../index-XcXGKQqt.mjs";
|
|
6
6
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import "../response-
|
|
1
|
+
import "../response-dgNpkPIp.mjs";
|
|
2
2
|
import { t as BaseServer } from "../base-server-CE0mfqPY.mjs";
|
|
3
|
-
import { t as Server } from "../server-
|
|
3
|
+
import { t as Server } from "../server-BCjY3a63.mjs";
|
|
4
4
|
import "../dependency-manager-CGMZJTer.mjs";
|
|
5
5
|
import { t as ComponentServer } from "../component-server-Cya46YN3.mjs";
|
|
6
|
-
import { t as ServerFactory } from "../server-
|
|
6
|
+
import { t as ServerFactory } from "../server-AJWK-vUI.mjs";
|
|
7
7
|
|
|
8
8
|
export { BaseServer, ComponentServer, Server, ServerFactory };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
2
|
-
import "../server-
|
|
3
|
-
import { t as ServerFactory } from "../index-
|
|
1
|
+
import "../defineRoute-FhAN4ivP.mjs";
|
|
2
|
+
import "../server-8X5Hgu7h.mjs";
|
|
3
|
+
import { t as ServerFactory } from "../index-XcXGKQqt.mjs";
|
|
4
4
|
export { ServerFactory };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../response-
|
|
2
|
-
import "../server-
|
|
1
|
+
import "../response-dgNpkPIp.mjs";
|
|
2
|
+
import "../server-BCjY3a63.mjs";
|
|
3
3
|
import "../dependency-manager-CGMZJTer.mjs";
|
|
4
4
|
import "../component-server-Cya46YN3.mjs";
|
|
5
|
-
import { t as ServerFactory } from "../server-
|
|
5
|
+
import { t as ServerFactory } from "../server-AJWK-vUI.mjs";
|
|
6
6
|
|
|
7
7
|
export { ServerFactory };
|
package/dist/server/server.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
2
|
-
import { t as Server } from "../server-
|
|
1
|
+
import "../defineRoute-FhAN4ivP.mjs";
|
|
2
|
+
import { t as Server } from "../server-8X5Hgu7h.mjs";
|
|
3
3
|
export { Server };
|
package/dist/server/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as ProcessedRoute } from "./defineRoute-
|
|
1
|
+
import { i as ProcessedRoute } from "./defineRoute-FhAN4ivP.mjs";
|
|
2
2
|
import { n as Method } from "./types-B8Z3cMtZ.mjs";
|
|
3
3
|
import { t as BaseServer } from "./base-server-Contwrlf.mjs";
|
|
4
4
|
|
|
@@ -45,4 +45,4 @@ declare class Server extends BaseServer {
|
|
|
45
45
|
}
|
|
46
46
|
//#endregion
|
|
47
47
|
export { Server as t };
|
|
48
|
-
//# sourceMappingURL=server-
|
|
48
|
+
//# sourceMappingURL=server-8X5Hgu7h.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Server } from "./server-
|
|
1
|
+
import { t as Server } from "./server-BCjY3a63.mjs";
|
|
2
2
|
import { t as ComponentServer } from "./component-server-Cya46YN3.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/server/server-factory.ts
|
|
@@ -67,4 +67,4 @@ var ServerFactory = class {
|
|
|
67
67
|
|
|
68
68
|
//#endregion
|
|
69
69
|
export { ServerFactory as t };
|
|
70
|
-
//# sourceMappingURL=server-
|
|
70
|
+
//# sourceMappingURL=server-AJWK-vUI.mjs.map
|