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.
Files changed (120) hide show
  1. package/README.md +32 -0
  2. package/dist/IpResolver-BVgnGnpf.d.mts +5 -0
  3. package/dist/IpResolver-BVgnGnpf.d.ts +5 -0
  4. package/dist/SwaggerPlugin-C0UZTjaZ.d.ts +6 -0
  5. package/dist/SwaggerPlugin-wr9S4SRG.d.mts +6 -0
  6. package/dist/cookies/index.d.mts +7 -0
  7. package/dist/cookies/index.d.ts +7 -0
  8. package/dist/cookies/index.js +38 -0
  9. package/dist/cookies/index.js.map +1 -0
  10. package/dist/cookies/index.mjs +35 -0
  11. package/dist/cookies/index.mjs.map +1 -0
  12. package/dist/core/index.d.mts +18 -27
  13. package/dist/core/index.d.ts +18 -27
  14. package/dist/core/index.js +214 -14
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/core/index.mjs +214 -14
  17. package/dist/core/index.mjs.map +1 -1
  18. package/dist/cors/index.d.mts +7 -0
  19. package/dist/cors/index.d.ts +7 -0
  20. package/dist/cors/index.js +52 -0
  21. package/dist/cors/index.js.map +1 -0
  22. package/dist/cors/index.mjs +50 -0
  23. package/dist/cors/index.mjs.map +1 -0
  24. package/dist/decorators/index.d.mts +2 -0
  25. package/dist/decorators/index.d.ts +2 -0
  26. package/dist/decorators/index.js +25 -0
  27. package/dist/decorators/index.js.map +1 -1
  28. package/dist/decorators/index.mjs +24 -1
  29. package/dist/decorators/index.mjs.map +1 -1
  30. package/dist/decorators-B6l3CbxC.d.ts +13 -0
  31. package/dist/decorators-D5nY109r.d.mts +13 -0
  32. package/dist/http-error/index.d.mts +18 -0
  33. package/dist/http-error/index.d.ts +18 -0
  34. package/dist/http-error/index.js +81 -0
  35. package/dist/http-error/index.js.map +1 -0
  36. package/dist/http-error/index.mjs +79 -0
  37. package/dist/http-error/index.mjs.map +1 -0
  38. package/dist/index-j6QGMhZU.d.mts +30 -0
  39. package/dist/index-tpPZS_UK.d.ts +30 -0
  40. package/dist/index.d.mts +16 -5
  41. package/dist/index.d.ts +16 -5
  42. package/dist/index.js +1178 -14
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.mjs +1176 -15
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/infra/index.d.mts +6 -0
  47. package/dist/infra/index.d.ts +6 -0
  48. package/dist/infra/index.js +162 -0
  49. package/dist/infra/index.js.map +1 -0
  50. package/dist/infra/index.mjs +159 -0
  51. package/dist/infra/index.mjs.map +1 -0
  52. package/dist/{Logger-iEQNVVSc.d.mts → logger/index.d.mts} +2 -1
  53. package/dist/{Logger-iEQNVVSc.d.ts → logger/index.d.ts} +2 -1
  54. package/dist/logger/index.js +123 -0
  55. package/dist/logger/index.js.map +1 -0
  56. package/dist/logger/index.mjs +120 -0
  57. package/dist/logger/index.mjs.map +1 -0
  58. package/dist/plugins/index.d.mts +8 -6
  59. package/dist/plugins/index.d.ts +8 -6
  60. package/dist/plugins/index.js +1101 -0
  61. package/dist/plugins/index.js.map +1 -1
  62. package/dist/plugins/index.mjs +1101 -1
  63. package/dist/plugins/index.mjs.map +1 -1
  64. package/dist/rate-limit/index.d.mts +7 -0
  65. package/dist/rate-limit/index.d.ts +7 -0
  66. package/dist/rate-limit/index.js +81 -0
  67. package/dist/rate-limit/index.js.map +1 -0
  68. package/dist/rate-limit/index.mjs +79 -0
  69. package/dist/rate-limit/index.mjs.map +1 -0
  70. package/dist/router/index.d.mts +4 -0
  71. package/dist/router/index.d.ts +4 -0
  72. package/dist/router/index.js +218 -0
  73. package/dist/router/index.js.map +1 -0
  74. package/dist/router/index.mjs +216 -0
  75. package/dist/router/index.mjs.map +1 -0
  76. package/dist/routes.type-DZO5VBW2.d.mts +58 -0
  77. package/dist/routes.type-DzHNkCag.d.ts +58 -0
  78. package/dist/swagger/index.d.mts +30 -0
  79. package/dist/swagger/index.d.ts +30 -0
  80. package/dist/swagger/index.js +1136 -0
  81. package/dist/swagger/index.js.map +1 -0
  82. package/dist/swagger/index.mjs +1126 -0
  83. package/dist/swagger/index.mjs.map +1 -0
  84. package/dist/swagger/swagger-ui-modern.html +894 -0
  85. package/dist/swagger.type-Bfn5nGR8.d.mts +42 -0
  86. package/dist/swagger.type-CfDbFCZC.d.ts +42 -0
  87. package/dist/types/index.d.mts +5 -58
  88. package/dist/types/index.d.ts +5 -58
  89. package/dist/utils/index.d.mts +7 -72
  90. package/dist/utils/index.d.ts +7 -72
  91. package/dist/validators/index.d.mts +48 -0
  92. package/dist/validators/index.d.ts +48 -0
  93. package/dist/validators/index.js +144 -0
  94. package/dist/validators/index.js.map +1 -0
  95. package/dist/validators/index.mjs +141 -0
  96. package/dist/validators/index.mjs.map +1 -0
  97. package/package.json +86 -2
  98. package/src/cookies/index.ts +1 -0
  99. package/src/core/index.ts +1 -0
  100. package/src/core/router.ts +26 -15
  101. package/src/core/server.ts +64 -14
  102. package/src/cors/index.ts +2 -0
  103. package/src/decorators/index.ts +2 -0
  104. package/src/http-error/index.ts +1 -0
  105. package/src/infra/index.ts +3 -0
  106. package/src/logger/index.ts +1 -0
  107. package/src/plugins/SwaggerPlugin.ts +45 -0
  108. package/src/plugins/index.ts +1 -0
  109. package/src/rate-limit/index.ts +2 -0
  110. package/src/router/index.ts +1 -0
  111. package/src/swagger/constants.ts +8 -0
  112. package/src/swagger/decorators.ts +35 -0
  113. package/src/swagger/index.ts +10 -0
  114. package/src/swagger/openapi-builder.ts +199 -0
  115. package/src/swagger/swagger-ui-html.ts +24 -0
  116. package/src/swagger/swagger-ui-modern.html +894 -0
  117. package/src/swagger/swagger-ui-template.ts +5 -0
  118. package/src/types/index.ts +7 -0
  119. package/src/types/swagger.type.ts +36 -0
  120. 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 };
@@ -1,63 +1,10 @@
1
- import { M as MiddlewareHandler, H as HttpMethod, R as RouteHandler } from '../common.type-BhGCNyEm.mjs';
2
- export { A as AzuraRequest, a as AzuraResponse, C as CookieOptions, E as ErrorHandler, N as NextFunction, b as RouteMatch } from '../common.type-BhGCNyEm.mjs';
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 { type ControllerMetadata, HttpMethod, HttpStatus, type HttpStatusCode, HttpStatusText, MiddlewareHandler, type ParamMetadata, type ParamType, type ParameterMeta, type ResponseMeta, type RouteDefinition, RouteHandler, type RouteMeta, type RouteMetadata };
35
+ export { HttpStatus, type HttpStatusCode, HttpStatusText };
@@ -1,63 +1,10 @@
1
- import { M as MiddlewareHandler, H as HttpMethod, R as RouteHandler } from '../common.type-BhGCNyEm.js';
2
- export { A as AzuraRequest, a as AzuraResponse, C as CookieOptions, E as ErrorHandler, N as NextFunction, b as RouteMatch } from '../common.type-BhGCNyEm.js';
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 { type ControllerMetadata, HttpMethod, HttpStatus, type HttpStatusCode, HttpStatusText, MiddlewareHandler, type ParamMetadata, type ParamType, type ParameterMeta, type ResponseMeta, type RouteDefinition, RouteHandler, type RouteMeta, type RouteMetadata };
35
+ export { HttpStatus, type HttpStatusCode, HttpStatusText };
@@ -1,25 +1,10 @@
1
- export { L as Logger } from '../Logger-iEQNVVSc.mjs';
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
- import { C as CookieOptions } from '../common.type-BhGCNyEm.mjs';
4
-
5
- declare class HttpError extends Error {
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
- declare function serializeCookie(name: string, value: string, options?: CookieOptions): string;
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 };
@@ -1,25 +1,10 @@
1
- export { L as Logger } from '../Logger-iEQNVVSc.js';
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
- import { C as CookieOptions } from '../common.type-BhGCNyEm.js';
4
-
5
- declare class HttpError extends Error {
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
- declare function serializeCookie(name: string, value: string, options?: CookieOptions): string;
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"]}