azurajs 3.0.2 → 3.0.4
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 +32 -0
- package/dist/IpResolver-BVgnGnpf.d.mts +5 -0
- package/dist/IpResolver-BVgnGnpf.d.ts +5 -0
- package/dist/SwaggerPlugin-C0UZTjaZ.d.ts +6 -0
- package/dist/SwaggerPlugin-wr9S4SRG.d.mts +6 -0
- package/dist/cookies/index.d.mts +7 -0
- package/dist/cookies/index.d.ts +7 -0
- package/dist/cookies/index.js +38 -0
- package/dist/cookies/index.js.map +1 -0
- package/dist/cookies/index.mjs +35 -0
- package/dist/cookies/index.mjs.map +1 -0
- package/dist/core/index.d.mts +18 -27
- package/dist/core/index.d.ts +18 -27
- package/dist/core/index.js +214 -14
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +214 -14
- package/dist/core/index.mjs.map +1 -1
- package/dist/cors/index.d.mts +7 -0
- package/dist/cors/index.d.ts +7 -0
- package/dist/cors/index.js +52 -0
- package/dist/cors/index.js.map +1 -0
- package/dist/cors/index.mjs +50 -0
- package/dist/cors/index.mjs.map +1 -0
- package/dist/decorators/index.d.mts +2 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.js +25 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/index.mjs +24 -1
- package/dist/decorators/index.mjs.map +1 -1
- package/dist/decorators-B6l3CbxC.d.ts +13 -0
- package/dist/decorators-D5nY109r.d.mts +13 -0
- package/dist/http-error/index.d.mts +18 -0
- package/dist/http-error/index.d.ts +18 -0
- package/dist/http-error/index.js +81 -0
- package/dist/http-error/index.js.map +1 -0
- package/dist/http-error/index.mjs +79 -0
- package/dist/http-error/index.mjs.map +1 -0
- package/dist/index-j6QGMhZU.d.mts +30 -0
- package/dist/index-tpPZS_UK.d.ts +30 -0
- package/dist/index.d.mts +16 -5
- package/dist/index.d.ts +16 -5
- package/dist/index.js +1178 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1176 -15
- package/dist/index.mjs.map +1 -1
- package/dist/infra/index.d.mts +6 -0
- package/dist/infra/index.d.ts +6 -0
- package/dist/infra/index.js +162 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/infra/index.mjs +159 -0
- package/dist/infra/index.mjs.map +1 -0
- package/dist/{Logger-iEQNVVSc.d.mts → logger/index.d.mts} +2 -1
- package/dist/{Logger-iEQNVVSc.d.ts → logger/index.d.ts} +2 -1
- package/dist/logger/index.js +123 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/index.mjs +120 -0
- package/dist/logger/index.mjs.map +1 -0
- package/dist/plugins/index.d.mts +8 -6
- package/dist/plugins/index.d.ts +8 -6
- package/dist/plugins/index.js +1101 -0
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/index.mjs +1101 -1
- package/dist/plugins/index.mjs.map +1 -1
- package/dist/rate-limit/index.d.mts +7 -0
- package/dist/rate-limit/index.d.ts +7 -0
- package/dist/rate-limit/index.js +81 -0
- package/dist/rate-limit/index.js.map +1 -0
- package/dist/rate-limit/index.mjs +79 -0
- package/dist/rate-limit/index.mjs.map +1 -0
- package/dist/router/index.d.mts +4 -0
- package/dist/router/index.d.ts +4 -0
- package/dist/router/index.js +218 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/index.mjs +216 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/routes.type-DZO5VBW2.d.mts +58 -0
- package/dist/routes.type-DzHNkCag.d.ts +58 -0
- package/dist/swagger/index.d.mts +30 -0
- package/dist/swagger/index.d.ts +30 -0
- package/dist/swagger/index.js +1136 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/swagger/index.mjs +1126 -0
- package/dist/swagger/index.mjs.map +1 -0
- package/dist/swagger/swagger-ui-modern.html +894 -0
- package/dist/swagger.type-Bfn5nGR8.d.mts +42 -0
- package/dist/swagger.type-CfDbFCZC.d.ts +42 -0
- package/dist/types/index.d.mts +5 -58
- package/dist/types/index.d.ts +5 -58
- package/dist/utils/index.d.mts +7 -72
- package/dist/utils/index.d.ts +7 -72
- package/dist/validators/index.d.mts +48 -0
- package/dist/validators/index.d.ts +48 -0
- package/dist/validators/index.js +144 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/index.mjs +141 -0
- package/dist/validators/index.mjs.map +1 -0
- package/package.json +86 -2
- package/src/cookies/index.ts +1 -0
- package/src/core/index.ts +1 -0
- package/src/core/router.ts +26 -15
- package/src/core/server.ts +64 -14
- package/src/cors/index.ts +2 -0
- package/src/decorators/index.ts +2 -0
- package/src/http-error/index.ts +1 -0
- package/src/infra/index.ts +3 -0
- package/src/logger/index.ts +1 -0
- package/src/plugins/SwaggerPlugin.ts +45 -0
- package/src/plugins/index.ts +1 -0
- package/src/rate-limit/index.ts +2 -0
- package/src/router/index.ts +1 -0
- package/src/swagger/constants.ts +8 -0
- package/src/swagger/decorators.ts +35 -0
- package/src/swagger/index.ts +10 -0
- package/src/swagger/openapi-builder.ts +199 -0
- package/src/swagger/swagger-ui-html.ts +24 -0
- package/src/swagger/swagger-ui-modern.html +894 -0
- package/src/swagger/swagger-ui-template.ts +5 -0
- package/src/types/index.ts +7 -0
- package/src/types/swagger.type.ts +36 -0
- package/src/validators/index.ts +4 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { a as RouteDocument } from './index-j6QGMhZU.mjs';
|
|
2
|
+
|
|
3
|
+
interface OpenApiInfo {
|
|
4
|
+
title: string;
|
|
5
|
+
version: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
contact?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
};
|
|
12
|
+
license?: {
|
|
13
|
+
name: string;
|
|
14
|
+
url?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
interface OpenApiServer {
|
|
18
|
+
url: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}
|
|
21
|
+
interface BuildOpenApiOptions {
|
|
22
|
+
/** Se omitido, usa título e versão genéricos. */
|
|
23
|
+
info?: OpenApiInfo;
|
|
24
|
+
servers?: OpenApiServer[];
|
|
25
|
+
/** Prefixo global (ex.: /api/v1) aplicado a todos os paths do documento */
|
|
26
|
+
pathPrefix?: string;
|
|
27
|
+
}
|
|
28
|
+
interface SwaggerPluginOptions extends BuildOpenApiOptions {
|
|
29
|
+
/**
|
|
30
|
+
* Fonte de rotas — normalmente `() => app.getRouteDocuments()`.
|
|
31
|
+
* Avaliado em cada pedido ao JSON para refletir rotas novas.
|
|
32
|
+
*/
|
|
33
|
+
getDocuments: () => RouteDocument[];
|
|
34
|
+
/** Caminho do OpenAPI JSON (default `/openapi.json`) */
|
|
35
|
+
specPath?: string;
|
|
36
|
+
/** Caminho da UI Swagger (default `/docs`) */
|
|
37
|
+
docsPath?: string;
|
|
38
|
+
/** Incluir barra de pesquisa e deep-linking */
|
|
39
|
+
deepLinking?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type { BuildOpenApiOptions as B, OpenApiInfo as O, SwaggerPluginOptions as S, OpenApiServer as a };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { a as RouteDocument } from './index-tpPZS_UK.js';
|
|
2
|
+
|
|
3
|
+
interface OpenApiInfo {
|
|
4
|
+
title: string;
|
|
5
|
+
version: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
contact?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
};
|
|
12
|
+
license?: {
|
|
13
|
+
name: string;
|
|
14
|
+
url?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
interface OpenApiServer {
|
|
18
|
+
url: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}
|
|
21
|
+
interface BuildOpenApiOptions {
|
|
22
|
+
/** Se omitido, usa título e versão genéricos. */
|
|
23
|
+
info?: OpenApiInfo;
|
|
24
|
+
servers?: OpenApiServer[];
|
|
25
|
+
/** Prefixo global (ex.: /api/v1) aplicado a todos os paths do documento */
|
|
26
|
+
pathPrefix?: string;
|
|
27
|
+
}
|
|
28
|
+
interface SwaggerPluginOptions extends BuildOpenApiOptions {
|
|
29
|
+
/**
|
|
30
|
+
* Fonte de rotas — normalmente `() => app.getRouteDocuments()`.
|
|
31
|
+
* Avaliado em cada pedido ao JSON para refletir rotas novas.
|
|
32
|
+
*/
|
|
33
|
+
getDocuments: () => RouteDocument[];
|
|
34
|
+
/** Caminho do OpenAPI JSON (default `/openapi.json`) */
|
|
35
|
+
specPath?: string;
|
|
36
|
+
/** Caminho da UI Swagger (default `/docs`) */
|
|
37
|
+
docsPath?: string;
|
|
38
|
+
/** Incluir barra de pesquisa e deep-linking */
|
|
39
|
+
deepLinking?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type { BuildOpenApiOptions as B, OpenApiInfo as O, SwaggerPluginOptions as S, OpenApiServer as a };
|
package/dist/types/index.d.mts
CHANGED
|
@@ -1,63 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
export { A as AzuraRequest, a as AzuraResponse, C as CookieOptions, E as ErrorHandler, H as HttpMethod, M as MiddlewareHandler, N as NextFunction, R as RouteHandler, b as RouteMatch } from '../common.type-BhGCNyEm.mjs';
|
|
2
|
+
export { C as ControllerMetadata, P as ParamMetadata, a as ParamType, b as ParameterMeta, R as ResponseMeta, c as RouteDefinition, d as RouteMeta, e as RouteMetadata } from '../routes.type-DZO5VBW2.mjs';
|
|
3
3
|
export { A as AzuraConfig, L as LoggingConfig, P as PluginsConfig, S as ServerConfig } from '../config.type-4K-xcMSy.mjs';
|
|
4
4
|
export { C as CORSOptions, a as CircuitBreakerOptions, b as CircuitBreakerState, c as CompressionOptions, E as ETagOptions, H as HealthCheckOptions, d as HelmetOptions, J as JWTOptions, M as MultipartOptions, P as PluginContext, e as PluginDefinition, f as PluginFactory, g as PluginHandler, h as ProxyOptions, R as RateLimitOptions, i as RequestIdOptions, S as SSEOptions, j as SessionOptions, k as StaticOptions, T as TimeoutOptions } from '../plugin.type-BNooWhKa.mjs';
|
|
5
|
+
export { B as BuildOpenApiOptions, O as OpenApiInfo, a as OpenApiServer, S as SwaggerPluginOptions } from '../swagger.type-Bfn5nGR8.mjs';
|
|
5
6
|
import 'node:http';
|
|
6
|
-
|
|
7
|
-
interface RouteDefinition {
|
|
8
|
-
method: HttpMethod;
|
|
9
|
-
path: string;
|
|
10
|
-
handler: RouteHandler;
|
|
11
|
-
middlewares?: MiddlewareHandler[];
|
|
12
|
-
meta?: RouteMeta;
|
|
13
|
-
}
|
|
14
|
-
interface RouteMeta {
|
|
15
|
-
summary?: string;
|
|
16
|
-
description?: string;
|
|
17
|
-
tags?: string[];
|
|
18
|
-
deprecated?: boolean;
|
|
19
|
-
produces?: string[];
|
|
20
|
-
consumes?: string[];
|
|
21
|
-
parameters?: ParameterMeta[];
|
|
22
|
-
responses?: Record<number, ResponseMeta>;
|
|
23
|
-
security?: Record<string, string[]>[];
|
|
24
|
-
}
|
|
25
|
-
interface ParameterMeta {
|
|
26
|
-
name: string;
|
|
27
|
-
in: "path" | "query" | "header" | "body";
|
|
28
|
-
required?: boolean;
|
|
29
|
-
type?: string;
|
|
30
|
-
description?: string;
|
|
31
|
-
schema?: any;
|
|
32
|
-
}
|
|
33
|
-
interface ResponseMeta {
|
|
34
|
-
description: string;
|
|
35
|
-
schema?: any;
|
|
36
|
-
headers?: Record<string, {
|
|
37
|
-
type: string;
|
|
38
|
-
description: string;
|
|
39
|
-
}>;
|
|
40
|
-
}
|
|
41
|
-
type ParamType = "body" | "query" | "param" | "header" | "cookie" | "req" | "res" | "next" | "ip" | "session";
|
|
42
|
-
interface ParamMetadata {
|
|
43
|
-
index: number;
|
|
44
|
-
type: ParamType;
|
|
45
|
-
name?: string;
|
|
46
|
-
pipes?: ((value: any) => any)[];
|
|
47
|
-
}
|
|
48
|
-
interface ControllerMetadata {
|
|
49
|
-
prefix: string;
|
|
50
|
-
middlewares: MiddlewareHandler[];
|
|
51
|
-
routes: Map<string, RouteMetadata>;
|
|
52
|
-
}
|
|
53
|
-
interface RouteMetadata {
|
|
54
|
-
method: HttpMethod;
|
|
55
|
-
path: string;
|
|
56
|
-
propertyKey: string;
|
|
57
|
-
middlewares: MiddlewareHandler[];
|
|
58
|
-
params: ParamMetadata[];
|
|
59
|
-
meta?: RouteMeta;
|
|
60
|
-
}
|
|
7
|
+
import '../index-j6QGMhZU.mjs';
|
|
61
8
|
|
|
62
9
|
declare const HttpStatus: {
|
|
63
10
|
readonly OK: 200;
|
|
@@ -85,4 +32,4 @@ declare const HttpStatus: {
|
|
|
85
32
|
type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];
|
|
86
33
|
declare const HttpStatusText: Record<number, string>;
|
|
87
34
|
|
|
88
|
-
export {
|
|
35
|
+
export { HttpStatus, type HttpStatusCode, HttpStatusText };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,63 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
export { A as AzuraRequest, a as AzuraResponse, C as CookieOptions, E as ErrorHandler, H as HttpMethod, M as MiddlewareHandler, N as NextFunction, R as RouteHandler, b as RouteMatch } from '../common.type-BhGCNyEm.js';
|
|
2
|
+
export { C as ControllerMetadata, P as ParamMetadata, a as ParamType, b as ParameterMeta, R as ResponseMeta, c as RouteDefinition, d as RouteMeta, e as RouteMetadata } from '../routes.type-DzHNkCag.js';
|
|
3
3
|
export { A as AzuraConfig, L as LoggingConfig, P as PluginsConfig, S as ServerConfig } from '../config.type-s3ImgfM_.js';
|
|
4
4
|
export { C as CORSOptions, a as CircuitBreakerOptions, b as CircuitBreakerState, c as CompressionOptions, E as ETagOptions, H as HealthCheckOptions, d as HelmetOptions, J as JWTOptions, M as MultipartOptions, P as PluginContext, e as PluginDefinition, f as PluginFactory, g as PluginHandler, h as ProxyOptions, R as RateLimitOptions, i as RequestIdOptions, S as SSEOptions, j as SessionOptions, k as StaticOptions, T as TimeoutOptions } from '../plugin.type-D4HHceYz.js';
|
|
5
|
+
export { B as BuildOpenApiOptions, O as OpenApiInfo, a as OpenApiServer, S as SwaggerPluginOptions } from '../swagger.type-CfDbFCZC.js';
|
|
5
6
|
import 'node:http';
|
|
6
|
-
|
|
7
|
-
interface RouteDefinition {
|
|
8
|
-
method: HttpMethod;
|
|
9
|
-
path: string;
|
|
10
|
-
handler: RouteHandler;
|
|
11
|
-
middlewares?: MiddlewareHandler[];
|
|
12
|
-
meta?: RouteMeta;
|
|
13
|
-
}
|
|
14
|
-
interface RouteMeta {
|
|
15
|
-
summary?: string;
|
|
16
|
-
description?: string;
|
|
17
|
-
tags?: string[];
|
|
18
|
-
deprecated?: boolean;
|
|
19
|
-
produces?: string[];
|
|
20
|
-
consumes?: string[];
|
|
21
|
-
parameters?: ParameterMeta[];
|
|
22
|
-
responses?: Record<number, ResponseMeta>;
|
|
23
|
-
security?: Record<string, string[]>[];
|
|
24
|
-
}
|
|
25
|
-
interface ParameterMeta {
|
|
26
|
-
name: string;
|
|
27
|
-
in: "path" | "query" | "header" | "body";
|
|
28
|
-
required?: boolean;
|
|
29
|
-
type?: string;
|
|
30
|
-
description?: string;
|
|
31
|
-
schema?: any;
|
|
32
|
-
}
|
|
33
|
-
interface ResponseMeta {
|
|
34
|
-
description: string;
|
|
35
|
-
schema?: any;
|
|
36
|
-
headers?: Record<string, {
|
|
37
|
-
type: string;
|
|
38
|
-
description: string;
|
|
39
|
-
}>;
|
|
40
|
-
}
|
|
41
|
-
type ParamType = "body" | "query" | "param" | "header" | "cookie" | "req" | "res" | "next" | "ip" | "session";
|
|
42
|
-
interface ParamMetadata {
|
|
43
|
-
index: number;
|
|
44
|
-
type: ParamType;
|
|
45
|
-
name?: string;
|
|
46
|
-
pipes?: ((value: any) => any)[];
|
|
47
|
-
}
|
|
48
|
-
interface ControllerMetadata {
|
|
49
|
-
prefix: string;
|
|
50
|
-
middlewares: MiddlewareHandler[];
|
|
51
|
-
routes: Map<string, RouteMetadata>;
|
|
52
|
-
}
|
|
53
|
-
interface RouteMetadata {
|
|
54
|
-
method: HttpMethod;
|
|
55
|
-
path: string;
|
|
56
|
-
propertyKey: string;
|
|
57
|
-
middlewares: MiddlewareHandler[];
|
|
58
|
-
params: ParamMetadata[];
|
|
59
|
-
meta?: RouteMeta;
|
|
60
|
-
}
|
|
7
|
+
import '../index-tpPZS_UK.js';
|
|
61
8
|
|
|
62
9
|
declare const HttpStatus: {
|
|
63
10
|
readonly OK: 200;
|
|
@@ -85,4 +32,4 @@ declare const HttpStatus: {
|
|
|
85
32
|
type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];
|
|
86
33
|
declare const HttpStatusText: Record<number, string>;
|
|
87
34
|
|
|
88
|
-
export {
|
|
35
|
+
export { HttpStatus, type HttpStatusCode, HttpStatusText };
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -1,25 +1,10 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { Logger } from '../logger/index.mjs';
|
|
2
|
+
export { HttpError } from '../http-error/index.mjs';
|
|
3
|
+
export { r as resolveIp } from '../IpResolver-BVgnGnpf.mjs';
|
|
2
4
|
import { IncomingMessage } from 'node:http';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly statusCode: number;
|
|
7
|
-
readonly details?: any;
|
|
8
|
-
readonly isOperational: boolean;
|
|
9
|
-
constructor(statusCode: number, message?: string, details?: any);
|
|
10
|
-
toJSON(): Record<string, any>;
|
|
11
|
-
static badRequest(message?: string, details?: any): HttpError;
|
|
12
|
-
static unauthorized(message?: string): HttpError;
|
|
13
|
-
static forbidden(message?: string): HttpError;
|
|
14
|
-
static notFound(message?: string): HttpError;
|
|
15
|
-
static methodNotAllowed(message?: string): HttpError;
|
|
16
|
-
static conflict(message?: string, details?: any): HttpError;
|
|
17
|
-
static unprocessableEntity(message?: string, details?: any): HttpError;
|
|
18
|
-
static tooManyRequests(message?: string): HttpError;
|
|
19
|
-
static internal(message?: string): HttpError;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
declare function resolveIp(req: IncomingMessage): string;
|
|
5
|
+
export { clearCookieHeader, serializeCookie } from '../cookies/index.mjs';
|
|
6
|
+
export { DTOValidator, ExternalSchema, Schema, SchemaValidationResult, SchemaValidator, ValidationError, ValidationResult } from '../validators/index.mjs';
|
|
7
|
+
import '../common.type-BhGCNyEm.mjs';
|
|
23
8
|
|
|
24
9
|
declare function parseQueryString(qs: string): Record<string, string | string[]>;
|
|
25
10
|
declare function parseCookies(header: string | undefined): Record<string, string>;
|
|
@@ -29,54 +14,4 @@ declare function parseUrl(url: string): {
|
|
|
29
14
|
search: string;
|
|
30
15
|
};
|
|
31
16
|
|
|
32
|
-
|
|
33
|
-
declare function clearCookieHeader(name: string, options?: CookieOptions): string;
|
|
34
|
-
|
|
35
|
-
interface ValidationError {
|
|
36
|
-
field: string;
|
|
37
|
-
message: string;
|
|
38
|
-
value?: any;
|
|
39
|
-
}
|
|
40
|
-
interface ValidationResult {
|
|
41
|
-
valid: boolean;
|
|
42
|
-
errors: ValidationError[];
|
|
43
|
-
data?: any;
|
|
44
|
-
}
|
|
45
|
-
type RuleType = "string" | "number" | "boolean" | "object" | "array";
|
|
46
|
-
interface FieldRule {
|
|
47
|
-
type?: RuleType;
|
|
48
|
-
required?: boolean;
|
|
49
|
-
min?: number;
|
|
50
|
-
max?: number;
|
|
51
|
-
pattern?: RegExp;
|
|
52
|
-
enum?: any[];
|
|
53
|
-
custom?: (value: any) => string | null;
|
|
54
|
-
message?: string;
|
|
55
|
-
}
|
|
56
|
-
type Schema = Record<string, FieldRule>;
|
|
57
|
-
declare class DTOValidator {
|
|
58
|
-
static validate(data: any, schema: Schema): ValidationResult;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
interface ExternalSchema {
|
|
62
|
-
parse?: (data: any) => any;
|
|
63
|
-
safeParse?: (data: any) => {
|
|
64
|
-
success: boolean;
|
|
65
|
-
data?: any;
|
|
66
|
-
error?: any;
|
|
67
|
-
};
|
|
68
|
-
validate?: (data: any) => {
|
|
69
|
-
value?: any;
|
|
70
|
-
error?: any;
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
interface SchemaValidationResult {
|
|
74
|
-
valid: boolean;
|
|
75
|
-
data?: any;
|
|
76
|
-
errors?: any;
|
|
77
|
-
}
|
|
78
|
-
declare class SchemaValidator {
|
|
79
|
-
static validate(data: any, schema: ExternalSchema): SchemaValidationResult;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export { DTOValidator, type ExternalSchema, HttpError, type Schema, type SchemaValidationResult, SchemaValidator, type ValidationError, type ValidationResult, clearCookieHeader, parseBody, parseCookies, parseQueryString, parseUrl, resolveIp, serializeCookie };
|
|
17
|
+
export { parseBody, parseCookies, parseQueryString, parseUrl };
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,25 +1,10 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { Logger } from '../logger/index.js';
|
|
2
|
+
export { HttpError } from '../http-error/index.js';
|
|
3
|
+
export { r as resolveIp } from '../IpResolver-BVgnGnpf.js';
|
|
2
4
|
import { IncomingMessage } from 'node:http';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly statusCode: number;
|
|
7
|
-
readonly details?: any;
|
|
8
|
-
readonly isOperational: boolean;
|
|
9
|
-
constructor(statusCode: number, message?: string, details?: any);
|
|
10
|
-
toJSON(): Record<string, any>;
|
|
11
|
-
static badRequest(message?: string, details?: any): HttpError;
|
|
12
|
-
static unauthorized(message?: string): HttpError;
|
|
13
|
-
static forbidden(message?: string): HttpError;
|
|
14
|
-
static notFound(message?: string): HttpError;
|
|
15
|
-
static methodNotAllowed(message?: string): HttpError;
|
|
16
|
-
static conflict(message?: string, details?: any): HttpError;
|
|
17
|
-
static unprocessableEntity(message?: string, details?: any): HttpError;
|
|
18
|
-
static tooManyRequests(message?: string): HttpError;
|
|
19
|
-
static internal(message?: string): HttpError;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
declare function resolveIp(req: IncomingMessage): string;
|
|
5
|
+
export { clearCookieHeader, serializeCookie } from '../cookies/index.js';
|
|
6
|
+
export { DTOValidator, ExternalSchema, Schema, SchemaValidationResult, SchemaValidator, ValidationError, ValidationResult } from '../validators/index.js';
|
|
7
|
+
import '../common.type-BhGCNyEm.js';
|
|
23
8
|
|
|
24
9
|
declare function parseQueryString(qs: string): Record<string, string | string[]>;
|
|
25
10
|
declare function parseCookies(header: string | undefined): Record<string, string>;
|
|
@@ -29,54 +14,4 @@ declare function parseUrl(url: string): {
|
|
|
29
14
|
search: string;
|
|
30
15
|
};
|
|
31
16
|
|
|
32
|
-
|
|
33
|
-
declare function clearCookieHeader(name: string, options?: CookieOptions): string;
|
|
34
|
-
|
|
35
|
-
interface ValidationError {
|
|
36
|
-
field: string;
|
|
37
|
-
message: string;
|
|
38
|
-
value?: any;
|
|
39
|
-
}
|
|
40
|
-
interface ValidationResult {
|
|
41
|
-
valid: boolean;
|
|
42
|
-
errors: ValidationError[];
|
|
43
|
-
data?: any;
|
|
44
|
-
}
|
|
45
|
-
type RuleType = "string" | "number" | "boolean" | "object" | "array";
|
|
46
|
-
interface FieldRule {
|
|
47
|
-
type?: RuleType;
|
|
48
|
-
required?: boolean;
|
|
49
|
-
min?: number;
|
|
50
|
-
max?: number;
|
|
51
|
-
pattern?: RegExp;
|
|
52
|
-
enum?: any[];
|
|
53
|
-
custom?: (value: any) => string | null;
|
|
54
|
-
message?: string;
|
|
55
|
-
}
|
|
56
|
-
type Schema = Record<string, FieldRule>;
|
|
57
|
-
declare class DTOValidator {
|
|
58
|
-
static validate(data: any, schema: Schema): ValidationResult;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
interface ExternalSchema {
|
|
62
|
-
parse?: (data: any) => any;
|
|
63
|
-
safeParse?: (data: any) => {
|
|
64
|
-
success: boolean;
|
|
65
|
-
data?: any;
|
|
66
|
-
error?: any;
|
|
67
|
-
};
|
|
68
|
-
validate?: (data: any) => {
|
|
69
|
-
value?: any;
|
|
70
|
-
error?: any;
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
interface SchemaValidationResult {
|
|
74
|
-
valid: boolean;
|
|
75
|
-
data?: any;
|
|
76
|
-
errors?: any;
|
|
77
|
-
}
|
|
78
|
-
declare class SchemaValidator {
|
|
79
|
-
static validate(data: any, schema: ExternalSchema): SchemaValidationResult;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export { DTOValidator, type ExternalSchema, HttpError, type Schema, type SchemaValidationResult, SchemaValidator, type ValidationError, type ValidationResult, clearCookieHeader, parseBody, parseCookies, parseQueryString, parseUrl, resolveIp, serializeCookie };
|
|
17
|
+
export { parseBody, parseCookies, parseQueryString, parseUrl };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
interface ValidationError {
|
|
2
|
+
field: string;
|
|
3
|
+
message: string;
|
|
4
|
+
value?: any;
|
|
5
|
+
}
|
|
6
|
+
interface ValidationResult {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
errors: ValidationError[];
|
|
9
|
+
data?: any;
|
|
10
|
+
}
|
|
11
|
+
type RuleType = "string" | "number" | "boolean" | "object" | "array";
|
|
12
|
+
interface FieldRule {
|
|
13
|
+
type?: RuleType;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
min?: number;
|
|
16
|
+
max?: number;
|
|
17
|
+
pattern?: RegExp;
|
|
18
|
+
enum?: any[];
|
|
19
|
+
custom?: (value: any) => string | null;
|
|
20
|
+
message?: string;
|
|
21
|
+
}
|
|
22
|
+
type Schema = Record<string, FieldRule>;
|
|
23
|
+
declare class DTOValidator {
|
|
24
|
+
static validate(data: any, schema: Schema): ValidationResult;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface ExternalSchema {
|
|
28
|
+
parse?: (data: any) => any;
|
|
29
|
+
safeParse?: (data: any) => {
|
|
30
|
+
success: boolean;
|
|
31
|
+
data?: any;
|
|
32
|
+
error?: any;
|
|
33
|
+
};
|
|
34
|
+
validate?: (data: any) => {
|
|
35
|
+
value?: any;
|
|
36
|
+
error?: any;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
interface SchemaValidationResult {
|
|
40
|
+
valid: boolean;
|
|
41
|
+
data?: any;
|
|
42
|
+
errors?: any;
|
|
43
|
+
}
|
|
44
|
+
declare class SchemaValidator {
|
|
45
|
+
static validate(data: any, schema: ExternalSchema): SchemaValidationResult;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { DTOValidator, type ExternalSchema, type Schema, type SchemaValidationResult, SchemaValidator, type ValidationError, type ValidationResult };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
interface ValidationError {
|
|
2
|
+
field: string;
|
|
3
|
+
message: string;
|
|
4
|
+
value?: any;
|
|
5
|
+
}
|
|
6
|
+
interface ValidationResult {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
errors: ValidationError[];
|
|
9
|
+
data?: any;
|
|
10
|
+
}
|
|
11
|
+
type RuleType = "string" | "number" | "boolean" | "object" | "array";
|
|
12
|
+
interface FieldRule {
|
|
13
|
+
type?: RuleType;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
min?: number;
|
|
16
|
+
max?: number;
|
|
17
|
+
pattern?: RegExp;
|
|
18
|
+
enum?: any[];
|
|
19
|
+
custom?: (value: any) => string | null;
|
|
20
|
+
message?: string;
|
|
21
|
+
}
|
|
22
|
+
type Schema = Record<string, FieldRule>;
|
|
23
|
+
declare class DTOValidator {
|
|
24
|
+
static validate(data: any, schema: Schema): ValidationResult;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface ExternalSchema {
|
|
28
|
+
parse?: (data: any) => any;
|
|
29
|
+
safeParse?: (data: any) => {
|
|
30
|
+
success: boolean;
|
|
31
|
+
data?: any;
|
|
32
|
+
error?: any;
|
|
33
|
+
};
|
|
34
|
+
validate?: (data: any) => {
|
|
35
|
+
value?: any;
|
|
36
|
+
error?: any;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
interface SchemaValidationResult {
|
|
40
|
+
valid: boolean;
|
|
41
|
+
data?: any;
|
|
42
|
+
errors?: any;
|
|
43
|
+
}
|
|
44
|
+
declare class SchemaValidator {
|
|
45
|
+
static validate(data: any, schema: ExternalSchema): SchemaValidationResult;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { DTOValidator, type ExternalSchema, type Schema, type SchemaValidationResult, SchemaValidator, type ValidationError, type ValidationResult };
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/utils/validators/DTOValidator.ts
|
|
4
|
+
var DTOValidator = class {
|
|
5
|
+
static validate(data, schema) {
|
|
6
|
+
const errors = [];
|
|
7
|
+
if (data == null || typeof data !== "object") {
|
|
8
|
+
return {
|
|
9
|
+
valid: false,
|
|
10
|
+
errors: [{ field: "_root", message: "Request body must be an object" }]
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
for (const [field, rule] of Object.entries(schema)) {
|
|
14
|
+
const value = data[field];
|
|
15
|
+
if (rule.required && (value === void 0 || value === null || value === "")) {
|
|
16
|
+
errors.push({
|
|
17
|
+
field,
|
|
18
|
+
message: rule.message ?? `${field} is required`,
|
|
19
|
+
value
|
|
20
|
+
});
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (value === void 0 || value === null) continue;
|
|
24
|
+
if (rule.type) {
|
|
25
|
+
const actualType = Array.isArray(value) ? "array" : typeof value;
|
|
26
|
+
if (actualType !== rule.type) {
|
|
27
|
+
errors.push({
|
|
28
|
+
field,
|
|
29
|
+
message: rule.message ?? `${field} must be of type ${rule.type}`,
|
|
30
|
+
value
|
|
31
|
+
});
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (rule.type === "string" || typeof value === "string") {
|
|
36
|
+
if (rule.min !== void 0 && value.length < rule.min) {
|
|
37
|
+
errors.push({
|
|
38
|
+
field,
|
|
39
|
+
message: rule.message ?? `${field} must be at least ${rule.min} characters`,
|
|
40
|
+
value
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (rule.max !== void 0 && value.length > rule.max) {
|
|
44
|
+
errors.push({
|
|
45
|
+
field,
|
|
46
|
+
message: rule.message ?? `${field} must be at most ${rule.max} characters`,
|
|
47
|
+
value
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (rule.pattern && !rule.pattern.test(value)) {
|
|
51
|
+
errors.push({
|
|
52
|
+
field,
|
|
53
|
+
message: rule.message ?? `${field} has invalid format`,
|
|
54
|
+
value
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (rule.type === "number" || typeof value === "number") {
|
|
59
|
+
if (rule.min !== void 0 && value < rule.min) {
|
|
60
|
+
errors.push({
|
|
61
|
+
field,
|
|
62
|
+
message: rule.message ?? `${field} must be at least ${rule.min}`,
|
|
63
|
+
value
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (rule.max !== void 0 && value > rule.max) {
|
|
67
|
+
errors.push({
|
|
68
|
+
field,
|
|
69
|
+
message: rule.message ?? `${field} must be at most ${rule.max}`,
|
|
70
|
+
value
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (rule.type === "array" && Array.isArray(value)) {
|
|
75
|
+
if (rule.min !== void 0 && value.length < rule.min) {
|
|
76
|
+
errors.push({
|
|
77
|
+
field,
|
|
78
|
+
message: rule.message ?? `${field} must have at least ${rule.min} items`,
|
|
79
|
+
value
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (rule.max !== void 0 && value.length > rule.max) {
|
|
83
|
+
errors.push({
|
|
84
|
+
field,
|
|
85
|
+
message: rule.message ?? `${field} must have at most ${rule.max} items`,
|
|
86
|
+
value
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (rule.enum && !rule.enum.includes(value)) {
|
|
91
|
+
errors.push({
|
|
92
|
+
field,
|
|
93
|
+
message: rule.message ?? `${field} must be one of: ${rule.enum.join(", ")}`,
|
|
94
|
+
value
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (rule.custom) {
|
|
98
|
+
const customError = rule.custom(value);
|
|
99
|
+
if (customError) {
|
|
100
|
+
errors.push({ field, message: customError, value });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
valid: errors.length === 0,
|
|
106
|
+
errors,
|
|
107
|
+
data: errors.length === 0 ? data : void 0
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/utils/validators/SchemaValidator.ts
|
|
113
|
+
var SchemaValidator = class {
|
|
114
|
+
static validate(data, schema) {
|
|
115
|
+
if (typeof schema.safeParse === "function") {
|
|
116
|
+
const result = schema.safeParse(data);
|
|
117
|
+
if (result.success) {
|
|
118
|
+
return { valid: true, data: result.data };
|
|
119
|
+
}
|
|
120
|
+
return { valid: false, errors: result.error };
|
|
121
|
+
}
|
|
122
|
+
if (typeof schema.parse === "function") {
|
|
123
|
+
try {
|
|
124
|
+
const parsed = schema.parse(data);
|
|
125
|
+
return { valid: true, data: parsed };
|
|
126
|
+
} catch (err) {
|
|
127
|
+
return { valid: false, errors: err };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (typeof schema.validate === "function") {
|
|
131
|
+
const result = schema.validate(data);
|
|
132
|
+
if (result.error) {
|
|
133
|
+
return { valid: false, errors: result.error };
|
|
134
|
+
}
|
|
135
|
+
return { valid: true, data: result.value };
|
|
136
|
+
}
|
|
137
|
+
return { valid: true, data };
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
exports.DTOValidator = DTOValidator;
|
|
142
|
+
exports.SchemaValidator = SchemaValidator;
|
|
143
|
+
//# sourceMappingURL=index.js.map
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/validators/DTOValidator.ts","../../src/utils/validators/SchemaValidator.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export interface ValidationError {\r\n field: string;\r\n message: string;\r\n value?: any;\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n data?: any;\r\n}\r\n\r\ntype RuleType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\r\n\r\ninterface FieldRule {\r\n type?: RuleType;\r\n required?: boolean;\r\n min?: number;\r\n max?: number;\r\n pattern?: RegExp;\r\n enum?: any[];\r\n custom?: (value: any) => string | null;\r\n message?: string;\r\n}\r\n\r\nexport type Schema = Record<string, FieldRule>;\r\n\r\nexport class DTOValidator {\r\n static validate(data: any, schema: Schema): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n\r\n if (data == null || typeof data !== \"object\") {\r\n return {\r\n valid: false,\r\n errors: [{ field: \"_root\", message: \"Request body must be an object\" }],\r\n };\r\n }\r\n\r\n for (const [field, rule] of Object.entries(schema)) {\r\n const value = data[field];\r\n\r\n if (rule.required && (value === undefined || value === null || value === \"\")) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} is required`,\r\n value,\r\n });\r\n continue;\r\n }\r\n\r\n if (value === undefined || value === null) continue;\r\n\r\n if (rule.type) {\r\n const actualType = Array.isArray(value) ? \"array\" : typeof value;\r\n if (actualType !== rule.type) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be of type ${rule.type}`,\r\n value,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n if (rule.type === \"string\" || typeof value === \"string\") {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} has invalid format`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"number\" || typeof value === \"number\") {\r\n if (rule.min !== undefined && value < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min}`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max}`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"array\" && Array.isArray(value)) {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at least ${rule.min} items`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at most ${rule.max} items`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.enum && !rule.enum.includes(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be one of: ${rule.enum.join(\", \")}`,\r\n value,\r\n });\r\n }\r\n\r\n if (rule.custom) {\r\n const customError = rule.custom(value);\r\n if (customError) {\r\n errors.push({ field, message: customError, value });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n data: errors.length === 0 ? data : undefined,\r\n };\r\n }\r\n}\r\n","export interface ExternalSchema {\r\n parse?: (data: any) => any;\r\n safeParse?: (data: any) => { success: boolean; data?: any; error?: any };\r\n validate?: (data: any) => { value?: any; error?: any };\r\n}\r\n\r\nexport interface SchemaValidationResult {\r\n valid: boolean;\r\n data?: any;\r\n errors?: any;\r\n}\r\n\r\nexport class SchemaValidator {\r\n static validate(data: any, schema: ExternalSchema): SchemaValidationResult {\r\n // Zod-style schema\r\n if (typeof schema.safeParse === \"function\") {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { valid: true, data: result.data };\r\n }\r\n return { valid: false, errors: result.error };\r\n }\r\n\r\n // Zod parse (throws on error)\r\n if (typeof schema.parse === \"function\") {\r\n try {\r\n const parsed = schema.parse(data);\r\n return { valid: true, data: parsed };\r\n } catch (err) {\r\n return { valid: false, errors: err };\r\n }\r\n }\r\n\r\n // Joi-style schema\r\n if (typeof schema.validate === \"function\") {\r\n const result = schema.validate(data);\r\n if (result.error) {\r\n return { valid: false, errors: result.error };\r\n }\r\n return { valid: true, data: result.value };\r\n }\r\n\r\n return { valid: true, data };\r\n }\r\n}\r\n"]}
|