vafast 0.4.1 → 0.4.3
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 +6 -10
- package/dist/auth/{token.d.ts → token.d.mts} +21 -19
- package/dist/auth/token.mjs +105 -0
- package/dist/auth/token.mjs.map +1 -0
- package/dist/base-server-Bq4_lJWK.mjs +113 -0
- package/dist/base-server-Bq4_lJWK.mjs.map +1 -0
- package/dist/base-server-Gakrozqk.d.mts +40 -0
- package/dist/base64url-BY-HBSpL.d.mts +6 -0
- package/dist/base64url-DLDOeXsk.mjs +13 -0
- package/dist/base64url-DLDOeXsk.mjs.map +1 -0
- package/dist/chunk-67U6L5Jh.mjs +37 -0
- package/dist/component-route-BYV_X1rA.d.mts +31 -0
- package/dist/component-route-Do2yyYTi.mjs +1 -0
- package/dist/component-router-DXUXLp1R.mjs +33 -0
- package/dist/component-router-DXUXLp1R.mjs.map +1 -0
- package/dist/component-server-ARXvZJUQ.mjs +124 -0
- package/dist/component-server-ARXvZJUQ.mjs.map +1 -0
- package/dist/component-server-BOz4Q-Qt.d.mts +38 -0
- package/dist/create-handler-CbSoroA1.mjs +166 -0
- package/dist/create-handler-CbSoroA1.mjs.map +1 -0
- package/dist/{utils/create-handler.d.ts → create-handler-Dtt0xv6g.d.mts} +24 -24
- package/dist/{defineRoute.d.ts → defineRoute.d.mts} +20 -17
- package/dist/defineRoute.mjs +93 -0
- package/dist/defineRoute.mjs.map +1 -0
- package/dist/dependency-manager-CPkwMI7J.mjs +61 -0
- package/dist/dependency-manager-CPkwMI7J.mjs.map +1 -0
- package/dist/dependency-manager-Dbug5INp.d.mts +27 -0
- package/dist/formats-BSqJWCsG.d.mts +42 -0
- package/dist/go-await-B-KP-K8x.mjs +33 -0
- package/dist/go-await-B-KP-K8x.mjs.map +1 -0
- package/dist/{utils/go-await.d.ts → go-await-CqPx9dVQ.d.mts} +4 -2
- package/dist/handle-BhpqNgGf.mjs +30 -0
- package/dist/handle-BhpqNgGf.mjs.map +1 -0
- package/dist/{utils/handle.d.ts → handle-DOidKTI-.d.mts} +8 -6
- package/dist/html-renderer-C3LKTLme.d.mts +22 -0
- package/dist/{utils/html-renderer.js → html-renderer-CJ3B2Hft.mjs} +34 -29
- package/dist/html-renderer-CJ3B2Hft.mjs.map +1 -0
- package/dist/index-DFsQyT61.d.mts +48 -0
- package/dist/index-DXJd7-2Z.d.mts +1 -0
- package/dist/index.d.mts +35 -0
- package/dist/index.mjs +42 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/{auth.d.ts → auth.d.mts} +12 -8
- package/dist/middleware/auth.mjs +98 -0
- package/dist/middleware/auth.mjs.map +1 -0
- package/dist/middleware/authMiddleware.d.mts +9 -0
- package/dist/middleware/authMiddleware.mjs +19 -0
- package/dist/middleware/authMiddleware.mjs.map +1 -0
- package/dist/middleware/{component-renderer.d.ts → component-renderer.d.mts} +3 -1
- package/dist/middleware/component-renderer.mjs +119 -0
- package/dist/middleware/component-renderer.mjs.map +1 -0
- package/dist/middleware/{component-router.d.ts → component-router.d.mts} +5 -4
- package/dist/middleware/component-router.mjs +4 -0
- package/dist/middleware/cors.d.mts +16 -0
- package/dist/middleware/cors.mjs +38 -0
- package/dist/middleware/cors.mjs.map +1 -0
- package/dist/middleware/rateLimit.d.mts +14 -0
- package/dist/middleware/rateLimit.mjs +34 -0
- package/dist/middleware/rateLimit.mjs.map +1 -0
- package/dist/middleware-3ShRJyd1.mjs +59 -0
- package/dist/middleware-3ShRJyd1.mjs.map +1 -0
- package/dist/middleware.d.mts +25 -0
- package/dist/middleware.mjs +4 -0
- package/dist/monitoring/index.d.mts +33 -0
- package/dist/monitoring/index.mjs +27 -0
- package/dist/monitoring/index.mjs.map +1 -0
- package/dist/monitoring/native-monitor.d.mts +48 -0
- package/dist/monitoring/native-monitor.mjs +154 -0
- package/dist/monitoring/native-monitor.mjs.map +1 -0
- package/dist/monitoring/types.d.mts +150 -0
- package/dist/monitoring/types.mjs +1 -0
- package/dist/node-server/index.d.mts +4 -0
- package/dist/node-server/index.mjs +5 -0
- package/dist/node-server/{request.d.ts → request.d.mts} +4 -6
- package/dist/node-server/request.mjs +3 -0
- package/dist/node-server/{response.d.ts → response.d.mts} +4 -6
- package/dist/node-server/response.mjs +3 -0
- package/dist/node-server/serve.d.mts +2 -0
- package/dist/node-server/serve.mjs +4 -0
- package/dist/{utils/parsers.d.ts → parsers-CodQFP1Z.d.mts} +10 -8
- package/dist/parsers-ROIZWSGI.mjs +168 -0
- package/dist/parsers-ROIZWSGI.mjs.map +1 -0
- package/dist/path-matcher-CXMJ-IrG.mjs +62 -0
- package/dist/path-matcher-CXMJ-IrG.mjs.map +1 -0
- package/dist/radix-tree-BWmhTLhT.mjs +157 -0
- package/dist/radix-tree-BWmhTLhT.mjs.map +1 -0
- package/dist/request-B2BkUecT.mjs +133 -0
- package/dist/request-B2BkUecT.mjs.map +1 -0
- package/dist/request-validator-Dyqng-H_.mjs +77 -0
- package/dist/request-validator-Dyqng-H_.mjs.map +1 -0
- package/dist/request-validator-u2Ccj3_x.d.mts +67 -0
- package/dist/response-BhFKEphr.mjs +72 -0
- package/dist/response-BhFKEphr.mjs.map +1 -0
- package/dist/response-CSKW5hsS.mjs +97 -0
- package/dist/response-CSKW5hsS.mjs.map +1 -0
- package/dist/{utils/response.d.ts → response-CUyV5FIm.d.mts} +4 -2
- package/dist/route-BRR15b-p.mjs +11 -0
- package/dist/route-BRR15b-p.mjs.map +1 -0
- package/dist/route-BqmWCG4e.d.mts +44 -0
- package/dist/route-registry-AlkDgbcE.mjs +225 -0
- package/dist/route-registry-AlkDgbcE.mjs.map +1 -0
- package/dist/route-registry-ykzRmaHB.d.mts +176 -0
- package/dist/router/index.d.mts +5 -0
- package/dist/router/index.mjs +10 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/router/radix-tree.d.mts +60 -0
- package/dist/router/radix-tree.mjs +4 -0
- package/dist/router-BOeVQrjz.mjs +71 -0
- package/dist/router-BOeVQrjz.mjs.map +1 -0
- package/dist/{router.d.ts → router.d.mts} +6 -7
- package/dist/router.mjs +4 -0
- package/dist/schema-CVuttFSw.d.mts +81 -0
- package/dist/schema-CbAaktsZ.mjs +1 -0
- package/dist/serve-BQQ2JzIH.d.mts +69 -0
- package/dist/serve-MRGGK7-q.mjs +107 -0
- package/dist/serve-MRGGK7-q.mjs.map +1 -0
- package/dist/serve.d.mts +2 -0
- package/dist/serve.mjs +4 -0
- package/dist/server/base-server.d.mts +4 -0
- package/dist/server/base-server.mjs +4 -0
- package/dist/server/component-server.d.mts +5 -0
- package/dist/server/component-server.mjs +5 -0
- package/dist/server/index.d.mts +7 -0
- package/dist/server/index.mjs +8 -0
- package/dist/server/server-factory.d.mts +7 -0
- package/dist/server/server-factory.mjs +6 -0
- package/dist/server/server.d.mts +5 -0
- package/dist/server/server.mjs +4 -0
- package/dist/server-B0nzGCG5.mjs +88 -0
- package/dist/server-B0nzGCG5.mjs.map +1 -0
- package/dist/server-C8WCshmG.mjs +137 -0
- package/dist/server-C8WCshmG.mjs.map +1 -0
- package/dist/server-Drc2kSxp.d.mts +60 -0
- package/dist/sse-BOd2pvUK.d.mts +65 -0
- package/dist/sse-US5D9mgE.mjs +87 -0
- package/dist/sse-US5D9mgE.mjs.map +1 -0
- package/dist/types/component-route.d.mts +2 -0
- package/dist/types/component-route.mjs +1 -0
- package/dist/types/index.d.mts +6 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/route.d.mts +2 -0
- package/dist/types/route.mjs +3 -0
- package/dist/types/schema.d.mts +2 -0
- package/dist/types/schema.mjs +1 -0
- package/dist/types/types.d.mts +2 -0
- package/dist/types/types.mjs +1 -0
- package/dist/{types/types.d.ts → types-Cb7_2VSt.d.mts} +27 -23
- package/dist/utils/base64url.d.mts +2 -0
- package/dist/utils/base64url.mjs +3 -0
- package/dist/utils/create-handler.d.mts +3 -0
- package/dist/utils/create-handler.mjs +5 -0
- package/dist/utils/dependency-manager.d.mts +2 -0
- package/dist/utils/dependency-manager.mjs +4 -0
- package/dist/utils/formats.d.mts +2 -0
- package/dist/utils/formats.mjs +129 -0
- package/dist/utils/formats.mjs.map +1 -0
- package/dist/utils/go-await.d.mts +2 -0
- package/dist/utils/go-await.mjs +3 -0
- package/dist/utils/handle.d.mts +2 -0
- package/dist/utils/handle.mjs +4 -0
- package/dist/utils/html-renderer.d.mts +2 -0
- package/dist/utils/html-renderer.mjs +4 -0
- package/dist/utils/index.d.mts +16 -0
- package/dist/utils/index.mjs +23 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/parsers.d.mts +2 -0
- package/dist/utils/parsers.mjs +3 -0
- package/dist/utils/path-matcher.d.mts +27 -0
- package/dist/utils/path-matcher.mjs +4 -0
- package/dist/utils/request-validator.d.mts +3 -0
- package/dist/utils/request-validator.mjs +5 -0
- package/dist/utils/response.d.mts +2 -0
- package/dist/utils/response.mjs +4 -0
- package/dist/utils/route-registry.d.mts +4 -0
- package/dist/utils/route-registry.mjs +4 -0
- package/dist/utils/sse.d.mts +3 -0
- package/dist/utils/sse.mjs +5 -0
- package/dist/utils/validators/validators.d.mts +2 -0
- package/dist/utils/validators/validators.mjs +3 -0
- package/dist/validators-C0eZyxPh.d.mts +67 -0
- package/dist/validators-CbCLj0Rc.mjs +112 -0
- package/dist/validators-CbCLj0Rc.mjs.map +1 -0
- package/package.json +16 -18
- package/dist/auth/token.js +0 -131
- package/dist/auth/token.js.map +0 -1
- package/dist/defineRoute.js +0 -37
- package/dist/defineRoute.js.map +0 -1
- package/dist/index.d.ts +0 -32
- package/dist/index.js +0 -2575
- package/dist/index.js.map +0 -1
- package/dist/middleware/auth.js +0 -205
- package/dist/middleware/auth.js.map +0 -1
- package/dist/middleware/authMiddleware.d.ts +0 -5
- package/dist/middleware/authMiddleware.js +0 -57
- package/dist/middleware/authMiddleware.js.map +0 -1
- package/dist/middleware/component-renderer.js +0 -139
- package/dist/middleware/component-renderer.js.map +0 -1
- package/dist/middleware/component-router.js +0 -36
- package/dist/middleware/component-router.js.map +0 -1
- package/dist/middleware/cors.d.ts +0 -12
- package/dist/middleware/cors.js +0 -43
- package/dist/middleware/cors.js.map +0 -1
- package/dist/middleware/rateLimit.d.ts +0 -10
- package/dist/middleware/rateLimit.js +0 -49
- package/dist/middleware/rateLimit.js.map +0 -1
- package/dist/middleware.d.ts +0 -21
- package/dist/middleware.js +0 -102
- package/dist/middleware.js.map +0 -1
- package/dist/monitoring/index.d.ts +0 -36
- package/dist/monitoring/index.js +0 -1484
- package/dist/monitoring/index.js.map +0 -1
- package/dist/monitoring/native-monitor.d.ts +0 -44
- package/dist/monitoring/native-monitor.js +0 -1451
- package/dist/monitoring/native-monitor.js.map +0 -1
- package/dist/monitoring/types.d.ts +0 -148
- package/dist/monitoring/types.js +0 -8
- package/dist/monitoring/types.js.map +0 -1
- package/dist/node-server/index.d.ts +0 -4
- package/dist/node-server/index.js +0 -298
- package/dist/node-server/index.js.map +0 -1
- package/dist/node-server/request.js +0 -125
- package/dist/node-server/request.js.map +0 -1
- package/dist/node-server/response.js +0 -76
- package/dist/node-server/response.js.map +0 -1
- package/dist/node-server/serve.d.ts +0 -71
- package/dist/node-server/serve.js +0 -281
- package/dist/node-server/serve.js.map +0 -1
- package/dist/router/index.d.ts +0 -3
- package/dist/router/index.js +0 -229
- package/dist/router/index.js.map +0 -1
- package/dist/router/radix-tree.d.ts +0 -66
- package/dist/router/radix-tree.js +0 -190
- package/dist/router/radix-tree.js.map +0 -1
- package/dist/router.js +0 -41
- package/dist/router.js.map +0 -1
- package/dist/serve.d.ts +0 -2
- package/dist/serve.js +0 -281
- package/dist/serve.js.map +0 -1
- package/dist/server/base-server.d.ts +0 -37
- package/dist/server/base-server.js +0 -134
- package/dist/server/base-server.js.map +0 -1
- package/dist/server/component-server.d.ts +0 -37
- package/dist/server/component-server.js +0 -488
- package/dist/server/component-server.js.map +0 -1
- package/dist/server/index.d.ts +0 -8
- package/dist/server/index.js +0 -1156
- package/dist/server/index.js.map +0 -1
- package/dist/server/server-factory.d.ts +0 -48
- package/dist/server/server-factory.js +0 -1153
- package/dist/server/server-factory.js.map +0 -1
- package/dist/server/server.d.ts +0 -64
- package/dist/server/server.js +0 -734
- package/dist/server/server.js.map +0 -1
- package/dist/types/component-route.d.ts +0 -29
- package/dist/types/component-route.js +0 -1
- package/dist/types/component-route.js.map +0 -1
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.js +0 -21
- package/dist/types/index.js.map +0 -1
- package/dist/types/route.d.ts +0 -42
- package/dist/types/route.js +0 -12
- package/dist/types/route.js.map +0 -1
- package/dist/types/schema.d.ts +0 -79
- package/dist/types/schema.js +0 -10
- package/dist/types/schema.js.map +0 -1
- package/dist/types/types.js +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/utils/base64url.d.ts +0 -4
- package/dist/utils/base64url.js +0 -14
- package/dist/utils/base64url.js.map +0 -1
- package/dist/utils/create-handler.js +0 -299
- package/dist/utils/create-handler.js.map +0 -1
- package/dist/utils/dependency-manager.d.ts +0 -25
- package/dist/utils/dependency-manager.js +0 -71
- package/dist/utils/dependency-manager.js.map +0 -1
- package/dist/utils/formats.d.ts +0 -40
- package/dist/utils/formats.js +0 -116
- package/dist/utils/formats.js.map +0 -1
- package/dist/utils/go-await.js +0 -16
- package/dist/utils/go-await.js.map +0 -1
- package/dist/utils/handle.js +0 -48
- package/dist/utils/handle.js.map +0 -1
- package/dist/utils/html-renderer.d.ts +0 -20
- package/dist/utils/html-renderer.js.map +0 -1
- package/dist/utils/index.d.ts +0 -16
- package/dist/utils/index.js +0 -1038
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/parsers.js +0 -160
- package/dist/utils/parsers.js.map +0 -1
- package/dist/utils/path-matcher.d.ts +0 -25
- package/dist/utils/path-matcher.js +0 -73
- package/dist/utils/path-matcher.js.map +0 -1
- package/dist/utils/request-validator.d.ts +0 -66
- package/dist/utils/request-validator.js +0 -158
- package/dist/utils/request-validator.js.map +0 -1
- package/dist/utils/response.js +0 -102
- package/dist/utils/response.js.map +0 -1
- package/dist/utils/route-registry.d.ts +0 -195
- package/dist/utils/route-registry.js +0 -152
- package/dist/utils/route-registry.js.map +0 -1
- package/dist/utils/sse.d.ts +0 -87
- package/dist/utils/sse.js +0 -181
- package/dist/utils/sse.js.map +0 -1
- package/dist/utils/validators/validators.d.ts +0 -76
- package/dist/utils/validators/validators.js +0 -97
- package/dist/utils/validators/validators.js.map +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { c as text, i as json, n as html, o as redirect, r as init_response, s as stream, t as empty } from "../response-CSKW5hsS.mjs";
|
|
2
|
+
import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-AlkDgbcE.mjs";
|
|
3
|
+
import { n as init_html_renderer, t as HtmlRenderer } from "../html-renderer-CJ3B2Hft.mjs";
|
|
4
|
+
import { n as init_dependency_manager, t as DependencyManager } from "../dependency-manager-CPkwMI7J.mjs";
|
|
5
|
+
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-ROIZWSGI.mjs";
|
|
6
|
+
import { t as goAwait } from "../go-await-B-KP-K8x.mjs";
|
|
7
|
+
import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "../validators-CbCLj0Rc.mjs";
|
|
8
|
+
import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "../create-handler-CbSoroA1.mjs";
|
|
9
|
+
import { n as base64urlEncode, t as base64urlDecode } from "../base64url-DLDOeXsk.mjs";
|
|
10
|
+
import { i as setLocals, n as getLocals } from "../handle-BhpqNgGf.mjs";
|
|
11
|
+
import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-Dyqng-H_.mjs";
|
|
12
|
+
import { Patterns, hasFormat, registerFormat, registerFormats } from "./formats.mjs";
|
|
13
|
+
import { t as createSSEHandler } from "../sse-US5D9mgE.mjs";
|
|
14
|
+
|
|
15
|
+
//#region src/utils/index.ts
|
|
16
|
+
init_response();
|
|
17
|
+
init_html_renderer();
|
|
18
|
+
init_dependency_manager();
|
|
19
|
+
init_route_registry();
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { DependencyManager, HtmlRenderer, Patterns, RouteRegistry, base64urlDecode, base64urlEncode, createHandler, createHandlerWithExtra, createRequestValidator, createRouteRegistry, createSSEHandler, createValidator, empty, filterRoutes, getAllRoutes, getCookie, getHeader, getLocals, getRoute, getRouteRegistry, getValidatorCacheStats, goAwait, hasFormat, html, json, parseAndValidateRequest, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, parseRequest, precompileSchemas, redirect, registerFormat, registerFormats, setLocals, simpleHandler, stream, text, validateAllSchemas, validateFast, validateRequest, validateSchema, validateSchemaOrThrow };
|
|
23
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["/**\n * 工具函数模块导出\n */\n\n// 处理器工厂\nexport {\n createHandler,\n createHandlerWithExtra,\n simpleHandler,\n type InferableHandler,\n} from \"./create-handler\";\n\n// 请求解析\nexport {\n parseBody,\n parseQuery,\n parseQueryFast,\n parseHeaders,\n getHeader,\n parseCookies,\n parseCookiesFast,\n getCookie,\n} from \"./parsers\";\n\n// 响应工具\nexport { json, text, html, redirect, empty, stream } from \"./response\";\n\n// Go 风格错误处理\nexport { goAwait } from \"./go-await\";\n\n// Base64 编码\nexport { base64urlEncode, base64urlDecode } from \"./base64url\";\n\n// 请求上下文\nexport { setLocals, getLocals } from \"./handle\";\n\n// 请求验证\nexport {\n parseRequest,\n validateRequest,\n parseAndValidateRequest,\n createRequestValidator,\n} from \"./request-validator\";\n\n// HTML 渲染 (SSR)\nexport { HtmlRenderer } from \"./html-renderer\";\n\n// 依赖管理\nexport { DependencyManager } from \"./dependency-manager\";\n\n// 验证器(JIT 编译 + Format 支持)\nexport {\n validateSchema,\n validateSchemaOrThrow,\n validateFast,\n validateAllSchemas,\n precompileSchemas,\n createValidator,\n getValidatorCacheStats,\n type SchemaConfig,\n type ValidationError,\n type ValidationResult,\n} from \"./validators/validators\";\n\n// Format 验证器(内置常用 format)\nexport {\n registerFormats,\n registerFormat,\n hasFormat,\n Patterns,\n} from \"./formats\";\n\n// SSE (Server-Sent Events) 支持\nexport {\n createSSEHandler,\n type SSEEvent,\n type SSEHandler,\n type SSEMarker,\n} from \"./sse\";\n\n// 路由注册表\nexport {\n RouteRegistry,\n createRouteRegistry,\n // 全局访问函数(Server 创建后可在任意位置使用)\n getRouteRegistry,\n getRoute,\n getAllRoutes,\n filterRoutes,\n type RouteMeta,\n} from \"./route-registry\";\n"],"mappings":";;;;;;;;;;;;;;;eAyBuE;oBAoBxB;yBAGU;qBA0C/B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as parseBody, c as parseCookiesFast, d as parseHeaders, f as parseQuery, i as getHeader, l as parseFile, n as FormData, o as parseBodyAs, p as parseQueryFast, r as getCookie, s as parseCookies, t as FileInfo, u as parseFormData } from "../parsers-CodQFP1Z.mjs";
|
|
2
|
+
export { FileInfo, FormData, getCookie, getHeader, parseBody, parseBodyAs, parseCookies, parseCookiesFast, parseFile, parseFormData, parseHeaders, parseQuery, parseQueryFast };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { a as parseCookies, c as parseFormData, d as parseQueryFast, i as parseBodyAs, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, s as parseFile, t as getCookie, u as parseQuery } from "../parsers-ROIZWSGI.mjs";
|
|
2
|
+
|
|
3
|
+
export { getCookie, getHeader, parseBody, parseBodyAs, parseCookies, parseCookiesFast, parseFile, parseFormData, parseHeaders, parseQuery, parseQueryFast };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/utils/path-matcher.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 路径匹配工具类
|
|
4
|
+
* 提供统一的路径匹配和参数提取功能
|
|
5
|
+
*/
|
|
6
|
+
declare class PathMatcher {
|
|
7
|
+
/**
|
|
8
|
+
* 路径匹配
|
|
9
|
+
*/
|
|
10
|
+
static matchPath(pattern: string, path: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* 提取路径参数
|
|
13
|
+
*/
|
|
14
|
+
static extractParams(pattern: string, path: string): Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* 计算路径特异性分数
|
|
17
|
+
* 用于路由排序:静态 > 动态(:param) > 通配符(*)
|
|
18
|
+
*/
|
|
19
|
+
static calculatePathScore(path: string): number;
|
|
20
|
+
/**
|
|
21
|
+
* 判断两个路径是否可能冲突
|
|
22
|
+
*/
|
|
23
|
+
static pathsMayConflict(path1: string, path2: string): boolean;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { PathMatcher };
|
|
27
|
+
//# sourceMappingURL=path-matcher.d.mts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import "../validators-C0eZyxPh.mjs";
|
|
2
|
+
import { a as parseAndValidateRequest, i as createRequestValidator, n as ValidatedRequestData, o as parseRequest, r as ValidationResult, s as validateRequest, t as RequestData } from "../request-validator-u2Ccj3_x.mjs";
|
|
3
|
+
export { RequestData, ValidatedRequestData, ValidationResult, createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import "../parsers-ROIZWSGI.mjs";
|
|
2
|
+
import "../validators-CbCLj0Rc.mjs";
|
|
3
|
+
import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-Dyqng-H_.mjs";
|
|
4
|
+
|
|
5
|
+
export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import "../schema-CVuttFSw.mjs";
|
|
2
|
+
import "../index-DXJd7-2Z.mjs";
|
|
3
|
+
import { a as getAllRoutes, c as setGlobalRegistry, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-ykzRmaHB.mjs";
|
|
4
|
+
export { RouteMeta, RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, setGlobalRegistry };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-AlkDgbcE.mjs";
|
|
2
|
+
|
|
3
|
+
init_route_registry();
|
|
4
|
+
export { RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, setGlobalRegistry };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f as validateSchema, i as Type, l as precompileSchemas, n as Static, o as ValidationResult, p as validateSchemaOrThrow, r as TSchema, s as createValidator, t as SchemaConfig, u as validateAllSchemas } from "../../validators-C0eZyxPh.mjs";
|
|
2
|
+
export { SchemaConfig, Static, TSchema, Type, ValidationError, ValidationResult, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema, t as Type } from "../../validators-CbCLj0Rc.mjs";
|
|
2
|
+
|
|
3
|
+
export { Type, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Static as Static$1, TSchema as TSchema$1, Type } from "@sinclair/typebox";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/validators/validators.d.ts
|
|
4
|
+
|
|
5
|
+
/** Schema 配置接口 */
|
|
6
|
+
interface SchemaConfig {
|
|
7
|
+
body?: TSchema$1;
|
|
8
|
+
query?: TSchema$1;
|
|
9
|
+
params?: TSchema$1;
|
|
10
|
+
headers?: TSchema$1;
|
|
11
|
+
cookies?: TSchema$1;
|
|
12
|
+
}
|
|
13
|
+
/** 验证错误接口 */
|
|
14
|
+
interface ValidationError {
|
|
15
|
+
path: string;
|
|
16
|
+
message: string;
|
|
17
|
+
code: string;
|
|
18
|
+
value?: unknown;
|
|
19
|
+
}
|
|
20
|
+
/** 验证结果 */
|
|
21
|
+
type ValidationResult<T = unknown> = {
|
|
22
|
+
success: true;
|
|
23
|
+
data: T;
|
|
24
|
+
} | {
|
|
25
|
+
success: false;
|
|
26
|
+
errors: ValidationError[];
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* 验证单个 Schema(返回结果对象)
|
|
30
|
+
*/
|
|
31
|
+
declare function validateSchema<T extends TSchema$1>(schema: T, data: unknown): ValidationResult<Static$1<T>>;
|
|
32
|
+
/**
|
|
33
|
+
* 验证 Schema(抛出异常版本,用于框架内部)
|
|
34
|
+
*/
|
|
35
|
+
declare function validateSchemaOrThrow<T extends TSchema$1>(schema: T, data: unknown, context: string): Static$1<T>;
|
|
36
|
+
/**
|
|
37
|
+
* 快速验证(只返回布尔值)
|
|
38
|
+
*/
|
|
39
|
+
declare function validateFast<T extends TSchema$1>(schema: T, data: unknown): data is Static$1<T>;
|
|
40
|
+
/**
|
|
41
|
+
* 批量验证所有 Schema(用于请求验证)
|
|
42
|
+
*/
|
|
43
|
+
declare function validateAllSchemas(config: SchemaConfig, data: {
|
|
44
|
+
body: unknown;
|
|
45
|
+
query: unknown;
|
|
46
|
+
params: unknown;
|
|
47
|
+
headers: unknown;
|
|
48
|
+
cookies: unknown;
|
|
49
|
+
}): typeof data;
|
|
50
|
+
/**
|
|
51
|
+
* 预编译 Schema(启动时调用,避免首次请求开销)
|
|
52
|
+
*/
|
|
53
|
+
declare function precompileSchemas(config: SchemaConfig): void;
|
|
54
|
+
/**
|
|
55
|
+
* 创建类型特化的验证器(高频使用场景)
|
|
56
|
+
*/
|
|
57
|
+
declare function createValidator<T extends TSchema$1>(schema: T): (data: unknown) => ValidationResult<Static$1<T>>;
|
|
58
|
+
/**
|
|
59
|
+
* 获取缓存统计(调试用)
|
|
60
|
+
*/
|
|
61
|
+
declare function getValidatorCacheStats(): {
|
|
62
|
+
cacheType: string;
|
|
63
|
+
note: string;
|
|
64
|
+
};
|
|
65
|
+
//#endregion
|
|
66
|
+
export { ValidationError as a, getValidatorCacheStats as c, validateFast as d, validateSchema as f, Type as i, precompileSchemas as l, Static$1 as n, ValidationResult as o, validateSchemaOrThrow as p, TSchema$1 as r, createValidator as s, SchemaConfig as t, validateAllSchemas as u };
|
|
67
|
+
//# sourceMappingURL=validators-C0eZyxPh.d.mts.map
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/validators/validators.ts
|
|
5
|
+
/**
|
|
6
|
+
* Schema 验证器 - 简洁版
|
|
7
|
+
*
|
|
8
|
+
* 特点:
|
|
9
|
+
* - WeakMap 缓存避免内存泄漏
|
|
10
|
+
* - TypeCompiler JIT 编译,性能最佳
|
|
11
|
+
* - 支持 FormatRegistry(需确保同一实例)
|
|
12
|
+
*
|
|
13
|
+
* @version 7.0.0
|
|
14
|
+
*/
|
|
15
|
+
/** 编译器缓存 - WeakMap 避免内存泄漏 */
|
|
16
|
+
const compilerCache = /* @__PURE__ */ new WeakMap();
|
|
17
|
+
/**
|
|
18
|
+
* 获取或创建编译后的验证器
|
|
19
|
+
*/
|
|
20
|
+
function getCompiledValidator(schema) {
|
|
21
|
+
let compiler = compilerCache.get(schema);
|
|
22
|
+
if (!compiler) {
|
|
23
|
+
compiler = TypeCompiler.Compile(schema);
|
|
24
|
+
compilerCache.set(schema, compiler);
|
|
25
|
+
}
|
|
26
|
+
return compiler;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 验证单个 Schema(返回结果对象)
|
|
30
|
+
*/
|
|
31
|
+
function validateSchema(schema, data) {
|
|
32
|
+
try {
|
|
33
|
+
const compiler = getCompiledValidator(schema);
|
|
34
|
+
if (compiler.Check(data)) return {
|
|
35
|
+
success: true,
|
|
36
|
+
data
|
|
37
|
+
};
|
|
38
|
+
const errors = [];
|
|
39
|
+
for (const error of compiler.Errors(data)) errors.push({
|
|
40
|
+
path: error.path,
|
|
41
|
+
message: error.message,
|
|
42
|
+
code: "VALIDATION_FAILED",
|
|
43
|
+
value: error.value
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
errors
|
|
48
|
+
};
|
|
49
|
+
} catch (error) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
errors: [{
|
|
53
|
+
path: "",
|
|
54
|
+
message: error instanceof Error ? error.message : "验证异常",
|
|
55
|
+
code: "VALIDATION_EXCEPTION"
|
|
56
|
+
}]
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 验证 Schema(抛出异常版本,用于框架内部)
|
|
62
|
+
*/
|
|
63
|
+
function validateSchemaOrThrow(schema, data, context) {
|
|
64
|
+
if (!getCompiledValidator(schema).Check(data)) throw new Error(`${context}验证失败`);
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 快速验证(只返回布尔值)
|
|
69
|
+
*/
|
|
70
|
+
function validateFast(schema, data) {
|
|
71
|
+
return getCompiledValidator(schema).Check(data);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 批量验证所有 Schema(用于请求验证)
|
|
75
|
+
*/
|
|
76
|
+
function validateAllSchemas(config, data) {
|
|
77
|
+
if (config.body) validateSchemaOrThrow(config.body, data.body, "请求体");
|
|
78
|
+
if (config.query) validateSchemaOrThrow(config.query, data.query, "Query参数");
|
|
79
|
+
if (config.params) validateSchemaOrThrow(config.params, data.params, "路径参数");
|
|
80
|
+
if (config.headers) validateSchemaOrThrow(config.headers, data.headers, "请求头");
|
|
81
|
+
if (config.cookies) validateSchemaOrThrow(config.cookies, data.cookies, "Cookie");
|
|
82
|
+
return data;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 预编译 Schema(启动时调用,避免首次请求开销)
|
|
86
|
+
*/
|
|
87
|
+
function precompileSchemas(config) {
|
|
88
|
+
if (config.body) getCompiledValidator(config.body);
|
|
89
|
+
if (config.query) getCompiledValidator(config.query);
|
|
90
|
+
if (config.params) getCompiledValidator(config.params);
|
|
91
|
+
if (config.headers) getCompiledValidator(config.headers);
|
|
92
|
+
if (config.cookies) getCompiledValidator(config.cookies);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 创建类型特化的验证器(高频使用场景)
|
|
96
|
+
*/
|
|
97
|
+
function createValidator(schema) {
|
|
98
|
+
return (data) => validateSchema(schema, data);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 获取缓存统计(调试用)
|
|
102
|
+
*/
|
|
103
|
+
function getValidatorCacheStats() {
|
|
104
|
+
return {
|
|
105
|
+
cacheType: "WeakMap",
|
|
106
|
+
note: "WeakMap 缓存会随 Schema 对象自动清理,无内存泄漏风险"
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//#endregion
|
|
111
|
+
export { validateAllSchemas as a, validateSchemaOrThrow as c, precompileSchemas as i, createValidator as n, validateFast as o, getValidatorCacheStats as r, validateSchema as s, Type as t };
|
|
112
|
+
//# sourceMappingURL=validators-CbCLj0Rc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators-CbCLj0Rc.mjs","names":[],"sources":["../src/utils/validators/validators.ts"],"sourcesContent":["/**\n * Schema 验证器 - 简洁版\n *\n * 特点:\n * - WeakMap 缓存避免内存泄漏\n * - TypeCompiler JIT 编译,性能最佳\n * - 支持 FormatRegistry(需确保同一实例)\n *\n * @version 7.0.0\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport { TypeCompiler, type TypeCheck } from \"@sinclair/typebox/compiler\";\nimport { Value } from \"@sinclair/typebox/value\";\n\n// ============== 类型定义 ==============\n\n/** Schema 配置接口 */\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 验证错误接口 */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n value?: unknown;\n}\n\n/** 验证结果 */\nexport type ValidationResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\n// ============== 缓存 ==============\n\n/** 编译器缓存 - WeakMap 避免内存泄漏 */\nconst compilerCache = new WeakMap<TSchema, TypeCheck<TSchema>>();\n\n// ============== 核心函数 ==============\n\n/**\n * 获取或创建编译后的验证器\n */\nfunction getCompiledValidator<T extends TSchema>(schema: T): TypeCheck<T> {\n let compiler = compilerCache.get(schema);\n if (!compiler) {\n compiler = TypeCompiler.Compile(schema);\n compilerCache.set(schema, compiler);\n }\n return compiler as TypeCheck<T>;\n}\n\n/**\n * 验证单个 Schema(返回结果对象)\n */\nexport function validateSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n): ValidationResult<Static<T>> {\n try {\n const compiler = getCompiledValidator(schema);\n\n if (compiler.Check(data)) {\n return { success: true, data: data as Static<T> };\n }\n\n // 收集错误\n const errors: ValidationError[] = [];\n for (const error of compiler.Errors(data)) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n });\n }\n return { success: false, errors };\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : \"验证异常\",\n code: \"VALIDATION_EXCEPTION\",\n },\n ],\n };\n }\n}\n\n/**\n * 验证 Schema(抛出异常版本,用于框架内部)\n */\nexport function validateSchemaOrThrow<T extends TSchema>(\n schema: T,\n data: unknown,\n context: string,\n): Static<T> {\n const compiler = getCompiledValidator(schema);\n\n if (!compiler.Check(data)) {\n throw new Error(`${context}验证失败`);\n }\n\n return data as Static<T>;\n}\n\n/**\n * 快速验证(只返回布尔值)\n */\nexport function validateFast<T extends TSchema>(\n schema: T,\n data: unknown,\n): data is Static<T> {\n const compiler = getCompiledValidator(schema);\n return compiler.Check(data);\n}\n\n/**\n * 批量验证所有 Schema(用于请求验证)\n */\nexport function validateAllSchemas(\n config: SchemaConfig,\n data: {\n body: unknown;\n query: unknown;\n params: unknown;\n headers: unknown;\n cookies: unknown;\n },\n): typeof data {\n if (config.body) {\n validateSchemaOrThrow(config.body, data.body, \"请求体\");\n }\n if (config.query) {\n validateSchemaOrThrow(config.query, data.query, \"Query参数\");\n }\n if (config.params) {\n validateSchemaOrThrow(config.params, data.params, \"路径参数\");\n }\n if (config.headers) {\n validateSchemaOrThrow(config.headers, data.headers, \"请求头\");\n }\n if (config.cookies) {\n validateSchemaOrThrow(config.cookies, data.cookies, \"Cookie\");\n }\n return data;\n}\n\n/**\n * 预编译 Schema(启动时调用,避免首次请求开销)\n */\nexport function precompileSchemas(config: SchemaConfig): void {\n if (config.body) getCompiledValidator(config.body);\n if (config.query) getCompiledValidator(config.query);\n if (config.params) getCompiledValidator(config.params);\n if (config.headers) getCompiledValidator(config.headers);\n if (config.cookies) getCompiledValidator(config.cookies);\n}\n\n/**\n * 创建类型特化的验证器(高频使用场景)\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n): (data: unknown) => ValidationResult<Static<T>> {\n return (data: unknown) => validateSchema(schema, data);\n}\n\n/**\n * 获取缓存统计(调试用)\n */\nexport function getValidatorCacheStats(): { cacheType: string; note: string } {\n return {\n cacheType: \"WeakMap\",\n note: \"WeakMap 缓存会随 Schema 对象自动清理,无内存泄漏风险\",\n };\n}\n\n// 导出 TypeBox 类型\nexport { Type, Static, TSchema };\n"],"mappings":";;;;;;;;;;;;;;;AA2CA,MAAM,gCAAgB,IAAI,SAAsC;;;;AAOhE,SAAS,qBAAwC,QAAyB;CACxE,IAAI,WAAW,cAAc,IAAI,OAAO;AACxC,KAAI,CAAC,UAAU;AACb,aAAW,aAAa,QAAQ,OAAO;AACvC,gBAAc,IAAI,QAAQ,SAAS;;AAErC,QAAO;;;;;AAMT,SAAgB,eACd,QACA,MAC6B;AAC7B,KAAI;EACF,MAAM,WAAW,qBAAqB,OAAO;AAE7C,MAAI,SAAS,MAAM,KAAK,CACtB,QAAO;GAAE,SAAS;GAAY;GAAmB;EAInD,MAAM,SAA4B,EAAE;AACpC,OAAK,MAAM,SAAS,SAAS,OAAO,KAAK,CACvC,QAAO,KAAK;GACV,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,MAAM;GACN,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;GAAE,SAAS;GAAO;GAAQ;UAC1B,OAAO;AACd,SAAO;GACL,SAAS;GACT,QAAQ,CACN;IACE,MAAM;IACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IAClD,MAAM;IACP,CACF;GACF;;;;;;AAOL,SAAgB,sBACd,QACA,MACA,SACW;AAGX,KAAI,CAFa,qBAAqB,OAAO,CAE/B,MAAM,KAAK,CACvB,OAAM,IAAI,MAAM,GAAG,QAAQ,MAAM;AAGnC,QAAO;;;;;AAMT,SAAgB,aACd,QACA,MACmB;AAEnB,QADiB,qBAAqB,OAAO,CAC7B,MAAM,KAAK;;;;;AAM7B,SAAgB,mBACd,QACA,MAOa;AACb,KAAI,OAAO,KACT,uBAAsB,OAAO,MAAM,KAAK,MAAM,MAAM;AAEtD,KAAI,OAAO,MACT,uBAAsB,OAAO,OAAO,KAAK,OAAO,UAAU;AAE5D,KAAI,OAAO,OACT,uBAAsB,OAAO,QAAQ,KAAK,QAAQ,OAAO;AAE3D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,MAAM;AAE5D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,SAAS;AAE/D,QAAO;;;;;AAMT,SAAgB,kBAAkB,QAA4B;AAC5D,KAAI,OAAO,KAAM,sBAAqB,OAAO,KAAK;AAClD,KAAI,OAAO,MAAO,sBAAqB,OAAO,MAAM;AACpD,KAAI,OAAO,OAAQ,sBAAqB,OAAO,OAAO;AACtD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;AACxD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;;;;;AAM1D,SAAgB,gBACd,QACgD;AAChD,SAAQ,SAAkB,eAAe,QAAQ,KAAK;;;;;AAMxD,SAAgB,yBAA8D;AAC5E,QAAO;EACL,WAAW;EACX,MAAM;EACP"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vafast",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "极简结构化Web框架,支持 Bun 和 Node.js。Go风格,函数优先。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -13,31 +13,29 @@
|
|
|
13
13
|
},
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
|
-
"types": "./dist/index.d.
|
|
17
|
-
"import": "./dist/index.
|
|
18
|
-
"
|
|
19
|
-
"default": "./dist/index.js"
|
|
16
|
+
"types": "./dist/index.d.mts",
|
|
17
|
+
"import": "./dist/index.mjs",
|
|
18
|
+
"default": "./dist/index.mjs"
|
|
20
19
|
},
|
|
21
20
|
"./mod": {
|
|
22
|
-
"types": "./dist/index.d.
|
|
23
|
-
"import": "./dist/index.
|
|
24
|
-
"
|
|
25
|
-
"default": "./dist/index.js"
|
|
21
|
+
"types": "./dist/index.d.mts",
|
|
22
|
+
"import": "./dist/index.mjs",
|
|
23
|
+
"default": "./dist/index.mjs"
|
|
26
24
|
},
|
|
27
25
|
"./node-server": {
|
|
28
|
-
"types": "./dist/node-server/index.d.
|
|
29
|
-
"import": "./dist/node-server/index.
|
|
30
|
-
"
|
|
31
|
-
"default": "./dist/node-server/index.js"
|
|
26
|
+
"types": "./dist/node-server/index.d.mts",
|
|
27
|
+
"import": "./dist/node-server/index.mjs",
|
|
28
|
+
"default": "./dist/node-server/index.mjs"
|
|
32
29
|
}
|
|
33
30
|
},
|
|
34
|
-
"types": "./dist/index.d.
|
|
35
|
-
"main": "./dist/index.
|
|
31
|
+
"types": "./dist/index.d.mts",
|
|
32
|
+
"main": "./dist/index.mjs",
|
|
36
33
|
"scripts": {
|
|
37
|
-
"build": "
|
|
34
|
+
"build": "tsdown",
|
|
38
35
|
"dev": "npx tsx watch example/index.ts",
|
|
39
36
|
"test": "vitest run",
|
|
40
|
-
"
|
|
37
|
+
"type-check": "tsc --noEmit",
|
|
38
|
+
"release": "npm run type-check && npm run build && npm run test && npx bumpp && npm publish --access=public"
|
|
41
39
|
},
|
|
42
40
|
"keywords": [
|
|
43
41
|
"bun",
|
|
@@ -72,7 +70,7 @@
|
|
|
72
70
|
"jsdom": "^26.1.0",
|
|
73
71
|
"prettier": "^3.5.3",
|
|
74
72
|
"rimraf": "^6.0.1",
|
|
75
|
-
"
|
|
73
|
+
"tsdown": "^0.19.0-beta.4",
|
|
76
74
|
"typescript": "^5.9.2",
|
|
77
75
|
"typescript-eslint": "^8.30.1",
|
|
78
76
|
"vitest": "^3.2.4"
|
package/dist/auth/token.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
// src/utils/base64url.ts
|
|
2
|
-
function base64urlEncode(str) {
|
|
3
|
-
return btoa(str).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
4
|
-
}
|
|
5
|
-
function base64urlDecode(str) {
|
|
6
|
-
const pad = str.length % 4 === 0 ? "" : "=".repeat(4 - str.length % 4);
|
|
7
|
-
const base64 = str.replace(/-/g, "+").replace(/_/g, "/") + pad;
|
|
8
|
-
return atob(base64);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// src/auth/token.ts
|
|
12
|
-
var TokenError = class extends Error {
|
|
13
|
-
constructor(message, code) {
|
|
14
|
-
super(message);
|
|
15
|
-
this.code = code;
|
|
16
|
-
this.name = "TokenError";
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
var encoder = new TextEncoder();
|
|
20
|
-
async function sign(data, secret) {
|
|
21
|
-
const key = await crypto.subtle.importKey(
|
|
22
|
-
"raw",
|
|
23
|
-
encoder.encode(secret),
|
|
24
|
-
{ name: "HMAC", hash: "SHA-256" },
|
|
25
|
-
false,
|
|
26
|
-
["sign"]
|
|
27
|
-
);
|
|
28
|
-
const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(data));
|
|
29
|
-
return btoa(
|
|
30
|
-
String.fromCharCode.apply(null, Array.from(new Uint8Array(signature)))
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
async function generateToken(payload, secret, options = {}) {
|
|
34
|
-
const { expiresIn = 3600, issuer, audience, subject } = options;
|
|
35
|
-
const now = Math.floor(Date.now() / 1e3);
|
|
36
|
-
const tokenPayload = {
|
|
37
|
-
...payload,
|
|
38
|
-
iat: now,
|
|
39
|
-
exp: now + expiresIn
|
|
40
|
-
};
|
|
41
|
-
if (issuer) tokenPayload.iss = issuer;
|
|
42
|
-
if (audience) tokenPayload.aud = audience;
|
|
43
|
-
if (subject) tokenPayload.sub = subject;
|
|
44
|
-
const data = base64urlEncode(JSON.stringify(tokenPayload));
|
|
45
|
-
const sig = await sign(data, secret);
|
|
46
|
-
const token = `${data}.${base64urlEncode(sig)}`;
|
|
47
|
-
return {
|
|
48
|
-
payload: tokenPayload,
|
|
49
|
-
token,
|
|
50
|
-
expiresAt: tokenPayload.exp * 1e3
|
|
51
|
-
// 转换为毫秒
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
async function verifyToken(token, secret) {
|
|
55
|
-
try {
|
|
56
|
-
const [data, sig] = token.split(".");
|
|
57
|
-
if (!data || !sig) {
|
|
58
|
-
throw new TokenError("\u4EE4\u724C\u683C\u5F0F\u65E0\u6548", "MALFORMED_TOKEN");
|
|
59
|
-
}
|
|
60
|
-
const expectedSig = await sign(data, secret);
|
|
61
|
-
const expected = base64urlEncode(expectedSig);
|
|
62
|
-
if (sig !== expected) {
|
|
63
|
-
throw new TokenError("\u4EE4\u724C\u7B7E\u540D\u65E0\u6548", "INVALID_SIGNATURE");
|
|
64
|
-
}
|
|
65
|
-
const payload = JSON.parse(base64urlDecode(data));
|
|
66
|
-
if (payload.exp && Date.now() / 1e3 > payload.exp) {
|
|
67
|
-
throw new TokenError("\u4EE4\u724C\u5DF2\u8FC7\u671F", "EXPIRED_TOKEN");
|
|
68
|
-
}
|
|
69
|
-
return payload;
|
|
70
|
-
} catch (error) {
|
|
71
|
-
if (error instanceof TokenError) {
|
|
72
|
-
throw error;
|
|
73
|
-
}
|
|
74
|
-
throw new TokenError("\u4EE4\u724C\u9A8C\u8BC1\u5931\u8D25", "INVALID_TOKEN");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function parseToken(token) {
|
|
78
|
-
try {
|
|
79
|
-
const [data] = token.split(".");
|
|
80
|
-
if (!data) return null;
|
|
81
|
-
return JSON.parse(base64urlDecode(data));
|
|
82
|
-
} catch {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function isTokenExpired(token) {
|
|
87
|
-
const payload = parseToken(token);
|
|
88
|
-
if (!payload || !payload.exp) return true;
|
|
89
|
-
return Date.now() / 1e3 > payload.exp;
|
|
90
|
-
}
|
|
91
|
-
function getTokenTimeRemaining(token) {
|
|
92
|
-
const payload = parseToken(token);
|
|
93
|
-
if (!payload || !payload.exp) return 0;
|
|
94
|
-
const remaining = payload.exp - Date.now() / 1e3;
|
|
95
|
-
return Math.max(0, Math.floor(remaining));
|
|
96
|
-
}
|
|
97
|
-
async function refreshToken(token, secret, options = {}) {
|
|
98
|
-
try {
|
|
99
|
-
const payload = await verifyToken(token, secret);
|
|
100
|
-
if (!payload) return null;
|
|
101
|
-
const { exp, iat, ...cleanPayload } = payload;
|
|
102
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
103
|
-
return await generateToken(cleanPayload, secret, options);
|
|
104
|
-
} catch {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
async function createTokenPair(payload, secret, options = {}) {
|
|
109
|
-
const accessToken = await generateToken(payload, secret, {
|
|
110
|
-
...options,
|
|
111
|
-
expiresIn: options.expiresIn || 3600
|
|
112
|
-
// 1小时
|
|
113
|
-
});
|
|
114
|
-
const refreshToken2 = await generateToken(payload, secret, {
|
|
115
|
-
...options,
|
|
116
|
-
expiresIn: 7 * 24 * 3600
|
|
117
|
-
// 7天
|
|
118
|
-
});
|
|
119
|
-
return { accessToken, refreshToken: refreshToken2 };
|
|
120
|
-
}
|
|
121
|
-
export {
|
|
122
|
-
TokenError,
|
|
123
|
-
createTokenPair,
|
|
124
|
-
generateToken,
|
|
125
|
-
getTokenTimeRemaining,
|
|
126
|
-
isTokenExpired,
|
|
127
|
-
parseToken,
|
|
128
|
-
refreshToken,
|
|
129
|
-
verifyToken
|
|
130
|
-
};
|
|
131
|
-
//# sourceMappingURL=token.js.map
|
package/dist/auth/token.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/base64url.ts","../../src/auth/token.ts"],"sourcesContent":["export function base64urlEncode(str: string): string {\n return btoa(str)\n .replace(/=/g, \"\") // ✅ 删除填充\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\");\n}\n\nexport function base64urlDecode(str: string): string {\n const pad = str.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (str.length % 4));\n const base64 = str.replace(/-/g, \"+\").replace(/_/g, \"/\") + pad;\n return atob(base64);\n}\n","// src/auth/token.ts\nimport { base64urlEncode, base64urlDecode } from \"../utils/base64url\";\n\n// 类型定义\nexport interface TokenPayload {\n [key: string]: any;\n exp?: number; // 过期时间戳\n iat?: number; // 签发时间戳\n sub?: string; // 主题(通常是用户ID)\n aud?: string; // 受众\n iss?: string; // 签发者\n}\n\nexport interface TokenResult {\n payload: TokenPayload;\n token: string;\n expiresAt: number;\n}\n\nexport interface TokenOptions {\n expiresIn?: number; // 过期时间(秒)\n issuer?: string; // 签发者\n audience?: string; // 受众\n subject?: string; // 主题\n}\n\nexport class TokenError extends Error {\n constructor(\n message: string,\n public code:\n | \"INVALID_TOKEN\"\n | \"EXPIRED_TOKEN\"\n | \"INVALID_SIGNATURE\"\n | \"MALFORMED_TOKEN\"\n | \"INVALID_PAYLOAD\",\n ) {\n super(message);\n this.name = \"TokenError\";\n }\n}\n\nconst encoder = new TextEncoder();\n\n/** 使用 HMAC-SHA256 进行签名 */\nasync function sign(data: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(data));\n return btoa(\n String.fromCharCode.apply(null, Array.from(new Uint8Array(signature))),\n );\n}\n\n/** 生成令牌 */\nexport async function generateToken(\n payload: TokenPayload,\n secret: string,\n options: TokenOptions = {},\n): Promise<TokenResult> {\n const { expiresIn = 3600, issuer, audience, subject } = options;\n\n // 创建令牌载荷,强制使用当前时间\n const now = Math.floor(Date.now() / 1000);\n const tokenPayload: TokenPayload = {\n ...payload,\n iat: now,\n exp: now + expiresIn,\n };\n\n // 添加可选字段\n if (issuer) tokenPayload.iss = issuer;\n if (audience) tokenPayload.aud = audience;\n if (subject) tokenPayload.sub = subject;\n\n const data = base64urlEncode(JSON.stringify(tokenPayload));\n const sig = await sign(data, secret);\n const token = `${data}.${base64urlEncode(sig)}`;\n\n return {\n payload: tokenPayload,\n token,\n expiresAt: tokenPayload.exp! * 1000, // 转换为毫秒\n };\n}\n\n/** 验证令牌 */\nexport async function verifyToken(\n token: string,\n secret: string,\n): Promise<TokenPayload | null> {\n try {\n const [data, sig] = token.split(\".\");\n if (!data || !sig) {\n throw new TokenError(\"令牌格式无效\", \"MALFORMED_TOKEN\");\n }\n\n const expectedSig = await sign(data, secret);\n const expected = base64urlEncode(expectedSig);\n\n if (sig !== expected) {\n throw new TokenError(\"令牌签名无效\", \"INVALID_SIGNATURE\");\n }\n\n const payload = JSON.parse(base64urlDecode(data)) as TokenPayload;\n\n // 检查过期时间\n if (payload.exp && Date.now() / 1000 > payload.exp) {\n throw new TokenError(\"令牌已过期\", \"EXPIRED_TOKEN\");\n }\n\n return payload;\n } catch (error) {\n if (error instanceof TokenError) {\n throw error;\n }\n throw new TokenError(\"令牌验证失败\", \"INVALID_TOKEN\");\n }\n}\n\n/** 解析令牌(不验证签名) */\nexport function parseToken(token: string): TokenPayload | null {\n try {\n const [data] = token.split(\".\");\n if (!data) return null;\n\n return JSON.parse(base64urlDecode(data));\n } catch {\n return null;\n }\n}\n\n/** 检查令牌是否过期 */\nexport function isTokenExpired(token: string): boolean {\n const payload = parseToken(token);\n if (!payload || !payload.exp) return true;\n\n return Date.now() / 1000 > payload.exp;\n}\n\n/** 获取令牌剩余有效时间(秒) */\nexport function getTokenTimeRemaining(token: string): number {\n const payload = parseToken(token);\n if (!payload || !payload.exp) return 0;\n\n const remaining = payload.exp - Date.now() / 1000;\n return Math.max(0, Math.floor(remaining));\n}\n\n/** 刷新令牌 */\nexport async function refreshToken(\n token: string,\n secret: string,\n options: TokenOptions = {},\n): Promise<TokenResult | null> {\n try {\n const payload = await verifyToken(token, secret);\n if (!payload) return null;\n\n // 移除时间相关字段,重新生成\n const { exp, iat, ...cleanPayload } = payload;\n\n // 添加延迟确保时间戳不同\n await new Promise((resolve) => setTimeout(resolve, 10));\n\n return await generateToken(cleanPayload, secret, options);\n } catch {\n return null;\n }\n}\n\n/** 创建访问令牌和刷新令牌对 */\nexport async function createTokenPair(\n payload: TokenPayload,\n secret: string,\n options: TokenOptions = {},\n): Promise<{\n accessToken: TokenResult;\n refreshToken: TokenResult;\n}> {\n const accessToken = await generateToken(payload, secret, {\n ...options,\n expiresIn: options.expiresIn || 3600, // 1小时\n });\n\n const refreshToken = await generateToken(payload, secret, {\n ...options,\n expiresIn: 7 * 24 * 3600, // 7天\n });\n\n return { accessToken, refreshToken };\n}\n"],"mappings":"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","names":["refreshToken"]}
|
package/dist/defineRoute.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
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
|
-
}
|
|
25
|
-
function defineRoutes(routes) {
|
|
26
|
-
return routes;
|
|
27
|
-
}
|
|
28
|
-
export {
|
|
29
|
-
defineRoutes,
|
|
30
|
-
del,
|
|
31
|
-
get,
|
|
32
|
-
patch,
|
|
33
|
-
post,
|
|
34
|
-
put,
|
|
35
|
-
route
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=defineRoute.js.map
|
package/dist/defineRoute.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export { Server } from './server/server.js';
|
|
2
|
-
export { ComponentServer } from './server/component-server.js';
|
|
3
|
-
export { ServerFactory } from './server/server-factory.js';
|
|
4
|
-
export { BaseServer } from './server/base-server.js';
|
|
5
|
-
export { VafastError, composeMiddleware } from './middleware.js';
|
|
6
|
-
export { InferableHandler, createHandler, createHandlerWithExtra, simpleHandler } from './utils/create-handler.js';
|
|
7
|
-
export { getCookie, getHeader, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast } from './utils/parsers.js';
|
|
8
|
-
export { empty, html, json, redirect, stream, text } from './utils/response.js';
|
|
9
|
-
export { goAwait } from './utils/go-await.js';
|
|
10
|
-
export { base64urlDecode, base64urlEncode } from './utils/base64url.js';
|
|
11
|
-
export { getLocals, setLocals } from './utils/handle.js';
|
|
12
|
-
export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest } from './utils/request-validator.js';
|
|
13
|
-
export { HtmlRenderer } from './utils/html-renderer.js';
|
|
14
|
-
export { DependencyManager } from './utils/dependency-manager.js';
|
|
15
|
-
export { SchemaConfig, ValidationError, ValidationResult, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow } from './utils/validators/validators.js';
|
|
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, filterRoutes, getAllRoutes, getRoute, getRouteRegistry } from './utils/route-registry.js';
|
|
19
|
-
export { flattenNestedRoutes, normalizePath } from './router.js';
|
|
20
|
-
export { requireAuth } from './middleware/authMiddleware.js';
|
|
21
|
-
export { rateLimit } from './middleware/rateLimit.js';
|
|
22
|
-
export { CORSOptions, createCORS } from './middleware/cors.js';
|
|
23
|
-
export { TokenError, TokenOptions, TokenPayload, TokenResult, createTokenPair, generateToken, getTokenTimeRemaining, isTokenExpired, parseToken, refreshToken, verifyToken } from './auth/token.js';
|
|
24
|
-
export { createAuth, createOptionalAuth, createPermissionAuth, createRoleAuth } from './middleware/auth.js';
|
|
25
|
-
export { InferableRoute, RouteDefinition, defineRoutes, del, get, patch, post, put, route } from './defineRoute.js';
|
|
26
|
-
export { FlattenedRoute, Handler, Method, Middleware, NestedRoute, ResponseBody, Route } from './types/types.js';
|
|
27
|
-
export { BaseRouteConfig, CompatibleRoute, ExtendedRouteConfig, NestedRouteConfig, TypedRoute, createTypedRoute, isTypedRoute } from './types/route.js';
|
|
28
|
-
export { ComponentRoute, FlattenedComponentRoute, NestedComponentRoute } from './types/component-route.js';
|
|
29
|
-
export { HandlerContext, HandlerContextWithExtra, InferSchema, RouteSchema, TypedHandler, TypedRouteConfig } from './types/schema.js';
|
|
30
|
-
export { FetchHandler, ServeOptions, ServeResult, serve } from './node-server/serve.js';
|
|
31
|
-
export { FormatRegistry, Type } from '@sinclair/typebox';
|
|
32
|
-
import 'node:http';
|