{"_id":"@chrono-os/health-nest","_rev":"2-a9741005b118397f49d9fd4a6986697f","name":"@chrono-os/health-nest","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@chrono-os/health-nest","version":"0.1.0","keywords":["health-check","readiness","liveness","nestjs","coolify","chrono-os"],"license":"MIT","_id":"@chrono-os/health-nest@0.1.0","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"homepage":"https://github.com/SugarHoneyIceTea/health-nest#readme","bugs":{"url":"https://github.com/SugarHoneyIceTea/health-nest/issues"},"dist":{"shasum":"1404a88252d1dfb25b74ebe0361cb06f11946be0","tarball":"https://registry.npmjs.org/@chrono-os/health-nest/-/health-nest-0.1.0.tgz","fileCount":16,"integrity":"sha512-43oHKVrwhWMwml8a7O8U+23y/byATAsQBpFsdMaSyeVYPWK8RoPij5FwfZPBd8vyStwzNVuV947K+FBpWi7Mfg==","signatures":[{"sig":"MEUCIQCnFdt7EOXNl1VE+sAKm1BrQOILz1aEIUaHC1NhUtLFnQIgWADK/bdfca/hgRWqhnASl0E0RQ2dFMSapWNNe0dYsGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82327},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./core":{"types":"./dist/core.d.ts","import":"./dist/core.js","require":"./dist/core.cjs"},"./package.json":"./package.json"},"gitHead":"8ef6a0d5f7e41ddb8bc17848d772222e21ee9612","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"git+https://github.com/SugarHoneyIceTea/health-nest.git","type":"git"},"_npmVersion":"11.9.0","description":"Health check para NestJS: GET /health com checks de dependência (banco, Redis, heartbeat) em paralelo, timeout por check, 200 ok ou 503 degraded, sem vazar erro interno no corpo; GET /health/live para liveness.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"7.8.2","tsup":"8.5.1","vitest":"3.2.7","supertest":"7.2.2","typescript":"5.9.3","@types/node":"25.9.6","@nestjs/core":"11.2.3","@nestjs/common":"11.2.3","@nestjs/testing":"11.2.3","@types/supertest":"7.2.1","reflect-metadata":"0.2.2","@nestjs/platform-express":"11.2.3"},"peerDependencies":{"@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/health-nest_0.1.0_1789071324054_0.6299120286414468","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@chrono-os/health-nest","version":"0.1.1","description":"Health check para NestJS: GET /health com checks de dependência (banco, Redis, heartbeat) em paralelo, timeout por check, 200 ok ou 503 degraded, sem vazar erro interno no corpo; GET /health/live para liveness.","license":"MIT","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./core":{"import":{"types":"./dist/core.d.ts","default":"./dist/core.js"},"require":{"types":"./dist/core.d.cts","default":"./dist/core.cjs"}},"./package.json":"./package.json"},"sideEffects":false,"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"repository":{"type":"git","url":"git+https://github.com/SugarHoneyIceTea/health-nest.git"},"keywords":["health-check","readiness","liveness","nestjs","coolify","chrono-os"],"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json"},"peerDependencies":{"@nestjs/common":"^11.0.0","@nestjs/core":"^11.0.0"},"devDependencies":{"@nestjs/common":"11.2.3","@nestjs/core":"11.2.3","@nestjs/platform-express":"11.2.3","@nestjs/testing":"11.2.3","@types/node":"25.9.6","@types/supertest":"7.2.1","reflect-metadata":"0.2.2","rxjs":"7.8.2","supertest":"7.2.2","tsup":"8.5.1","typescript":"5.9.3","vitest":"3.2.7"},"engines":{"node":">=18.17"},"gitHead":"52b98525a3b4b04124f1005da32ff69eea46d711","_id":"@chrono-os/health-nest@0.1.1","bugs":{"url":"https://github.com/SugarHoneyIceTea/health-nest/issues"},"homepage":"https://github.com/SugarHoneyIceTea/health-nest#readme","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-NmxsHAAhX3F6L3Hh+m15WVUDmi4GXjY7P8jorxDy5aOLbdaf7yC81t4b6Z17KD9AD/MZoHqMUmp8aSSQW+AgTA==","shasum":"c69d138b56d4d7f399be7f98275e45dad3466e47","tarball":"https://registry.npmjs.org/@chrono-os/health-nest/-/health-nest-0.1.1.tgz","fileCount":16,"unpackedSize":82879,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDG7LW20SinRPMOHOFoNg6bKwItQPzTQp8CJSt5HGDTnQIhAK/+k4TKM1x3JXUxnq59I/uP45qhBgqa1DRBQvMwlZDs"}]},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"directories":{},"maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/health-nest_0.1.1_1789076032138_0.7616412183494581"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-10T20:15:23.862Z","modified":"2026-09-10T21:33:52.463Z","0.1.0":"2026-09-10T20:15:24.193Z","0.1.1":"2026-09-10T21:33:52.302Z"},"bugs":{"url":"https://github.com/SugarHoneyIceTea/health-nest/issues"},"license":"MIT","homepage":"https://github.com/SugarHoneyIceTea/health-nest#readme","keywords":["health-check","readiness","liveness","nestjs","coolify","chrono-os"],"repository":{"type":"git","url":"git+https://github.com/SugarHoneyIceTea/health-nest.git"},"description":"Health check para NestJS: GET /health com checks de dependência (banco, Redis, heartbeat) em paralelo, timeout por check, 200 ok ou 503 degraded, sem vazar erro interno no corpo; GET /health/live para liveness.","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"readme":"# @chrono-os/health-nest\n\nHealth check para backend NestJS. `GET /health` roda os checks de dependência em paralelo, cada um com timeout próprio, e responde `200 {status:'ok'}` ou `503 {status:'degraded'}`. `GET /health/live` responde 200 enquanto o processo estiver vivo, sem tocar em nada.\n\nSubstitui o `HealthController` repetido no parque: uns devolvem 200 fixo sem olhar o banco (o orquestrador diz \"saudável\" com o Postgres fora), outros põem a mensagem do erro no corpo, e nenhum tem timeout (banco travado trava o health junto).\n\n```ts\nimport { HealthModule, prismaPing } from '@chrono-os/health-nest'\n\n@Module({\n  imports: [\n    HealthModule.forRootAsync({\n      inject: [PrismaService],\n      useFactory: (prisma: PrismaService) => ({\n        checks: {\n          db: prismaPing(prisma),                          // SELECT 1\n          redis: async () => (await redis.ping()) === 'PONG',\n          zapi: { run: () => !getZapiHealth().degraded, critical: false },\n        },\n        timeoutMs: 2000,\n        info: { service: 'meu-backend' },\n      }),\n      decorators: [Public(), SkipThrottle()],              // libera do guard global\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nResposta:\n\n```json\n{ \"service\": \"meu-backend\", \"status\": \"degraded\",\n  \"checks\": { \"db\": { \"status\": \"falha\", \"latencyMs\": 2001 }, \"redis\": { \"status\": \"ok\", \"latencyMs\": 3 } } }\n```\n\n## Regras\n\n- **Um check falha** quando lança, rejeita, devolve `false` ou passa do `timeoutMs` (default 3000, pode ser definido por check).\n- **O corpo nunca leva o erro.** Só `ok`/`falha` e a latência. O motivo vai para o log do servidor (`Logger` do Nest, ou `onFailure(name, error)`). Mensagem de erro do Prisma/pg costuma trazer host, usuário e nome do banco.\n- **`critical: false`** deixa o check só informativo: aparece no corpo, mas não derruba para 503.\n- **Prisma não é dependência.** `prismaPing(client)` chama `$queryRawUnsafe('SELECT 1')`; `sqlPing(pool)` serve `pg`. Qualquer `() => Promise` também vale.\n- **`path`** muda o prefixo (default `'health'`, aceita array); **`live: false`** tira a sub-rota de liveness.\n- **Com `setGlobalPrefix`**, exclua as rotas: `app.setGlobalPrefix('api/v1', { exclude: ['health', 'health/live'] })`.\n- **Backend Fastify** (sem Nest) usa só o núcleo: `import { runHealthChecks } from '@chrono-os/health-nest/core'`.\n\nPeers: `@nestjs/common` e `@nestjs/core` 11.\n","readmeFilename":"README.md"}