{"_id":"@codylabs/nestjs-pg-drizzle","_rev":"9-487b91e4e2235e8c9037a251e91a3225","name":"@codylabs/nestjs-pg-drizzle","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.1","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.1","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"dist":{"shasum":"e3ded33f7cec44abe8824d536972ae2dd59e379d","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.1.tgz","fileCount":35,"integrity":"sha512-CzqEEcZcDBLAq0TumOGXPtc3gF/pKZH/vPxFL+tAdumeNS4sCbHrPpFWBqHe8nG/OAw8HMRogYYXKIOkc32TkA==","signatures":[{"sig":"MEYCIQD2AZmGOogzaCLZBWlX2w/2OaHx5uCEJw0uGwm77drkvQIhANsQ6xB+T7wyxiBwhZxisdQQFzI2nosK6/t/HptQAnuX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296241},"main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.7"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.1_1779529439692_0.7143893458233248","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.2","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.2","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"dist":{"shasum":"fc6bbb47ed59ba7cde66e6f82588b807ae3199dd","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.2.tgz","fileCount":36,"integrity":"sha512-rmPkW5f2ni2vqsKI2K9dHQRN+XvT4Va92nu57k998/UjJ4eJsClMqwZ1KtrYzzh5LQdyooMA2oa5qSccR2sI2A==","signatures":[{"sig":"MEYCIQDxGXOlivxiCH6AiCkynSW3rrMAZw3qppRcdIRdR4cL0AIhAINH+SdaYtaKRttP6Y5O6xXEgWTDYxZvhEJ+ANxluuWu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311947},"main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.8"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.2_1779590111557_0.4177437892607987","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.3","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.3","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"dist":{"shasum":"c89706456592c250e0408c55947a231c8dc57b06","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.3.tgz","fileCount":42,"integrity":"sha512-4fWt587TBeg4OQ7BFLtk3uWqvKDQlzVKjmLAvhxQY4jCetL918f2o4UQPabh6vyoRtP9zxV+nidknVFKVfcmXQ==","signatures":[{"sig":"MEUCIQC1EyPLbZs49h20i2HXSzfriTAyU/ZbLzk9gQXDYBL/PgIgD6LX7JTuye8vcxLNnZmcUbDyG6DnHRxaGIOu7kVx26U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315470},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.8"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.3_1779983836057_0.7672353656823192","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.4","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.4","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"dist":{"shasum":"2d25339ec6f802382103c3bcd56ff2191fe75bb4","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.4.tgz","fileCount":42,"integrity":"sha512-iNWlO26DA4J+wu8igOFQ207Y2FyCOvw/aLgzSMmmfVOmrZ0gWafeBnRS84HWVXOjqrvHRnsYbKAe6L5i9EVsjA==","signatures":[{"sig":"MEMCIBgX9TniJ3/+1vVJ2+1XqBRGJJfPbCB5NrjPfKNeLnNSAh85m2QbajxXHpe2z4AKA3EjacNd2brnwUawKuIDrw9J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315577},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.8"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.4_1779984152599_0.8525452225519667","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.5","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.5","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"dist":{"shasum":"1d8f03386daca8e6918c16c7a4dab2b0a4c25809","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.5.tgz","fileCount":42,"integrity":"sha512-ejgFC21Xc2Bn+oXH12UUiG1MuFn9bdJkEclO9KHcQa6aXZHkbHrcqntlMcTCk8PfhcPDjr5LlYN9zHoE7I3yJw==","signatures":[{"sig":"MEQCIHaMZbrtN/ArUpTDCU/7PeE/BnmnygTQOgjqk/1rtZ4MAiAqxa/j7PQiDTPrEveBtz0HwKKXf4oeTs86ZKepPkmSQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315447},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.8"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-rc.1","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.5_1780041554859_0.04733317509907242","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.6","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.6","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"homepage":"https://github.com/cuongnd1705/codylabs#readme","bugs":{"url":"https://github.com/cuongnd1705/codylabs/issues"},"dist":{"shasum":"db8df3540a7b6fb0b470bd3597acae14feaa17b9","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.6.tgz","fileCount":42,"integrity":"sha512-KPcKk6KzrL1Ft5uaGhmOJn0pN6qOZeNVFxQYkizWD/JzB4KS5ald3e3itaGfv8OXDrZ30D9CMHYDS7GLEflDbQ==","signatures":[{"sig":"MEYCIQCiqu4u4pwPiaXiRXYA4A4ernbzkloDo7Pj5uHN88qKcQIhANDnRJNIVNQyTPqU1/r3lbSuZ4LfpR/3Emtzv160TfLk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315691},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"repository":{"url":"git+https://github.com/cuongnd1705/codylabs.git","type":"git"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.9"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-rc.1","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.6_1780126504238_0.24518494566215132","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.0.7","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.0.7","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"homepage":"https://github.com/cuongnd1705/codylabs#readme","bugs":{"url":"https://github.com/cuongnd1705/codylabs/issues"},"dist":{"shasum":"e095670db3ab5e23e85374d48a0b2ae6908d2bdc","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.0.7.tgz","fileCount":42,"integrity":"sha512-aCQxCd2UoL5TbqTfAIpXkRmh6zHb4Qy/CnySnSndgd7EFQ7lM2nZNNGEW0laYN46rNRtiejoiVc4eHNJxk12iQ==","signatures":[{"sig":"MEUCIBUzZahVc3m3yRhlJXNpSrVJNhgu8uPDoqm6o5LzM2pbAiEAllgOPF9dfj6Qw3sm72Bq2+Q2yoyfUMXt0yfQM83336g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315679},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"repository":{"url":"git+https://github.com/cuongnd1705/codylabs.git","type":"git"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.9"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-rc.1","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.0.7_1781847224354_0.36783237509974676","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.1.0","author":"Cody Nguyen","license":"MIT","_id":"@codylabs/nestjs-pg-drizzle@0.1.0","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"homepage":"https://github.com/cuongnd1705/codylabs#readme","bugs":{"url":"https://github.com/cuongnd1705/codylabs/issues"},"dist":{"shasum":"b35a463e2c70009e9c4e84cd23372d411a665305","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.1.0.tgz","fileCount":51,"integrity":"sha512-8igzdas2MymlKQcm3vroIN8vJA729g8uh4CfPNAu463pMp4PAacuPxkPJYsGRkTrRfNKc5h4YKJBL+ikzLnALw==","signatures":[{"sig":"MEYCIQCDb70pTMuToQheXWlNAEqK+RQervu6rqzcslMJ0xE0YAIhAPpmqG8Of0nZ6BSyIPEVx+2k08jgcXiVvO9BD/0iqHTy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":383440},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"jest --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test:watch":"jest --watch"},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"repository":{"url":"git+https://github.com/cuongnd1705/codylabs.git","type":"git"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@codylabs/typescript-configs":"0.0.9"},"peerDependencies":{"pg":"^8.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-rc.1","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-pg-drizzle_0.1.0_1784477196960_0.11756597909684996","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@codylabs/nestjs-pg-drizzle","version":"0.2.0","description":"PostgreSQL (using Drizzle ORM) module for NestJS","homepage":"https://github.com/cuongnd1705/codylabs#readme","bugs":{"url":"https://github.com/cuongnd1705/codylabs/issues"},"license":"MIT","author":"Cody Nguyen","repository":{"type":"git","url":"git+https://github.com/cuongnd1705/codylabs.git"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"publishConfig":{"access":"public"},"devDependencies":{"@codylabs/typescript-configs":"0.1.0","@swc/core":"^1.16.1","unplugin-swc":"^1.5.11","vitest":"^4.1.11"},"peerDependencies":{"@nestjs/common":"^12.0.0","@nestjs/core":"^12.0.0","@types/pg":"^8.0.0","drizzle-orm":">=1.0.0-rc.1","pg":"^8.0.0"},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf .turbo node_modules dist","prebuild":"rimraf dist","test":"vitest run --passWithNoTests","test:watch":"vitest"},"_nodeVersion":"24.20.0","_id":"@codylabs/nestjs-pg-drizzle@0.2.0","dist":{"integrity":"sha512-UPPnWBCHfx271EHLF1PKi/3f/uGX+KKvUN0AJuV9Gz7cqEvfy9LrfDVyasmwQWI87J9l8dhVkmJvw2SNQIcbjA==","shasum":"193f6a852af5c8ea3cc093883df504857bfa05b3","tarball":"https://registry.npmjs.org/@codylabs/nestjs-pg-drizzle/-/nestjs-pg-drizzle-0.2.0.tgz","fileCount":48,"unpackedSize":336014,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCE/uDpmYb0AUKXtvGQHeMiCMJ2Xw6ggWMRth2K0vKb4wIhAJfBuD7Np1L9ssjKDHZ45yAFhRet2pIL1aByD1Y2+JcB"}]},"_npmUser":{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"},"directories":{},"maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-pg-drizzle_0.2.0_1788017131290_0.359650355363349"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-23T09:43:59.565Z","modified":"2026-08-29T15:25:31.621Z","0.0.1":"2026-05-23T09:43:59.832Z","0.0.2":"2026-05-24T02:35:11.718Z","0.0.3":"2026-05-28T15:57:16.236Z","0.0.4":"2026-05-28T16:02:32.826Z","0.0.5":"2026-05-29T07:59:15.007Z","0.0.6":"2026-05-30T07:35:04.600Z","0.0.7":"2026-06-19T05:33:44.491Z","0.1.0":"2026-07-19T16:06:37.193Z","0.2.0":"2026-08-29T15:25:31.427Z"},"bugs":{"url":"https://github.com/cuongnd1705/codylabs/issues"},"author":"Cody Nguyen","license":"MIT","homepage":"https://github.com/cuongnd1705/codylabs#readme","repository":{"type":"git","url":"git+https://github.com/cuongnd1705/codylabs.git"},"description":"PostgreSQL (using Drizzle ORM) module for NestJS","maintainers":[{"name":"cuongnd1705","email":"cuongnd.work@gmail.com"}],"readme":"# @codylabs/nestjs-pg-drizzle\n\nPostgreSQL module for NestJS using [Drizzle ORM](https://orm.drizzle.team/). Provides a configurable global module, an `@InjectDrizzle()` decorator, and an abstract `BaseRepository` with a rich set of query helpers.\n\n## Installation\n\n```bash\npnpm add @codylabs/nestjs-pg-drizzle drizzle-orm@rc pg\npnpm add -D @types/pg\n```\n\n## Peer dependencies\n\n| Package          | Version                |\n| ---------------- | ---------------------- |\n| `@nestjs/common` | `^10.0.0 \\|\\| ^11.0.0` |\n| `@nestjs/core`   | `^10.0.0 \\|\\| ^11.0.0` |\n| `drizzle-orm`    | `>=1.0.0-0`            |\n| `pg`             | `^8.0.0`               |\n| `@types/pg`      | `^8.0.0`               |\n\n## Quick start\n\n### 1. Register the module\n\n```typescript\n// app.module.ts\nimport { Module } from '@nestjs/common';\nimport { DrizzleModule } from '@codylabs/nestjs-pg-drizzle';\nimport * as relations from './db/relations';\n\n@Module({\n  imports: [\n    DrizzleModule.forRoot({\n      host: 'localhost',\n      port: 5432,\n      user: 'postgres',\n      password: 'secret',\n      database: 'mydb',\n      relations, // optional — your Drizzle relations object\n      logger: true, // optional — log SQL queries\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nYou can pass a custom logger that satisfies Drizzle's `Logger` interface (e.g. to route SQL queries through your app's logger):\n\n```typescript\nimport { Logger } from '@codylabs/nestjs-pg-drizzle';\n\nclass MyLogger implements Logger {\n  logQuery(query: string, params: unknown[]) {\n    console.log('[SQL]', query, params);\n  }\n}\n\nDrizzleModule.forRoot({\n  host: 'localhost',\n  // ...\n  logger: new MyLogger(),\n});\n```\n\nFor async configuration (e.g. using `ConfigService`):\n\n```typescript\nDrizzleModule.forRootAsync({\n  inject: [ConfigService],\n  useFactory: (config: ConfigService) => ({\n    host: config.get('DB_HOST'),\n    port: config.get('DB_PORT'),\n    user: config.get('DB_USER'),\n    password: config.get('DB_PASSWORD'),\n    database: config.get('DB_NAME'),\n  }),\n});\n```\n\n### 2. Inject the database instance\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectDrizzle } from '@codylabs/nestjs-pg-drizzle';\nimport { Database } from '@codylabs/nestjs-pg-drizzle';\nimport * as relations from './db/schema';\n\n@Injectable()\nexport class UserService {\n  constructor(@InjectDrizzle() private readonly db: Database<typeof relations>) {}\n\n  findAll() {\n    return this.db.query.users.findMany();\n  }\n}\n```\n\n## BaseRepository\n\n`BaseRepository` is an abstract class that wraps a Drizzle table with a typed set of CRUD and pagination helpers. Extend it to create a repository for each table.\n\n### Creating a repository\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { BaseRepository, InjectDrizzle, Database } from '@codylabs/nestjs-pg-drizzle';\nimport { usersTable } from './db/schema';\nimport * as relations from './db/schema';\n\n@Injectable()\nexport class UsersRepository extends BaseRepository<\n  typeof usersTable,\n  typeof relations,\n  'users' // table name key in the relations schema\n> {\n  constructor(@InjectDrizzle() db: Database<typeof relations>) {\n    super(db, usersTable, 'users');\n  }\n}\n```\n\nRegister the repository as a provider and inject it wherever needed.\n\n### Available methods\n\n#### Write operations\n\n| Method                              | Description                                                                   |\n| ----------------------------------- | ----------------------------------------------------------------------------- |\n| `insert(value, opts?)`              | Insert a single row; returns the inserted row or `null`                       |\n| `insertMany(values, opts?)`         | Insert multiple rows                                                          |\n| `update(value, opts?)`              | Update rows matching `where`; auto-sets `updateTime` when the column exists   |\n| `delete(opts?)`                     | Hard-delete rows matching `where`                                             |\n| `softDelete(opts?)`                 | Set `deleteTime = NOW()` instead of deleting (requires a `deleteTime` column) |\n| `restore(opts?)`                    | Clear `deleteTime` to un-delete soft-deleted rows                             |\n| `increment(column, amount?, opts?)` | Atomically increment a numeric column                                         |\n| `decrement(column, amount?, opts?)` | Atomically decrement a numeric column                                         |\n\n#### Read operations\n\n| Method                    | Description                                                                     |\n| ------------------------- | ------------------------------------------------------------------------------- |\n| `findFirst(opts?)`        | Return the first matching row or `null`                                         |\n| `findFirstOrFail(opts?)`  | Return the first matching row or throw `NotFoundException`                      |\n| `findMany(opts?)`         | Return all matching rows                                                        |\n| `paginateByOffset(opts?)` | Offset-based pagination — returns `{ data, total, page, pageSize, totalPages }` |\n| `paginateByCursor(opts?)` | Cursor-based (keyset) pagination — returns `{ data, nextPageToken }`            |\n\n#### Aggregation\n\n| Method                   | Description                                |\n| ------------------------ | ------------------------------------------ |\n| `exists(opts?)`          | `true` if at least one matching row exists |\n| `count(opts?)`           | Number of matching rows                    |\n| `sum(column, opts?)`     | Sum of a numeric column                    |\n| `average(column, opts?)` | Average of a numeric column                |\n| `minimum(column, opts?)` | Minimum value of a numeric column          |\n| `maximum(column, opts?)` | Maximum value of a numeric column          |\n\nAll methods accept an optional `tx` option so they can participate in a Drizzle transaction.\n\n### Soft delete\n\nWhen the table has a `deleteTime` column, `findFirst`, `findFirstOrFail`, `findMany`, `paginateByOffset`, `paginateByCursor`, `count`, and `exists` automatically filter out soft-deleted rows. Pass `showDeleted: true` to include them.\n\n> **Note:** Calling `softDelete()` on a table without a `deleteTime` column throws a `BadRequestException`.\n\n```typescript\n// Exclude soft-deleted rows (default)\nawait this.usersRepository.findMany({ where: { role: 'admin' } });\n\n// Include soft-deleted rows\nawait this.usersRepository.findMany({ where: { role: 'admin' }, showDeleted: true });\n\n// Soft-delete a user\nawait this.usersRepository.softDelete({ where: { id: userId } });\n\n// Restore a soft-deleted user\nawait this.usersRepository.restore({ where: { id: userId } });\n```\n\n### Pagination\n\n#### Offset-based\n\n```typescript\nconst result = await this.usersRepository.paginateByOffset({\n  page: 2,\n  pageSize: 20,\n  orderBy: 'createdAt:desc,id:asc',\n  where: { role: 'admin' },\n});\n// result: { data: User[], total: number, page: number, pageSize: number, totalPages: number }\n```\n\n#### Cursor-based\n\n```typescript\n// First page\nconst first = await this.usersRepository.paginateByCursor({\n  pageSize: 20,\n  orderBy: 'createdAt:desc',\n});\n// first: { data: User[], nextPageToken: string | null }\n\n// Subsequent pages\nconst next = await this.usersRepository.paginateByCursor({\n  pageSize: 20,\n  orderBy: 'createdAt:desc',\n  pageToken: first.nextPageToken,\n});\n```\n\nPagination requires positive integer page values and a `pageSize` between 1 and 1000. Order expressions only\naccept `asc` or `desc`. Cursor tokens are opaque, URL-safe, versioned values; applications should return them to\nthe repository unchanged rather than decoding or constructing them.\n\n### Transactions\n\nUse `withTransaction()` on any repository to start a transaction. All repository methods accept an optional `tx` option to participate in an existing transaction.\n\n```typescript\nawait this.usersRepository.withTransaction(async (tx) => {\n  await this.usersRepository.insert({ name: 'Alice' }, { tx });\n  await this.postsRepository.insert({ authorId: userId, title: 'Hello' }, { tx });\n});\n```\n\nYou can also pass a transaction obtained elsewhere:\n\n```typescript\nimport { Transaction } from '@codylabs/nestjs-pg-drizzle';\nimport * as relations from './db/schema';\n\nawait this.db.transaction(async (tx: Transaction<typeof relations>) => {\n  await this.usersRepository.insert({ name: 'Alice' }, { tx });\n  await this.postsRepository.insert({ authorId: userId, title: 'Hello' }, { tx });\n});\n```\n\n### Lifecycle hooks\n\nOverride these protected methods in your repository subclass to add custom logic:\n\n```typescript\nexport class UsersRepository extends BaseRepository<...> {\n  protected async beforeInsert(row: PgInsertValue<typeof usersTable>) {\n    // e.g. hash passwords before persisting\n  }\n\n  protected async afterInsert(row: InferSelectModel<typeof usersTable>) {\n    // e.g. emit a domain event\n  }\n\n  protected async afterFind(row: InferSelectModel<typeof usersTable>) {\n    // e.g. strip sensitive fields\n  }\n\n  protected async beforeUpdate(value: PgUpdateSetSource<typeof usersTable>) {\n    // e.g. validate state transitions\n  }\n\n  protected async afterUpdate(row: InferSelectModel<typeof usersTable>) {\n    // e.g. publish an updated event\n  }\n\n  protected async afterDelete(row: InferSelectModel<typeof usersTable>) {\n    // e.g. publish a deleted event\n  }\n}\n```\n\n## API reference\n\n### `DrizzleModuleOptions`\n\n| Property                  | Type                     | Required | Description                                                                                |\n| ------------------------- | ------------------------ | -------- | ------------------------------------------------------------------------------------------ |\n| `host`                    | `string`                 | ✓        | Database host                                                                              |\n| `port`                    | `number`                 | ✓        | Database port                                                                              |\n| `user`                    | `string`                 | ✓        | Database user                                                                              |\n| `password`                | `string`                 | ✓        | Database password                                                                          |\n| `database`                | `string`                 | ✓        | Database name                                                                              |\n| `max`                     | `number`                 |          | Maximum number of pool connections (default: pg default)                                   |\n| `idleTimeoutMillis`       | `number`                 |          | Milliseconds a client can sit idle before being closed                                     |\n| `connectionTimeoutMillis` | `number`                 |          | Milliseconds to wait when acquiring a connection                                           |\n| `ssl`                     | `boolean \\| object`      |          | SSL configuration passed directly to `pg`                                                  |\n| `relations`               | `TablesRelationalConfig` |          | Drizzle relations object — required for relational queries                                 |\n| `logger`                  | `boolean \\| Logger`      |          | Enable query logging (`true` = built-in console logger) or pass a custom `Logger` instance |\n\n### `BaseRepository` constructor\n\n```typescript\nconstructor(db: Database<TSchema>, table: PgTable, tableName: keyof TSchema)\n```\n\n## License\n\nMIT\n","readmeFilename":""}