@innv/nest-initializer 0.1.0

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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +257 -0
  3. package/dist/cjs/core/app-initializer.js +431 -0
  4. package/dist/cjs/core/auto-discovery.helper.js +46 -0
  5. package/dist/cjs/core/config-validator.helper.js +28 -0
  6. package/dist/cjs/core/index.js +17 -0
  7. package/dist/cjs/features/health.controller.js +92 -0
  8. package/dist/cjs/features/index.js +18 -0
  9. package/dist/cjs/features/metrics/metrics.controller.js +41 -0
  10. package/dist/cjs/features/metrics/metrics.interceptor.js +45 -0
  11. package/dist/cjs/features/metrics/metrics.module.js +38 -0
  12. package/dist/cjs/features/metrics/metrics.provider.js +29 -0
  13. package/dist/cjs/features/metrics/metrics.tokens.js +5 -0
  14. package/dist/cjs/features/terminus-health-check.module.js +39 -0
  15. package/dist/cjs/index.js +18 -0
  16. package/dist/cjs/plugins/index.js +19 -0
  17. package/dist/cjs/plugins/rate-limiter.plugin.js +26 -0
  18. package/dist/cjs/plugins/request-logger.plugin.js +13 -0
  19. package/dist/cjs/plugins/typeorm-migration.plugin.js +30 -0
  20. package/dist/cjs/starters/caching.starter.js +27 -0
  21. package/dist/cjs/starters/index.js +19 -0
  22. package/dist/cjs/starters/mongoose.starter.js +24 -0
  23. package/dist/cjs/starters/typeorm.starter.js +31 -0
  24. package/dist/esm/core/app-initializer.js +431 -0
  25. package/dist/esm/core/auto-discovery.helper.js +46 -0
  26. package/dist/esm/core/config-validator.helper.js +28 -0
  27. package/dist/esm/core/index.js +17 -0
  28. package/dist/esm/features/health.controller.js +92 -0
  29. package/dist/esm/features/index.js +18 -0
  30. package/dist/esm/features/metrics/metrics.controller.js +41 -0
  31. package/dist/esm/features/metrics/metrics.interceptor.js +45 -0
  32. package/dist/esm/features/metrics/metrics.module.js +38 -0
  33. package/dist/esm/features/metrics/metrics.provider.js +29 -0
  34. package/dist/esm/features/metrics/metrics.tokens.js +5 -0
  35. package/dist/esm/features/terminus-health-check.module.js +39 -0
  36. package/dist/esm/index.js +18 -0
  37. package/dist/esm/plugins/index.js +19 -0
  38. package/dist/esm/plugins/rate-limiter.plugin.js +26 -0
  39. package/dist/esm/plugins/request-logger.plugin.js +13 -0
  40. package/dist/esm/plugins/typeorm-migration.plugin.js +30 -0
  41. package/dist/esm/starters/caching.starter.js +27 -0
  42. package/dist/esm/starters/index.js +19 -0
  43. package/dist/esm/starters/mongoose.starter.js +24 -0
  44. package/dist/esm/starters/typeorm.starter.js +31 -0
  45. package/dist/types/core/app-initializer.d.ts +206 -0
  46. package/dist/types/core/auto-discovery.helper.d.ts +15 -0
  47. package/dist/types/core/config-validator.helper.d.ts +9 -0
  48. package/dist/types/core/index.d.ts +1 -0
  49. package/dist/types/features/health.controller.d.ts +11 -0
  50. package/dist/types/features/index.d.ts +2 -0
  51. package/dist/types/features/metrics/metrics.controller.d.ts +6 -0
  52. package/dist/types/features/metrics/metrics.interceptor.d.ts +8 -0
  53. package/dist/types/features/metrics/metrics.module.d.ts +4 -0
  54. package/dist/types/features/metrics/metrics.provider.d.ts +2 -0
  55. package/dist/types/features/metrics/metrics.tokens.d.ts +2 -0
  56. package/dist/types/features/terminus-health-check.module.d.ts +11 -0
  57. package/dist/types/index.d.ts +6 -0
  58. package/dist/types/plugins/index.d.ts +3 -0
  59. package/dist/types/plugins/rate-limiter.plugin.d.ts +8 -0
  60. package/dist/types/plugins/request-logger.plugin.d.ts +5 -0
  61. package/dist/types/plugins/typeorm-migration.plugin.d.ts +15 -0
  62. package/dist/types/starters/caching.starter.d.ts +20 -0
  63. package/dist/types/starters/index.d.ts +3 -0
  64. package/dist/types/starters/mongoose.starter.d.ts +24 -0
  65. package/dist/types/starters/typeorm.starter.d.ts +19 -0
  66. package/package.json +159 -0
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.MetricsInterceptor = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const prom_client_1 = require("prom-client");
18
+ const operators_1 = require("rxjs/operators");
19
+ const metrics_tokens_1 = require("./metrics.tokens");
20
+ let MetricsInterceptor = class MetricsInterceptor {
21
+ histogram;
22
+ constructor(histogram) {
23
+ this.histogram = histogram;
24
+ }
25
+ intercept(context, next) {
26
+ const httpContext = context.switchToHttp();
27
+ const request = httpContext.getRequest();
28
+ const response = httpContext.getResponse();
29
+ const end = this.histogram.startTimer();
30
+ return next.handle().pipe((0, operators_1.finalize)(() => {
31
+ const path = request.route?.path ?? request.path;
32
+ end({
33
+ method: request.method,
34
+ path: path,
35
+ status_code: response.statusCode,
36
+ });
37
+ }));
38
+ }
39
+ };
40
+ exports.MetricsInterceptor = MetricsInterceptor;
41
+ exports.MetricsInterceptor = MetricsInterceptor = __decorate([
42
+ (0, common_1.Injectable)(),
43
+ __param(0, (0, common_1.Inject)(metrics_tokens_1.METRICS_HTTP_HISTOGRAM)),
44
+ __metadata("design:paramtypes", [prom_client_1.Histogram])
45
+ ], MetricsInterceptor);
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var MetricsModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MetricsModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const core_1 = require("@nestjs/core");
13
+ const metrics_controller_1 = require("./metrics.controller");
14
+ const metrics_interceptor_1 = require("./metrics.interceptor");
15
+ const metrics_provider_1 = require("./metrics.provider");
16
+ const metrics_tokens_1 = require("./metrics.tokens");
17
+ let MetricsModule = MetricsModule_1 = class MetricsModule {
18
+ static forRoot() {
19
+ const providers = [
20
+ ...metrics_provider_1.metricsProviders,
21
+ metrics_interceptor_1.MetricsInterceptor,
22
+ {
23
+ provide: core_1.APP_INTERCEPTOR,
24
+ useClass: metrics_interceptor_1.MetricsInterceptor,
25
+ },
26
+ ];
27
+ return {
28
+ module: MetricsModule_1,
29
+ controllers: [metrics_controller_1.MetricsController],
30
+ providers: providers,
31
+ exports: [metrics_tokens_1.METRICS_REGISTRY, metrics_tokens_1.METRICS_HTTP_HISTOGRAM],
32
+ };
33
+ }
34
+ };
35
+ exports.MetricsModule = MetricsModule;
36
+ exports.MetricsModule = MetricsModule = MetricsModule_1 = __decorate([
37
+ (0, common_1.Module)({})
38
+ ], MetricsModule);
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.metricsProviders = void 0;
4
+ const prom_client_1 = require("prom-client");
5
+ const metrics_tokens_1 = require("./metrics.tokens");
6
+ exports.metricsProviders = [
7
+ {
8
+ provide: metrics_tokens_1.METRICS_REGISTRY,
9
+ useFactory: () => {
10
+ const registry = new prom_client_1.Registry();
11
+ (0, prom_client_1.collectDefaultMetrics)({ register: registry });
12
+ return registry;
13
+ },
14
+ },
15
+ {
16
+ provide: metrics_tokens_1.METRICS_HTTP_HISTOGRAM,
17
+ useFactory: (registry) => {
18
+ const histogram = new prom_client_1.Histogram({
19
+ name: 'http_requests_duration_seconds',
20
+ help: 'Duração das requisições HTTP em segundos',
21
+ labelNames: ['method', 'path', 'status_code'],
22
+ buckets: [0.1, 0.3, 0.5, 0.7, 1, 3, 5, 10], // Buckets em segundos
23
+ });
24
+ registry.registerMetric(histogram);
25
+ return histogram;
26
+ },
27
+ inject: [metrics_tokens_1.METRICS_REGISTRY],
28
+ },
29
+ ];
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.METRICS_HTTP_HISTOGRAM = exports.METRICS_REGISTRY = void 0;
4
+ exports.METRICS_REGISTRY = 'METRICS_REGISTRY';
5
+ exports.METRICS_HTTP_HISTOGRAM = 'METRICS_HTTP_HISTOGRAM';
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var TerminusHealthCheckModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TerminusHealthCheckModule = void 0;
11
+ const axios_1 = require("@nestjs/axios");
12
+ const common_1 = require("@nestjs/common");
13
+ const terminus_1 = require("@nestjs/terminus");
14
+ const health_controller_1 = require("./health.controller");
15
+ let TerminusHealthCheckModule = TerminusHealthCheckModule_1 = class TerminusHealthCheckModule {
16
+ static forRoot(options) {
17
+ const providers = [];
18
+ if (options.database) {
19
+ providers.push(terminus_1.TypeOrmHealthIndicator);
20
+ }
21
+ const optionsProvider = {
22
+ provide: health_controller_1.HEALTH_CHECK_OPTIONS,
23
+ useValue: options,
24
+ };
25
+ providers.push(optionsProvider);
26
+ providers.push(terminus_1.MemoryHealthIndicator);
27
+ return {
28
+ module: TerminusHealthCheckModule_1,
29
+ imports: [terminus_1.TerminusModule, axios_1.HttpModule],
30
+ controllers: [health_controller_1.HealthController],
31
+ providers: providers,
32
+ exports: [],
33
+ };
34
+ }
35
+ };
36
+ exports.TerminusHealthCheckModule = TerminusHealthCheckModule;
37
+ exports.TerminusHealthCheckModule = TerminusHealthCheckModule = TerminusHealthCheckModule_1 = __decorate([
38
+ (0, common_1.Module)({})
39
+ ], TerminusHealthCheckModule);
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./core/app-initializer"), exports);
18
+ __exportStar(require("./plugins"), exports);
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./rate-limiter.plugin"), exports);
18
+ __exportStar(require("./request-logger.plugin"), exports);
19
+ __exportStar(require("./typeorm-migration.plugin"), exports);
@@ -0,0 +1,26 @@
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.RateLimiterPlugin = void 0;
7
+ const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
8
+ class RateLimiterPlugin {
9
+ options;
10
+ constructor(options = {}) {
11
+ const finalOptions = {
12
+ windowMs: 15 * 60 * 1000,
13
+ limit: 100,
14
+ statusCode: 429,
15
+ message: 'Too many requests from this IP, please try again after 15 minutes',
16
+ standardHeaders: true,
17
+ legacyHeaders: false,
18
+ ...options,
19
+ };
20
+ this.options = finalOptions;
21
+ }
22
+ apply(app) {
23
+ app.use((0, express_rate_limit_1.default)(this.options));
24
+ }
25
+ }
26
+ exports.RateLimiterPlugin = RateLimiterPlugin;
@@ -0,0 +1,13 @@
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.RequestLoggerPlugin = void 0;
7
+ const morgan_1 = __importDefault(require("morgan"));
8
+ class RequestLoggerPlugin {
9
+ apply(app) {
10
+ app.use((0, morgan_1.default)('dev'));
11
+ }
12
+ }
13
+ exports.RequestLoggerPlugin = RequestLoggerPlugin;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeOrmMigrationPlugin = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const typeorm_1 = require("typeorm");
6
+ /**
7
+ * Um plugin do AppInitializer que executa automaticamente as migrations
8
+ * do TypeORM na inicialização da aplicação.
9
+ */
10
+ class TypeOrmMigrationPlugin {
11
+ logger = new common_1.Logger(TypeOrmMigrationPlugin.name);
12
+ /**
13
+ * Método 'apply' que será chamado pelo AppInitializer durante o bootstrap.
14
+ * Este método é assíncrono para poder aguardar a conclusão das migrations.
15
+ * @param app A instância da aplicação NestJS.
16
+ */
17
+ async apply(app) {
18
+ try {
19
+ const dataSource = app.get(typeorm_1.DataSource);
20
+ this.logger.log('Iniciando execução das migrations do banco de dados...');
21
+ await dataSource.runMigrations();
22
+ this.logger.log('Migrations executadas com sucesso.');
23
+ }
24
+ catch (error) {
25
+ this.logger.error('Falha ao obter DataSource ou executar migrations.', error);
26
+ throw error;
27
+ }
28
+ }
29
+ }
30
+ exports.TypeOrmMigrationPlugin = TypeOrmMigrationPlugin;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCachingStarter = createCachingStarter;
4
+ const cache_manager_1 = require("@nestjs/cache-manager");
5
+ const config_1 = require("@nestjs/config");
6
+ const cache_manager_redis_store_1 = require("cache-manager-redis-store");
7
+ /**
8
+ * Cria o módulo dinâmico para o "Starter" de Cache.
9
+ * Configura o CacheModule para ser global e usar o Redis.
10
+ */
11
+ function createCachingStarter(options = {}) {
12
+ const { redisUrlEnvKey = 'REDIS_URL', defaultTtlInSeconds = 300 } = options;
13
+ return cache_manager_1.CacheModule.registerAsync({
14
+ isGlobal: true,
15
+ imports: [],
16
+ inject: [config_1.ConfigService],
17
+ useFactory: async (configService) => {
18
+ const store = await (0, cache_manager_redis_store_1.redisStore)({
19
+ url: configService.get(redisUrlEnvKey),
20
+ });
21
+ return {
22
+ store: () => store,
23
+ ttl: defaultTtlInSeconds,
24
+ };
25
+ },
26
+ });
27
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./typeorm.starter"), exports);
18
+ __exportStar(require("./mongoose.starter"), exports);
19
+ __exportStar(require("./caching.starter"), exports);
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMongooseStarter = createMongooseStarter;
4
+ const config_1 = require("@nestjs/config");
5
+ const mongoose_1 = require("@nestjs/mongoose");
6
+ /**
7
+ * Cria o módulo dinâmico para o "Starter" de Mongoose.
8
+ * Configura o MongooseModule para ser global e usar a URI do .env.
9
+ */
10
+ function createMongooseStarter(options = {}) {
11
+ const { uriEnvKey = 'MONGO_URI', mongooseOptions = {} } = options;
12
+ const mongooseDynamicModule = mongoose_1.MongooseModule.forRootAsync({
13
+ imports: [],
14
+ inject: [config_1.ConfigService],
15
+ useFactory: (configService) => ({
16
+ uri: configService.get(uriEnvKey),
17
+ ...mongooseOptions,
18
+ }),
19
+ });
20
+ return {
21
+ module: mongooseDynamicModule,
22
+ plugins: [],
23
+ };
24
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTypeOrmStarter = createTypeOrmStarter;
4
+ const config_1 = require("@nestjs/config");
5
+ const typeorm_1 = require("@nestjs/typeorm");
6
+ const plugins_1 = require("../plugins");
7
+ /**
8
+ * Cria o módulo dinâmico para o "Starter" de TypeORM.
9
+ * Esta função constrói toda a configuração necessária para o TypeOrmModule.
10
+ */
11
+ function createTypeOrmStarter(options = {}) {
12
+ const { autoLoadEntities = true, runMigrationsOnStartup = false, databaseUrlEnvKey = 'DATABASE_URL', typeOrmOptions = {}, } = options;
13
+ const typeOrmDynamicModule = typeorm_1.TypeOrmModule.forRootAsync({
14
+ imports: [],
15
+ inject: [config_1.ConfigService],
16
+ useFactory: (configService) => ({
17
+ url: configService.get(databaseUrlEnvKey),
18
+ autoLoadEntities: autoLoadEntities,
19
+ synchronize: false,
20
+ ...typeOrmOptions,
21
+ }),
22
+ });
23
+ const plugins = [];
24
+ if (runMigrationsOnStartup) {
25
+ plugins.push(new plugins_1.TypeOrmMigrationPlugin());
26
+ }
27
+ return {
28
+ module: typeOrmDynamicModule,
29
+ plugins: plugins,
30
+ };
31
+ }