{"_id":"@asenajs/asena-drizzle","_rev":"11-5a7f00d890634765103df920b9cd0a1f","name":"@asenajs/asena-drizzle","dist-tags":{"latest":"4.0.0"},"versions":{"1.0.1":{"name":"@asenajs/asena-drizzle","version":"1.0.1","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@1.0.1","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"2bd2de75bbaf94e1a39e3a8480f5a124a5fef53d","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-1.0.1.tgz","fileCount":42,"integrity":"sha512-hQ5yXb+C2OafP3z/pR8UZk/AAsSY/RfgJil5TSJvr2wIjZih2M+a8t01931i8jRJBD0/x0C8PbT8hadgOvRAWA==","signatures":[{"sig":"MEQCIGS+L/hsqY3r+wLUYqrcz6S6V9kSftm1E6q0B50mZv7pAiA2gJjwxy1XJymLjfA4rQDjLj63bAzzzfcqFqE+AWX8zA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89499},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"d512b9016712aa6377f566f2dc4c96b09a30aad2","scripts":{"test":"bun test","build":"bun run clean && tsc","clean":"rm -rf dist","release":"bun run build && changeset publish","version":"changeset version","changeset":"changeset","test:watch":"bun test --watch","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"11.6.0","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"24.8.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","eslint":"^8.57.1","mysql2":"^3.15.1","prettier":"^3.6.2","@types/pg":"^8.15.5","@types/bun":"latest","drizzle-kit":"^0.31.5","drizzle-orm":"^0.44.5","@asenajs/asena":"^0.3.2","@changesets/cli":"^2.29.7","eslint-plugin-n":"^16.6.2","reflect-metadata":"^0.2.2","eslint-config-alloy":"^5.1.2","eslint-plugin-alloy":"^1.2.1","eslint-plugin-import":"^2.32.0","eslint-plugin-promise":"^6.6.0","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/eslint-plugin":"^6.21.0"},"peerDependencies":{"pg":"^8.0.0","mysql2":"^3.0.0","typescript":"^5.9.2","drizzle-orm":"^0.44.5","@asenajs/asena":"^0.3.2","reflect-metadata":"^0.1.13"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_1.0.1_1759188028585_0.5745519821098546","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@asenajs/asena-drizzle","version":"1.0.2","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@1.0.2","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"6e144163a3d038b21359f4f282c8b5f556514ad3","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-1.0.2.tgz","fileCount":48,"integrity":"sha512-9HkeIFjZa8D7GZ1Hfo38m4ShIE1U+Fu8WF/llq0kImJKkHgnbTtwEcSI3QTY7RQ6/XsRloAaX+/uI+anCZahhw==","signatures":[{"sig":"MEYCIQClF+wHwEW75P2NgjAH26013LWhCzNTSiHvqmlqlpmm6wIhAIHjL9LTpj5HReYVDF+vfVcAX6IsnAu+9hFN2lvZpxOi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100696},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"40868ede9c29b9cacc2df8f8683549b0cbee257f","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"11.6.2","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"25.0.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","eslint":"^9.38.0","mysql2":"^3.15.3","prettier":"^3.6.2","@types/pg":"^8.15.5","@types/bun":"latest","drizzle-kit":"^0.31.5","drizzle-orm":"^0.44.7","@asenajs/asena":"0.5.0","@changesets/cli":"^2.29.7","reflect-metadata":"^0.2.2","typescript-eslint":"^8.46.2","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.46.2","@typescript-eslint/eslint-plugin":"^8.46.2"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.2","drizzle-orm":"^0.44.5","@asenajs/asena":"^0.5.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_1.0.2_1761426417865_0.19677651151474418","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@asenajs/asena-drizzle","version":"1.1.0","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@1.1.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"5515969ba030bb6fe81383805e6ff88b26d21a15","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-1.1.0.tgz","fileCount":48,"integrity":"sha512-mj15QjlCDtLfu0MPfUkj7tlDuftb5EvdRrb5s9Spa/Z9fVDfzRrfEaaogB4vmkExpshthts+fUNBtsUEt/ahnw==","signatures":[{"sig":"MEYCIQDYFA1+NG+bGReueRTj3aCneJbeyvyArAdqccvqKuRAtAIhAIOYrXg9r5EwiZJ/3cHv3PZFH0IjVEMiKh2/OZ06c3H1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100743},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"dc7d68295a4ff3530720534473b9b48555c7a9b0","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"11.12.1","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","eslint":"^9.39.4","mysql2":"^3.20.0","prettier":"^3.8.1","@types/pg":"^8.20.0","@types/bun":"latest","drizzle-kit":"^0.31.10","drizzle-orm":"^0.44.7","@asenajs/asena":"^0.7.0","@changesets/cli":"^2.30.0","reflect-metadata":"^0.2.2","typescript-eslint":"^8.58.0","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.58.0","@typescript-eslint/eslint-plugin":"^8.58.0"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.2","drizzle-orm":"^0.44.5","@asenajs/asena":"^0.7.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_1.1.0_1775523325556_0.08922838501697616","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@asenajs/asena-drizzle","version":"1.1.1","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@1.1.1","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"38a267e13ce73a6c887f827547ebfb8b86ea06e4","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-1.1.1.tgz","fileCount":48,"integrity":"sha512-ivt2Sjnf54Qij1TWklA7oiktyxyodAgD3QQoqjBsxF7X9NKIk6PMHqvQ5IemGQ5iKHknta2IcseKLX1PFHaI7Q==","signatures":[{"sig":"MEQCIHevbR5bHiUsOzJmkOQC1GR3Jyfz/eDK0ONAUIBnezG7AiBcymFlF/xgr52yIjr1nojsE3fcbLjlLhERAphYlHwLVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100743},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"a6f89f01a7bc24dad6601aebc360e06a9fe9cfb1","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"11.12.1","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","eslint":"^9.39.4","mysql2":"^3.20.0","prettier":"^3.8.1","@types/pg":"^8.20.0","@types/bun":"latest","drizzle-kit":"^0.31.10","drizzle-orm":"^0.44.7","@asenajs/asena":"^0.7.0","@changesets/cli":"^2.30.0","reflect-metadata":"^0.2.2","typescript-eslint":"^8.58.0","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.58.0","@typescript-eslint/eslint-plugin":"^8.58.0"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.2","drizzle-orm":"^0.44.5","@asenajs/asena":"^0.7.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_1.1.1_1775574590892_0.3562166398114468","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@asenajs/asena-drizzle","version":"1.1.2","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@1.1.2","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"400fcf7cb81a2f24548944ab076e9cdb9405620b","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-1.1.2.tgz","fileCount":42,"integrity":"sha512-5cZJingmIfbK0CjS82ITTxbrdgnKifQyw+83CUVz48+581EBsVH7aXUGEXpL2Of3lIvSpS1K0SSkJmDZmjmSnA==","signatures":[{"sig":"MEYCIQC1LkiPaX+Hf3wcNZxvVZDTgH06fEhlUEAsLR1aWfWkIQIhALVfCJzez+e/rdVEH5r6o57CRnPnXa99sI1BZa62KDV1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89747},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"4d0cbeb96fb83328c5535b08123baaea74f1fe14","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"11.12.1","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","eslint":"^9.39.4","mysql2":"^3.22.0","prettier":"^3.8.2","@types/pg":"^8.20.0","@types/bun":"latest","drizzle-kit":"^0.31.10","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.7.0","@changesets/cli":"^2.30.0","reflect-metadata":"^0.2.2","typescript-eslint":"^8.58.1","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.3","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.7.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_1.1.2_1775939394054_0.627363120374655","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@asenajs/asena-drizzle","version":"1.2.0","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@1.2.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"6ffab353aeea0a5d9394a4db692fbeb8cc78bd35","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-1.2.0.tgz","fileCount":66,"integrity":"sha512-KtXAKB2bJOg5T71nrgNO88pNDKAhQYhri6iSyMUyTIVkkbg3Cj8tX0jxfA7WuwIH+dF/1qJisgxH1HkBbpB73A==","signatures":[{"sig":"MEUCIFg+D4c4K6devgJqR1qKSg/2W4/53UHkeErKAt3cRd2EAiEAu2vVTzrIZ3IqCcQZ30ubwQ2w5lM1h8sle6SYPJM7ljc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136531},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","gitHead":"ce8744ee510ec0d6c0c2a3448686a179d9dd8c30","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"12.0.1","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","eslint":"^9.39.4","mysql2":"^3.22.2","prettier":"^3.8.3","@types/pg":"^8.20.0","@types/bun":"latest","drizzle-kit":"^0.31.10","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.8.0","@changesets/cli":"^2.31.0","reflect-metadata":"^0.2.2","typescript-eslint":"^8.59.0","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.59.0","@typescript-eslint/eslint-plugin":"^8.59.0"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.3","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.7.0 || ^0.8.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_1.2.0_1785008655430_0.45776497483730183","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@asenajs/asena-drizzle","version":"2.0.0","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@2.0.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"3689605f0e25f885c1cacf39b6f3f37f00cd2201","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-2.0.0.tgz","fileCount":66,"integrity":"sha512-19NGVeY7YOwikqoRsn0XmdfiYIHTI2R4KH+j1K+/1z8OwYuSQvyfPPtBzxbJNzONSutXJ7BjMwAT3BE4zmoYcQ==","signatures":[{"sig":"MEUCIQCOi1iH8z3bGmBwPtjWSRpPInDy0S4Bx+eZw0Vz9RQnnwIgY3nkqEdLKFvg/wrycrqgMroWuPjNKYi2APAUdHPkwyM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137057},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","engines":{"bun":">=1.3.12"},"gitHead":"f3895d12654c0d6835a87942f92387b633bc77c7","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"12.0.1","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","eslint":"^9.39.4","mysql2":"^3.22.2","prettier":"^3.8.3","@types/pg":"^8.20.0","@types/bun":"latest","drizzle-kit":"^0.31.10","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.9.0","@changesets/cli":"^2.31.0","reflect-metadata":"^0.2.2","typescript-eslint":"^8.59.0","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.59.0","@typescript-eslint/eslint-plugin":"^8.59.0"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.3","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.9.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_2.0.0_1785197661849_0.9228827358608949","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@asenajs/asena-drizzle","version":"3.0.0","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"author":{"name":"LibirSoft"},"license":"MIT","_id":"@asenajs/asena-drizzle@3.0.0","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"dist":{"shasum":"2cd28b21784f017c061de95c7c34e1ffcc03291b","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-3.0.0.tgz","fileCount":66,"integrity":"sha512-brfiK5Iu6TgTzkl3c5u20VKWPEXeym8kb0rDA6rZNdpxws4KcIMHOVIAvaoH1NxeySQvYoWUGNHQu7dX0UkI4Q==","signatures":[{"sig":"MEYCIQCwOTQwvJqO6vynRSLz5VQPJ2KBZF81EuN+uDbkovmOWwIhAKQTm4rFi5OQldwGMJmAvzWqt98PDxC1Svq6RTw1qjHN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154291},"main":"dist/index.js","types":"dist/index.d.ts","module":"index.ts","engines":{"bun":">=1.3.12"},"gitHead":"cc763eefc488d8407c34761f2395a8a7a2bd1cc6","scripts":{"lint":"eslint .","test":"bun test","build":"bun run clean && tsc","check":"bun run lint && bun run format:check","clean":"rm -rf dist","format":"prettier --write .","release":"bun run build && changeset publish","version":"changeset version","lint:fix":"eslint . --fix","changeset":"changeset","check:fix":"bun run lint:fix && bun run format","typecheck":"tsc -p tsconfig.typecheck.json","test:watch":"bun test --watch","format:check":"prettier --check .","test:coverage":"bun test --coverage","prepublishOnly":"bun run build"},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"repository":{"url":"git+https://github.com/AsenaJs/asena-drizzle.git","type":"git"},"_npmVersion":"12.0.1","description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"pg":"^8.20.0","eslint":"^9.39.4","mysql2":"^3.22.2","prettier":"^3.8.3","@types/pg":"^8.20.0","@types/bun":"latest","drizzle-kit":"^0.31.10","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.10.0","@changesets/cli":"^2.31.0","reflect-metadata":"^0.2.2","typescript-eslint":"^8.59.0","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^8.59.0","@typescript-eslint/eslint-plugin":"^8.59.0"},"peerDependencies":{"pg":">=8","mysql2":">=2","typescript":"^5.9.3","drizzle-orm":"^0.45.2","@asenajs/asena":"^0.10.0","reflect-metadata":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/asena-drizzle_3.0.0_1785360439586_0.6106255561041298","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@asenajs/asena-drizzle","version":"4.0.0","author":{"name":"LibirSoft"},"description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","main":"dist/index.js","module":"index.ts","types":"dist/index.d.ts","license":"MIT","engines":{"bun":">=1.4.0"},"keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"repository":{"type":"git","url":"git+https://github.com/AsenaJs/asena-drizzle.git"},"bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"homepage":"https://github.com/AsenaJs/asena-drizzle#readme","scripts":{"test":"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage","build":"bun run clean && tsc","typecheck":"tsc -p tsconfig.typecheck.json","clean":"rm -rf dist","prepublishOnly":"bun run build","changeset":"changeset","version":"changeset version","release":"bun run build && changeset publish","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write .","format:check":"prettier --check .","check":"bun run lint && bun run format:check","check:fix":"bun run lint:fix && bun run format"},"devDependencies":{"@asenajs/asena":"^0.11.0","@changesets/cli":"^2.31.1","@types/bun":"latest","@types/pg":"^8.23.1","@typescript-eslint/eslint-plugin":"^8.68.0","@typescript-eslint/parser":"^8.68.0","drizzle-kit":"^0.31.10","drizzle-orm":"^0.45.2","eslint":"^9.39.5","eslint-config-prettier":"^9.1.2","mysql2":"^3.24.2","pg":"^8.23.0","prettier":"^3.9.6","reflect-metadata":"^0.2.2","typescript-eslint":"^8.68.0"},"peerDependencies":{"@asenajs/asena":"^0.11.0","drizzle-orm":"^0.45.2","typescript":"^5.9.3","mysql2":">=2","pg":">=8","reflect-metadata":"^0.2.2"},"gitHead":"ec8da88d3b21d87dfc193a269244e5e9fe9483fd","_id":"@asenajs/asena-drizzle@4.0.0","_nodeVersion":"26.7.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-HunvWEIWN3XAT71JFn7QwJ3cX7+bEcAzj+Zc1N4s/NwsfRKuTsTYBVFULaQxumpagH2QnttjiHSOwA0VOPGGfQ==","shasum":"6d98937c91f12f59ad3b456e61edd3f966215c7e","tarball":"https://registry.npmjs.org/@asenajs/asena-drizzle/-/asena-drizzle-4.0.0.tgz","fileCount":72,"unpackedSize":171907,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC/wx2X2H+z6DlRzI/HQyaYBSbiW32nW9t9EklF1H17QAiEAv1H1AWub1dsgyJCYTNZvfZogsvB/UbegTE92TGuSUcc="}]},"_npmUser":{"name":"libir","email":"libirsoft@gmail.com"},"directories":{},"maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/asena-drizzle_4.0.0_1787695346110_0.6601220831924546"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-29T22:52:16.864Z","modified":"2026-08-25T22:02:26.446Z","1.0.0":"2025-09-29T22:52:17.202Z","1.0.1":"2025-09-29T23:20:28.761Z","1.0.2":"2025-10-25T21:06:58.054Z","1.1.0":"2026-04-07T00:55:25.707Z","1.1.1":"2026-04-07T15:09:51.050Z","1.1.2":"2026-04-11T20:29:54.181Z","1.2.0":"2026-07-25T19:44:15.551Z","2.0.0":"2026-07-28T00:14:22.063Z","3.0.0":"2026-07-29T21:27:19.733Z","4.0.0":"2026-08-25T22:02:26.251Z"},"bugs":{"url":"https://github.com/AsenaJs/asena-drizzle/issues"},"author":{"name":"LibirSoft"},"license":"MIT","homepage":"https://github.com/AsenaJs/asena-drizzle#readme","keywords":["asenajs","drizzle","drizzle-orm","database","orm","repository","postgresql","mysql","typescript","decorators","ioc","dependency-injection"],"repository":{"type":"git","url":"git+https://github.com/AsenaJs/asena-drizzle.git"},"description":"Type-safe database integration for AsenaJS with Drizzle ORM - Repository pattern, decorators, and multi-database support","maintainers":[{"name":"libir","email":"libirsoft@gmail.com"}],"readme":"# @asenajs/asena-drizzle\n\n[![Version](https://img.shields.io/badge/version-4.0.0-blue.svg)](https://github.com/AsenaJs/asena-drizzle#readme)\n[![Bun Version](https://img.shields.io/badge/Bun-1.4%2B-blueviolet)](https://bun.sh)\n\nDrizzle ORM utilities for AsenaJS - A powerful and type-safe database integration package that provides generic Database services and Repository patterns.\n\n## Features\n\n- 🚀 **Generic Database Service** - Support for multiple database types (PostgreSQL, MySQL, BunSQL)\n- 🎯 **Type-Safe Repository Pattern** - Full TypeScript support with inferred types\n- 🏷️ **Decorator-Based Configuration** - Easy setup with `@Database`, `@Repository`, `@Transaction`, and `@Drizzle` decorators\n- 🔄 **Declarative Transactions** - `@Transaction` with `REQUIRED` / `NESTED` / `REQUIRES_NEW` propagation, propagated through `AsyncLocalStorage`\n- 🔧 **AsenaJS Integration** - Seamless IoC container integration.\n- 📦 **Multiple Database Support** - Connect to different databases simultaneously\n- ⚡ **Performance Optimized** - Connection pooling and efficient query execution\n\n## Requirements\n\n- [Bun](https://bun.sh) v1.4 or higher\n- [@asenajs/asena](https://github.com/AsenaJs/Asena) v0.11.0 or higher\n- [drizzle-orm](https://orm.drizzle.team) v0.44 or higher\n\n## Installation\n\n```bash\nbun add @asenajs/asena-drizzle drizzle-orm\n# For PostgreSQL\nbun add pg\n# For MySQL\nbun add mysql2\n```\n\n## Quick Start\n\n### 1. Database Service Setup\n\n```typescript\nimport { Database } from '@asenajs/asena-drizzle';\n\n@Database({\n  type: 'postgresql',\n  config: {\n    host: 'localhost',\n    port: 5432,\n    database: 'myapp',\n    user: 'postgres',\n    password: 'password',\n  },\n  name: 'MainDatabase' // Optional: for multiple databases but we recommend using it\n})\nexport class MyDatabase extends AsenaDatabaseService {}\n```\n\n### 2. Repository Setup\n\n```typescript\nimport { BaseRepository, Repository } from '@asenajs/asena-drizzle';\nimport { pgTable, uuid, text } from 'drizzle-orm/pg-core';\n\nconst users = pgTable('users', {\n  id: uuid('id').primaryKey().defaultRandom(),\n  name: text('name').notNull(),\n  email: text('email').notNull().unique(),\n});\n\n@Repository({\n  table: users,\n  databaseService: 'MainDatabase',\n})\nexport class UserRepository extends BaseRepository<typeof users> {\n  \n  async findByEmail(email: string) {\n    return this.findOne(eq(users.email, email));\n  }\n}\n```\n\n### 3. Activate the Transaction Post-Processor\n\nIf you want to use `@Transaction`, drop a one-liner `@Drizzle`-decorated class anywhere inside your project's source folder (typically `src/config/`). AsenaJS only scans your own source files — never `node_modules` — so the post-processor must be subclassed in your codebase to be discovered.\n\n```typescript\n// src/config/AppDrizzle.ts\nimport { Drizzle, TransactionPostProcessor } from '@asenajs/asena-drizzle';\n\n@Drizzle({ defaultDb: 'MainDatabase' })\nexport class AppDrizzle extends TransactionPostProcessor {}\n```\n\n`defaultDb` lets single-database projects skip the `database` option on every `@Transaction`. You can omit it (`@Drizzle()`) if you'd rather always specify the database name explicitly.\n\n### 4. Service Usage\n\n```typescript\nimport { Service } from '@asenajs/asena/decorators';\nimport { Inject } from '@asenajs/asena/decorators/ioc';\n\n@Service(\"UserService\")\nexport class UserService {\n  \n  @Inject(\"UserRepository\")\n  private userRepository: UserRepository;\n\n  async createUser(name: string, email: string) {\n    return this.userRepository.create({ name, email });\n  }\n\n  async getAllUsers() {\n    return this.userRepository.findAll();\n  }\n\n  async getUsersPaginated(page = 1, limit = 10) {\n    return this.userRepository.paginate(page, limit);\n  }\n}\n```\n\n## Transactions\n\nWrap any service method with `@Transaction` to run it inside a Drizzle transaction. Repository calls made from within the method automatically pick up the active transaction via `AsyncLocalStorage` — no explicit `tx` parameter passing required.\n\n> **Setup required:** make sure you have a `@Drizzle`-decorated class in your source folder (see [Step 3 of Quick Start](#3-activate-the-transaction-post-processor)). Without it, `@Transaction` methods would run with autocommit, so the boot **fails** with `@Transaction methods are not wrapped: <Class>.<method>` instead of starting a half-configured server. The same error fires when a transactional class sits inside a post-processor's dependency closure (i.e. a `@Drizzle` subclass — or something it injects — `@Inject`s the class): such classes are constructed before post-processing is active and can never be wrapped; keep them out of that closure.\n\n```typescript\nimport { Service } from '@asenajs/asena/decorators';\nimport { Inject } from '@asenajs/asena/decorators/ioc';\nimport { Transaction } from '@asenajs/asena-drizzle';\n\n@Service('AccountService')\nexport class AccountService {\n    \n  @Inject('UserRepository') \n  private userRepo: UserRepository;\n  \n  @Inject('AuditRepository') \n  private auditRepo: AuditRepository;\n\n  // Uses defaultDb from @Drizzle({ defaultDb: 'MainDatabase' })\n  @Transaction()\n  async register(payload: { email: string; name: string }) {\n    const user = await this.userRepo.create(payload);\n    await this.auditRepo.create({ userId: user.id, event: 'register' });\n    // If either insert throws, both rows roll back atomically.\n    return user;\n  }\n}\n```\n\n### Propagation Modes\n\n| Mode | Behavior |\n|---|---|\n| `REQUIRED` (default) | Joins the active transaction, or starts a new top-level one if none exists. |\n| `NESTED` | Opens a `SAVEPOINT` inside the active transaction, or a new top-level one if none exists. Inner failures roll back to the savepoint without discarding the outer transaction. |\n| `REQUIRES_NEW` | Always starts an independent top-level transaction. The outer transaction is suspended for the duration of the call. |\n\n```typescript\n@Transaction({ database: 'MainDatabase', propagation: 'NESTED', isolationLevel: 'serializable' })\nasync bestEffortAudit(userId: string) { /* ... */ }\n\n@Transaction({ database: 'MainDatabase', propagation: 'REQUIRES_NEW' })\nasync writeAuditLog(event: AuditEvent) { /* survives outer rollback */ }\n```\n\n### Programmatic Transactions\n\nWhen you need a transaction boundary inside a single method, use `BaseRepository#transaction(callback, options?)`:\n\n```typescript\nawait this.userRepo.transaction(async () => {\n  await this.userRepo.create(...);\n  await this.profileRepo.create(...);\n}, { isolationLevel: 'repeatable read' });\n```\n\nInside an active `@Transaction` scope this opens a savepoint; outside, it starts a new top-level transaction.\n\n> ⚠️ **Self-invocation:** `@Transaction` only wraps actual class methods. Arrow-function class properties (`run = async () => …`) are not intercepted. Use the standard `async method() { … }` syntax.\n\n## Supported Database Types\n\n- `postgresql` - PostgreSQL using pg (node-postgres) with connection pooling\n- `mysql` - MySQL using mysql2\n- `bun-sql` - BunSQL using Bun's SQL interface\n- `sqlite` - SQLite (coming soon)\n\n## Connection Pool Configuration\n\nPool size is a property of the process, not of the schema - an API serving concurrent requests and a worker draining one\njob at a time can ship from the same image and still want different numbers. `config.pool` describes it once, in\ndriver-agnostic terms, and each adapter translates it into its own driver's vocabulary. Durations are always\nmilliseconds; the adapter converts where the driver counts in seconds.\n\n```typescript\n@Database({\n  type: 'postgresql',\n  config: {\n    host: 'localhost',\n    port: 5432,\n    database: 'myapp',\n    user: 'postgres',\n    password: 'password',\n    pool: {\n      max: Number(process.env.DB_POOL_MAX ?? 20),\n      idleTimeoutMs: 30000,\n      connectTimeoutMs: 2000,\n      maxLifetimeMs: 1800000,\n    },\n    // Anything not modelled above, passed straight to the driver (and applied last)\n    extra: { application_name: 'billing-api' },\n  },\n})\nexport class MyDatabase extends AsenaDatabaseService {}\n```\n\n| `pool` field       | `postgresql` (pg)         | `mysql` (mysql2)  | `bun-sql` (Bun `SQL`)       |\n| ------------------ | ------------------------- | ----------------- | --------------------------- |\n| `max`              | `max` (default 20)        | `connectionLimit` (default 10) | `max` (Bun default 10) |\n| `idleTimeoutMs`    | `idleTimeoutMillis` (default 30000) | `idleTimeout` | `idleTimeout` (seconds)     |\n| `connectTimeoutMs` | `connectionTimeoutMillis` (default 2000) | `connectTimeout` | `connectionTimeout` (seconds) |\n| `maxLifetimeMs`    | `maxLifetimeSeconds`      | not supported by mysql2 | `maxLifetime` (seconds) |\n\nEvery field is optional: leaving one out keeps the default shown above, so adding a `pool` block never changes anything\nyou did not ask it to change.\n\n## Lifecycle\n\nThe database connects in an `@OnStart` hook - after every component is constructed, before the HTTP socket binds - and\nreleases the pool in an `@OnStop` hook when `server.stop()` runs. Nothing else needs to call `disconnect()`; this\nmatters most in test suites, where each file boots its own container and leaked pools accumulate until the database\nrefuses new clients.\n\n## Repository Methods\n\nThe `BaseRepository` provides the following built-in methods:\n\n- `findById(id)` - Find record by ID\n- `findAll(where?)` - Find all records with optional conditions\n- `findOne(where)` - Find single record\n- `findBy(field, value)` - Find all records where `field === value` (shortcut)\n- `create(data)` - Create new record\n- `createMany(data[])` - Create multiple records\n- `updateById(id, data)` - Update record by ID\n- `update(where, data)` - Update records with conditions\n- `updateMany(where, data)` - Alias of `update(where, data)`\n- `deleteById(id)` - Delete record by ID\n- `delete(where)` - Delete records with conditions\n- `deleteMany(where)` - Alias of `delete(where)`\n- `count()` - Count all records\n- `countBy(where)` - Count records with conditions\n- `paginate(page, limit, where?, orderBy?)` - Paginated results; falls back to `asc(table.id)` when `orderBy` is omitted so pages stay deterministic\n- `exists(where)` - Check if record exists\n- `existsBy(field, value)` - Check if a record where `field === value` exists (shortcut)\n- `transaction(callback, options?)` - Run `callback` inside a transaction; opens a savepoint if already inside an active `@Transaction` scope\n\n## Advanced Usage\n\n### Multiple Database Connections\n\n```typescript\n@Database({\n  type: 'postgresql',\n  config: { /* primary db config */ },\n  name: 'PrimaryDB'\n})\nexport class PrimaryDatabase extends AsenaDatabaseService {}\n\n@Database({\n  type: 'mysql',\n  config: { /* analytics db config */ },\n  name: 'AnalyticsDB'\n})\nexport class AnalyticsDatabase extends AsenaDatabaseService {}\n\n@Repository({\n  table: users,\n  databaseService: 'PrimaryDB',\n})\nexport class UserRepository extends BaseRepository<typeof users> {}\n\n@Repository({\n  table: events,\n  databaseService: 'AnalyticsDB',\n})\nexport class EventRepository extends BaseRepository<typeof events> {}\n```\n\n### Connection String Usage\n\n`connectionString` replaces `host`, `port`, `database`, `user` and `password` entirely - leave them out rather than\nblanking them. Every adapter honours it, each under its own driver's key (`connectionString` for `postgresql`, `uri` for\n`mysql`, `url` for `bun-sql`), and none of the five discrete fields is handed to the driver when it is set.\n\n```typescript\n@Database({\n  type: 'postgresql',\n  config: {\n    connectionString: process.env.DATABASE_URL,\n    pool: { max: 50 },\n  },\n})\nexport class DatabaseFromURL extends AsenaDatabaseService {}\n```\n\nMixing the two is not a merge on any of the three drivers, which is why the adapters pick one: pg lets the URL win and\nfills whatever it omits from its own defaults - never from your `port` - while mysql2 does the opposite and ignores the\nURL wherever a discrete field is set. Emitting both would mean a different winner per database type.\n\n`pool`, `ssl` and `extra` are unaffected and still apply. An `ssl` or `sslmode` in the query string wins for\n`postgresql` - pg parses the URL over the rest of the options, so `config.ssl` only decides the cases the URL says\nnothing about. For `mysql` the priority is the other way round: an explicit `ssl: true` beats the URI's own parameter.\nOne asymmetry worth knowing for the same reason: for `postgresql`, `extra: { host: 'x' }` cannot override a connection\nstring either; for `mysql` it can.\n\n## License\n\nMIT\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.","readmeFilename":"README.md"}