@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
+ }
@@ -0,0 +1,206 @@
1
+ import { CanActivate, ExceptionFilter, INestApplication, NestInterceptor, PipeTransform, Type, ValidationPipeOptions, VersioningOptions } from '@nestjs/common';
2
+ import { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface';
3
+ import { AbstractHttpAdapter } from '@nestjs/core';
4
+ import { TerminusHealthCheckOptions } from '../features';
5
+ import { CachingStarterOptions, MongooseStarterOptions, TypeOrmStarterOptions } from '../starters';
6
+ /**
7
+ * Interface que todos os plugins do AppInitializer devem implementar.
8
+ */
9
+ export interface AppInitializerPlugin {
10
+ /**
11
+ * Método que será executado durante a inicialização para aplicar a lógica do plugin.
12
+ * Pode ser síncrono ou assíncrono.
13
+ * @param app A instância da aplicação NestJS (INestApplication).
14
+ */
15
+ apply(app: INestApplication): Promise<void> | void;
16
+ }
17
+ /**
18
+ * Opções para a configuração do Swagger (OpenAPI).
19
+ */
20
+ export type SwaggerOptions = {
21
+ title: string;
22
+ description: string;
23
+ version: string;
24
+ path?: string;
25
+ };
26
+ /**
27
+ * Assinatura da função de callback usada para configurar o inicializador.
28
+ * @param app A instância do AppInitializer a ser configurada.
29
+ */
30
+ type AppConfigurator<T extends INestApplication> = (app: AppInitializer<T>) => void;
31
+ /**
32
+ * Uma classe fluente (Builder) para inicializar uma aplicação NestJS de forma declarativa.
33
+ */
34
+ export declare class AppInitializer<T extends INestApplication = INestApplication> {
35
+ private app;
36
+ private readonly module;
37
+ private readonly adapter?;
38
+ private readonly logger;
39
+ private port;
40
+ private globalPrefix?;
41
+ private versioningOptions?;
42
+ private corsOptions?;
43
+ private swaggerOptions?;
44
+ private readonly setupFunctions;
45
+ private readonly plugins;
46
+ private readonly featureModules;
47
+ private advancedSwaggerUiOptions?;
48
+ private autoDiscoveredComponents?;
49
+ private readonly globalProviders;
50
+ private readonly factoryGeneratedControllers;
51
+ private constructor();
52
+ /**
53
+ * Aplica um conjunto de configurações padrão recomendadas para o ambiente de desenvolvimento.
54
+ * Inclui Swagger e um logger de requisições.
55
+ * @param swaggerOptions Opções para customizar a documentação Swagger.
56
+ */
57
+ useDevelopmentDefaults(swaggerOptions: Omit<SwaggerOptions, 'path'>): this;
58
+ /**
59
+ * Aplica um conjunto de configurações padrão recomendadas para o ambiente de produção.
60
+ * Inclui Helmet, compressão, graceful shutdown e um rate limiter básico.
61
+ */
62
+ useProductionDefaults(): this;
63
+ /**
64
+ * Aplica um bloco de configurações de forma condicional.
65
+ * @param condition A condição booleana. Se for `true`, o callback de configuração será executado.
66
+ * @param configure A função de callback que recebe o builder para aplicar as configurações.
67
+ */
68
+ when(condition: boolean, configure: (builder: this) => void): this;
69
+ withHealthCheck(options: TerminusHealthCheckOptions): this;
70
+ /**
71
+ * Habilita a coleta e exposição de métricas no padrão Prometheus
72
+ * no endpoint /metrics. Inclui métricas padrão do Node.js
73
+ * e métricas de latência de requisições HTTP.
74
+ */
75
+ withMetrics(): this;
76
+ static bootstrap<T extends INestApplication = INestApplication>(module: Type, configurator: AppConfigurator<T>): Promise<void>;
77
+ static bootstrap<T extends INestApplication = INestApplication>(module: Type, adapter: AbstractHttpAdapter, configurator: AppConfigurator<T>): Promise<void>;
78
+ /**
79
+ * Define a porta em que a aplicação vai rodar.
80
+ * @param port O número da porta.
81
+ */
82
+ onPort(port: number): this;
83
+ /**
84
+ * Registra um plugin para ser executado durante a inicialização.
85
+ * @param plugin Uma instância de um objeto que implementa a interface AppInitializerPlugin.
86
+ */
87
+ withPlugin(plugin: AppInitializerPlugin): this;
88
+ /**
89
+ * Habilita e configura o versionamento da API.
90
+ * @param options As opções de versionamento do NestJS.
91
+ */
92
+ withVersioning(options: VersioningOptions): this;
93
+ /**
94
+ * Define um prefixo global para todas as rotas da aplicação (ex: /api/v1).
95
+ * @param prefix O prefixo a ser aplicado.
96
+ */
97
+ withGlobalPrefix(prefix: string): this;
98
+ /**
99
+ * Habilita e configura o Cross-Origin Resource Sharing (CORS).
100
+ * @param options As opções de configuração do CORS.
101
+ */
102
+ withCors(options?: CorsOptions): this;
103
+ /**
104
+ * Adiciona o ValidationPipe global com opções customizadas.
105
+ * Esta é a forma recomendada de habilitar a validação padrão.
106
+ * @param options Opções de configuração para o ValidationPipe.
107
+ */
108
+ withValidationPipe(options?: ValidationPipeOptions): this;
109
+ /**
110
+ * Registra um Pipe global customizado (ex: um pipe de parsing).
111
+ * O pipe participará da Injeção de Dependência.
112
+ * @param pipe A *classe* do pipe a ser registrada.
113
+ */
114
+ useGlobalPipe(pipe: Type<PipeTransform>): this;
115
+ /**
116
+ * Registra um Filtro de Exceção global (ex: HttpExceptionFilter).
117
+ * O filtro participará da Injeção de Dependência.
118
+ * @param filter A *classe* do filtro a ser registrada.
119
+ */
120
+ useGlobalFilter(filter: Type<ExceptionFilter>): this;
121
+ /**
122
+ * Registra um Guard global (ex: JwtAuthGuard).
123
+ * O guard participará da Injeção de Dependência.
124
+ * @param guard A *classe* do guard a ser registrada.
125
+ */
126
+ useGlobalGuard(guard: Type<CanActivate>): this;
127
+ /**
128
+ * Registra um Interceptor global (ex: LoggingInterceptor).
129
+ * O interceptor participará da Injeção de Dependência.
130
+ * @param interceptor A *classe* do interceptor a ser registrada.
131
+ */
132
+ useGlobalInterceptor(interceptor: Type<NestInterceptor>): this;
133
+ /**
134
+ * Registra o ClassSerializerInterceptor globalmente.
135
+ * Essencial para transformações de DTO (@Exclude, @Expose).
136
+ * Ele automaticamente recebe o Reflector via DI.
137
+ */
138
+ withClassSerializer(): this;
139
+ /**
140
+ * Habilita e configura a documentação da API via Swagger (OpenAPI).
141
+ * @param options As opções para construir a documentação.
142
+ */
143
+ withSwagger(options: SwaggerOptions): this;
144
+ /**
145
+ * Aplica customizações avançadas à interface do Swagger UI.
146
+ * Isso pode incluir temas, scripts e outras configurações visuais.
147
+ * Por padrão, aplica um tema escuro e algumas configurações de layout.
148
+ */
149
+ withAdvancedSwaggerUI(): this;
150
+ /**
151
+ * Habilita os 'shutdown hooks' do NestJS para um desligamento gracioso.
152
+ */
153
+ withGracefulShutdown(): this;
154
+ /**
155
+ * Adiciona o middleware de segurança Helmet com configurações padrão.
156
+ */
157
+ useHelmet(): this;
158
+ /**
159
+ * Adiciona o middleware de compressão (gzip) para as respostas.
160
+ */
161
+ enableCompression(): this;
162
+ /**
163
+ * Carrega e valida as variáveis de ambiente na inicialização
164
+ * usando um schema de validação (classe com decoradores class-validator).
165
+ * Se a validação falhar, a aplicação não será iniciada.
166
+ * @param schema A classe de schema para validar (ex: EnvironmentVariables).
167
+ */
168
+ withValidatedConfig<T extends object>(schema: Type<T>): this;
169
+ /**
170
+ * Configura e registra automaticamente o TypeOrmModule (Estilo "Starter").
171
+ * @param options Opções para o "Starter" de TypeORM.
172
+ */
173
+ withTypeOrm(options?: TypeOrmStarterOptions): this;
174
+ /**
175
+ * Configura e registra automaticamente o MongooseModule (Estilo "Starter").
176
+ * Usa a configuração global (de .withValidatedConfig) para se conectar
177
+ * ao MongoDB e descobre schemas automaticamente.
178
+ *
179
+ * @param options Opções para o "Starter" de Mongoose.
180
+ */
181
+ withMongoose(options?: MongooseStarterOptions): this;
182
+ /**
183
+ * Configura e registra automaticamente o CacheModule (Estilo "Starter").
184
+ * Usa a configuração global (de .withValidatedConfig) para se conectar
185
+ * ao Redis e torna o cache globalmente disponível.
186
+ *
187
+ * @param options Opções para o "Starter" de Cache.
188
+ */
189
+ withCaching(options?: CachingStarterOptions): this;
190
+ /**
191
+ * Retorna a instância da aplicação NestJS (INestApplication) após a inicialização.
192
+ * @throws Error se a aplicação ainda não foi inicializada.
193
+ */
194
+ getApp(): T;
195
+ /**
196
+ * Habilita a descoberta e registro automático de Providers e Controllers.
197
+ * Varre o projeto em busca de classes com @Injectable() e @Controller()
198
+ * e as adiciona ao módulo raiz.
199
+ * @param options Opções para configurar a descoberta.
200
+ */
201
+ withAutoDiscovery(options: {
202
+ basePath: string;
203
+ }): this;
204
+ private listen;
205
+ }
206
+ export {};
@@ -0,0 +1,15 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ interface DiscoveredComponents {
4
+ providers: Type[];
5
+ controllers: Type[];
6
+ }
7
+ type RequireFn = (id: string) => any;
8
+ /**
9
+ * Descobre componentes NestJS (Providers e Controllers) em um diretório.
10
+ * @param basePath O diretório raiz para a varredura.
11
+ * @param reflectorInst Uma instância do Reflector.
12
+ * @param requireFn A função 'require' a ser usada (padrão: Node's require).
13
+ */
14
+ export declare function discoverComponents(basePath: string, reflectorInst: Reflector, requireFn?: RequireFn): DiscoveredComponents;
15
+ export {};
@@ -0,0 +1,9 @@
1
+ import { Type } from '@nestjs/common';
2
+ /**
3
+ * Valida um objeto de configuração (ex: process.env) contra uma classe de schema.
4
+ * Se a validação falhar, lança um erro detalhado.
5
+ * @param config O objeto de configuração a ser validado (geralmente process.env).
6
+ * @param schema A classe de schema com decoradores do class-validator.
7
+ * @returns O objeto de configuração validado e transformado.
8
+ */
9
+ export declare function validateConfig<T extends object>(config: Record<string, any>, schema: Type<T>): T;
@@ -0,0 +1 @@
1
+ export * from './app-initializer';
@@ -0,0 +1,11 @@
1
+ import { HealthCheckService, MemoryHealthIndicator, TypeOrmHealthIndicator } from '@nestjs/terminus';
2
+ import * as terminusHealthCheckModule from './terminus-health-check.module';
3
+ export declare const HEALTH_CHECK_OPTIONS = "HEALTH_CHECK_OPTIONS";
4
+ export declare class HealthController {
5
+ private readonly options;
6
+ private readonly health;
7
+ private readonly db;
8
+ private readonly memory;
9
+ constructor(options: terminusHealthCheckModule.TerminusHealthCheckOptions, health: HealthCheckService, db: TypeOrmHealthIndicator, memory: MemoryHealthIndicator);
10
+ check(): Promise<import("@nestjs/terminus").HealthCheckResult>;
11
+ }
@@ -0,0 +1,2 @@
1
+ export * from './metrics/metrics.module';
2
+ export * from './terminus-health-check.module';
@@ -0,0 +1,6 @@
1
+ import { Registry } from 'prom-client';
2
+ export declare class MetricsController {
3
+ private readonly registry;
4
+ constructor(registry: Registry);
5
+ getMetrics(res: any): Promise<void>;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Histogram } from 'prom-client';
3
+ import { Observable } from 'rxjs';
4
+ export declare class MetricsInterceptor implements NestInterceptor {
5
+ private readonly histogram;
6
+ constructor(histogram: Histogram);
7
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
8
+ }
@@ -0,0 +1,4 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ export declare class MetricsModule {
3
+ static forRoot(): DynamicModule;
4
+ }
@@ -0,0 +1,2 @@
1
+ import { Provider } from '@nestjs/common';
2
+ export declare const metricsProviders: Provider[];