vafast 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -2
- package/dist/{base-server-CE0mfqPY.mjs → base-server-CbnxNoNf.mjs} +1 -1
- package/dist/{base-server-CE0mfqPY.mjs.map → base-server-CbnxNoNf.mjs.map} +1 -1
- package/dist/{base-server-CeJ8LTBk.d.mts → base-server-DDNu97SA.d.mts} +2 -2
- package/dist/{base64url-Cc77f1ms.mjs → base64url-Cc25EVjw.mjs} +1 -1
- package/dist/{base64url-Cc77f1ms.mjs.map → base64url-Cc25EVjw.mjs.map} +1 -1
- package/dist/{base64url-CAmasWF0.d.mts → base64url-wYuxnrb0.d.mts} +1 -1
- package/dist/{component-route-CGbmQm5P.d.mts → component-route-BAaJKp8X.d.mts} +2 -2
- package/dist/{component-router-B6M5XDnp.mjs → component-router-wQc8auz9.mjs} +1 -1
- package/dist/{component-router-B6M5XDnp.mjs.map → component-router-wQc8auz9.mjs.map} +1 -1
- package/dist/{component-server-CKcXIvMg.d.mts → component-server-CVhgbxOe.d.mts} +4 -4
- package/dist/{component-server-O6IQwKam.mjs → component-server-llGj--XB.mjs} +6 -6
- package/dist/{component-server-O6IQwKam.mjs.map → component-server-llGj--XB.mjs.map} +1 -1
- package/dist/{contract-vSyKiRwz.mjs → contract-BIqqOwPd.mjs} +2 -2
- package/dist/{contract-vSyKiRwz.mjs.map → contract-BIqqOwPd.mjs.map} +1 -1
- package/dist/{contract-C-xQoZ6r.d.mts → contract-ChZaybx9.d.mts} +1 -1
- package/dist/{defineRoute-Rod-Vi6-.d.mts → defineRoute-DUYeO8TR.d.mts} +1 -1
- package/dist/defineRoute.d.mts +1 -1
- package/dist/defineRoute.mjs +6 -13
- package/dist/defineRoute.mjs.map +1 -1
- package/dist/{dependency-manager-mqzLAocb.d.mts → dependency-manager-BIjSc7j3.d.mts} +1 -1
- package/dist/{dependency-manager-ChW24ep8.mjs → dependency-manager-DaDThGEc.mjs} +1 -1
- package/dist/{dependency-manager-ChW24ep8.mjs.map → dependency-manager-DaDThGEc.mjs.map} +1 -1
- package/dist/{formats-Ca7ASaYH.d.mts → formats-B1vlpb1f.d.mts} +1 -1
- package/dist/{go-await-B1U27PgB.mjs → go-await-C4ZdEUwY.mjs} +1 -1
- package/dist/{go-await-B1U27PgB.mjs.map → go-await-C4ZdEUwY.mjs.map} +1 -1
- package/dist/{go-await-Dz1CRSTT.d.mts → go-await-KQIMkGZy.d.mts} +1 -1
- package/dist/{html-renderer-D1zzDVQM.mjs → html-renderer-DgYwJP_a.mjs} +1 -1
- package/dist/{html-renderer-D1zzDVQM.mjs.map → html-renderer-DgYwJP_a.mjs.map} +1 -1
- package/dist/{html-renderer-Up52eIS6.d.mts → html-renderer-ZY_sfcpi.d.mts} +1 -1
- package/dist/{index-CqwSjhXb.d.mts → index-DgIsC7ua.d.mts} +5 -5
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +17 -16
- package/dist/index.mjs.map +1 -1
- package/dist/middleware/component-router.d.mts +1 -1
- package/dist/middleware/component-router.mjs +1 -1
- package/dist/{middleware-BTg4GbjC.d.mts → middleware-B_fMMYr3.d.mts} +2 -2
- package/dist/middleware.d.mts +1 -1
- package/dist/middleware.mjs +2 -1
- package/dist/monitoring/index.d.mts +3 -3
- package/dist/monitoring/native-monitor.d.mts +3 -3
- package/dist/node-server/index.d.mts +1 -1
- package/dist/node-server/index.mjs +3 -3
- package/dist/node-server/request.mjs +1 -1
- package/dist/node-server/response.mjs +1 -1
- package/dist/node-server/serve.d.mts +1 -1
- package/dist/node-server/serve.mjs +2 -2
- package/dist/{parsers-CEkO18PZ.d.mts → parsers-B1dewjiN.d.mts} +1 -1
- package/dist/{parsers-BPBVKby-.mjs → parsers-DPKyyUv3.mjs} +1 -1
- package/dist/{parsers-BPBVKby-.mjs.map → parsers-DPKyyUv3.mjs.map} +1 -1
- package/dist/{path-matcher-Dp-DRUV9.mjs → path-matcher-BwpVrcVG.mjs} +1 -1
- package/dist/{path-matcher-Dp-DRUV9.mjs.map → path-matcher-BwpVrcVG.mjs.map} +1 -1
- package/dist/{radix-tree-dyn3qDFX.mjs → radix-tree-DPcGUi6x.mjs} +1 -1
- package/dist/{radix-tree-dyn3qDFX.mjs.map → radix-tree-DPcGUi6x.mjs.map} +1 -1
- package/dist/{request-D5oMj6sH.mjs → request-COqaDa-c.mjs} +1 -1
- package/dist/{request-D5oMj6sH.mjs.map → request-COqaDa-c.mjs.map} +1 -1
- package/dist/{response-BlHLmKys.mjs → response-BK2pYq43.mjs} +1 -1
- package/dist/{response-BlHLmKys.mjs.map → response-BK2pYq43.mjs.map} +1 -1
- package/dist/{response-Bs9GhJz-.mjs → response-BlkS--Fb.mjs} +9 -2
- package/dist/response-BlkS--Fb.mjs.map +1 -0
- package/dist/{response-lI0YZoia.d.mts → response-DsH8MnBO.d.mts} +2 -2
- package/dist/{route-registry-DmbGzvgn.d.mts → route-registry-B0q_pJDC.d.mts} +3 -3
- package/dist/{route-registry-DsPslV2b.mjs → route-registry-ClmI5VwE.mjs} +1 -1
- package/dist/{route-registry-DsPslV2b.mjs.map → route-registry-ClmI5VwE.mjs.map} +1 -1
- package/dist/router/index.mjs +1 -1
- package/dist/router/radix-tree.d.mts +1 -1
- package/dist/router/radix-tree.mjs +1 -1
- package/dist/{serve-Cj0bYhav.mjs → serve-CozN9Tlz.mjs} +3 -3
- package/dist/{serve-Cj0bYhav.mjs.map → serve-CozN9Tlz.mjs.map} +1 -1
- package/dist/{serve-Dw-GHkc3.d.mts → serve-Dh6Ux5Pg.d.mts} +1 -1
- package/dist/serve.d.mts +1 -1
- package/dist/serve.mjs +2 -2
- package/dist/server/base-server.d.mts +1 -1
- package/dist/server/base-server.mjs +1 -1
- package/dist/server/component-server.d.mts +1 -1
- package/dist/server/component-server.mjs +2 -2
- package/dist/server/index.d.mts +5 -5
- package/dist/server/index.mjs +7 -6
- package/dist/server/server-factory.d.mts +3 -3
- package/dist/server/server-factory.mjs +6 -5
- package/dist/server/server.d.mts +2 -2
- package/dist/server/server.mjs +3 -2
- package/dist/{server-u4TNtYHx.mjs → server-D-jaEU-V.mjs} +3 -3
- package/dist/{server-u4TNtYHx.mjs.map → server-D-jaEU-V.mjs.map} +1 -1
- package/dist/{server-B-X9ANNh.d.mts → server-Dr_qEIqu.d.mts} +4 -4
- package/dist/{server-B4YDcNJy.mjs → server-Dtk8M7eI.mjs} +5 -5
- package/dist/{server-B4YDcNJy.mjs.map → server-Dtk8M7eI.mjs.map} +1 -1
- package/dist/{sse-BqvrwmK6.d.mts → sse-CZnFOi2K.d.mts} +1 -1
- package/dist/types/component-route.d.mts +1 -1
- package/dist/types/index.d.mts +2 -2
- package/dist/types/types.d.mts +1 -1
- package/dist/{types-aczawQFE.d.mts → types-BaIZETLg.d.mts} +1 -1
- package/dist/utils/base64url.d.mts +1 -1
- package/dist/utils/base64url.mjs +1 -1
- package/dist/utils/contract.d.mts +1 -1
- package/dist/utils/contract.mjs +1 -1
- package/dist/utils/dependency-manager.d.mts +1 -1
- package/dist/utils/dependency-manager.mjs +1 -1
- package/dist/utils/formats.d.mts +1 -1
- package/dist/utils/go-await.d.mts +1 -1
- package/dist/utils/go-await.mjs +1 -1
- package/dist/utils/handle.mjs +1 -1
- package/dist/utils/html-renderer.d.mts +1 -1
- package/dist/utils/html-renderer.mjs +1 -1
- package/dist/utils/index.d.mts +14 -13
- package/dist/utils/index.mjs +11 -10
- package/dist/utils/parsers.d.mts +1 -1
- package/dist/utils/parsers.mjs +1 -1
- package/dist/utils/path-matcher.mjs +1 -1
- package/dist/utils/response.d.mts +1 -1
- package/dist/utils/response.mjs +2 -1
- package/dist/utils/route-registry.d.mts +2 -2
- package/dist/utils/route-registry.mjs +1 -1
- package/dist/utils/sse.d.mts +1 -1
- package/dist/utils/validators/validation-errors.d.mts +2 -0
- package/dist/utils/validators/validation-errors.mjs +3 -0
- package/dist/utils/validators/validators.d.mts +1 -1
- package/dist/utils/validators/validators.mjs +2 -1
- package/dist/validation-errors-BXOr6Rf2.d.mts +36 -0
- package/dist/validation-errors-j7DAULlG.mjs +38 -0
- package/dist/validation-errors-j7DAULlG.mjs.map +1 -0
- package/dist/{validators-CkfvNBbK.mjs → validators-DdEfUzCC.mjs} +60 -21
- package/dist/validators-DdEfUzCC.mjs.map +1 -0
- package/dist/{validators-D5KJCSZr.d.mts → validators-jkeNFN8V.d.mts} +7 -5
- package/package.json +1 -1
- package/dist/response-Bs9GhJz-.mjs.map +0 -1
- package/dist/validators-CkfvNBbK.mjs.map +0 -1
- /package/dist/{component-route-DdKFowzp.mjs → component-route-B6jaTxLT.mjs} +0 -0
- /package/dist/{index-D4DUvwPf.d.mts → index-1-AkepUA.d.mts} +0 -0
package/dist/utils/handle.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as HtmlRenderer } from "../html-renderer-
|
|
1
|
+
import { t as HtmlRenderer } from "../html-renderer-ZY_sfcpi.mjs";
|
|
2
2
|
export { HtmlRenderer };
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
2
|
-
import { t as DependencyManager } from "../dependency-manager-
|
|
3
|
-
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-
|
|
4
|
-
import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-
|
|
5
|
-
import { t as goAwait } from "../go-await-
|
|
6
|
-
import { n as base64urlEncode, t as base64urlDecode } from "../base64url-
|
|
7
|
-
import { t as HtmlRenderer } from "../html-renderer-
|
|
8
|
-
import { a as
|
|
9
|
-
import {
|
|
10
|
-
import { t as
|
|
11
|
-
import {
|
|
12
|
-
import { n as
|
|
13
|
-
|
|
1
|
+
import "../defineRoute-DUYeO8TR.mjs";
|
|
2
|
+
import { t as DependencyManager } from "../dependency-manager-BIjSc7j3.mjs";
|
|
3
|
+
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-B1dewjiN.mjs";
|
|
4
|
+
import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-DsH8MnBO.mjs";
|
|
5
|
+
import { t as goAwait } from "../go-await-KQIMkGZy.mjs";
|
|
6
|
+
import { n as base64urlEncode, t as base64urlDecode } from "../base64url-wYuxnrb0.mjs";
|
|
7
|
+
import { t as HtmlRenderer } from "../html-renderer-ZY_sfcpi.mjs";
|
|
8
|
+
import { a as createErrorDetail, i as ValidationFailedError, n as SchemaLocation, o as isValidationFailedError, r as VALIDATION_FAILED_SYMBOL, s as pathToField, t as ErrorDetail } from "../validation-errors-BXOr6Rf2.mjs";
|
|
9
|
+
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-jkeNFN8V.mjs";
|
|
10
|
+
import { i as registerFormats, n as hasFormat, r as registerFormat, t as Patterns } from "../formats-B1vlpb1f.mjs";
|
|
11
|
+
import { t as SSEEvent } from "../sse-CZnFOi2K.mjs";
|
|
12
|
+
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-B0q_pJDC.mjs";
|
|
13
|
+
import { n as generateAITools, r as getApiSpec, t as ApiSpec } from "../contract-ChZaybx9.mjs";
|
|
14
|
+
export { type ApiSpec, DependencyManager, type ErrorDetail, HtmlRenderer, Patterns, type RouteMeta, RouteRegistry, type SSEEvent, type SchemaConfig, type SchemaLocation, VALIDATION_FAILED_SYMBOL, type ValidationError, ValidationFailedError, type ValidationResult, base64urlDecode, base64urlEncode, createErrorDetail, createRouteRegistry, createValidator, empty, err, filterRoutes, generateAITools, getAllRoutes, getApiSpec, getCookie, getHeader, getRoute, getRouteRegistry, getRoutesByMethod, getValidatorCacheStats, goAwait, hasFormat, html, isValidationFailedError, json, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, pathToField, precompileSchemas, redirect, registerFormat, registerFormats, stream, text, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
package/dist/utils/index.mjs
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
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-
|
|
2
|
-
import { a as
|
|
3
|
-
import { c as
|
|
4
|
-
import {
|
|
5
|
-
import { t as
|
|
6
|
-
import { t as
|
|
7
|
-
import { t as
|
|
8
|
-
import {
|
|
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-DPKyyUv3.mjs";
|
|
2
|
+
import { a as pathToField, i as isValidationFailedError, n as ValidationFailedError, r as createErrorDetail, t as VALIDATION_FAILED_SYMBOL } from "../validation-errors-j7DAULlG.mjs";
|
|
3
|
+
import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "../validators-DdEfUzCC.mjs";
|
|
4
|
+
import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-BlkS--Fb.mjs";
|
|
5
|
+
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-ClmI5VwE.mjs";
|
|
6
|
+
import { t as HtmlRenderer } from "../html-renderer-DgYwJP_a.mjs";
|
|
7
|
+
import { t as DependencyManager } from "../dependency-manager-DaDThGEc.mjs";
|
|
8
|
+
import { t as goAwait } from "../go-await-C4ZdEUwY.mjs";
|
|
9
|
+
import { n as base64urlEncode, t as base64urlDecode } from "../base64url-Cc25EVjw.mjs";
|
|
9
10
|
import { Patterns, hasFormat, registerFormat, registerFormats } from "./formats.mjs";
|
|
10
|
-
import { n as getApiSpec, t as generateAITools } from "../contract-
|
|
11
|
+
import { n as getApiSpec, t as generateAITools } from "../contract-BIqqOwPd.mjs";
|
|
11
12
|
|
|
12
|
-
export { DependencyManager, HtmlRenderer, Patterns, RouteRegistry, base64urlDecode, base64urlEncode, createRouteRegistry, createValidator, empty, err, filterRoutes, generateAITools, getAllRoutes, getApiSpec, getCookie, getHeader, getRoute, getRouteRegistry, getRoutesByMethod, getValidatorCacheStats, goAwait, hasFormat, html, json, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, precompileSchemas, redirect, registerFormat, registerFormats, stream, text, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
|
13
|
+
export { DependencyManager, HtmlRenderer, Patterns, RouteRegistry, VALIDATION_FAILED_SYMBOL, ValidationFailedError, base64urlDecode, base64urlEncode, createErrorDetail, createRouteRegistry, createValidator, empty, err, filterRoutes, generateAITools, getAllRoutes, getApiSpec, getCookie, getHeader, getRoute, getRouteRegistry, getRoutesByMethod, getValidatorCacheStats, goAwait, hasFormat, html, isValidationFailedError, json, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, pathToField, precompileSchemas, redirect, registerFormat, registerFormats, stream, text, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
package/dist/utils/parsers.d.mts
CHANGED
|
@@ -1,2 +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-
|
|
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-B1dewjiN.mjs";
|
|
2
2
|
export { FileInfo, FormData, getCookie, getHeader, parseBody, parseBodyAs, parseCookies, parseCookiesFast, parseFile, parseFormData, parseHeaders, parseQuery, parseQueryFast };
|
package/dist/utils/parsers.mjs
CHANGED
|
@@ -1,3 +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-
|
|
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-DPKyyUv3.mjs";
|
|
2
2
|
|
|
3
3
|
export { getCookie, getHeader, parseBody, parseBodyAs, parseCookies, parseCookiesFast, parseFile, parseFormData, parseHeaders, parseQuery, parseQueryFast };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as mapResponse, c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-
|
|
1
|
+
import { a as mapResponse, c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-DsH8MnBO.mjs";
|
|
2
2
|
export { empty, err, html, json, mapResponse, redirect, stream, text };
|
package/dist/utils/response.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "../validation-errors-j7DAULlG.mjs";
|
|
2
|
+
import { a as mapResponse, c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-BlkS--Fb.mjs";
|
|
2
3
|
|
|
3
4
|
export { empty, err, html, json, mapResponse, redirect, stream, text };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "../defineRoute-
|
|
2
|
-
import { a as getAllRoutes, c as getRoutesByMethod, i as filterRoutes, l as setGlobalRegistry, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-
|
|
1
|
+
import "../defineRoute-DUYeO8TR.mjs";
|
|
2
|
+
import { a as getAllRoutes, c as getRoutesByMethod, i as filterRoutes, l as setGlobalRegistry, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-B0q_pJDC.mjs";
|
|
3
3
|
export { RouteMeta, RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, getRoutesByMethod, setGlobalRegistry };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as getRoutesByMethod, t as RouteRegistry } from "../route-registry-
|
|
1
|
+
import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as getRoutesByMethod, t as RouteRegistry } from "../route-registry-ClmI5VwE.mjs";
|
|
2
2
|
|
|
3
3
|
export { RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, getRoutesByMethod, setGlobalRegistry };
|
package/dist/utils/sse.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as SSEEventWithMeta, r as SSEMeta, t as SSEEvent } from "../sse-
|
|
1
|
+
import { n as SSEEventWithMeta, r as SSEMeta, t as SSEEvent } from "../sse-CZnFOi2K.mjs";
|
|
2
2
|
export { SSEEvent, SSEEventWithMeta, SSEMeta };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as createErrorDetail, i as ValidationFailedError, n as SchemaLocation, o as isValidationFailedError, r as VALIDATION_FAILED_SYMBOL, s as pathToField, t as ErrorDetail } from "../../validation-errors-BXOr6Rf2.mjs";
|
|
2
|
+
export { ErrorDetail, SchemaLocation, VALIDATION_FAILED_SYMBOL, ValidationFailedError, createErrorDetail, isValidationFailedError, pathToField };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { a as pathToField, i as isValidationFailedError, n as ValidationFailedError, r as createErrorDetail, t as VALIDATION_FAILED_SYMBOL } from "../../validation-errors-j7DAULlG.mjs";
|
|
2
|
+
|
|
3
|
+
export { VALIDATION_FAILED_SYMBOL, ValidationFailedError, createErrorDetail, isValidationFailedError, pathToField };
|
|
@@ -1,2 +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-
|
|
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-jkeNFN8V.mjs";
|
|
2
2
|
export { SchemaConfig, Static, TSchema, Type, ValidationError, ValidationResult, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "../../validation-errors-j7DAULlG.mjs";
|
|
2
|
+
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-DdEfUzCC.mjs";
|
|
2
3
|
|
|
3
4
|
export { Type, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ValueError } from "@sinclair/typebox/errors";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/validators/validation-errors.d.ts
|
|
4
|
+
|
|
5
|
+
/** Schema 校验位置 */
|
|
6
|
+
type SchemaLocation = "body" | "query" | "params" | "headers" | "cookies";
|
|
7
|
+
/** 单条字段校验错误 */
|
|
8
|
+
interface ErrorDetail {
|
|
9
|
+
location: SchemaLocation;
|
|
10
|
+
/** JSON Pointer 风格路径,如 /email、/receiver/name、/orderIds/1 */
|
|
11
|
+
path: string;
|
|
12
|
+
/** 表单绑字段路径,如 email、receiver.name、orderIds.1 */
|
|
13
|
+
field: string;
|
|
14
|
+
/** TypeBox 原始 message */
|
|
15
|
+
message: string;
|
|
16
|
+
value?: unknown;
|
|
17
|
+
}
|
|
18
|
+
/** 全局 Symbol,跨包识别 ValidationFailedError */
|
|
19
|
+
declare const VALIDATION_FAILED_SYMBOL: unique symbol;
|
|
20
|
+
/** Schema 校验失败错误(422) */
|
|
21
|
+
declare class ValidationFailedError extends Error {
|
|
22
|
+
readonly [VALIDATION_FAILED_SYMBOL] = true;
|
|
23
|
+
readonly status = 422;
|
|
24
|
+
readonly code = 422;
|
|
25
|
+
readonly details: ErrorDetail[];
|
|
26
|
+
constructor(details: ErrorDetail[], message?: string);
|
|
27
|
+
}
|
|
28
|
+
/** 跨包安全识别 ValidationFailedError */
|
|
29
|
+
declare function isValidationFailedError(err: unknown): err is ValidationFailedError;
|
|
30
|
+
/** JSON Pointer path → 表单 field 路径 */
|
|
31
|
+
declare function pathToField(path: string): string;
|
|
32
|
+
/** 从 TypeBox ValueError 构造 ErrorDetail */
|
|
33
|
+
declare function createErrorDetail(location: SchemaLocation, error: ValueError): ErrorDetail;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { createErrorDetail as a, ValidationFailedError as i, SchemaLocation as n, isValidationFailedError as o, VALIDATION_FAILED_SYMBOL as r, pathToField as s, ErrorDetail as t };
|
|
36
|
+
//# sourceMappingURL=validation-errors-BXOr6Rf2.d.mts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/utils/validators/validation-errors.ts
|
|
2
|
+
/** 全局 Symbol,跨包识别 ValidationFailedError */
|
|
3
|
+
const VALIDATION_FAILED_SYMBOL = Symbol.for("vafast.validation_failed");
|
|
4
|
+
/** Schema 校验失败错误(422) */
|
|
5
|
+
var ValidationFailedError = class extends Error {
|
|
6
|
+
[VALIDATION_FAILED_SYMBOL] = true;
|
|
7
|
+
status = 422;
|
|
8
|
+
code = 422;
|
|
9
|
+
details;
|
|
10
|
+
constructor(details, message = "请求参数校验失败") {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "ValidationFailedError";
|
|
13
|
+
this.details = details;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/** 跨包安全识别 ValidationFailedError */
|
|
17
|
+
function isValidationFailedError(err) {
|
|
18
|
+
return err instanceof ValidationFailedError || typeof err === "object" && err !== null && err[VALIDATION_FAILED_SYMBOL] === true;
|
|
19
|
+
}
|
|
20
|
+
/** JSON Pointer path → 表单 field 路径 */
|
|
21
|
+
function pathToField(path) {
|
|
22
|
+
if (!path || path === "/") return "";
|
|
23
|
+
return path.startsWith("/") ? path.slice(1).replace(/\//g, ".") : path.replace(/\//g, ".");
|
|
24
|
+
}
|
|
25
|
+
/** 从 TypeBox ValueError 构造 ErrorDetail */
|
|
26
|
+
function createErrorDetail(location, error) {
|
|
27
|
+
return {
|
|
28
|
+
location,
|
|
29
|
+
path: error.path,
|
|
30
|
+
field: pathToField(error.path),
|
|
31
|
+
message: error.message,
|
|
32
|
+
...error.value !== void 0 ? { value: error.value } : {}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { pathToField as a, isValidationFailedError as i, ValidationFailedError as n, createErrorDetail as r, VALIDATION_FAILED_SYMBOL as t };
|
|
38
|
+
//# sourceMappingURL=validation-errors-j7DAULlG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-errors-j7DAULlG.mjs","names":[],"sources":["../src/utils/validators/validation-errors.ts"],"sourcesContent":["/**\n * Schema 校验错误契约\n *\n * HTTP 422 + { code: 422, message, details[] }\n * message 直接使用 TypeBox 原始英文,不做翻译或 rule 映射。\n */\n\nimport type { ValueError } from \"@sinclair/typebox/errors\";\n\n/** Schema 校验位置 */\nexport type SchemaLocation =\n | \"body\"\n | \"query\"\n | \"params\"\n | \"headers\"\n | \"cookies\";\n\n/** 单条字段校验错误 */\nexport interface ErrorDetail {\n location: SchemaLocation;\n /** JSON Pointer 风格路径,如 /email、/receiver/name、/orderIds/1 */\n path: string;\n /** 表单绑字段路径,如 email、receiver.name、orderIds.1 */\n field: string;\n /** TypeBox 原始 message */\n message: string;\n value?: unknown;\n}\n\n/** 全局 Symbol,跨包识别 ValidationFailedError */\nexport const VALIDATION_FAILED_SYMBOL = Symbol.for(\"vafast.validation_failed\");\n\n/** Schema 校验失败错误(422) */\nexport class ValidationFailedError extends Error {\n readonly [VALIDATION_FAILED_SYMBOL] = true;\n\n readonly status = 422;\n readonly code = 422;\n readonly details: ErrorDetail[];\n\n constructor(details: ErrorDetail[], message = \"请求参数校验失败\") {\n super(message);\n this.name = \"ValidationFailedError\";\n this.details = details;\n }\n}\n\n/** 跨包安全识别 ValidationFailedError */\nexport function isValidationFailedError(\n err: unknown,\n): err is ValidationFailedError {\n return (\n err instanceof ValidationFailedError ||\n (typeof err === \"object\" &&\n err !== null &&\n (err as Record<symbol, unknown>)[VALIDATION_FAILED_SYMBOL] === true)\n );\n}\n\n/** JSON Pointer path → 表单 field 路径 */\nexport function pathToField(path: string): string {\n if (!path || path === \"/\") return \"\";\n return path.startsWith(\"/\")\n ? path.slice(1).replace(/\\//g, \".\")\n : path.replace(/\\//g, \".\");\n}\n\n/** 从 TypeBox ValueError 构造 ErrorDetail */\nexport function createErrorDetail(\n location: SchemaLocation,\n error: ValueError,\n): ErrorDetail {\n return {\n location,\n path: error.path,\n field: pathToField(error.path),\n message: error.message,\n ...(error.value !== undefined ? { value: error.value } : {}),\n };\n}\n"],"mappings":";;AA8BA,MAAa,2BAA2B,OAAO,IAAI,2BAA2B;;AAG9E,IAAa,wBAAb,cAA2C,MAAM;CAC/C,CAAU,4BAA4B;CAEtC,AAAS,SAAS;CAClB,AAAS,OAAO;CAChB,AAAS;CAET,YAAY,SAAwB,UAAU,YAAY;AACxD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,UAAU;;;;AAKnB,SAAgB,wBACd,KAC8B;AAC9B,QACE,eAAe,yBACd,OAAO,QAAQ,YACd,QAAQ,QACP,IAAgC,8BAA8B;;;AAKrE,SAAgB,YAAY,MAAsB;AAChD,KAAI,CAAC,QAAQ,SAAS,IAAK,QAAO;AAClC,QAAO,KAAK,WAAW,IAAI,GACvB,KAAK,MAAM,EAAE,CAAC,QAAQ,OAAO,IAAI,GACjC,KAAK,QAAQ,OAAO,IAAI;;;AAI9B,SAAgB,kBACd,UACA,OACa;AACb,QAAO;EACL;EACA,MAAM,MAAM;EACZ,OAAO,YAAY,MAAM,KAAK;EAC9B,SAAS,MAAM;EACf,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAC5D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { a as pathToField, n as ValidationFailedError, r as createErrorDetail } from "./validation-errors-j7DAULlG.mjs";
|
|
1
2
|
import { Type } from "@sinclair/typebox";
|
|
2
3
|
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
|
3
4
|
|
|
@@ -25,43 +26,51 @@ function getCompiledValidator(schema) {
|
|
|
25
26
|
}
|
|
26
27
|
return compiler;
|
|
27
28
|
}
|
|
29
|
+
/** 收集单个 schema 的校验错误 */
|
|
30
|
+
function collectSchemaErrors(schema, data) {
|
|
31
|
+
const compiler = getCompiledValidator(schema);
|
|
32
|
+
if (compiler.Check(data)) return [];
|
|
33
|
+
return [...compiler.Errors(data)];
|
|
34
|
+
}
|
|
35
|
+
function valueErrorToValidationError(error) {
|
|
36
|
+
return {
|
|
37
|
+
path: error.path,
|
|
38
|
+
field: pathToField(error.path),
|
|
39
|
+
message: error.message,
|
|
40
|
+
...error.value !== void 0 ? { value: error.value } : {}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
28
43
|
/**
|
|
29
44
|
* 验证单个 Schema(返回结果对象)
|
|
30
45
|
*/
|
|
31
46
|
function validateSchema(schema, data) {
|
|
32
47
|
try {
|
|
33
|
-
const
|
|
34
|
-
if (
|
|
48
|
+
const errors = collectSchemaErrors(schema, data);
|
|
49
|
+
if (errors.length === 0) return {
|
|
35
50
|
success: true,
|
|
36
51
|
data
|
|
37
52
|
};
|
|
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
53
|
return {
|
|
46
54
|
success: false,
|
|
47
|
-
errors
|
|
55
|
+
errors: errors.map(valueErrorToValidationError)
|
|
48
56
|
};
|
|
49
57
|
} catch (error) {
|
|
50
58
|
return {
|
|
51
59
|
success: false,
|
|
52
60
|
errors: [{
|
|
53
61
|
path: "",
|
|
54
|
-
|
|
55
|
-
|
|
62
|
+
field: "",
|
|
63
|
+
message: error instanceof Error ? error.message : "验证异常"
|
|
56
64
|
}]
|
|
57
65
|
};
|
|
58
66
|
}
|
|
59
67
|
}
|
|
60
68
|
/**
|
|
61
|
-
* 验证 Schema
|
|
69
|
+
* 验证 Schema(抛出 ValidationFailedError)
|
|
62
70
|
*/
|
|
63
|
-
function validateSchemaOrThrow(schema, data,
|
|
64
|
-
|
|
71
|
+
function validateSchemaOrThrow(schema, data, location) {
|
|
72
|
+
const rawErrors = collectSchemaErrors(schema, data);
|
|
73
|
+
if (rawErrors.length > 0) throw new ValidationFailedError(rawErrors.map((e) => createErrorDetail(location, e)));
|
|
65
74
|
return data;
|
|
66
75
|
}
|
|
67
76
|
/**
|
|
@@ -72,13 +81,43 @@ function validateFast(schema, data) {
|
|
|
72
81
|
}
|
|
73
82
|
/**
|
|
74
83
|
* 批量验证所有 Schema(用于请求验证)
|
|
84
|
+
* 失败时抛出 ValidationFailedError(422 + details)
|
|
75
85
|
*/
|
|
76
86
|
function validateAllSchemas(config, data) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
const details = [];
|
|
88
|
+
const checks = [
|
|
89
|
+
[
|
|
90
|
+
"body",
|
|
91
|
+
config.body,
|
|
92
|
+
data.body
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
"query",
|
|
96
|
+
config.query,
|
|
97
|
+
data.query
|
|
98
|
+
],
|
|
99
|
+
[
|
|
100
|
+
"params",
|
|
101
|
+
config.params,
|
|
102
|
+
data.params
|
|
103
|
+
],
|
|
104
|
+
[
|
|
105
|
+
"headers",
|
|
106
|
+
config.headers,
|
|
107
|
+
data.headers
|
|
108
|
+
],
|
|
109
|
+
[
|
|
110
|
+
"cookies",
|
|
111
|
+
config.cookies,
|
|
112
|
+
data.cookies
|
|
113
|
+
]
|
|
114
|
+
];
|
|
115
|
+
for (const [location, schema, value] of checks) {
|
|
116
|
+
if (!schema) continue;
|
|
117
|
+
const rawErrors = collectSchemaErrors(schema, value);
|
|
118
|
+
for (const e of rawErrors) details.push(createErrorDetail(location, e));
|
|
119
|
+
}
|
|
120
|
+
if (details.length > 0) throw new ValidationFailedError(details);
|
|
82
121
|
return data;
|
|
83
122
|
}
|
|
84
123
|
/**
|
|
@@ -109,4 +148,4 @@ function getValidatorCacheStats() {
|
|
|
109
148
|
|
|
110
149
|
//#endregion
|
|
111
150
|
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-
|
|
151
|
+
//# sourceMappingURL=validators-DdEfUzCC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators-DdEfUzCC.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 type { ValueError } from \"@sinclair/typebox/errors\";\nimport {\n createErrorDetail,\n pathToField,\n ValidationFailedError,\n type ErrorDetail,\n type SchemaLocation,\n} from \"./validation-errors\";\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/** 验证错误接口(validateSchema 返回值) */\nexport interface ValidationError {\n path: string;\n field: string;\n message: 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/** 收集单个 schema 的校验错误 */\nfunction collectSchemaErrors(\n schema: TSchema,\n data: unknown,\n): ValueError[] {\n const compiler = getCompiledValidator(schema);\n if (compiler.Check(data)) {\n return [];\n }\n\n return [...compiler.Errors(data)];\n}\n\nfunction valueErrorToValidationError(error: ValueError): ValidationError {\n return {\n path: error.path,\n field: pathToField(error.path),\n message: error.message,\n ...(error.value !== undefined ? { value: error.value } : {}),\n };\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 errors = collectSchemaErrors(schema, data);\n if (errors.length === 0) {\n return { success: true, data: data as Static<T> };\n }\n return { success: false, errors: errors.map(valueErrorToValidationError) };\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: \"\",\n field: \"\",\n message: error instanceof Error ? error.message : \"验证异常\",\n },\n ],\n };\n }\n}\n\n/**\n * 验证 Schema(抛出 ValidationFailedError)\n */\nexport function validateSchemaOrThrow<T extends TSchema>(\n schema: T,\n data: unknown,\n location: SchemaLocation,\n): Static<T> {\n const rawErrors = collectSchemaErrors(schema, data);\n if (rawErrors.length > 0) {\n const details = rawErrors.map((e) => createErrorDetail(location, e));\n throw new ValidationFailedError(details);\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 * 失败时抛出 ValidationFailedError(422 + details)\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 const details: ErrorDetail[] = [];\n\n const checks: Array<[SchemaLocation, TSchema | undefined, unknown]> = [\n [\"body\", config.body, data.body],\n [\"query\", config.query, data.query],\n [\"params\", config.params, data.params],\n [\"headers\", config.headers, data.headers],\n [\"cookies\", config.cookies, data.cookies],\n ];\n\n for (const [location, schema, value] of checks) {\n if (!schema) continue;\n\n const rawErrors = collectSchemaErrors(schema, value);\n for (const e of rawErrors) {\n details.push(createErrorDetail(location, e));\n }\n }\n\n if (details.length > 0) {\n throw new ValidationFailedError(details);\n }\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":";;;;;;;;;;;;;;;;AAkDA,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;;;AAIT,SAAS,oBACP,QACA,MACc;CACd,MAAM,WAAW,qBAAqB,OAAO;AAC7C,KAAI,SAAS,MAAM,KAAK,CACtB,QAAO,EAAE;AAGX,QAAO,CAAC,GAAG,SAAS,OAAO,KAAK,CAAC;;AAGnC,SAAS,4BAA4B,OAAoC;AACvE,QAAO;EACL,MAAM,MAAM;EACZ,OAAO,YAAY,MAAM,KAAK;EAC9B,SAAS,MAAM;EACf,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAC5D;;;;;AAMH,SAAgB,eACd,QACA,MAC6B;AAC7B,KAAI;EACF,MAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,MAAI,OAAO,WAAW,EACpB,QAAO;GAAE,SAAS;GAAY;GAAmB;AAEnD,SAAO;GAAE,SAAS;GAAO,QAAQ,OAAO,IAAI,4BAA4B;GAAE;UACnE,OAAO;AACd,SAAO;GACL,SAAS;GACT,QAAQ,CACN;IACE,MAAM;IACN,OAAO;IACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IACnD,CACF;GACF;;;;;;AAOL,SAAgB,sBACd,QACA,MACA,UACW;CACX,MAAM,YAAY,oBAAoB,QAAQ,KAAK;AACnD,KAAI,UAAU,SAAS,EAErB,OAAM,IAAI,sBADM,UAAU,KAAK,MAAM,kBAAkB,UAAU,EAAE,CAAC,CAC5B;AAG1C,QAAO;;;;;AAMT,SAAgB,aACd,QACA,MACmB;AAEnB,QADiB,qBAAqB,OAAO,CAC7B,MAAM,KAAK;;;;;;AAO7B,SAAgB,mBACd,QACA,MAOa;CACb,MAAM,UAAyB,EAAE;CAEjC,MAAM,SAAgE;EACpE;GAAC;GAAQ,OAAO;GAAM,KAAK;GAAK;EAChC;GAAC;GAAS,OAAO;GAAO,KAAK;GAAM;EACnC;GAAC;GAAU,OAAO;GAAQ,KAAK;GAAO;EACtC;GAAC;GAAW,OAAO;GAAS,KAAK;GAAQ;EACzC;GAAC;GAAW,OAAO;GAAS,KAAK;GAAQ;EAC1C;AAED,MAAK,MAAM,CAAC,UAAU,QAAQ,UAAU,QAAQ;AAC9C,MAAI,CAAC,OAAQ;EAEb,MAAM,YAAY,oBAAoB,QAAQ,MAAM;AACpD,OAAK,MAAM,KAAK,UACd,SAAQ,KAAK,kBAAkB,UAAU,EAAE,CAAC;;AAIhD,KAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,sBAAsB,QAAQ;AAG1C,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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { n as SchemaLocation } from "./validation-errors-BXOr6Rf2.mjs";
|
|
1
2
|
import { Static as Static$1, TSchema as TSchema$1, Type } from "@sinclair/typebox";
|
|
2
3
|
|
|
3
4
|
//#region src/utils/validators/validators.d.ts
|
|
@@ -10,11 +11,11 @@ interface SchemaConfig {
|
|
|
10
11
|
headers?: TSchema$1;
|
|
11
12
|
cookies?: TSchema$1;
|
|
12
13
|
}
|
|
13
|
-
/**
|
|
14
|
+
/** 验证错误接口(validateSchema 返回值) */
|
|
14
15
|
interface ValidationError {
|
|
15
16
|
path: string;
|
|
17
|
+
field: string;
|
|
16
18
|
message: string;
|
|
17
|
-
code: string;
|
|
18
19
|
value?: unknown;
|
|
19
20
|
}
|
|
20
21
|
/** 验证结果 */
|
|
@@ -30,15 +31,16 @@ type ValidationResult<T = unknown> = {
|
|
|
30
31
|
*/
|
|
31
32
|
declare function validateSchema<T extends TSchema$1>(schema: T, data: unknown): ValidationResult<Static$1<T>>;
|
|
32
33
|
/**
|
|
33
|
-
* 验证 Schema
|
|
34
|
+
* 验证 Schema(抛出 ValidationFailedError)
|
|
34
35
|
*/
|
|
35
|
-
declare function validateSchemaOrThrow<T extends TSchema$1>(schema: T, data: unknown,
|
|
36
|
+
declare function validateSchemaOrThrow<T extends TSchema$1>(schema: T, data: unknown, location: SchemaLocation): Static$1<T>;
|
|
36
37
|
/**
|
|
37
38
|
* 快速验证(只返回布尔值)
|
|
38
39
|
*/
|
|
39
40
|
declare function validateFast<T extends TSchema$1>(schema: T, data: unknown): data is Static$1<T>;
|
|
40
41
|
/**
|
|
41
42
|
* 批量验证所有 Schema(用于请求验证)
|
|
43
|
+
* 失败时抛出 ValidationFailedError(422 + details)
|
|
42
44
|
*/
|
|
43
45
|
declare function validateAllSchemas(config: SchemaConfig, data: {
|
|
44
46
|
body: unknown;
|
|
@@ -64,4 +66,4 @@ declare function getValidatorCacheStats(): {
|
|
|
64
66
|
};
|
|
65
67
|
//#endregion
|
|
66
68
|
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-
|
|
69
|
+
//# sourceMappingURL=validators-jkeNFN8V.d.mts.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-Bs9GhJz-.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\n/**\n * 全局 Symbol 标识 VafastError\n *\n * 使用 Symbol.for() 确保跨包共享同一个 Symbol 引用,\n * 彻底解决多包实例 instanceof 失效的问题。\n */\nexport const VAFAST_ERROR_SYMBOL = Symbol.for(\"vafast.error\");\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n /** 全局标识,用于跨包识别 */\n readonly [VAFAST_ERROR_SYMBOL] = true;\n\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/** 检查是否是 VafastError(跨包安全) */\nexport function isVafastError(err: unknown): err is VafastError {\n return (\n err instanceof VafastError ||\n (typeof err === \"object\" &&\n err !== null &&\n (err as any)[VAFAST_ERROR_SYMBOL] === true)\n );\n}\n\n/**\n * 组合中间件链\n *\n * 纯粹的中间件组合,不自动注入任何中间件。\n * 错误处理器由 Server 在适当位置注入,确保洋葱模型正确:\n *\n * ```\n * CORS.before → errorHandler.try → auth → handler\n * ↓ (error)\n * errorHandler.catch → return errorResponse\n * CORS.after (添加 CORS 头) ← errorResponse\n * ```\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\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 < middleware.length) {\n const mw = middleware[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/**\n * 全局错误处理中间件\n *\n * 捕获后续中间件和 handler 抛出的所有错误,转换为标准 JSON 响应。\n * 由 Server 自动注入到全局中间件之后、路由中间件之前。\n */\nexport const errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n // 使用 Symbol.for() 跨包安全识别 VafastError\n if (isVafastError(err)) {\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators-CkfvNBbK.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"}
|
|
File without changes
|
|
File without changes
|