@hazeljs/core 0.2.0-alpha.1

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 (195) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +560 -0
  3. package/dist/__tests__/container.test.d.ts +2 -0
  4. package/dist/__tests__/container.test.d.ts.map +1 -0
  5. package/dist/__tests__/container.test.js +454 -0
  6. package/dist/__tests__/decorators.test.d.ts +2 -0
  7. package/dist/__tests__/decorators.test.d.ts.map +1 -0
  8. package/dist/__tests__/decorators.test.js +1237 -0
  9. package/dist/__tests__/errors/http.error.test.d.ts +2 -0
  10. package/dist/__tests__/errors/http.error.test.d.ts.map +1 -0
  11. package/dist/__tests__/errors/http.error.test.js +117 -0
  12. package/dist/__tests__/filters/exception-filter.test.d.ts +2 -0
  13. package/dist/__tests__/filters/exception-filter.test.d.ts.map +1 -0
  14. package/dist/__tests__/filters/exception-filter.test.js +135 -0
  15. package/dist/__tests__/filters/http-exception.filter.test.d.ts +2 -0
  16. package/dist/__tests__/filters/http-exception.filter.test.d.ts.map +1 -0
  17. package/dist/__tests__/filters/http-exception.filter.test.js +119 -0
  18. package/dist/__tests__/hazel-app.test.d.ts +2 -0
  19. package/dist/__tests__/hazel-app.test.d.ts.map +1 -0
  20. package/dist/__tests__/hazel-app.test.js +810 -0
  21. package/dist/__tests__/hazel-module.test.d.ts +2 -0
  22. package/dist/__tests__/hazel-module.test.d.ts.map +1 -0
  23. package/dist/__tests__/hazel-module.test.js +408 -0
  24. package/dist/__tests__/hazel-response.test.d.ts +2 -0
  25. package/dist/__tests__/hazel-response.test.d.ts.map +1 -0
  26. package/dist/__tests__/hazel-response.test.js +138 -0
  27. package/dist/__tests__/health.test.d.ts +2 -0
  28. package/dist/__tests__/health.test.d.ts.map +1 -0
  29. package/dist/__tests__/health.test.js +147 -0
  30. package/dist/__tests__/index.test.d.ts +2 -0
  31. package/dist/__tests__/index.test.d.ts.map +1 -0
  32. package/dist/__tests__/index.test.js +239 -0
  33. package/dist/__tests__/interceptors/interceptor.test.d.ts +2 -0
  34. package/dist/__tests__/interceptors/interceptor.test.d.ts.map +1 -0
  35. package/dist/__tests__/interceptors/interceptor.test.js +166 -0
  36. package/dist/__tests__/logger.test.d.ts +2 -0
  37. package/dist/__tests__/logger.test.d.ts.map +1 -0
  38. package/dist/__tests__/logger.test.js +141 -0
  39. package/dist/__tests__/middleware/cors.test.d.ts +2 -0
  40. package/dist/__tests__/middleware/cors.test.d.ts.map +1 -0
  41. package/dist/__tests__/middleware/cors.test.js +129 -0
  42. package/dist/__tests__/middleware/csrf.test.d.ts +2 -0
  43. package/dist/__tests__/middleware/csrf.test.d.ts.map +1 -0
  44. package/dist/__tests__/middleware/csrf.test.js +247 -0
  45. package/dist/__tests__/middleware/global-middleware.test.d.ts +2 -0
  46. package/dist/__tests__/middleware/global-middleware.test.d.ts.map +1 -0
  47. package/dist/__tests__/middleware/global-middleware.test.js +259 -0
  48. package/dist/__tests__/middleware/rate-limit.test.d.ts +2 -0
  49. package/dist/__tests__/middleware/rate-limit.test.d.ts.map +1 -0
  50. package/dist/__tests__/middleware/rate-limit.test.js +264 -0
  51. package/dist/__tests__/middleware/security-headers.test.d.ts +2 -0
  52. package/dist/__tests__/middleware/security-headers.test.d.ts.map +1 -0
  53. package/dist/__tests__/middleware/security-headers.test.js +229 -0
  54. package/dist/__tests__/middleware/timeout.test.d.ts +2 -0
  55. package/dist/__tests__/middleware/timeout.test.d.ts.map +1 -0
  56. package/dist/__tests__/middleware/timeout.test.js +132 -0
  57. package/dist/__tests__/middleware.test.d.ts +2 -0
  58. package/dist/__tests__/middleware.test.d.ts.map +1 -0
  59. package/dist/__tests__/middleware.test.js +180 -0
  60. package/dist/__tests__/pipes/pipe.test.d.ts +2 -0
  61. package/dist/__tests__/pipes/pipe.test.d.ts.map +1 -0
  62. package/dist/__tests__/pipes/pipe.test.js +245 -0
  63. package/dist/__tests__/pipes/validation.pipe.test.d.ts +2 -0
  64. package/dist/__tests__/pipes/validation.pipe.test.d.ts.map +1 -0
  65. package/dist/__tests__/pipes/validation.pipe.test.js +297 -0
  66. package/dist/__tests__/request-parser.test.d.ts +2 -0
  67. package/dist/__tests__/request-parser.test.d.ts.map +1 -0
  68. package/dist/__tests__/request-parser.test.js +182 -0
  69. package/dist/__tests__/router.test.d.ts +2 -0
  70. package/dist/__tests__/router.test.d.ts.map +1 -0
  71. package/dist/__tests__/router.test.js +1183 -0
  72. package/dist/__tests__/routing/route-matcher.test.d.ts +2 -0
  73. package/dist/__tests__/routing/route-matcher.test.d.ts.map +1 -0
  74. package/dist/__tests__/routing/route-matcher.test.js +219 -0
  75. package/dist/__tests__/routing/version.decorator.test.d.ts +2 -0
  76. package/dist/__tests__/routing/version.decorator.test.d.ts.map +1 -0
  77. package/dist/__tests__/routing/version.decorator.test.js +298 -0
  78. package/dist/__tests__/service.test.d.ts +2 -0
  79. package/dist/__tests__/service.test.d.ts.map +1 -0
  80. package/dist/__tests__/service.test.js +121 -0
  81. package/dist/__tests__/shutdown.test.d.ts +2 -0
  82. package/dist/__tests__/shutdown.test.d.ts.map +1 -0
  83. package/dist/__tests__/shutdown.test.js +250 -0
  84. package/dist/__tests__/testing/testing.module.test.d.ts +2 -0
  85. package/dist/__tests__/testing/testing.module.test.d.ts.map +1 -0
  86. package/dist/__tests__/testing/testing.module.test.js +370 -0
  87. package/dist/__tests__/upload/file-upload.test.d.ts +2 -0
  88. package/dist/__tests__/upload/file-upload.test.d.ts.map +1 -0
  89. package/dist/__tests__/upload/file-upload.test.js +498 -0
  90. package/dist/__tests__/utils/sanitize.test.d.ts +2 -0
  91. package/dist/__tests__/utils/sanitize.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/sanitize.test.js +291 -0
  93. package/dist/__tests__/validator.test.d.ts +2 -0
  94. package/dist/__tests__/validator.test.d.ts.map +1 -0
  95. package/dist/__tests__/validator.test.js +300 -0
  96. package/dist/container.d.ts +80 -0
  97. package/dist/container.d.ts.map +1 -0
  98. package/dist/container.js +271 -0
  99. package/dist/decorators.d.ts +166 -0
  100. package/dist/decorators.d.ts.map +1 -0
  101. package/dist/decorators.js +538 -0
  102. package/dist/errors/http.error.d.ts +34 -0
  103. package/dist/errors/http.error.d.ts.map +1 -0
  104. package/dist/errors/http.error.js +69 -0
  105. package/dist/filters/exception-filter.d.ts +39 -0
  106. package/dist/filters/exception-filter.d.ts.map +1 -0
  107. package/dist/filters/exception-filter.js +38 -0
  108. package/dist/filters/http-exception.filter.d.ts +9 -0
  109. package/dist/filters/http-exception.filter.d.ts.map +1 -0
  110. package/dist/filters/http-exception.filter.js +42 -0
  111. package/dist/hazel-app.d.ts +94 -0
  112. package/dist/hazel-app.d.ts.map +1 -0
  113. package/dist/hazel-app.js +516 -0
  114. package/dist/hazel-module.d.ts +29 -0
  115. package/dist/hazel-module.d.ts.map +1 -0
  116. package/dist/hazel-module.js +137 -0
  117. package/dist/hazel-response.d.ts +25 -0
  118. package/dist/hazel-response.d.ts.map +1 -0
  119. package/dist/hazel-response.js +89 -0
  120. package/dist/health.d.ts +73 -0
  121. package/dist/health.d.ts.map +1 -0
  122. package/dist/health.js +174 -0
  123. package/dist/index.d.ts +41 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +159 -0
  126. package/dist/interceptors/interceptor.d.ts +30 -0
  127. package/dist/interceptors/interceptor.d.ts.map +1 -0
  128. package/dist/interceptors/interceptor.js +71 -0
  129. package/dist/logger.d.ts +8 -0
  130. package/dist/logger.d.ts.map +1 -0
  131. package/dist/logger.js +261 -0
  132. package/dist/middleware/cors.middleware.d.ts +44 -0
  133. package/dist/middleware/cors.middleware.d.ts.map +1 -0
  134. package/dist/middleware/cors.middleware.js +118 -0
  135. package/dist/middleware/csrf.middleware.d.ts +82 -0
  136. package/dist/middleware/csrf.middleware.d.ts.map +1 -0
  137. package/dist/middleware/csrf.middleware.js +183 -0
  138. package/dist/middleware/global-middleware.d.ts +111 -0
  139. package/dist/middleware/global-middleware.d.ts.map +1 -0
  140. package/dist/middleware/global-middleware.js +179 -0
  141. package/dist/middleware/rate-limit.middleware.d.ts +73 -0
  142. package/dist/middleware/rate-limit.middleware.d.ts.map +1 -0
  143. package/dist/middleware/rate-limit.middleware.js +124 -0
  144. package/dist/middleware/security-headers.middleware.d.ts +76 -0
  145. package/dist/middleware/security-headers.middleware.d.ts.map +1 -0
  146. package/dist/middleware/security-headers.middleware.js +123 -0
  147. package/dist/middleware/timeout.middleware.d.ts +25 -0
  148. package/dist/middleware/timeout.middleware.d.ts.map +1 -0
  149. package/dist/middleware/timeout.middleware.js +74 -0
  150. package/dist/middleware.d.ts +13 -0
  151. package/dist/middleware.d.ts.map +1 -0
  152. package/dist/middleware.js +47 -0
  153. package/dist/pipes/pipe.d.ts +50 -0
  154. package/dist/pipes/pipe.d.ts.map +1 -0
  155. package/dist/pipes/pipe.js +96 -0
  156. package/dist/pipes/validation.pipe.d.ts +6 -0
  157. package/dist/pipes/validation.pipe.d.ts.map +1 -0
  158. package/dist/pipes/validation.pipe.js +61 -0
  159. package/dist/request-context.d.ts +22 -0
  160. package/dist/request-context.d.ts.map +1 -0
  161. package/dist/request-context.js +2 -0
  162. package/dist/request-parser.d.ts +7 -0
  163. package/dist/request-parser.d.ts.map +1 -0
  164. package/dist/request-parser.js +60 -0
  165. package/dist/router.d.ts +33 -0
  166. package/dist/router.d.ts.map +1 -0
  167. package/dist/router.js +506 -0
  168. package/dist/routing/route-matcher.d.ts +39 -0
  169. package/dist/routing/route-matcher.d.ts.map +1 -0
  170. package/dist/routing/route-matcher.js +93 -0
  171. package/dist/routing/version.decorator.d.ts +36 -0
  172. package/dist/routing/version.decorator.d.ts.map +1 -0
  173. package/dist/routing/version.decorator.js +89 -0
  174. package/dist/service.d.ts +9 -0
  175. package/dist/service.d.ts.map +1 -0
  176. package/dist/service.js +39 -0
  177. package/dist/shutdown.d.ts +32 -0
  178. package/dist/shutdown.d.ts.map +1 -0
  179. package/dist/shutdown.js +109 -0
  180. package/dist/testing/testing.module.d.ts +83 -0
  181. package/dist/testing/testing.module.d.ts.map +1 -0
  182. package/dist/testing/testing.module.js +164 -0
  183. package/dist/types.d.ts +82 -0
  184. package/dist/types.d.ts.map +1 -0
  185. package/dist/types.js +2 -0
  186. package/dist/upload/file-upload.d.ts +75 -0
  187. package/dist/upload/file-upload.d.ts.map +1 -0
  188. package/dist/upload/file-upload.js +261 -0
  189. package/dist/utils/sanitize.d.ts +45 -0
  190. package/dist/utils/sanitize.d.ts.map +1 -0
  191. package/dist/utils/sanitize.js +165 -0
  192. package/dist/validator.d.ts +7 -0
  193. package/dist/validator.d.ts.map +1 -0
  194. package/dist/validator.js +119 -0
  195. package/package.json +67 -0
package/dist/index.js ADDED
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * HazelJS Core Framework
4
+ * A modern, modular Node.js framework with TypeScript support
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.UnauthorizedError = exports.BadRequestError = exports.HttpError = exports.Scope = exports.Container = exports.CUSTOM_METADATA_PREFIX = exports.createParamDecorator = exports.getMetadata = exports.SetMetadata = exports.ApiOperation = exports.ApiTags = exports.Retry = exports.Session = exports.Optional = exports.Timeout = exports.AITask = exports.SkipAuth = exports.Public = exports.UseGuards = exports.UseInterceptors = exports.UsePipes = exports.Inject = exports.Redirect = exports.Header = exports.HttpCode = exports.Headers = exports.Host = exports.Ip = exports.Res = exports.Req = exports.Query = exports.Param = exports.Body = exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = exports.Service = exports.Injectable = exports.Controller = exports.TimeoutMiddleware = exports.BuiltInHealthChecks = exports.HealthCheckManager = exports.ShutdownManager = exports.getModuleMetadata = exports.HazelModuleInstance = exports.Module = exports.HazelModule = exports.HazelApp = void 0;
11
+ exports.escapeHtml = exports.sanitizeObject = exports.sanitizeSql = exports.sanitizeEmail = exports.sanitizeUrl = exports.sanitizeString = exports.sanitizeHtml = exports.RequestParser = exports.Router = exports.Validator = exports.default = exports.logger = exports.UploadedFiles = exports.UploadedFile = exports.FileUploadInterceptor = exports.CsrfMiddleware = exports.RateLimitMiddleware = exports.SecurityHeadersMiddleware = exports.LoggerMiddleware = exports.CorsMiddleware = exports.GlobalMiddlewareManager = exports.extractVersion = exports.matchVersion = exports.getVersionMetadata = exports.VersioningType = exports.Version = exports.RouteMatcher = exports.TestingModuleBuilder = exports.TestingModule = exports.Test = exports.HttpExceptionFilter = exports.getFilterExceptions = exports.Catch = exports.ArgumentsHostImpl = exports.RetryInterceptor = exports.ValidationPipe = exports.ParseIntPipe = exports.ValidationError = exports.RequestTimeoutError = exports.InternalServerErrorException = exports.ConflictException = exports.NotFoundException = exports.ForbiddenException = exports.UnauthorizedException = exports.BadRequestException = exports.HttpException = exports.InternalServerError = exports.ConflictError = exports.NotFoundError = exports.ForbiddenError = void 0;
12
+ // Import reflect-metadata to enable decorator metadata
13
+ // Users don't need to import this manually
14
+ require("reflect-metadata");
15
+ // Core exports
16
+ var hazel_app_1 = require("./hazel-app");
17
+ Object.defineProperty(exports, "HazelApp", { enumerable: true, get: function () { return hazel_app_1.HazelApp; } });
18
+ var hazel_module_1 = require("./hazel-module");
19
+ Object.defineProperty(exports, "HazelModule", { enumerable: true, get: function () { return hazel_module_1.HazelModule; } });
20
+ Object.defineProperty(exports, "Module", { enumerable: true, get: function () { return hazel_module_1.Module; } });
21
+ Object.defineProperty(exports, "HazelModuleInstance", { enumerable: true, get: function () { return hazel_module_1.HazelModuleInstance; } });
22
+ Object.defineProperty(exports, "getModuleMetadata", { enumerable: true, get: function () { return hazel_module_1.getModuleMetadata; } });
23
+ // Shutdown & Health
24
+ var shutdown_1 = require("./shutdown");
25
+ Object.defineProperty(exports, "ShutdownManager", { enumerable: true, get: function () { return shutdown_1.ShutdownManager; } });
26
+ var health_1 = require("./health");
27
+ Object.defineProperty(exports, "HealthCheckManager", { enumerable: true, get: function () { return health_1.HealthCheckManager; } });
28
+ Object.defineProperty(exports, "BuiltInHealthChecks", { enumerable: true, get: function () { return health_1.BuiltInHealthChecks; } });
29
+ // Timeout Middleware (new)
30
+ var timeout_middleware_1 = require("./middleware/timeout.middleware");
31
+ Object.defineProperty(exports, "TimeoutMiddleware", { enumerable: true, get: function () { return timeout_middleware_1.TimeoutMiddleware; } });
32
+ // Decorators
33
+ var decorators_1 = require("./decorators");
34
+ Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return decorators_1.Controller; } });
35
+ Object.defineProperty(exports, "Injectable", { enumerable: true, get: function () { return decorators_1.Injectable; } });
36
+ Object.defineProperty(exports, "Service", { enumerable: true, get: function () { return decorators_1.Service; } });
37
+ Object.defineProperty(exports, "Get", { enumerable: true, get: function () { return decorators_1.Get; } });
38
+ Object.defineProperty(exports, "Post", { enumerable: true, get: function () { return decorators_1.Post; } });
39
+ Object.defineProperty(exports, "Put", { enumerable: true, get: function () { return decorators_1.Put; } });
40
+ Object.defineProperty(exports, "Delete", { enumerable: true, get: function () { return decorators_1.Delete; } });
41
+ Object.defineProperty(exports, "Patch", { enumerable: true, get: function () { return decorators_1.Patch; } });
42
+ Object.defineProperty(exports, "Body", { enumerable: true, get: function () { return decorators_1.Body; } });
43
+ Object.defineProperty(exports, "Param", { enumerable: true, get: function () { return decorators_1.Param; } });
44
+ Object.defineProperty(exports, "Query", { enumerable: true, get: function () { return decorators_1.Query; } });
45
+ Object.defineProperty(exports, "Req", { enumerable: true, get: function () { return decorators_1.Req; } });
46
+ Object.defineProperty(exports, "Res", { enumerable: true, get: function () { return decorators_1.Res; } });
47
+ Object.defineProperty(exports, "Ip", { enumerable: true, get: function () { return decorators_1.Ip; } });
48
+ Object.defineProperty(exports, "Host", { enumerable: true, get: function () { return decorators_1.Host; } });
49
+ Object.defineProperty(exports, "Headers", { enumerable: true, get: function () { return decorators_1.Headers; } });
50
+ Object.defineProperty(exports, "HttpCode", { enumerable: true, get: function () { return decorators_1.HttpCode; } });
51
+ Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return decorators_1.Header; } });
52
+ Object.defineProperty(exports, "Redirect", { enumerable: true, get: function () { return decorators_1.Redirect; } });
53
+ Object.defineProperty(exports, "Inject", { enumerable: true, get: function () { return decorators_1.Inject; } });
54
+ Object.defineProperty(exports, "UsePipes", { enumerable: true, get: function () { return decorators_1.UsePipes; } });
55
+ Object.defineProperty(exports, "UseInterceptors", { enumerable: true, get: function () { return decorators_1.UseInterceptors; } });
56
+ Object.defineProperty(exports, "UseGuards", { enumerable: true, get: function () { return decorators_1.UseGuards; } });
57
+ Object.defineProperty(exports, "Public", { enumerable: true, get: function () { return decorators_1.Public; } });
58
+ Object.defineProperty(exports, "SkipAuth", { enumerable: true, get: function () { return decorators_1.SkipAuth; } });
59
+ Object.defineProperty(exports, "AITask", { enumerable: true, get: function () { return decorators_1.AITask; } });
60
+ Object.defineProperty(exports, "Timeout", { enumerable: true, get: function () { return decorators_1.Timeout; } });
61
+ Object.defineProperty(exports, "Optional", { enumerable: true, get: function () { return decorators_1.Optional; } });
62
+ Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return decorators_1.Session; } });
63
+ Object.defineProperty(exports, "Retry", { enumerable: true, get: function () { return decorators_1.Retry; } });
64
+ Object.defineProperty(exports, "ApiTags", { enumerable: true, get: function () { return decorators_1.ApiTags; } });
65
+ Object.defineProperty(exports, "ApiOperation", { enumerable: true, get: function () { return decorators_1.ApiOperation; } });
66
+ Object.defineProperty(exports, "SetMetadata", { enumerable: true, get: function () { return decorators_1.SetMetadata; } });
67
+ Object.defineProperty(exports, "getMetadata", { enumerable: true, get: function () { return decorators_1.getMetadata; } });
68
+ Object.defineProperty(exports, "createParamDecorator", { enumerable: true, get: function () { return decorators_1.createParamDecorator; } });
69
+ Object.defineProperty(exports, "CUSTOM_METADATA_PREFIX", { enumerable: true, get: function () { return decorators_1.CUSTOM_METADATA_PREFIX; } });
70
+ // Container & DI
71
+ var container_1 = require("./container");
72
+ Object.defineProperty(exports, "Container", { enumerable: true, get: function () { return container_1.Container; } });
73
+ Object.defineProperty(exports, "Scope", { enumerable: true, get: function () { return container_1.Scope; } });
74
+ // Errors
75
+ var http_error_1 = require("./errors/http.error");
76
+ Object.defineProperty(exports, "HttpError", { enumerable: true, get: function () { return http_error_1.HttpError; } });
77
+ Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return http_error_1.BadRequestError; } });
78
+ Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return http_error_1.UnauthorizedError; } });
79
+ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return http_error_1.ForbiddenError; } });
80
+ Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return http_error_1.NotFoundError; } });
81
+ Object.defineProperty(exports, "ConflictError", { enumerable: true, get: function () { return http_error_1.ConflictError; } });
82
+ Object.defineProperty(exports, "InternalServerError", { enumerable: true, get: function () { return http_error_1.InternalServerError; } });
83
+ Object.defineProperty(exports, "HttpException", { enumerable: true, get: function () { return http_error_1.HttpException; } });
84
+ Object.defineProperty(exports, "BadRequestException", { enumerable: true, get: function () { return http_error_1.BadRequestException; } });
85
+ Object.defineProperty(exports, "UnauthorizedException", { enumerable: true, get: function () { return http_error_1.UnauthorizedException; } });
86
+ Object.defineProperty(exports, "ForbiddenException", { enumerable: true, get: function () { return http_error_1.ForbiddenException; } });
87
+ Object.defineProperty(exports, "NotFoundException", { enumerable: true, get: function () { return http_error_1.NotFoundException; } });
88
+ Object.defineProperty(exports, "ConflictException", { enumerable: true, get: function () { return http_error_1.ConflictException; } });
89
+ Object.defineProperty(exports, "InternalServerErrorException", { enumerable: true, get: function () { return http_error_1.InternalServerErrorException; } });
90
+ Object.defineProperty(exports, "RequestTimeoutError", { enumerable: true, get: function () { return http_error_1.RequestTimeoutError; } });
91
+ // Pipes
92
+ var pipe_1 = require("./pipes/pipe");
93
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return pipe_1.ValidationError; } });
94
+ Object.defineProperty(exports, "ParseIntPipe", { enumerable: true, get: function () { return pipe_1.ParseIntPipe; } });
95
+ var validation_pipe_1 = require("./pipes/validation.pipe");
96
+ Object.defineProperty(exports, "ValidationPipe", { enumerable: true, get: function () { return validation_pipe_1.ValidationPipe; } });
97
+ // Interceptors
98
+ var interceptor_1 = require("./interceptors/interceptor");
99
+ Object.defineProperty(exports, "RetryInterceptor", { enumerable: true, get: function () { return interceptor_1.RetryInterceptor; } });
100
+ // Filters
101
+ var exception_filter_1 = require("./filters/exception-filter");
102
+ Object.defineProperty(exports, "ArgumentsHostImpl", { enumerable: true, get: function () { return exception_filter_1.ArgumentsHostImpl; } });
103
+ Object.defineProperty(exports, "Catch", { enumerable: true, get: function () { return exception_filter_1.Catch; } });
104
+ Object.defineProperty(exports, "getFilterExceptions", { enumerable: true, get: function () { return exception_filter_1.getFilterExceptions; } });
105
+ var http_exception_filter_1 = require("./filters/http-exception.filter");
106
+ Object.defineProperty(exports, "HttpExceptionFilter", { enumerable: true, get: function () { return http_exception_filter_1.HttpExceptionFilter; } });
107
+ // Testing
108
+ var testing_module_1 = require("./testing/testing.module");
109
+ Object.defineProperty(exports, "Test", { enumerable: true, get: function () { return testing_module_1.Test; } });
110
+ Object.defineProperty(exports, "TestingModule", { enumerable: true, get: function () { return testing_module_1.TestingModule; } });
111
+ Object.defineProperty(exports, "TestingModuleBuilder", { enumerable: true, get: function () { return testing_module_1.TestingModuleBuilder; } });
112
+ // Routing
113
+ var route_matcher_1 = require("./routing/route-matcher");
114
+ Object.defineProperty(exports, "RouteMatcher", { enumerable: true, get: function () { return route_matcher_1.RouteMatcher; } });
115
+ var version_decorator_1 = require("./routing/version.decorator");
116
+ Object.defineProperty(exports, "Version", { enumerable: true, get: function () { return version_decorator_1.Version; } });
117
+ Object.defineProperty(exports, "VersioningType", { enumerable: true, get: function () { return version_decorator_1.VersioningType; } });
118
+ Object.defineProperty(exports, "getVersionMetadata", { enumerable: true, get: function () { return version_decorator_1.getVersionMetadata; } });
119
+ Object.defineProperty(exports, "matchVersion", { enumerable: true, get: function () { return version_decorator_1.matchVersion; } });
120
+ Object.defineProperty(exports, "extractVersion", { enumerable: true, get: function () { return version_decorator_1.extractVersion; } });
121
+ // Middleware
122
+ var global_middleware_1 = require("./middleware/global-middleware");
123
+ Object.defineProperty(exports, "GlobalMiddlewareManager", { enumerable: true, get: function () { return global_middleware_1.GlobalMiddlewareManager; } });
124
+ Object.defineProperty(exports, "CorsMiddleware", { enumerable: true, get: function () { return global_middleware_1.CorsMiddleware; } });
125
+ Object.defineProperty(exports, "LoggerMiddleware", { enumerable: true, get: function () { return global_middleware_1.LoggerMiddleware; } });
126
+ var security_headers_middleware_1 = require("./middleware/security-headers.middleware");
127
+ Object.defineProperty(exports, "SecurityHeadersMiddleware", { enumerable: true, get: function () { return security_headers_middleware_1.SecurityHeadersMiddleware; } });
128
+ var rate_limit_middleware_1 = require("./middleware/rate-limit.middleware");
129
+ Object.defineProperty(exports, "RateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_middleware_1.RateLimitMiddleware; } });
130
+ var csrf_middleware_1 = require("./middleware/csrf.middleware");
131
+ Object.defineProperty(exports, "CsrfMiddleware", { enumerable: true, get: function () { return csrf_middleware_1.CsrfMiddleware; } });
132
+ // File Upload
133
+ var file_upload_1 = require("./upload/file-upload");
134
+ Object.defineProperty(exports, "FileUploadInterceptor", { enumerable: true, get: function () { return file_upload_1.FileUploadInterceptor; } });
135
+ Object.defineProperty(exports, "UploadedFile", { enumerable: true, get: function () { return file_upload_1.UploadedFileDecorator; } });
136
+ Object.defineProperty(exports, "UploadedFiles", { enumerable: true, get: function () { return file_upload_1.UploadedFilesDecorator; } });
137
+ // Logger
138
+ var logger_1 = require("./logger");
139
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return __importDefault(logger_1).default; } });
140
+ var logger_2 = require("./logger");
141
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(logger_2).default; } });
142
+ // Validator
143
+ var validator_1 = require("./validator");
144
+ Object.defineProperty(exports, "Validator", { enumerable: true, get: function () { return validator_1.Validator; } });
145
+ // Router
146
+ var router_1 = require("./router");
147
+ Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return router_1.Router; } });
148
+ // Request utilities
149
+ var request_parser_1 = require("./request-parser");
150
+ Object.defineProperty(exports, "RequestParser", { enumerable: true, get: function () { return request_parser_1.RequestParser; } });
151
+ // Security utilities
152
+ var sanitize_1 = require("./utils/sanitize");
153
+ Object.defineProperty(exports, "sanitizeHtml", { enumerable: true, get: function () { return sanitize_1.sanitizeHtml; } });
154
+ Object.defineProperty(exports, "sanitizeString", { enumerable: true, get: function () { return sanitize_1.sanitizeString; } });
155
+ Object.defineProperty(exports, "sanitizeUrl", { enumerable: true, get: function () { return sanitize_1.sanitizeUrl; } });
156
+ Object.defineProperty(exports, "sanitizeEmail", { enumerable: true, get: function () { return sanitize_1.sanitizeEmail; } });
157
+ Object.defineProperty(exports, "sanitizeSql", { enumerable: true, get: function () { return sanitize_1.sanitizeSql; } });
158
+ Object.defineProperty(exports, "sanitizeObject", { enumerable: true, get: function () { return sanitize_1.sanitizeObject; } });
159
+ Object.defineProperty(exports, "escapeHtml", { enumerable: true, get: function () { return sanitize_1.escapeHtml; } });
@@ -0,0 +1,30 @@
1
+ import { RequestContext } from '../request-context';
2
+ export interface Interceptor {
3
+ intercept(context: RequestContext, next: () => Promise<unknown>): Promise<unknown>;
4
+ }
5
+ export interface InterceptorMetadata {
6
+ type: Type<Interceptor>;
7
+ options?: unknown;
8
+ }
9
+ export interface CacheOptions {
10
+ ttl?: number;
11
+ }
12
+ export declare class LoggingInterceptor implements Interceptor {
13
+ intercept(context: RequestContext, next: () => Promise<unknown>): Promise<unknown>;
14
+ }
15
+ export declare class CacheInterceptor implements Interceptor {
16
+ private static cache;
17
+ private readonly ttl;
18
+ constructor(options?: CacheOptions);
19
+ intercept(context: RequestContext, next: () => Promise<unknown>): Promise<unknown>;
20
+ }
21
+ export interface RetryOptions {
22
+ count: number;
23
+ delay?: number;
24
+ retryIf?: (err: Error) => boolean;
25
+ }
26
+ export declare class RetryInterceptor implements Interceptor {
27
+ intercept(context: RequestContext, next: () => Promise<unknown>): Promise<unknown>;
28
+ }
29
+ export type Type<T = unknown> = new (...args: unknown[]) => T;
30
+ //# sourceMappingURL=interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/interceptors/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,kBAAmB,YAAW,WAAW;IAC9C,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAgBzF;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAA2D;IAC/E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,OAAO,CAAC,EAAE,YAAY;IAI5B,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAgBzF;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;CACnC;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAC5C,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAqBzF;AAED,MAAM,MAAM,IAAI,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RetryInterceptor = exports.CacheInterceptor = exports.LoggingInterceptor = void 0;
7
+ const logger_1 = __importDefault(require("../logger"));
8
+ class LoggingInterceptor {
9
+ async intercept(context, next) {
10
+ const startTime = Date.now();
11
+ logger_1.default.info(`[${context.method}] ${context.url}`);
12
+ try {
13
+ const result = await next();
14
+ const duration = Date.now() - startTime;
15
+ logger_1.default.info(`[${context.method}] ${context.url} - ${duration}ms`);
16
+ return result;
17
+ }
18
+ catch (error) {
19
+ const duration = Date.now() - startTime;
20
+ const err = error;
21
+ logger_1.default.error(`[${context.method}] ${context.url} - ${err.message} (${duration}ms)`);
22
+ throw error;
23
+ }
24
+ }
25
+ }
26
+ exports.LoggingInterceptor = LoggingInterceptor;
27
+ class CacheInterceptor {
28
+ constructor(options) {
29
+ this.ttl = options?.ttl || 60000;
30
+ }
31
+ async intercept(context, next) {
32
+ if (context.method !== 'GET') {
33
+ return next();
34
+ }
35
+ const cacheKey = `${context.method}:${context.url}`;
36
+ const cached = CacheInterceptor.cache.get(cacheKey);
37
+ if (cached && Date.now() - cached.timestamp < this.ttl) {
38
+ return cached.data;
39
+ }
40
+ const result = await next();
41
+ CacheInterceptor.cache.set(cacheKey, { data: result, timestamp: Date.now() });
42
+ return result;
43
+ }
44
+ }
45
+ exports.CacheInterceptor = CacheInterceptor;
46
+ CacheInterceptor.cache = new Map();
47
+ class RetryInterceptor {
48
+ async intercept(context, next) {
49
+ const opts = context.retryOptions;
50
+ if (!opts || opts.count < 1) {
51
+ return next();
52
+ }
53
+ const delayMs = opts.delay ?? 100;
54
+ const shouldRetry = opts.retryIf ?? (() => true);
55
+ let lastError;
56
+ for (let attempt = 0; attempt <= opts.count; attempt++) {
57
+ try {
58
+ return await next();
59
+ }
60
+ catch (err) {
61
+ lastError = err instanceof Error ? err : new Error(String(err));
62
+ if (attempt === opts.count || !shouldRetry(lastError)) {
63
+ throw lastError;
64
+ }
65
+ await new Promise((r) => setTimeout(r, delayMs));
66
+ }
67
+ }
68
+ throw lastError;
69
+ }
70
+ }
71
+ exports.RetryInterceptor = RetryInterceptor;
@@ -0,0 +1,8 @@
1
+ import winston from 'winston';
2
+ import { IncomingMessage, ServerResponse } from 'http';
3
+ export declare const requestLogger: (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
4
+ declare const enhancedLogger: winston.Logger & {
5
+ isDebugEnabled: () => boolean;
6
+ };
7
+ export default enhancedLogger;
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAK9B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAwQvD,eAAO,MAAM,aAAa,GACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,MAAM,MAAM,IAAI,KACf,IAyBF,CAAC;AAQF,QAAA,MAAM,cAAc;0BALO,OAAO;CAOhC,CAAC;AAGH,eAAe,cAAc,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.requestLogger = void 0;
7
+ const winston_1 = __importDefault(require("winston"));
8
+ const dotenv_1 = __importDefault(require("dotenv"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ // Load environment variables
13
+ dotenv_1.default.config();
14
+ const logLevel = process.env.LOG_LEVEL || 'info';
15
+ const logDir = process.env.LOG_DIR || 'logs';
16
+ const logEnabled = process.env.LOG_ENABLED !== 'false'; // default: true
17
+ const logPackage = process.env.LOG_PACKAGE || ''; // e.g. "http" = only HTTP request logs
18
+ // Ensure log directory exists
19
+ if (logDir && !fs_1.default.existsSync(logDir)) {
20
+ fs_1.default.mkdirSync(logDir, { recursive: true });
21
+ }
22
+ // Professional color scheme for different log levels
23
+ const colors = {
24
+ error: chalk_1.default.red,
25
+ warn: chalk_1.default.yellow,
26
+ info: chalk_1.default.blue,
27
+ http: chalk_1.default.magenta,
28
+ debug: chalk_1.default.gray,
29
+ silly: chalk_1.default.gray,
30
+ };
31
+ // Professional category-based coloring
32
+ const categoryColors = {
33
+ // Module operations
34
+ 'Initializing HazelModule': chalk_1.default.blue.bold,
35
+ 'Initializing module': chalk_1.default.blue.bold,
36
+ 'Initializing imported modules': chalk_1.default.blue,
37
+ 'Initializing HazelApp': chalk_1.default.cyan.bold,
38
+ // Provider operations
39
+ 'Registering providers': chalk_1.default.green.bold,
40
+ 'Registering provider': chalk_1.default.green,
41
+ 'Created instance of': chalk_1.default.green,
42
+ // Controller operations
43
+ 'Registering controllers': chalk_1.default.yellow.bold,
44
+ 'Registering controller': chalk_1.default.yellow,
45
+ // Route operations
46
+ 'Registering route': chalk_1.default.magenta.bold,
47
+ // Server operations
48
+ 'Server listening on': chalk_1.default.green.bold,
49
+ 'Application started': chalk_1.default.cyan.bold,
50
+ 'Connected to database': chalk_1.default.green.bold,
51
+ 'Disconnected from database': chalk_1.default.yellow,
52
+ // Cache operations
53
+ 'Cache service initialized': chalk_1.default.blue,
54
+ 'Cache registered': chalk_1.default.green,
55
+ 'Configuring cache module': chalk_1.default.blue,
56
+ // Configuration
57
+ 'Configuration loaded': chalk_1.default.green,
58
+ Configuring: chalk_1.default.blue,
59
+ // Container
60
+ 'Container initialized': chalk_1.default.cyan.bold,
61
+ };
62
+ // Helper to detect log category and apply appropriate color
63
+ const getCategoryColor = (message) => {
64
+ for (const [category, colorFn] of Object.entries(categoryColors)) {
65
+ if (message.includes(category)) {
66
+ return colorFn;
67
+ }
68
+ }
69
+ return chalk_1.default.white;
70
+ };
71
+ // Custom format for better readability with enhanced colors
72
+ const customFormat = winston_1.default.format.printf((info) => {
73
+ const { level, message, timestamp, ...metadata } = info;
74
+ // Get the appropriate color for the log level
75
+ const levelColor = colors[level] || chalk_1.default.white;
76
+ // Format the timestamp with subtle color
77
+ const time = chalk_1.default.gray.dim(String(timestamp ?? ''));
78
+ // Format the level with color and padding (no icons for professional look)
79
+ const levelStr = levelColor.bold(`[${String(level).toUpperCase()}]`.padEnd(9));
80
+ // Convert message to string
81
+ const messageStr = String(message ?? '');
82
+ // Detect category and apply appropriate color to message
83
+ const categoryColor = getCategoryColor(messageStr);
84
+ let msg = categoryColor(messageStr);
85
+ // Special formatting for important messages
86
+ if (messageStr.includes('Server listening on')) {
87
+ msg = chalk_1.default.green.bold(messageStr);
88
+ }
89
+ else if (messageStr.includes('Application started')) {
90
+ msg = chalk_1.default.cyan.bold(messageStr);
91
+ }
92
+ else if (messageStr.includes('→ Local:') || messageStr.includes('→ Network:')) {
93
+ msg = chalk_1.default.green(messageStr);
94
+ }
95
+ // Format metadata if present with enhanced colors
96
+ let metaStr = '';
97
+ if (Object.keys(metadata).length > 0) {
98
+ metaStr = Object.entries(metadata)
99
+ .map(([key, value]) => {
100
+ // Color keys based on their type
101
+ let keyColor = chalk_1.default.cyan;
102
+ if (key.includes('module') || key.includes('Module')) {
103
+ keyColor = chalk_1.default.blue;
104
+ }
105
+ else if (key.includes('provider') ||
106
+ key.includes('Provider') ||
107
+ key.includes('Service')) {
108
+ keyColor = chalk_1.default.green;
109
+ }
110
+ else if (key.includes('controller') || key.includes('Controller')) {
111
+ keyColor = chalk_1.default.yellow;
112
+ }
113
+ else if (key.includes('route') || key.includes('Route')) {
114
+ keyColor = chalk_1.default.magenta;
115
+ }
116
+ const formattedKey = keyColor.bold(key);
117
+ // Use a custom replacer function to handle circular references
118
+ const seen = new WeakSet();
119
+ const safeValue = JSON.stringify(value, (key, val) => {
120
+ // Skip known circular references
121
+ if (key === 'socket' || key === 'parser' || key === 'res' || key === 'req') {
122
+ return '[Circular]';
123
+ }
124
+ // Skip Node.js internal objects
125
+ if (key === '_idlePrev' || key === '_idleNext' || key === 'cleanupInterval') {
126
+ return '[Internal]';
127
+ }
128
+ // Handle circular references
129
+ if (typeof val === 'object' && val !== null) {
130
+ if (seen.has(val)) {
131
+ return '[Circular]';
132
+ }
133
+ seen.add(val);
134
+ }
135
+ return val;
136
+ });
137
+ // Color values based on their content
138
+ let valueColor = chalk_1.default.yellow;
139
+ if (typeof value === 'string') {
140
+ if (value.includes('Module') ||
141
+ value.includes('Service') ||
142
+ value.includes('Controller')) {
143
+ valueColor = chalk_1.default.cyan;
144
+ }
145
+ else if (value.includes('http://') || value.includes('localhost')) {
146
+ valueColor = chalk_1.default.green;
147
+ }
148
+ }
149
+ const formattedValue = valueColor(safeValue);
150
+ return `${formattedKey}=${formattedValue}`;
151
+ })
152
+ .join(' ');
153
+ metaStr = chalk_1.default.gray.dim(' | ') + metaStr;
154
+ }
155
+ return `${time} ${levelStr} ${msg}${metaStr}`;
156
+ });
157
+ // When LOG_PACKAGE=http, only allow logs that look like HTTP requests
158
+ const isHttpLog = (info) => {
159
+ const msg = String(info.message ?? '');
160
+ return /^(GET|POST|PUT|PATCH|DELETE|OPTIONS|HEAD)\s+/i.test(msg) || msg.includes(' → ') || msg.includes(' ← ');
161
+ };
162
+ const transports = [];
163
+ if (logEnabled) {
164
+ if (logPackage === 'http') {
165
+ transports.push(new winston_1.default.transports.Console({
166
+ format: winston_1.default.format.combine(winston_1.default.format((info) => (isHttpLog(info) ? info : false))(), customFormat),
167
+ }));
168
+ }
169
+ else {
170
+ transports.push(new winston_1.default.transports.Console({
171
+ format: winston_1.default.format.combine(customFormat),
172
+ }));
173
+ }
174
+ if (logDir) {
175
+ transports.push(new winston_1.default.transports.File({
176
+ filename: path_1.default.join(logDir, 'combined.log'),
177
+ format: winston_1.default.format.combine(winston_1.default.format.timestamp(), winston_1.default.format.printf((info) => {
178
+ const { level, message, timestamp, ...metadata } = info;
179
+ let msg = `${timestamp} [${String(level).toUpperCase()}] ${message}`;
180
+ if (Object.keys(metadata).length > 0) {
181
+ msg += ` | ${JSON.stringify(metadata, (key, val) => {
182
+ if (key === 'socket' || key === 'parser' || key === 'res' || key === 'req') {
183
+ return '[Circular]';
184
+ }
185
+ return val;
186
+ })}`;
187
+ }
188
+ return msg;
189
+ })),
190
+ }), new winston_1.default.transports.File({
191
+ filename: path_1.default.join(logDir, 'error.log'),
192
+ level: 'error',
193
+ format: winston_1.default.format.combine(winston_1.default.format.timestamp(), winston_1.default.format.printf((info) => {
194
+ const { level, message, timestamp, ...metadata } = info;
195
+ let msg = `${timestamp} [${String(level).toUpperCase()}] ${message}`;
196
+ if (Object.keys(metadata).length > 0) {
197
+ msg += ` | ${JSON.stringify(metadata, (key, val) => {
198
+ if (key === 'socket' || key === 'parser' || key === 'res' || key === 'req') {
199
+ return '[Circular]';
200
+ }
201
+ return val;
202
+ })}`;
203
+ }
204
+ return msg;
205
+ })),
206
+ }));
207
+ }
208
+ }
209
+ else {
210
+ transports.push(new winston_1.default.transports.Console({ silent: true }));
211
+ }
212
+ // Create logger instance
213
+ const logger = winston_1.default.createLogger({
214
+ level: logLevel,
215
+ format: winston_1.default.format.combine(winston_1.default.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), customFormat),
216
+ transports,
217
+ });
218
+ // Log application info when starting
219
+ const appInfo = {
220
+ service: process.env.APP_NAME || 'hazeljs',
221
+ version: process.env.APP_VERSION || '0.1.0',
222
+ environment: process.env.NODE_ENV || 'development',
223
+ };
224
+ logger.info(chalk_1.default.cyan.bold('Application started'), appInfo);
225
+ // Add request logging middleware with beautiful formatting
226
+ const requestLogger = (req, res, next) => {
227
+ const start = Date.now();
228
+ res.on('finish', () => {
229
+ const pathname = (req.url ?? '').split('?')[0];
230
+ if (pathname === '/favicon.ico')
231
+ return;
232
+ const duration = Date.now() - start;
233
+ const statusColor = res.statusCode >= 500
234
+ ? chalk_1.default.red
235
+ : res.statusCode >= 400
236
+ ? chalk_1.default.yellow
237
+ : res.statusCode >= 300
238
+ ? chalk_1.default.cyan
239
+ : res.statusCode >= 200
240
+ ? chalk_1.default.green
241
+ : chalk_1.default.white;
242
+ logger.info(`${chalk_1.default.bold(req.method ?? '')} ${req.url ?? ''}`, {
243
+ status: statusColor(String(res.statusCode)),
244
+ duration: chalk_1.default.yellow(`${duration}ms`),
245
+ userAgent: chalk_1.default.gray(String(req.headers['user-agent'] ?? '')),
246
+ ip: chalk_1.default.gray(String(req.socket.remoteAddress ?? '')),
247
+ });
248
+ });
249
+ next();
250
+ };
251
+ exports.requestLogger = requestLogger;
252
+ // Add helper method to check if debug is enabled
253
+ const isDebugEnabled = () => {
254
+ return logger.isLevelEnabled('debug');
255
+ };
256
+ // Extend logger with helper method
257
+ const enhancedLogger = Object.assign(logger, {
258
+ isDebugEnabled,
259
+ });
260
+ // Export logger instance
261
+ exports.default = enhancedLogger;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * CORS Middleware
3
+ * Handles Cross-Origin Resource Sharing
4
+ */
5
+ import { Request, Response } from '../types';
6
+ export interface CorsOptions {
7
+ origin?: string | string[] | ((origin: string) => boolean);
8
+ methods?: string[];
9
+ allowedHeaders?: string[];
10
+ exposedHeaders?: string[];
11
+ credentials?: boolean;
12
+ maxAge?: number;
13
+ preflightContinue?: boolean;
14
+ optionsSuccessStatus?: number;
15
+ }
16
+ export declare class CorsMiddleware {
17
+ private options;
18
+ constructor(options?: CorsOptions);
19
+ /**
20
+ * Check if origin is allowed
21
+ */
22
+ private isOriginAllowed;
23
+ /**
24
+ * Set CORS headers
25
+ */
26
+ private setCorsHeaders;
27
+ /**
28
+ * Handle preflight request
29
+ */
30
+ private handlePreflight;
31
+ /**
32
+ * Handle CORS request
33
+ */
34
+ handle(req: Request, res: Response, next: () => void): void;
35
+ /**
36
+ * Create middleware function
37
+ */
38
+ static create(options?: CorsOptions): (req: Request, res: Response, next: () => void) => void;
39
+ }
40
+ /**
41
+ * Simple CORS helper for common use cases
42
+ */
43
+ export declare function enableCors(options?: CorsOptions): (req: Request, res: Response, next: () => void) => void;
44
+ //# sourceMappingURL=cors.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,GAAE,WAAgB;IAarC;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI;IAa3D;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI;CAI9F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAEzG"}