azurajs 3.0.1 → 3.0.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.
Files changed (106) hide show
  1. package/dist/config/index.js +128 -6
  2. package/dist/config/index.js.map +1 -1
  3. package/dist/config/index.mjs +130 -1
  4. package/dist/config/index.mjs.map +1 -1
  5. package/dist/core/index.js +1100 -11
  6. package/dist/core/index.js.map +1 -1
  7. package/dist/core/index.mjs +1102 -3
  8. package/dist/core/index.mjs.map +1 -1
  9. package/dist/decorators/index.js +117 -87
  10. package/dist/decorators/index.js.map +1 -1
  11. package/dist/decorators/index.mjs +98 -1
  12. package/dist/decorators/index.mjs.map +1 -1
  13. package/dist/index.js +2592 -236
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +2537 -9
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/middleware/index.js +16 -7
  18. package/dist/middleware/index.js.map +1 -1
  19. package/dist/middleware/index.mjs +17 -1
  20. package/dist/middleware/index.mjs.map +1 -1
  21. package/dist/plugins/index.js +1056 -73
  22. package/dist/plugins/index.js.map +1 -1
  23. package/dist/plugins/index.mjs +1042 -1
  24. package/dist/plugins/index.mjs.map +1 -1
  25. package/dist/types/index.js +49 -12
  26. package/dist/types/index.js.map +1 -1
  27. package/dist/types/index.mjs +49 -2
  28. package/dist/types/index.mjs.map +1 -1
  29. package/dist/utils/index.js +551 -50
  30. package/dist/utils/index.js.map +1 -1
  31. package/dist/utils/index.mjs +541 -3
  32. package/dist/utils/index.mjs.map +1 -1
  33. package/package.json +35 -17
  34. package/{dist/chunk-DR254CWJ.mjs → src/config/ConfigModule.ts} +169 -132
  35. package/src/config/index.ts +1 -0
  36. package/src/core/index.ts +2 -0
  37. package/src/core/router.ts +284 -0
  38. package/{dist/chunk-EYAHUNC7.mjs → src/core/server.ts} +590 -699
  39. package/src/decorators/Route.ts +110 -0
  40. package/src/decorators/index.ts +23 -0
  41. package/src/index.ts +12 -0
  42. package/src/middleware/LoggingMiddleware.ts +20 -0
  43. package/src/middleware/index.ts +1 -0
  44. package/src/plugins/CORSPlugin.ts +56 -0
  45. package/src/plugins/CircuitBreakerPlugin.ts +84 -0
  46. package/src/plugins/CompressionPlugin.ts +80 -0
  47. package/src/plugins/ETagPlugin.ts +31 -0
  48. package/src/plugins/HealthCheckPlugin.ts +57 -0
  49. package/src/plugins/HelmetPlugin.ts +89 -0
  50. package/src/plugins/JWTPlugin.ts +132 -0
  51. package/src/plugins/MultipartPlugin.ts +168 -0
  52. package/src/plugins/ProxyPlugin.ts +89 -0
  53. package/src/plugins/RateLimitPlugin.ts +96 -0
  54. package/src/plugins/RequestIdPlugin.ts +21 -0
  55. package/src/plugins/SSEPlugin.ts +114 -0
  56. package/src/plugins/SessionPlugin.ts +98 -0
  57. package/src/plugins/StaticPlugin.ts +152 -0
  58. package/src/plugins/TimeoutPlugin.ts +33 -0
  59. package/src/plugins/index.ts +18 -0
  60. package/src/types/common.type.ts +82 -0
  61. package/src/types/config.type.ts +57 -0
  62. package/{dist/chunk-OWUGAI5V.mjs → src/types/http/status.ts} +49 -51
  63. package/src/types/index.ts +55 -0
  64. package/src/types/plugins/plugin.type.ts +170 -0
  65. package/src/types/reflect.d.ts +14 -0
  66. package/src/types/routes.type.ts +70 -0
  67. package/src/utils/HttpError.ts +62 -0
  68. package/src/utils/IpResolver.ts +30 -0
  69. package/src/utils/Logger.ts +144 -0
  70. package/src/utils/Parser.ts +182 -0
  71. package/src/utils/cookies/CookieManager.ts +48 -0
  72. package/src/utils/index.ts +9 -0
  73. package/{dist/chunk-UWIFSGSQ.mjs → src/utils/validators/DTOValidator.ts} +145 -141
  74. package/src/utils/validators/SchemaValidator.ts +45 -0
  75. package/dist/chunk-3UFAWS2V.js +0 -392
  76. package/dist/chunk-3UFAWS2V.js.map +0 -1
  77. package/dist/chunk-4LSFAAZW.js +0 -4
  78. package/dist/chunk-4LSFAAZW.js.map +0 -1
  79. package/dist/chunk-7NSRIVZM.js +0 -54
  80. package/dist/chunk-7NSRIVZM.js.map +0 -1
  81. package/dist/chunk-AOG6NYAM.js +0 -144
  82. package/dist/chunk-AOG6NYAM.js.map +0 -1
  83. package/dist/chunk-DR254CWJ.mjs.map +0 -1
  84. package/dist/chunk-EYAHUNC7.mjs.map +0 -1
  85. package/dist/chunk-HHDQPIJN.mjs +0 -19
  86. package/dist/chunk-HHDQPIJN.mjs.map +0 -1
  87. package/dist/chunk-HHZNAGGI.js +0 -702
  88. package/dist/chunk-HHZNAGGI.js.map +0 -1
  89. package/dist/chunk-KJM5XCAY.js +0 -21
  90. package/dist/chunk-KJM5XCAY.js.map +0 -1
  91. package/dist/chunk-NLSZKAPA.mjs +0 -1044
  92. package/dist/chunk-NLSZKAPA.mjs.map +0 -1
  93. package/dist/chunk-OWUGAI5V.mjs.map +0 -1
  94. package/dist/chunk-POPNQEOK.js +0 -1063
  95. package/dist/chunk-POPNQEOK.js.map +0 -1
  96. package/dist/chunk-QPRW4YU4.js +0 -134
  97. package/dist/chunk-QPRW4YU4.js.map +0 -1
  98. package/dist/chunk-REJDZUZ5.mjs +0 -382
  99. package/dist/chunk-REJDZUZ5.mjs.map +0 -1
  100. package/dist/chunk-TC6N6TJZ.mjs +0 -100
  101. package/dist/chunk-TC6N6TJZ.mjs.map +0 -1
  102. package/dist/chunk-TEUXKMXP.js +0 -122
  103. package/dist/chunk-TEUXKMXP.js.map +0 -1
  104. package/dist/chunk-UWIFSGSQ.mjs.map +0 -1
  105. package/dist/chunk-YPBKY4KY.mjs +0 -3
  106. package/dist/chunk-YPBKY4KY.mjs.map +0 -1
@@ -1,392 +0,0 @@
1
- 'use strict';
2
-
3
- var chunk7NSRIVZM_js = require('./chunk-7NSRIVZM.js');
4
-
5
- // src/utils/Logger.ts
6
- var LEVEL_PRIORITY = {
7
- debug: 0,
8
- info: 1,
9
- warn: 2,
10
- error: 3,
11
- silent: 4
12
- };
13
- var COLORS = {
14
- reset: "\x1B[0m",
15
- bold: "\x1B[1m",
16
- dim: "\x1B[2m",
17
- red: "\x1B[31m",
18
- green: "\x1B[32m",
19
- yellow: "\x1B[33m",
20
- blue: "\x1B[34m",
21
- magenta: "\x1B[35m",
22
- cyan: "\x1B[36m",
23
- white: "\x1B[37m",
24
- gray: "\x1B[90m"};
25
- var METHOD_COLORS = {
26
- GET: COLORS.green,
27
- POST: COLORS.blue,
28
- PUT: COLORS.yellow,
29
- DELETE: COLORS.red,
30
- PATCH: COLORS.magenta,
31
- HEAD: COLORS.cyan,
32
- OPTIONS: COLORS.gray
33
- };
34
- function statusColor(code) {
35
- if (code < 200) return COLORS.gray;
36
- if (code < 300) return COLORS.green;
37
- if (code < 400) return COLORS.cyan;
38
- if (code < 500) return COLORS.yellow;
39
- return COLORS.red;
40
- }
41
- function formatDuration(ns) {
42
- const us = Number(ns) / 1e3;
43
- if (us < 1e3) return `${us.toFixed(0)}\xB5s`;
44
- const ms = us / 1e3;
45
- if (ms < 1e3) return `${ms.toFixed(1)}ms`;
46
- return `${(ms / 1e3).toFixed(2)}s`;
47
- }
48
- var Logger = class {
49
- level;
50
- useColors;
51
- showTimestamp;
52
- prefix;
53
- constructor(options = {}) {
54
- this.level = options.level ?? "info";
55
- this.useColors = options.colors ?? process.stdout.isTTY !== false;
56
- this.showTimestamp = options.timestamp ?? true;
57
- this.prefix = options.prefix ?? "azura";
58
- }
59
- shouldLog(level) {
60
- return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];
61
- }
62
- timestamp() {
63
- if (!this.showTimestamp) return "";
64
- const now = /* @__PURE__ */ new Date();
65
- return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;
66
- }
67
- tag(level) {
68
- if (!this.useColors) return `[${level.toUpperCase()}]`;
69
- const colorMap = {
70
- debug: COLORS.gray,
71
- info: COLORS.blue,
72
- warn: COLORS.yellow,
73
- error: COLORS.red
74
- };
75
- return `${colorMap[level] ?? ""}[${level.toUpperCase()}]${COLORS.reset}`;
76
- }
77
- debug(message, ...args) {
78
- if (!this.shouldLog("debug")) return;
79
- console.debug(`${this.timestamp()}${this.tag("debug")} ${message}`, ...args);
80
- }
81
- info(message, ...args) {
82
- if (!this.shouldLog("info")) return;
83
- console.info(`${this.timestamp()}${this.tag("info")} ${message}`, ...args);
84
- }
85
- warn(message, ...args) {
86
- if (!this.shouldLog("warn")) return;
87
- console.warn(`${this.timestamp()}${this.tag("warn")} ${message}`, ...args);
88
- }
89
- error(message, ...args) {
90
- if (!this.shouldLog("error")) return;
91
- console.error(`${this.timestamp()}${this.tag("error")} ${message}`, ...args);
92
- }
93
- request(method, path, statusCode, duration) {
94
- if (!this.shouldLog("info")) return;
95
- const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : "";
96
- const sc = this.useColors ? statusColor(statusCode) : "";
97
- const r = this.useColors ? COLORS.reset : "";
98
- const dur = formatDuration(duration);
99
- console.info(
100
- `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`
101
- );
102
- }
103
- banner(port, host) {
104
- if (!this.shouldLog("info")) return;
105
- const c = this.useColors;
106
- const lines = [
107
- "",
108
- `${c ? COLORS.bold + COLORS.cyan : ""} \u26A1 AzuraJS v3.0.0${c ? COLORS.reset : ""}`,
109
- "",
110
- `${c ? COLORS.green : ""} \u279C Local: ${c ? COLORS.bold : ""}http://${host}:${port}/${c ? COLORS.reset : ""}`,
111
- `${c ? COLORS.dim : ""} \u279C Press Ctrl+C to stop${c ? COLORS.reset : ""}`,
112
- ""
113
- ];
114
- console.info(lines.join("\n"));
115
- }
116
- setLevel(level) {
117
- this.level = level;
118
- }
119
- };
120
- new Logger();
121
-
122
- // src/utils/HttpError.ts
123
- var HttpError = class _HttpError extends Error {
124
- statusCode;
125
- details;
126
- isOperational;
127
- constructor(statusCode, message, details) {
128
- super(message ?? chunk7NSRIVZM_js.HttpStatusText[statusCode] ?? "Unknown Error");
129
- this.statusCode = statusCode;
130
- this.details = details;
131
- this.isOperational = true;
132
- Object.setPrototypeOf(this, _HttpError.prototype);
133
- }
134
- toJSON() {
135
- const obj = {
136
- error: {
137
- statusCode: this.statusCode,
138
- message: this.message
139
- }
140
- };
141
- if (this.details) obj.error.details = this.details;
142
- return obj;
143
- }
144
- static badRequest(message, details) {
145
- return new _HttpError(400, message ?? "Bad Request", details);
146
- }
147
- static unauthorized(message) {
148
- return new _HttpError(401, message ?? "Unauthorized");
149
- }
150
- static forbidden(message) {
151
- return new _HttpError(403, message ?? "Forbidden");
152
- }
153
- static notFound(message) {
154
- return new _HttpError(404, message ?? "Not Found");
155
- }
156
- static methodNotAllowed(message) {
157
- return new _HttpError(405, message ?? "Method Not Allowed");
158
- }
159
- static conflict(message, details) {
160
- return new _HttpError(409, message ?? "Conflict", details);
161
- }
162
- static unprocessableEntity(message, details) {
163
- return new _HttpError(422, message ?? "Unprocessable Entity", details);
164
- }
165
- static tooManyRequests(message) {
166
- return new _HttpError(429, message ?? "Too Many Requests");
167
- }
168
- static internal(message) {
169
- return new _HttpError(500, message ?? "Internal Server Error");
170
- }
171
- };
172
-
173
- // src/utils/Parser.ts
174
- function parseQueryString(qs) {
175
- const result = /* @__PURE__ */ Object.create(null);
176
- if (!qs || qs.length === 0) return result;
177
- let key = "";
178
- let value = "";
179
- let startingKey = true;
180
- let i = qs.charCodeAt(0) === 63 ? 1 : 0;
181
- for (; i < qs.length; i++) {
182
- const ch = qs.charCodeAt(i);
183
- if (ch === 61 && startingKey) {
184
- startingKey = false;
185
- continue;
186
- }
187
- if (ch === 38) {
188
- if (key.length > 0) {
189
- const decodedKey = fastDecode(key);
190
- const decodedVal = fastDecode(value);
191
- const existing = result[decodedKey];
192
- if (existing === void 0) {
193
- result[decodedKey] = decodedVal;
194
- } else if (typeof existing === "string") {
195
- result[decodedKey] = [existing, decodedVal];
196
- } else {
197
- existing.push(decodedVal);
198
- }
199
- }
200
- key = "";
201
- value = "";
202
- startingKey = true;
203
- continue;
204
- }
205
- if (startingKey) {
206
- key += qs[i];
207
- } else {
208
- value += qs[i];
209
- }
210
- }
211
- if (key.length > 0) {
212
- const decodedKey = fastDecode(key);
213
- const decodedVal = fastDecode(value);
214
- const existing = result[decodedKey];
215
- if (existing === void 0) {
216
- result[decodedKey] = decodedVal;
217
- } else if (typeof existing === "string") {
218
- result[decodedKey] = [existing, decodedVal];
219
- } else {
220
- existing.push(decodedVal);
221
- }
222
- }
223
- return result;
224
- }
225
- function fastDecode(str) {
226
- if (str.indexOf("%") === -1 && str.indexOf("+") === -1) return str;
227
- try {
228
- return decodeURIComponent(str.replace(/\+/g, " "));
229
- } catch {
230
- return str;
231
- }
232
- }
233
- function parseCookies(header) {
234
- const cookies = /* @__PURE__ */ Object.create(null);
235
- if (!header) return cookies;
236
- let i = 0;
237
- const len = header.length;
238
- while (i < len) {
239
- while (i < len && header.charCodeAt(i) === 32) i++;
240
- let eqIdx = -1;
241
- let semiIdx = -1;
242
- for (let j = i; j < len; j++) {
243
- const ch = header.charCodeAt(j);
244
- if (ch === 61 && eqIdx === -1) eqIdx = j;
245
- if (ch === 59) {
246
- semiIdx = j;
247
- break;
248
- }
249
- }
250
- if (eqIdx === -1) {
251
- i = semiIdx === -1 ? len : semiIdx + 1;
252
- continue;
253
- }
254
- const end = semiIdx === -1 ? len : semiIdx;
255
- const name = header.slice(i, eqIdx).trim();
256
- let val = header.slice(eqIdx + 1, end).trim();
257
- if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {
258
- val = val.slice(1, -1);
259
- }
260
- if (cookies[name] === void 0) {
261
- cookies[name] = fastDecode(val);
262
- }
263
- i = end + 1;
264
- }
265
- return cookies;
266
- }
267
- var CONTENT_TYPE_JSON = "application/json";
268
- var CONTENT_TYPE_FORM = "application/x-www-form-urlencoded";
269
- async function parseBody(req) {
270
- const contentType = req.headers["content-type"] ?? "";
271
- const contentLength = req.headers["content-length"];
272
- if (req.method === "GET" || req.method === "HEAD" || req.method === "OPTIONS" || contentLength !== void 0 && contentLength === "0") {
273
- return void 0;
274
- }
275
- const chunks = [];
276
- let totalSize = 0;
277
- const maxSize = 10 * 1024 * 1024;
278
- return new Promise((resolve, reject) => {
279
- req.on("data", (chunk) => {
280
- totalSize += chunk.length;
281
- if (totalSize > maxSize) {
282
- req.destroy();
283
- reject(new Error("Request body too large"));
284
- return;
285
- }
286
- chunks.push(chunk);
287
- });
288
- req.on("end", () => {
289
- if (chunks.length === 0) {
290
- resolve(void 0);
291
- return;
292
- }
293
- const raw = Buffer.concat(chunks).toString("utf-8");
294
- if (contentType.startsWith(CONTENT_TYPE_JSON)) {
295
- try {
296
- resolve(JSON.parse(raw));
297
- } catch {
298
- resolve(raw);
299
- }
300
- } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {
301
- resolve(parseQueryString(raw));
302
- } else {
303
- resolve(raw);
304
- }
305
- });
306
- req.on("error", reject);
307
- });
308
- }
309
- function parseUrl(url) {
310
- let pathname = "";
311
- let search = "";
312
- let i = 0;
313
- for (; i < url.length; i++) {
314
- if (url.charCodeAt(i) === 63) {
315
- pathname = url.slice(0, i);
316
- search = url.slice(i);
317
- return { pathname, search };
318
- }
319
- }
320
- return { pathname: url, search: "" };
321
- }
322
-
323
- // src/utils/IpResolver.ts
324
- var PROXY_HEADERS = [
325
- "x-forwarded-for",
326
- "x-real-ip",
327
- "cf-connecting-ip",
328
- "x-client-ip",
329
- "x-cluster-client-ip",
330
- "fastly-client-ip",
331
- "true-client-ip"
332
- ];
333
- function resolveIp(req) {
334
- for (const header of PROXY_HEADERS) {
335
- const val = req.headers[header];
336
- if (val) {
337
- const ip = typeof val === "string" ? val.split(",")[0].trim() : val[0];
338
- if (ip && ip.length > 0) return normalizeIp(ip);
339
- }
340
- }
341
- const remoteAddr = req.socket?.remoteAddress ?? "127.0.0.1";
342
- return normalizeIp(remoteAddr);
343
- }
344
- function normalizeIp(ip) {
345
- if (ip === "::1" || ip === "::ffff:127.0.0.1") return "127.0.0.1";
346
- if (ip.startsWith("::ffff:")) return ip.slice(7);
347
- return ip;
348
- }
349
-
350
- // src/utils/cookies/CookieManager.ts
351
- function serializeCookie(name, value, options = {}) {
352
- let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
353
- if (options.maxAge != null) {
354
- cookie += `; Max-Age=${Math.floor(options.maxAge)}`;
355
- }
356
- if (options.expires) {
357
- cookie += `; Expires=${options.expires.toUTCString()}`;
358
- }
359
- if (options.domain) {
360
- cookie += `; Domain=${options.domain}`;
361
- }
362
- cookie += `; Path=${options.path ?? "/"}`;
363
- if (options.secure) {
364
- cookie += "; Secure";
365
- }
366
- if (options.httpOnly !== false) {
367
- cookie += "; HttpOnly";
368
- }
369
- if (options.sameSite) {
370
- cookie += `; SameSite=${options.sameSite}`;
371
- }
372
- return cookie;
373
- }
374
- function clearCookieHeader(name, options = {}) {
375
- return serializeCookie(name, "", {
376
- ...options,
377
- maxAge: 0,
378
- expires: /* @__PURE__ */ new Date(0)
379
- });
380
- }
381
-
382
- exports.HttpError = HttpError;
383
- exports.Logger = Logger;
384
- exports.clearCookieHeader = clearCookieHeader;
385
- exports.parseBody = parseBody;
386
- exports.parseCookies = parseCookies;
387
- exports.parseQueryString = parseQueryString;
388
- exports.parseUrl = parseUrl;
389
- exports.resolveIp = resolveIp;
390
- exports.serializeCookie = serializeCookie;
391
- //# sourceMappingURL=chunk-3UFAWS2V.js.map
392
- //# sourceMappingURL=chunk-3UFAWS2V.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/Logger.ts","../src/utils/HttpError.ts","../src/utils/Parser.ts","../src/utils/IpResolver.ts","../src/utils/cookies/CookieManager.ts"],"names":["HttpStatusText"],"mappings":"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","file":"chunk-3UFAWS2V.js","sourcesContent":["type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\r\n\r\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst COLORS = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n gray: \"\\x1b[90m\",\r\n bgRed: \"\\x1b[41m\",\r\n bgGreen: \"\\x1b[42m\",\r\n bgYellow: \"\\x1b[43m\",\r\n bgBlue: \"\\x1b[44m\",\r\n} as const;\r\n\r\nconst METHOD_COLORS: Record<string, string> = {\r\n GET: COLORS.green,\r\n POST: COLORS.blue,\r\n PUT: COLORS.yellow,\r\n DELETE: COLORS.red,\r\n PATCH: COLORS.magenta,\r\n HEAD: COLORS.cyan,\r\n OPTIONS: COLORS.gray,\r\n};\r\n\r\nfunction statusColor(code: number): string {\r\n if (code < 200) return COLORS.gray;\r\n if (code < 300) return COLORS.green;\r\n if (code < 400) return COLORS.cyan;\r\n if (code < 500) return COLORS.yellow;\r\n return COLORS.red;\r\n}\r\n\r\nfunction formatDuration(ns: bigint): string {\r\n const us = Number(ns) / 1_000;\r\n if (us < 1_000) return `${us.toFixed(0)}µs`;\r\n const ms = us / 1_000;\r\n if (ms < 1_000) return `${ms.toFixed(1)}ms`;\r\n return `${(ms / 1_000).toFixed(2)}s`;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private useColors: boolean;\r\n private showTimestamp: boolean;\r\n private prefix: string;\r\n\r\n constructor(options: {\r\n level?: LogLevel;\r\n colors?: boolean;\r\n timestamp?: boolean;\r\n prefix?: string;\r\n } = {}) {\r\n this.level = options.level ?? \"info\";\r\n this.useColors = options.colors ?? process.stdout.isTTY !== false;\r\n this.showTimestamp = options.timestamp ?? true;\r\n this.prefix = options.prefix ?? \"azura\";\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];\r\n }\r\n\r\n private timestamp(): string {\r\n if (!this.showTimestamp) return \"\";\r\n const now = new Date();\r\n return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;\r\n }\r\n\r\n private tag(level: LogLevel): string {\r\n if (!this.useColors) return `[${level.toUpperCase()}]`;\r\n const colorMap: Record<string, string> = {\r\n debug: COLORS.gray,\r\n info: COLORS.blue,\r\n warn: COLORS.yellow,\r\n error: COLORS.red,\r\n };\r\n return `${colorMap[level] ?? \"\"}[${level.toUpperCase()}]${COLORS.reset}`;\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"debug\")) return;\r\n console.debug(`${this.timestamp()}${this.tag(\"debug\")} ${message}`, ...args);\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n console.info(`${this.timestamp()}${this.tag(\"info\")} ${message}`, ...args);\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"warn\")) return;\r\n console.warn(`${this.timestamp()}${this.tag(\"warn\")} ${message}`, ...args);\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"error\")) return;\r\n console.error(`${this.timestamp()}${this.tag(\"error\")} ${message}`, ...args);\r\n }\r\n\r\n request(method: string, path: string, statusCode: number, duration: bigint): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : \"\";\r\n const sc = this.useColors ? statusColor(statusCode) : \"\";\r\n const r = this.useColors ? COLORS.reset : \"\";\r\n const dur = formatDuration(duration);\r\n console.info(\r\n `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`,\r\n );\r\n }\r\n\r\n banner(port: number, host: string): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const c = this.useColors;\r\n const lines = [\r\n \"\",\r\n `${c ? COLORS.bold + COLORS.cyan : \"\"} ⚡ AzuraJS v3.0.0${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n `${c ? COLORS.green : \"\"} ➜ Local: ${c ? COLORS.bold : \"\"}http://${host}:${port}/${c ? COLORS.reset : \"\"}`,\r\n `${c ? COLORS.dim : \"\"} ➜ Press Ctrl+C to stop${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n ];\r\n console.info(lines.join(\"\\n\"));\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n","import { HttpStatusText } from \"../types/http/status.js\";\r\n\r\nexport class HttpError extends Error {\r\n public readonly statusCode: number;\r\n public readonly details?: any;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(statusCode: number, message?: string, details?: any) {\r\n super(message ?? HttpStatusText[statusCode] ?? \"Unknown Error\");\r\n this.statusCode = statusCode;\r\n this.details = details;\r\n this.isOperational = true;\r\n Object.setPrototypeOf(this, HttpError.prototype);\r\n }\r\n\r\n toJSON(): Record<string, any> {\r\n const obj: Record<string, any> = {\r\n error: {\r\n statusCode: this.statusCode,\r\n message: this.message,\r\n },\r\n };\r\n if (this.details) obj.error.details = this.details;\r\n return obj;\r\n }\r\n\r\n static badRequest(message?: string, details?: any): HttpError {\r\n return new HttpError(400, message ?? \"Bad Request\", details);\r\n }\r\n\r\n static unauthorized(message?: string): HttpError {\r\n return new HttpError(401, message ?? \"Unauthorized\");\r\n }\r\n\r\n static forbidden(message?: string): HttpError {\r\n return new HttpError(403, message ?? \"Forbidden\");\r\n }\r\n\r\n static notFound(message?: string): HttpError {\r\n return new HttpError(404, message ?? \"Not Found\");\r\n }\r\n\r\n static methodNotAllowed(message?: string): HttpError {\r\n return new HttpError(405, message ?? \"Method Not Allowed\");\r\n }\r\n\r\n static conflict(message?: string, details?: any): HttpError {\r\n return new HttpError(409, message ?? \"Conflict\", details);\r\n }\r\n\r\n static unprocessableEntity(message?: string, details?: any): HttpError {\r\n return new HttpError(422, message ?? \"Unprocessable Entity\", details);\r\n }\r\n\r\n static tooManyRequests(message?: string): HttpError {\r\n return new HttpError(429, message ?? \"Too Many Requests\");\r\n }\r\n\r\n static internal(message?: string): HttpError {\r\n return new HttpError(500, message ?? \"Internal Server Error\");\r\n }\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nexport function parseQueryString(qs: string): Record<string, string | string[]> {\r\n const result: Record<string, string | string[]> = Object.create(null);\r\n if (!qs || qs.length === 0) return result;\r\n\r\n let key = \"\";\r\n let value = \"\";\r\n let startingKey = true;\r\n let i = qs.charCodeAt(0) === 63 ? 1 : 0; // skip leading ?\r\n\r\n for (; i < qs.length; i++) {\r\n const ch = qs.charCodeAt(i);\r\n\r\n if (ch === 61 /* = */ && startingKey) {\r\n startingKey = false;\r\n continue;\r\n }\r\n\r\n if (ch === 38 /* & */) {\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n key = \"\";\r\n value = \"\";\r\n startingKey = true;\r\n continue;\r\n }\r\n\r\n if (startingKey) {\r\n key += qs[i];\r\n } else {\r\n value += qs[i];\r\n }\r\n }\r\n\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction fastDecode(str: string): string {\r\n if (str.indexOf(\"%\") === -1 && str.indexOf(\"+\") === -1) return str;\r\n try {\r\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\nexport function parseCookies(header: string | undefined): Record<string, string> {\r\n const cookies: Record<string, string> = Object.create(null);\r\n if (!header) return cookies;\r\n\r\n let i = 0;\r\n const len = header.length;\r\n\r\n while (i < len) {\r\n while (i < len && header.charCodeAt(i) === 32) i++; // skip spaces\r\n\r\n let eqIdx = -1;\r\n let semiIdx = -1;\r\n for (let j = i; j < len; j++) {\r\n const ch = header.charCodeAt(j);\r\n if (ch === 61 && eqIdx === -1) eqIdx = j;\r\n if (ch === 59) { semiIdx = j; break; }\r\n }\r\n\r\n if (eqIdx === -1) {\r\n i = semiIdx === -1 ? len : semiIdx + 1;\r\n continue;\r\n }\r\n\r\n const end = semiIdx === -1 ? len : semiIdx;\r\n const name = header.slice(i, eqIdx).trim();\r\n let val = header.slice(eqIdx + 1, end).trim();\r\n\r\n if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {\r\n val = val.slice(1, -1);\r\n }\r\n\r\n if (cookies[name] === undefined) {\r\n cookies[name] = fastDecode(val);\r\n }\r\n\r\n i = end + 1;\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\nconst CONTENT_TYPE_JSON = \"application/json\";\r\nconst CONTENT_TYPE_FORM = \"application/x-www-form-urlencoded\";\r\n\r\nexport async function parseBody(req: IncomingMessage): Promise<any> {\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n const contentLength = req.headers[\"content-length\"];\r\n\r\n if (\r\n req.method === \"GET\" ||\r\n req.method === \"HEAD\" ||\r\n req.method === \"OPTIONS\" ||\r\n (contentLength !== undefined && contentLength === \"0\")\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n const maxSize = 10 * 1024 * 1024; // 10MB default\r\n\r\n return new Promise((resolve, reject) => {\r\n req.on(\"data\", (chunk: Buffer) => {\r\n totalSize += chunk.length;\r\n if (totalSize > maxSize) {\r\n req.destroy();\r\n reject(new Error(\"Request body too large\"));\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on(\"end\", () => {\r\n if (chunks.length === 0) {\r\n resolve(undefined);\r\n return;\r\n }\r\n\r\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\r\n\r\n if (contentType.startsWith(CONTENT_TYPE_JSON)) {\r\n try {\r\n resolve(JSON.parse(raw));\r\n } catch {\r\n resolve(raw);\r\n }\r\n } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {\r\n resolve(parseQueryString(raw));\r\n } else {\r\n resolve(raw);\r\n }\r\n });\r\n\r\n req.on(\"error\", reject);\r\n });\r\n}\r\n\r\nexport function parseUrl(url: string): { pathname: string; search: string } {\r\n let pathname = \"\";\r\n let search = \"\";\r\n let i = 0;\r\n\r\n for (; i < url.length; i++) {\r\n if (url.charCodeAt(i) === 63) { // ?\r\n pathname = url.slice(0, i);\r\n search = url.slice(i);\r\n return { pathname, search };\r\n }\r\n }\r\n\r\n return { pathname: url, search: \"\" };\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nconst PROXY_HEADERS = [\r\n \"x-forwarded-for\",\r\n \"x-real-ip\",\r\n \"cf-connecting-ip\",\r\n \"x-client-ip\",\r\n \"x-cluster-client-ip\",\r\n \"fastly-client-ip\",\r\n \"true-client-ip\",\r\n] as const;\r\n\r\nexport function resolveIp(req: IncomingMessage): string {\r\n for (const header of PROXY_HEADERS) {\r\n const val = req.headers[header];\r\n if (val) {\r\n const ip = typeof val === \"string\" ? val.split(\",\")[0].trim() : val[0];\r\n if (ip && ip.length > 0) return normalizeIp(ip);\r\n }\r\n }\r\n\r\n const remoteAddr = req.socket?.remoteAddress ?? \"127.0.0.1\";\r\n return normalizeIp(remoteAddr);\r\n}\r\n\r\nfunction normalizeIp(ip: string): string {\r\n if (ip === \"::1\" || ip === \"::ffff:127.0.0.1\") return \"127.0.0.1\";\r\n if (ip.startsWith(\"::ffff:\")) return ip.slice(7);\r\n return ip;\r\n}\r\n","import type { CookieOptions } from \"../../types/common.type.js\";\r\n\r\nexport function serializeCookie(\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {},\r\n): string {\r\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\r\n\r\n if (options.maxAge != null) {\r\n cookie += `; Max-Age=${Math.floor(options.maxAge)}`;\r\n }\r\n\r\n if (options.expires) {\r\n cookie += `; Expires=${options.expires.toUTCString()}`;\r\n }\r\n\r\n if (options.domain) {\r\n cookie += `; Domain=${options.domain}`;\r\n }\r\n\r\n cookie += `; Path=${options.path ?? \"/\"}`;\r\n\r\n if (options.secure) {\r\n cookie += \"; Secure\";\r\n }\r\n\r\n if (options.httpOnly !== false) {\r\n cookie += \"; HttpOnly\";\r\n }\r\n\r\n if (options.sameSite) {\r\n cookie += `; SameSite=${options.sameSite}`;\r\n }\r\n\r\n return cookie;\r\n}\r\n\r\nexport function clearCookieHeader(\r\n name: string,\r\n options: CookieOptions = {},\r\n): string {\r\n return serializeCookie(name, \"\", {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n"]}
@@ -1,4 +0,0 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=chunk-4LSFAAZW.js.map
4
- //# sourceMappingURL=chunk-4LSFAAZW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-4LSFAAZW.js"}
@@ -1,54 +0,0 @@
1
- 'use strict';
2
-
3
- // src/types/http/status.ts
4
- var HttpStatus = {
5
- OK: 200,
6
- CREATED: 201,
7
- ACCEPTED: 202,
8
- NO_CONTENT: 204,
9
- MOVED_PERMANENTLY: 301,
10
- FOUND: 302,
11
- NOT_MODIFIED: 304,
12
- BAD_REQUEST: 400,
13
- UNAUTHORIZED: 401,
14
- FORBIDDEN: 403,
15
- NOT_FOUND: 404,
16
- METHOD_NOT_ALLOWED: 405,
17
- CONFLICT: 409,
18
- GONE: 410,
19
- UNPROCESSABLE_ENTITY: 422,
20
- TOO_MANY_REQUESTS: 429,
21
- INTERNAL_SERVER_ERROR: 500,
22
- NOT_IMPLEMENTED: 501,
23
- BAD_GATEWAY: 502,
24
- SERVICE_UNAVAILABLE: 503,
25
- GATEWAY_TIMEOUT: 504
26
- };
27
- var HttpStatusText = {
28
- 200: "OK",
29
- 201: "Created",
30
- 202: "Accepted",
31
- 204: "No Content",
32
- 301: "Moved Permanently",
33
- 302: "Found",
34
- 304: "Not Modified",
35
- 400: "Bad Request",
36
- 401: "Unauthorized",
37
- 403: "Forbidden",
38
- 404: "Not Found",
39
- 405: "Method Not Allowed",
40
- 409: "Conflict",
41
- 410: "Gone",
42
- 422: "Unprocessable Entity",
43
- 429: "Too Many Requests",
44
- 500: "Internal Server Error",
45
- 501: "Not Implemented",
46
- 502: "Bad Gateway",
47
- 503: "Service Unavailable",
48
- 504: "Gateway Timeout"
49
- };
50
-
51
- exports.HttpStatus = HttpStatus;
52
- exports.HttpStatusText = HttpStatusText;
53
- //# sourceMappingURL=chunk-7NSRIVZM.js.map
54
- //# sourceMappingURL=chunk-7NSRIVZM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types/http/status.ts"],"names":[],"mappings":";;;AAAO,IAAM,UAAA,GAAa;AAAA,EACxB,EAAA,EAAI,GAAA;AAAA,EACJ,OAAA,EAAS,GAAA;AAAA,EACT,QAAA,EAAU,GAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB,GAAA;AAAA,EACnB,KAAA,EAAO,GAAA;AAAA,EACP,YAAA,EAAc,GAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,SAAA,EAAW,GAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,kBAAA,EAAoB,GAAA;AAAA,EACpB,QAAA,EAAU,GAAA;AAAA,EACV,IAAA,EAAM,GAAA;AAAA,EACN,oBAAA,EAAsB,GAAA;AAAA,EACtB,iBAAA,EAAmB,GAAA;AAAA,EACnB,qBAAA,EAAuB,GAAA;AAAA,EACvB,eAAA,EAAiB,GAAA;AAAA,EACjB,WAAA,EAAa,GAAA;AAAA,EACb,mBAAA,EAAqB,GAAA;AAAA,EACrB,eAAA,EAAiB;AACnB;AAIO,IAAM,cAAA,GAAyC;AAAA,EACpD,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK;AACP","file":"chunk-7NSRIVZM.js","sourcesContent":["export const HttpStatus = {\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];\r\n\r\nexport const HttpStatusText: Record<number, string> = {\r\n 200: \"OK\",\r\n 201: \"Created\",\r\n 202: \"Accepted\",\r\n 204: \"No Content\",\r\n 301: \"Moved Permanently\",\r\n 302: \"Found\",\r\n 304: \"Not Modified\",\r\n 400: \"Bad Request\",\r\n 401: \"Unauthorized\",\r\n 403: \"Forbidden\",\r\n 404: \"Not Found\",\r\n 405: \"Method Not Allowed\",\r\n 409: \"Conflict\",\r\n 410: \"Gone\",\r\n 422: \"Unprocessable Entity\",\r\n 429: \"Too Many Requests\",\r\n 500: \"Internal Server Error\",\r\n 501: \"Not Implemented\",\r\n 502: \"Bad Gateway\",\r\n 503: \"Service Unavailable\",\r\n 504: \"Gateway Timeout\",\r\n};\r\n"]}
@@ -1,144 +0,0 @@
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=chunk-AOG6NYAM.js.map
144
- //# sourceMappingURL=chunk-AOG6NYAM.js.map