@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.
- package/LICENSE +192 -0
- package/README.md +560 -0
- package/dist/__tests__/container.test.d.ts +2 -0
- package/dist/__tests__/container.test.d.ts.map +1 -0
- package/dist/__tests__/container.test.js +454 -0
- package/dist/__tests__/decorators.test.d.ts +2 -0
- package/dist/__tests__/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/decorators.test.js +1237 -0
- package/dist/__tests__/errors/http.error.test.d.ts +2 -0
- package/dist/__tests__/errors/http.error.test.d.ts.map +1 -0
- package/dist/__tests__/errors/http.error.test.js +117 -0
- package/dist/__tests__/filters/exception-filter.test.d.ts +2 -0
- package/dist/__tests__/filters/exception-filter.test.d.ts.map +1 -0
- package/dist/__tests__/filters/exception-filter.test.js +135 -0
- package/dist/__tests__/filters/http-exception.filter.test.d.ts +2 -0
- package/dist/__tests__/filters/http-exception.filter.test.d.ts.map +1 -0
- package/dist/__tests__/filters/http-exception.filter.test.js +119 -0
- package/dist/__tests__/hazel-app.test.d.ts +2 -0
- package/dist/__tests__/hazel-app.test.d.ts.map +1 -0
- package/dist/__tests__/hazel-app.test.js +810 -0
- package/dist/__tests__/hazel-module.test.d.ts +2 -0
- package/dist/__tests__/hazel-module.test.d.ts.map +1 -0
- package/dist/__tests__/hazel-module.test.js +408 -0
- package/dist/__tests__/hazel-response.test.d.ts +2 -0
- package/dist/__tests__/hazel-response.test.d.ts.map +1 -0
- package/dist/__tests__/hazel-response.test.js +138 -0
- package/dist/__tests__/health.test.d.ts +2 -0
- package/dist/__tests__/health.test.d.ts.map +1 -0
- package/dist/__tests__/health.test.js +147 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +239 -0
- package/dist/__tests__/interceptors/interceptor.test.d.ts +2 -0
- package/dist/__tests__/interceptors/interceptor.test.d.ts.map +1 -0
- package/dist/__tests__/interceptors/interceptor.test.js +166 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +141 -0
- package/dist/__tests__/middleware/cors.test.d.ts +2 -0
- package/dist/__tests__/middleware/cors.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/cors.test.js +129 -0
- package/dist/__tests__/middleware/csrf.test.d.ts +2 -0
- package/dist/__tests__/middleware/csrf.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/csrf.test.js +247 -0
- package/dist/__tests__/middleware/global-middleware.test.d.ts +2 -0
- package/dist/__tests__/middleware/global-middleware.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/global-middleware.test.js +259 -0
- package/dist/__tests__/middleware/rate-limit.test.d.ts +2 -0
- package/dist/__tests__/middleware/rate-limit.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/rate-limit.test.js +264 -0
- package/dist/__tests__/middleware/security-headers.test.d.ts +2 -0
- package/dist/__tests__/middleware/security-headers.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/security-headers.test.js +229 -0
- package/dist/__tests__/middleware/timeout.test.d.ts +2 -0
- package/dist/__tests__/middleware/timeout.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/timeout.test.js +132 -0
- package/dist/__tests__/middleware.test.d.ts +2 -0
- package/dist/__tests__/middleware.test.d.ts.map +1 -0
- package/dist/__tests__/middleware.test.js +180 -0
- package/dist/__tests__/pipes/pipe.test.d.ts +2 -0
- package/dist/__tests__/pipes/pipe.test.d.ts.map +1 -0
- package/dist/__tests__/pipes/pipe.test.js +245 -0
- package/dist/__tests__/pipes/validation.pipe.test.d.ts +2 -0
- package/dist/__tests__/pipes/validation.pipe.test.d.ts.map +1 -0
- package/dist/__tests__/pipes/validation.pipe.test.js +297 -0
- package/dist/__tests__/request-parser.test.d.ts +2 -0
- package/dist/__tests__/request-parser.test.d.ts.map +1 -0
- package/dist/__tests__/request-parser.test.js +182 -0
- package/dist/__tests__/router.test.d.ts +2 -0
- package/dist/__tests__/router.test.d.ts.map +1 -0
- package/dist/__tests__/router.test.js +1183 -0
- package/dist/__tests__/routing/route-matcher.test.d.ts +2 -0
- package/dist/__tests__/routing/route-matcher.test.d.ts.map +1 -0
- package/dist/__tests__/routing/route-matcher.test.js +219 -0
- package/dist/__tests__/routing/version.decorator.test.d.ts +2 -0
- package/dist/__tests__/routing/version.decorator.test.d.ts.map +1 -0
- package/dist/__tests__/routing/version.decorator.test.js +298 -0
- package/dist/__tests__/service.test.d.ts +2 -0
- package/dist/__tests__/service.test.d.ts.map +1 -0
- package/dist/__tests__/service.test.js +121 -0
- package/dist/__tests__/shutdown.test.d.ts +2 -0
- package/dist/__tests__/shutdown.test.d.ts.map +1 -0
- package/dist/__tests__/shutdown.test.js +250 -0
- package/dist/__tests__/testing/testing.module.test.d.ts +2 -0
- package/dist/__tests__/testing/testing.module.test.d.ts.map +1 -0
- package/dist/__tests__/testing/testing.module.test.js +370 -0
- package/dist/__tests__/upload/file-upload.test.d.ts +2 -0
- package/dist/__tests__/upload/file-upload.test.d.ts.map +1 -0
- package/dist/__tests__/upload/file-upload.test.js +498 -0
- package/dist/__tests__/utils/sanitize.test.d.ts +2 -0
- package/dist/__tests__/utils/sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/utils/sanitize.test.js +291 -0
- package/dist/__tests__/validator.test.d.ts +2 -0
- package/dist/__tests__/validator.test.d.ts.map +1 -0
- package/dist/__tests__/validator.test.js +300 -0
- package/dist/container.d.ts +80 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +271 -0
- package/dist/decorators.d.ts +166 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +538 -0
- package/dist/errors/http.error.d.ts +34 -0
- package/dist/errors/http.error.d.ts.map +1 -0
- package/dist/errors/http.error.js +69 -0
- package/dist/filters/exception-filter.d.ts +39 -0
- package/dist/filters/exception-filter.d.ts.map +1 -0
- package/dist/filters/exception-filter.js +38 -0
- package/dist/filters/http-exception.filter.d.ts +9 -0
- package/dist/filters/http-exception.filter.d.ts.map +1 -0
- package/dist/filters/http-exception.filter.js +42 -0
- package/dist/hazel-app.d.ts +94 -0
- package/dist/hazel-app.d.ts.map +1 -0
- package/dist/hazel-app.js +516 -0
- package/dist/hazel-module.d.ts +29 -0
- package/dist/hazel-module.d.ts.map +1 -0
- package/dist/hazel-module.js +137 -0
- package/dist/hazel-response.d.ts +25 -0
- package/dist/hazel-response.d.ts.map +1 -0
- package/dist/hazel-response.js +89 -0
- package/dist/health.d.ts +73 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +174 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/interceptors/interceptor.d.ts +30 -0
- package/dist/interceptors/interceptor.d.ts.map +1 -0
- package/dist/interceptors/interceptor.js +71 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +261 -0
- package/dist/middleware/cors.middleware.d.ts +44 -0
- package/dist/middleware/cors.middleware.d.ts.map +1 -0
- package/dist/middleware/cors.middleware.js +118 -0
- package/dist/middleware/csrf.middleware.d.ts +82 -0
- package/dist/middleware/csrf.middleware.d.ts.map +1 -0
- package/dist/middleware/csrf.middleware.js +183 -0
- package/dist/middleware/global-middleware.d.ts +111 -0
- package/dist/middleware/global-middleware.d.ts.map +1 -0
- package/dist/middleware/global-middleware.js +179 -0
- package/dist/middleware/rate-limit.middleware.d.ts +73 -0
- package/dist/middleware/rate-limit.middleware.d.ts.map +1 -0
- package/dist/middleware/rate-limit.middleware.js +124 -0
- package/dist/middleware/security-headers.middleware.d.ts +76 -0
- package/dist/middleware/security-headers.middleware.d.ts.map +1 -0
- package/dist/middleware/security-headers.middleware.js +123 -0
- package/dist/middleware/timeout.middleware.d.ts +25 -0
- package/dist/middleware/timeout.middleware.d.ts.map +1 -0
- package/dist/middleware/timeout.middleware.js +74 -0
- package/dist/middleware.d.ts +13 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +47 -0
- package/dist/pipes/pipe.d.ts +50 -0
- package/dist/pipes/pipe.d.ts.map +1 -0
- package/dist/pipes/pipe.js +96 -0
- package/dist/pipes/validation.pipe.d.ts +6 -0
- package/dist/pipes/validation.pipe.d.ts.map +1 -0
- package/dist/pipes/validation.pipe.js +61 -0
- package/dist/request-context.d.ts +22 -0
- package/dist/request-context.d.ts.map +1 -0
- package/dist/request-context.js +2 -0
- package/dist/request-parser.d.ts +7 -0
- package/dist/request-parser.d.ts.map +1 -0
- package/dist/request-parser.js +60 -0
- package/dist/router.d.ts +33 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +506 -0
- package/dist/routing/route-matcher.d.ts +39 -0
- package/dist/routing/route-matcher.d.ts.map +1 -0
- package/dist/routing/route-matcher.js +93 -0
- package/dist/routing/version.decorator.d.ts +36 -0
- package/dist/routing/version.decorator.d.ts.map +1 -0
- package/dist/routing/version.decorator.js +89 -0
- package/dist/service.d.ts +9 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +39 -0
- package/dist/shutdown.d.ts +32 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +109 -0
- package/dist/testing/testing.module.d.ts +83 -0
- package/dist/testing/testing.module.d.ts.map +1 -0
- package/dist/testing/testing.module.js +164 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/upload/file-upload.d.ts +75 -0
- package/dist/upload/file-upload.d.ts.map +1 -0
- package/dist/upload/file-upload.js +261 -0
- package/dist/utils/sanitize.d.ts +45 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +165 -0
- package/dist/validator.d.ts +7 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +119 -0
- 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;
|
package/dist/logger.d.ts
ADDED
|
@@ -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"}
|