vafast 0.3.10 → 0.4.0
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 +61 -0
- package/dist/defineRoute.d.ts +101 -3
- package/dist/defineRoute.js +30 -1
- package/dist/defineRoute.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +363 -50
- package/dist/index.js.map +1 -1
- package/dist/monitoring/index.js +18 -1
- package/dist/monitoring/index.js.map +1 -1
- package/dist/monitoring/native-monitor.js +18 -1
- package/dist/monitoring/native-monitor.js.map +1 -1
- package/dist/node-server/index.js +46 -2
- package/dist/node-server/index.js.map +1 -1
- package/dist/node-server/serve.d.ts +16 -1
- package/dist/node-server/serve.js +46 -2
- package/dist/node-server/serve.js.map +1 -1
- package/dist/router/index.js +2 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router.js +2 -1
- package/dist/router.js.map +1 -1
- package/dist/serve.js +46 -2
- package/dist/serve.js.map +1 -1
- package/dist/server/index.js +18 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-factory.js +18 -1
- package/dist/server/server-factory.js.map +1 -1
- package/dist/server/server.d.ts +15 -1
- package/dist/server/server.js +18 -1
- package/dist/server/server.js.map +1 -1
- package/dist/types/types.d.ts +12 -0
- package/dist/utils/create-handler.d.ts +12 -3
- package/dist/utils/create-handler.js +2 -1
- package/dist/utils/create-handler.js.map +1 -1
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.js +224 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/route-registry.d.ts +134 -0
- package/dist/utils/route-registry.js +128 -0
- package/dist/utils/route-registry.js.map +1 -0
- package/dist/utils/sse.d.ts +87 -0
- package/dist/utils/sse.js +181 -0
- package/dist/utils/sse.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -507,6 +507,67 @@ server.compile(); // 预编译所有路由的处理链
|
|
|
507
507
|
|
|
508
508
|
**性能效果:1000 次请求仅需 ~4ms,平均每次 0.004ms**
|
|
509
509
|
|
|
510
|
+
### 路由注册表 (RouteRegistry)
|
|
511
|
+
|
|
512
|
+
Vafast 提供 `RouteRegistry` 用于路由元信息的收集和查询,适用于 API 文档生成、Webhook 事件注册、权限检查等场景:
|
|
513
|
+
|
|
514
|
+
```typescript
|
|
515
|
+
import { Server, createRouteRegistry } from 'vafast';
|
|
516
|
+
import type { Route } from 'vafast';
|
|
517
|
+
|
|
518
|
+
// 定义带扩展字段的路由
|
|
519
|
+
const routes: Route[] = [
|
|
520
|
+
{
|
|
521
|
+
method: 'POST',
|
|
522
|
+
path: '/auth/signIn',
|
|
523
|
+
handler: signInHandler,
|
|
524
|
+
name: '用户登录', // 扩展字段
|
|
525
|
+
description: '用户通过邮箱密码登录', // 扩展字段
|
|
526
|
+
webhook: { eventKey: 'auth.signIn' }, // 自定义扩展
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
method: 'GET',
|
|
530
|
+
path: '/users',
|
|
531
|
+
handler: getUsersHandler,
|
|
532
|
+
permission: 'users.read', // 自定义扩展
|
|
533
|
+
},
|
|
534
|
+
];
|
|
535
|
+
|
|
536
|
+
const server = new Server(routes);
|
|
537
|
+
|
|
538
|
+
// 创建路由注册表
|
|
539
|
+
const registry = createRouteRegistry(server.getRoutesWithMeta());
|
|
540
|
+
|
|
541
|
+
// 查询路由
|
|
542
|
+
const route = registry.get('POST', '/auth/signIn');
|
|
543
|
+
console.log(route?.name); // '用户登录'
|
|
544
|
+
|
|
545
|
+
// 按分类获取
|
|
546
|
+
const authRoutes = registry.getByCategory('auth');
|
|
547
|
+
|
|
548
|
+
// 筛选有特定字段的路由
|
|
549
|
+
const webhookRoutes = registry.filter('webhook');
|
|
550
|
+
const permissionRoutes = registry.filter('permission');
|
|
551
|
+
|
|
552
|
+
// 获取所有分类
|
|
553
|
+
const categories = registry.getCategories(); // ['auth', 'users']
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
**完整 API:**
|
|
557
|
+
|
|
558
|
+
| 方法 | 说明 |
|
|
559
|
+
|------|------|
|
|
560
|
+
| `getAll()` | 获取所有路由元信息 |
|
|
561
|
+
| `get(method, path)` | 按 method+path 查询 |
|
|
562
|
+
| `has(method, path)` | 检查路由是否存在 |
|
|
563
|
+
| `getByCategory(category)` | 按分类获取路由 |
|
|
564
|
+
| `getCategories()` | 获取所有分类 |
|
|
565
|
+
| `filter(field)` | 筛选有特定字段的路由 |
|
|
566
|
+
| `filterBy(predicate)` | 自定义条件筛选 |
|
|
567
|
+
| `forEach(callback)` | 遍历所有路由 |
|
|
568
|
+
| `map(callback)` | 映射所有路由 |
|
|
569
|
+
| `size` | 路由数量 |
|
|
570
|
+
|
|
510
571
|
## 🔧 运行时支持
|
|
511
572
|
|
|
512
573
|
### Bun
|
package/dist/defineRoute.d.ts
CHANGED
|
@@ -1,5 +1,103 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RouteSchema } from './types/schema.js';
|
|
2
|
+
import { InferableHandler } from './utils/create-handler.js';
|
|
3
|
+
import '@sinclair/typebox';
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
/**
|
|
6
|
+
* 可推断的路由类型(用于类型推断)
|
|
7
|
+
* 供 vafast-api-client 使用,保留完整的类型信息
|
|
8
|
+
*/
|
|
9
|
+
type InferableRoute<TMethod extends string = string, TPath extends string = string, TReturn = unknown, TSchema extends RouteSchema = RouteSchema> = {
|
|
10
|
+
readonly method: TMethod;
|
|
11
|
+
readonly path: TPath;
|
|
12
|
+
readonly handler: InferableHandler<TReturn, TSchema>;
|
|
13
|
+
readonly middleware?: ReadonlyArray<(req: Request, next: () => Promise<Response>) => Promise<Response>>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 中间件类型
|
|
17
|
+
*/
|
|
18
|
+
type Middleware = (req: Request, next: () => Promise<Response>) => Promise<Response>;
|
|
19
|
+
/**
|
|
20
|
+
* 路由定义类型(保留完整 handler 类型)
|
|
21
|
+
*/
|
|
22
|
+
type RouteDefinition<TMethod extends string = string, TPath extends string = string, THandler = unknown> = {
|
|
23
|
+
readonly method: TMethod;
|
|
24
|
+
readonly path: TPath;
|
|
25
|
+
readonly handler: THandler;
|
|
26
|
+
readonly middleware?: ReadonlyArray<Middleware>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* 创建单个路由定义(自动保留字面量类型,无需 as const)
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import { route, defineRoutes, createHandler, Type } from 'vafast'
|
|
34
|
+
*
|
|
35
|
+
* const routes = defineRoutes([
|
|
36
|
+
* route('GET', '/users', createHandler(
|
|
37
|
+
* { query: Type.Object({ page: Type.Number() }) },
|
|
38
|
+
* async ({ query }) => ({ users: [], total: 0 })
|
|
39
|
+
* )),
|
|
40
|
+
* route('POST', '/users', createHandler(
|
|
41
|
+
* { body: Type.Object({ name: Type.String() }) },
|
|
42
|
+
* async ({ body }) => ({ id: '1', name: body.name })
|
|
43
|
+
* )),
|
|
44
|
+
* route('GET', '/users/:id', createHandler(
|
|
45
|
+
* { params: Type.Object({ id: Type.String() }) },
|
|
46
|
+
* async ({ params }) => ({ id: params.id, name: 'User' })
|
|
47
|
+
* ))
|
|
48
|
+
* ])
|
|
49
|
+
*
|
|
50
|
+
* // 无需 as const!类型自动推断
|
|
51
|
+
* type Api = InferEden<typeof routes>
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
declare function route<TMethod extends string, TPath extends string, THandler>(method: TMethod, path: TPath, handler: THandler, middleware?: Middleware[]): RouteDefinition<TMethod, TPath, THandler>;
|
|
55
|
+
/**
|
|
56
|
+
* GET 路由快捷方法
|
|
57
|
+
*/
|
|
58
|
+
declare function get<TPath extends string, THandler>(path: TPath, handler: THandler, middleware?: Middleware[]): RouteDefinition<'GET', TPath, THandler>;
|
|
59
|
+
/**
|
|
60
|
+
* POST 路由快捷方法
|
|
61
|
+
*/
|
|
62
|
+
declare function post<TPath extends string, THandler>(path: TPath, handler: THandler, middleware?: Middleware[]): RouteDefinition<'POST', TPath, THandler>;
|
|
63
|
+
/**
|
|
64
|
+
* PUT 路由快捷方法
|
|
65
|
+
*/
|
|
66
|
+
declare function put<TPath extends string, THandler>(path: TPath, handler: THandler, middleware?: Middleware[]): RouteDefinition<'PUT', TPath, THandler>;
|
|
67
|
+
/**
|
|
68
|
+
* DELETE 路由快捷方法
|
|
69
|
+
*/
|
|
70
|
+
declare function del<TPath extends string, THandler>(path: TPath, handler: THandler, middleware?: Middleware[]): RouteDefinition<'DELETE', TPath, THandler>;
|
|
71
|
+
/**
|
|
72
|
+
* PATCH 路由快捷方法
|
|
73
|
+
*/
|
|
74
|
+
declare function patch<TPath extends string, THandler>(path: TPath, handler: THandler, middleware?: Middleware[]): RouteDefinition<'PATCH', TPath, THandler>;
|
|
75
|
+
/**
|
|
76
|
+
* 定义路由数组(保留完整类型信息)
|
|
77
|
+
*
|
|
78
|
+
* 推荐配合 route() 函数使用,无需 as const
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* import { defineRoutes, route, createHandler, Type } from 'vafast'
|
|
83
|
+
*
|
|
84
|
+
* // ✨ 新方式:使用 route() 函数,无需 as const
|
|
85
|
+
* const routes = defineRoutes([
|
|
86
|
+
* route('GET', '/users', createHandler(...)),
|
|
87
|
+
* route('POST', '/users', createHandler(...))
|
|
88
|
+
* ])
|
|
89
|
+
*
|
|
90
|
+
* // 🔙 旧方式:需要 as const(仍然支持)
|
|
91
|
+
* const routes = defineRoutes([
|
|
92
|
+
* { method: 'GET', path: '/users', handler: createHandler(...) }
|
|
93
|
+
* ] as const)
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
declare function defineRoutes<const T extends readonly {
|
|
97
|
+
readonly method: string;
|
|
98
|
+
readonly path: string;
|
|
99
|
+
readonly handler: unknown;
|
|
100
|
+
readonly middleware?: ReadonlyArray<Middleware>;
|
|
101
|
+
}[]>(routes: T): T;
|
|
4
102
|
|
|
5
|
-
export { defineRoutes };
|
|
103
|
+
export { type InferableRoute, type RouteDefinition, defineRoutes, del, get, patch, post, put, route };
|
package/dist/defineRoute.js
CHANGED
|
@@ -1,8 +1,37 @@
|
|
|
1
1
|
// src/defineRoute.ts
|
|
2
|
+
function route(method, path, handler, middleware) {
|
|
3
|
+
return {
|
|
4
|
+
method,
|
|
5
|
+
path,
|
|
6
|
+
handler,
|
|
7
|
+
middleware
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function get(path, handler, middleware) {
|
|
11
|
+
return route("GET", path, handler, middleware);
|
|
12
|
+
}
|
|
13
|
+
function post(path, handler, middleware) {
|
|
14
|
+
return route("POST", path, handler, middleware);
|
|
15
|
+
}
|
|
16
|
+
function put(path, handler, middleware) {
|
|
17
|
+
return route("PUT", path, handler, middleware);
|
|
18
|
+
}
|
|
19
|
+
function del(path, handler, middleware) {
|
|
20
|
+
return route("DELETE", path, handler, middleware);
|
|
21
|
+
}
|
|
22
|
+
function patch(path, handler, middleware) {
|
|
23
|
+
return route("PATCH", path, handler, middleware);
|
|
24
|
+
}
|
|
2
25
|
function defineRoutes(routes) {
|
|
3
26
|
return routes;
|
|
4
27
|
}
|
|
5
28
|
export {
|
|
6
|
-
defineRoutes
|
|
29
|
+
defineRoutes,
|
|
30
|
+
del,
|
|
31
|
+
get,
|
|
32
|
+
patch,
|
|
33
|
+
post,
|
|
34
|
+
put,
|
|
35
|
+
route
|
|
7
36
|
};
|
|
8
37
|
//# sourceMappingURL=defineRoute.js.map
|
package/dist/defineRoute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defineRoute.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../src/defineRoute.ts"],"sourcesContent":["import type { RouteSchema } from \"./types\";\nimport type { InferableHandler } from \"./utils/create-handler\";\n\n/**\n * 可推断的路由类型(用于类型推断)\n * 供 vafast-api-client 使用,保留完整的类型信息\n */\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 handler: InferableHandler<TReturn, TSchema>;\n readonly middleware?: ReadonlyArray<(req: Request, next: () => Promise<Response>) => Promise<Response>>;\n}\n\n/**\n * 中间件类型\n */\ntype Middleware = (req: Request, next: () => Promise<Response>) => Promise<Response>;\n\n/**\n * 路由定义类型(保留完整 handler 类型)\n */\nexport type RouteDefinition<\n TMethod extends string = string,\n TPath extends string = string,\n THandler = unknown\n> = {\n readonly method: TMethod;\n readonly path: TPath;\n readonly handler: THandler;\n readonly middleware?: ReadonlyArray<Middleware>;\n}\n\n/**\n * 创建单个路由定义(自动保留字面量类型,无需 as const)\n * \n * @example\n * ```typescript\n * import { route, defineRoutes, createHandler, Type } from 'vafast'\n * \n * const routes = defineRoutes([\n * route('GET', '/users', createHandler(\n * { query: Type.Object({ page: Type.Number() }) },\n * async ({ query }) => ({ users: [], total: 0 })\n * )),\n * route('POST', '/users', createHandler(\n * { body: Type.Object({ name: Type.String() }) },\n * async ({ body }) => ({ id: '1', name: body.name })\n * )),\n * route('GET', '/users/:id', createHandler(\n * { params: Type.Object({ id: Type.String() }) },\n * async ({ params }) => ({ id: params.id, name: 'User' })\n * ))\n * ])\n * \n * // 无需 as const!类型自动推断\n * type Api = InferEden<typeof routes>\n * ```\n */\nexport function route<\n TMethod extends string,\n TPath extends string,\n THandler\n>(\n method: TMethod,\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<TMethod, TPath, THandler> {\n return {\n method,\n path,\n handler,\n middleware\n };\n}\n\n/**\n * GET 路由快捷方法\n */\nexport function get<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'GET', TPath, THandler> {\n return route('GET', path, handler, middleware);\n}\n\n/**\n * POST 路由快捷方法\n */\nexport function post<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'POST', TPath, THandler> {\n return route('POST', path, handler, middleware);\n}\n\n/**\n * PUT 路由快捷方法\n */\nexport function put<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'PUT', TPath, THandler> {\n return route('PUT', path, handler, middleware);\n}\n\n/**\n * DELETE 路由快捷方法\n */\nexport function del<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'DELETE', TPath, THandler> {\n return route('DELETE', path, handler, middleware);\n}\n\n/**\n * PATCH 路由快捷方法\n */\nexport function patch<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'PATCH', TPath, THandler> {\n return route('PATCH', path, handler, middleware);\n}\n\n/**\n * 定义路由数组(保留完整类型信息)\n * \n * 推荐配合 route() 函数使用,无需 as const\n * \n * @example\n * ```typescript\n * import { defineRoutes, route, createHandler, Type } from 'vafast'\n * \n * // ✨ 新方式:使用 route() 函数,无需 as const\n * const routes = defineRoutes([\n * route('GET', '/users', createHandler(...)),\n * route('POST', '/users', createHandler(...))\n * ])\n * \n * // 🔙 旧方式:需要 as const(仍然支持)\n * const routes = defineRoutes([\n * { method: 'GET', path: '/users', handler: createHandler(...) }\n * ] as const)\n * ```\n */\nexport function defineRoutes<\n const T extends readonly {\n readonly method: string\n readonly path: string\n readonly handler: unknown\n readonly middleware?: ReadonlyArray<Middleware>\n }[]\n>(routes: T): T {\n return routes;\n}\n"],"mappings":";AAgEO,SAAS,MAKd,QACA,MACA,SACA,YAC2C;AAC3C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,IACd,MACA,SACA,YACyC;AACzC,SAAO,MAAM,OAAO,MAAM,SAAS,UAAU;AAC/C;AAKO,SAAS,KACd,MACA,SACA,YAC0C;AAC1C,SAAO,MAAM,QAAQ,MAAM,SAAS,UAAU;AAChD;AAKO,SAAS,IACd,MACA,SACA,YACyC;AACzC,SAAO,MAAM,OAAO,MAAM,SAAS,UAAU;AAC/C;AAKO,SAAS,IACd,MACA,SACA,YAC4C;AAC5C,SAAO,MAAM,UAAU,MAAM,SAAS,UAAU;AAClD;AAKO,SAAS,MACd,MACA,SACA,YAC2C;AAC3C,SAAO,MAAM,SAAS,MAAM,SAAS,UAAU;AACjD;AAuBO,SAAS,aAOd,QAAc;AACd,SAAO;AACT;","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { ComponentServer } from './server/component-server.js';
|
|
|
3
3
|
export { ServerFactory } from './server/server-factory.js';
|
|
4
4
|
export { BaseServer } from './server/base-server.js';
|
|
5
5
|
export { VafastError, composeMiddleware } from './middleware.js';
|
|
6
|
-
export { createHandler, createHandlerWithExtra, simpleHandler } from './utils/create-handler.js';
|
|
6
|
+
export { InferableHandler, createHandler, createHandlerWithExtra, simpleHandler } from './utils/create-handler.js';
|
|
7
7
|
export { getCookie, getHeader, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast } from './utils/parsers.js';
|
|
8
8
|
export { empty, html, json, redirect, stream, text } from './utils/response.js';
|
|
9
9
|
export { goAwait } from './utils/go-await.js';
|
|
@@ -14,13 +14,15 @@ export { HtmlRenderer } from './utils/html-renderer.js';
|
|
|
14
14
|
export { DependencyManager } from './utils/dependency-manager.js';
|
|
15
15
|
export { SchemaConfig, ValidationError, ValidationResult, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow } from './utils/validators/validators.js';
|
|
16
16
|
export { Patterns, hasFormat, registerFormat, registerFormats } from './utils/formats.js';
|
|
17
|
+
export { SSEEvent, SSEHandler, SSEMarker, createSSEHandler } from './utils/sse.js';
|
|
18
|
+
export { RouteMeta, RouteRegistry, createRouteRegistry } from './utils/route-registry.js';
|
|
17
19
|
export { flattenNestedRoutes, normalizePath } from './router.js';
|
|
18
20
|
export { requireAuth } from './middleware/authMiddleware.js';
|
|
19
21
|
export { rateLimit } from './middleware/rateLimit.js';
|
|
20
22
|
export { CORSOptions, createCORS } from './middleware/cors.js';
|
|
21
23
|
export { TokenError, TokenOptions, TokenPayload, TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken } from './auth/token.js';
|
|
22
24
|
export { createAuth, createOptionalAuth, createPermissionAuth, createRoleAuth } from './middleware/auth.js';
|
|
23
|
-
export { defineRoutes } from './defineRoute.js';
|
|
25
|
+
export { InferableRoute, RouteDefinition, defineRoutes, del, get, patch, post, put, route } from './defineRoute.js';
|
|
24
26
|
export { FlattenedRoute, Handler, Method, Middleware, NestedRoute, ResponseBody, Route } from './types/types.js';
|
|
25
27
|
export { BaseRouteConfig, CompatibleRoute, ExtendedRouteConfig, NestedRouteConfig, TypedRoute, createTypedRoute, isTypedRoute } from './types/route.js';
|
|
26
28
|
export { ComponentRoute, FlattenedComponentRoute, NestedComponentRoute } from './types/component-route.js';
|