{"_id":"@chrono-os/prisma-nest","_rev":"2-a24fa0443218da9b8c3d86ad8129f7f6","name":"@chrono-os/prisma-nest","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@chrono-os/prisma-nest","version":"0.1.0","keywords":["prisma","prisma-7","adapter-pg","nestjs","postgres","chrono-os"],"license":"MIT","_id":"@chrono-os/prisma-nest@0.1.0","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"homepage":"https://github.com/SugarHoneyIceTea/prisma-nest#readme","bugs":{"url":"https://github.com/SugarHoneyIceTea/prisma-nest/issues"},"dist":{"shasum":"fefa581ec5853f04931c38b3bc9faf65592eae97","tarball":"https://registry.npmjs.org/@chrono-os/prisma-nest/-/prisma-nest-0.1.0.tgz","fileCount":18,"integrity":"sha512-wwnKBr+nHN7NJ+a8nC4RhsPPN/EKJura3H3gcHXb42dUjwecawbcf4GORroYLme5yIKLj90g2eRcMGrLp+NUzA==","signatures":[{"sig":"MEUCICnbD8ejkxuX4zGCwNfGTPbv26+ArftwVBsIl+ykPbmiAiEAvTdGXWzeul7h1VxhTsmGWnGtdPou8R44xCaI/D7rbGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146683},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.19"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nest":{"types":"./dist/nest.d.ts","import":"./dist/nest.js","require":"./dist/nest.cjs"},"./package.json":"./package.json"},"gitHead":"748347c4bfbac248f938a6691d935862cd9c45b8","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","pretest":"yarn gerar:fixture","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json","test:watch":"vitest","pretypecheck":"yarn gerar:fixture","gerar:fixture":"prisma generate --schema tests/fixtures/schema.prisma"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"git+https://github.com/SugarHoneyIceTea/prisma-nest.git","type":"git"},"_npmVersion":"11.9.0","description":"Prisma 7 + Postgres sem os dois footguns: driver adapter impossível de esquecer e boot que prova o banco com SELECT 1 (o $connect() virou no-op). Fábrica do PrismaPg, ping reutilizável e PrismaService para NestJS.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","rxjs":"^7.8.1","tsup":"^8.3.0","prisma":"7.10.0","vitest":"^3","@types/pg":"^8.20.0","typescript":"5.9.3","@types/node":"^25.9.1","@nestjs/core":"11.2.3","@nestjs/common":"11.2.3","@prisma/client":"7.10.0","reflect-metadata":"^0.2.2","@prisma/adapter-pg":"7.10.0"},"peerDependencies":{"@nestjs/common":"^11.0.0","@prisma/client":"^7.0.0","@prisma/adapter-pg":"^7.0.0"},"peerDependenciesMeta":{"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/prisma-nest_0.1.0_1789070589032_0.4364124776435605","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@chrono-os/prisma-nest","version":"0.1.1","description":"Prisma 7 + Postgres sem os dois footguns: driver adapter impossível de esquecer e boot que prova o banco com SELECT 1 (o $connect() virou no-op). Fábrica do PrismaPg, ping reutilizável e PrismaService para NestJS.","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"}},"./nest":{"import":{"types":"./dist/nest.d.ts","default":"./dist/nest.js"},"require":{"types":"./dist/nest.d.cts","default":"./dist/nest.cjs"}},"./package.json":"./package.json"},"sideEffects":false,"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"repository":{"type":"git","url":"git+https://github.com/SugarHoneyIceTea/prisma-nest.git"},"keywords":["prisma","prisma-7","adapter-pg","nestjs","postgres","chrono-os"],"scripts":{"build":"tsup","dev":"tsup --watch","gerar:fixture":"prisma generate --schema tests/fixtures/schema.prisma","pretest":"yarn gerar:fixture","test":"vitest run","test:watch":"vitest","pretypecheck":"yarn gerar:fixture","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json"},"peerDependencies":{"@nestjs/common":"^11.0.0","@prisma/adapter-pg":"^7.0.0","@prisma/client":"^7.0.0"},"peerDependenciesMeta":{"@nestjs/common":{"optional":true}},"devDependencies":{"@nestjs/common":"11.2.3","@nestjs/core":"11.2.3","@prisma/adapter-pg":"7.10.0","@prisma/client":"7.10.0","@types/node":"^25.9.1","@types/pg":"^8.20.0","pg":"^8.20.0","prisma":"7.10.0","reflect-metadata":"^0.2.2","rxjs":"^7.8.1","tsup":"^8.3.0","typescript":"5.9.3","vitest":"^3"},"engines":{"node":">=20.19"},"gitHead":"8ab11925fa3bdf56fc7277ec3a56254eba7d8ab0","_id":"@chrono-os/prisma-nest@0.1.1","bugs":{"url":"https://github.com/SugarHoneyIceTea/prisma-nest/issues"},"homepage":"https://github.com/SugarHoneyIceTea/prisma-nest#readme","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-3QozZRo07hl6hVxYFzGOaOWFAWOOzLZGev9j1glvgPLoMiMoMPEHxoopq+VNuQCQ7DyosbmvZ+IHcP51osubcw==","shasum":"51e69600b0c902f69f4377905f11917d440a3acb","tarball":"https://registry.npmjs.org/@chrono-os/prisma-nest/-/prisma-nest-0.1.1.tgz","fileCount":18,"unpackedSize":147235,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHR1c4iQR8LcCuEktS4q8cDfoWbOLNsgR85Yp456n+D0AiAFL5bOL2sFHiIdQ+lJJudfwfVsKgw4GBwHuyvE6w3VSQ=="}]},"_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/prisma-nest_0.1.1_1789076207958_0.5614406389593722"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-10T20:03:08.821Z","modified":"2026-09-10T21:36:48.252Z","0.1.0":"2026-09-10T20:03:09.154Z","0.1.1":"2026-09-10T21:36:48.083Z"},"bugs":{"url":"https://github.com/SugarHoneyIceTea/prisma-nest/issues"},"license":"MIT","homepage":"https://github.com/SugarHoneyIceTea/prisma-nest#readme","keywords":["prisma","prisma-7","adapter-pg","nestjs","postgres","chrono-os"],"repository":{"type":"git","url":"git+https://github.com/SugarHoneyIceTea/prisma-nest.git"},"description":"Prisma 7 + Postgres sem os dois footguns: driver adapter impossível de esquecer e boot que prova o banco com SELECT 1 (o $connect() virou no-op). Fábrica do PrismaPg, ping reutilizável e PrismaService para NestJS.","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"readme":"# @chrono-os/prisma-nest\n\nPrisma 7 com Postgres (`@prisma/adapter-pg`) sem os dois erros que o parque já pagou em separado: esquecer o driver adapter e confiar no `$connect()`. Entrega a fábrica do adapter, um ping reutilizável por health check e a classe base do `PrismaService` para NestJS.\n\n## Os dois footguns\n\n**1. `super()` sem adapter só quebra em runtime.** No Prisma 7, `new PrismaClient()` sem driver adapter lança `A driver adapter is required`. O typecheck passa. Em `class PrismaService extends PrismaClient`, quem instancia é o `super()`, que nem aparece num grep por `new PrismaClient`. Aqui o `super()` é do pacote e sempre recebe o adapter.\n\n**2. `$connect()` virou no-op.** Com driver adapter, `$connect()` só cria o pool do `pg`, que é preguiçoso, e resolve com o banco fora do ar (medido em 71 ms contra endereço morto no painel-conteudo; o teste `tests/prisma-real.test.ts` reproduz). O `try/catch` em volta dele é código morto e o log \"Database connected\" mente. O boot deste pacote roda `SELECT 1` com timeout.\n\n## Nest\n\n```ts\nimport { Injectable } from '@nestjs/common'\nimport { PrismaClient } from '@prisma/client' // ou o caminho do seu `output`\nimport { createPrismaService } from '@chrono-os/prisma-nest/nest'\n\n@Injectable()\nexport class PrismaService extends createPrismaService(PrismaClient, {\n  politicaBoot: 'avisar',          // 'falhar' derruba o boot se o banco não responder\n  timeoutPingMs: 5000,\n  adapter: { max: 10, connectionTimeoutMillis: 5000 },\n  client: { log: ['error'] },      // resto das opções do PrismaClient, menos `adapter`\n}) {}\n```\n\n- `'avisar'` (default) loga e sobe; rotas com banco falham até ele voltar e o `/health` conta a verdade. `'falhar'` faz o bootstrap do Nest rejeitar.\n- `adapter` aceita uma função, avaliada no construtor, para ler um env validado sem tocar nele no import: `adapter: () => ({ url: env.DATABASE_URL })`.\n- `onModuleDestroy` chama `$disconnect()`, que fecha o pool. O Nest só chama esse hook no SIGTERM se o `main.ts` tiver `app.enableShutdownHooks()`.\n\n## Fora do Nest (singleton, worker, script, Fastify)\n\n```ts\nimport { criarAdapterPg, pingBanco, verificarBancoNoBoot } from '@chrono-os/prisma-nest'\n\nexport const prisma = new PrismaClient({ adapter: criarAdapterPg() })\nawait verificarBancoNoBoot(prisma, { politica: 'falhar' })\nhealth.registrar('db', pingBanco(prisma, 2000)) // () => Promise<{ latenciaMs }>\n```\n\nO entry raiz não importa Nest.\n\n## `criarAdapterPg(opts)`\n\n| Opção | Default | Nota |\n|---|---|---|\n| `url` | `process.env.DATABASE_URL` | Lida na chamada, nunca no import. |\n| `max` | `10` | Teto do pool por client. Dois clients no mesmo processo somam. |\n| `connectionTimeoutMillis` | `5000` | O default do `pg` é 0, que espera para sempre. |\n| `ssl` | não definido | Se a URL tiver `sslmode=` ou `ssl=`, a URL vence (regra do `pg`). |\n| `schema` | não definido | `PrismaPgOptions.schema`. |\n| `permitirSemUrl` | `false` | Sem URL, usa um placeholder que nunca conecta em vez de lançar. |\n| `onPoolError` | loga via `logger.error` | Conexão ociosa que morreu (Postgres reiniciado). |\n| `pg` | | Qualquer outra chave do `pg.PoolConfig`. |\n\n## Credencial fora de log e erro\n\nNenhuma mensagem do pacote inclui a URL. Erro de ping e de boot passa por `mascararSegredos`: a URL conhecida vira `[DATABASE_URL]`, a senha solta vira `***` e qualquer `postgres://user:senha@` restante perde a senha. O erro que sai do `pingBanco` é um `Error` novo (com o `code` do Prisma preservado), sem o objeto original.\n\n## Testes\n\n`yarn test` gera o client do schema de teste e roda unit + Prisma real contra endereço morto. A integração com Postgres de verdade roda com `PRISMA_NEST_IT_URL` definida (instruções em `tests/integracao-pg.test.ts`).\n","readmeFilename":"README.md"}