{"_id":"@andygo.dev/typeorm-base-repo","_rev":"25-3cdc5cbc03ee38f3a09e63f1ae6af475","name":"@andygo.dev/typeorm-base-repo","dist-tags":{"latest":"4.1.0"},"versions":{"3.0.1":{"name":"@andygo.dev/typeorm-base-repo","version":"3.0.1","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","_id":"@andygo.dev/typeorm-base-repo@3.0.1","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"dist":{"shasum":"d09b9413fe8e18fd0588b672ff060766a2f2f836","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-3.0.1.tgz","fileCount":51,"integrity":"sha512-puQ/aQqPIvYNxyknrItdC7oNBi+Ul0tG9Ox59ImMZ8GUW1nq30fbHgRwlD6NspcivdcJwrrzU0f2Zvzqyd68LQ==","signatures":[{"sig":"MEQCIDrD/Lw5tWUyIE2WtbnZk4NwMX7bbEM64trZvrLnzpxVAiA1tWjaLZqYfJGQJe/HH3BgY2w6TwBlmyHrFrV4+jFSfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120637},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22.15.0"},"gitHead":"ec2f9797a9c8715d406aebb11589373af9003760","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","publish":"npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"_npmVersion":"11.13.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^0.3.30","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^0.3.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm-base-repo_3.0.1_1781017379023_0.4403726160057386","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@andygo.dev/typeorm-base-repo","version":"3.0.2","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","_id":"@andygo.dev/typeorm-base-repo@3.0.2","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"dist":{"shasum":"3d88fdaa5631fd6c8f222c86adf40c791193bca7","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-3.0.2.tgz","fileCount":51,"integrity":"sha512-MU1oL/YcjuEoA1MMIoag6DyaW39q6hmQzk8P8Uf0uZuRyzZEi58dbAl288GLCrhD3limU9w3lgIxQ74OopspUA==","signatures":[{"sig":"MEYCIQDB96puxzGCfJUhoLrLQdNmQvl7zPZTabIkN3fdC+b0JQIhAKns9Dmm2ZPvRllek7tm5idy2l3gwfL+tUoYCf8uOcUL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121035},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22.15.0"},"gitHead":"8eb4a4360181621dc9ba86ce55c57174e93dcfa6","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","publish":"[ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || { echo 'Error: not on main branch'; exit 1; } && [ -z \"$(git status --porcelain)\" ] || { echo 'Error: uncommitted changes'; exit 1; } && [ -z \"$(git log @{u}..HEAD --oneline)\" ] || { echo 'Error: unpushed commits'; exit 1; } && [ -z \"$(git log HEAD..@{u} --oneline)\" ] || { echo 'Error: local main is behind origin/main'; exit 1; } && npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"_npmVersion":"11.13.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^0.3.30","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^0.3.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm-base-repo_3.0.2_1781018190970_0.9835952360100759","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@andygo.dev/typeorm-base-repo","version":"3.0.3","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","_id":"@andygo.dev/typeorm-base-repo@3.0.3","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"dist":{"shasum":"f835777498450a4dafa85af7de81020721766402","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-3.0.3.tgz","fileCount":51,"integrity":"sha512-nDrTP11kloYp2zvUp5tfHkjEdDVIHhkmjhhsfyADXxjIBjELNHJRzt0LRw0P8P/wtRzOoa8dhTKXanZ/djL7OQ==","signatures":[{"sig":"MEQCICRyoAIOO4gXgFZZsLj1/E1FexwbtE42ghfzC0qfHBRQAiAtJgHk4TnyM0LfSvzS4lTTaewtNHavfaqOwHe9Hbmm+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121035},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22.15.0"},"gitHead":"5dd3384b7acac35d6f07b2940d334ac2bb50ae07","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","publish":"[ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || { echo 'Error: not on main branch'; exit 1; } && [ -z \"$(git status --porcelain)\" ] || { echo 'Error: uncommitted changes'; exit 1; } && [ -z \"$(git log @{u}..HEAD --oneline)\" ] || { echo 'Error: unpushed commits'; exit 1; } && [ -z \"$(git log HEAD..@{u} --oneline)\" ] || { echo 'Error: local main is behind origin/main'; exit 1; } && npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"_npmVersion":"11.13.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^0.3.30","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^0.3.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm-base-repo_3.0.3_1781018566240_0.6822229003267357","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"@andygo.dev/typeorm-base-repo","version":"3.0.4","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","_id":"@andygo.dev/typeorm-base-repo@3.0.4","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"dist":{"shasum":"aa47bb4ad5c84ce62fa5eef1e3383926c108bb28","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-3.0.4.tgz","fileCount":51,"integrity":"sha512-QykR3Js2K4DXefKZP2k7zcMkm/Ag2dLemFNc4/jAYBzZ8ChU7LEdpzopJW4x23gz5jP5tvCNIVUqigUcKe7QaQ==","signatures":[{"sig":"MEQCIH5gYcx/P8ewxvIDc9IVBICx6SisJ2S1qYpb2RdsQwNPAiBf3Tji/adsxuCC7L0iddOqUbcna88rygGGkogjhVw4Eg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121035},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22.15.0"},"gitHead":"344e0d8e95bc4f299a958184763020ef9db99461","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","release":"[ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || { echo 'Error: not on main branch'; exit 1; } && [ -z \"$(git status --porcelain)\" ] || { echo 'Error: uncommitted changes'; exit 1; } && [ -z \"$(git log @{u}..HEAD --oneline)\" ] || { echo 'Error: unpushed commits'; exit 1; } && [ -z \"$(git log HEAD..@{u} --oneline)\" ] || { echo 'Error: local main is behind origin/main'; exit 1; } && npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"_npmVersion":"11.13.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^0.3.30","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^0.3.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm-base-repo_3.0.4_1781018824713_0.6035558493939928","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"@andygo.dev/typeorm-base-repo","version":"3.0.5","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","_id":"@andygo.dev/typeorm-base-repo@3.0.5","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"homepage":"https://github.com/andygo-develop/typeorm-base-repo#readme","bugs":{"url":"https://github.com/andygo-develop/typeorm-base-repo/issues"},"dist":{"shasum":"b62b0df008f1bb0d9ff26a9c3d9ab0b50b501c78","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-3.0.5.tgz","fileCount":51,"integrity":"sha512-OCvPp9l65NKk0LlxeEPXfEcrWYowqbsRW+6wj0H5A5kju6MEWIJvcCfxqShdFDxrgdhYyRHMRMWETOKE2+oqaQ==","signatures":[{"sig":"MEYCIQCJCcRpg9hQenvO492sllQz2QPT5soi6LIoF5mNRFBghgIhALhr6p/kpBPw9nzNFSUEl3U0jZSPMyWWrvGZtv+PCbLR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121315},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22.15.0"},"gitHead":"e9825011eb33c745b3fcdcf7622ea57911aa07c0","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","release":"[ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || { echo 'Error: not on main branch'; exit 1; } && [ -z \"$(git status --porcelain)\" ] || { echo 'Error: uncommitted changes'; exit 1; } && [ -z \"$(git log @{u}..HEAD --oneline)\" ] || { echo 'Error: unpushed commits'; exit 1; } && [ -z \"$(git log HEAD..@{u} --oneline)\" ] || { echo 'Error: local main is behind origin/main'; exit 1; } && npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"repository":{"url":"git+https://github.com/andygo-develop/typeorm-base-repo.git","type":"git"},"_npmVersion":"11.17.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^0.3.30","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^0.3.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm-base-repo_3.0.5_1786633696060_0.7824853603057882","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@andygo.dev/typeorm-base-repo","version":"4.0.0","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","_id":"@andygo.dev/typeorm-base-repo@4.0.0","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"homepage":"https://github.com/andygo-develop/typeorm-base-repo#readme","bugs":{"url":"https://github.com/andygo-develop/typeorm-base-repo/issues"},"dist":{"shasum":"647d1a23f932ef4417fa7b56f8c194f1f7ef291e","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-4.0.0.tgz","fileCount":51,"integrity":"sha512-yDUSPRwaJcE6kHvFuYdu6MSkX9Oc0Pj4axa7Xr87Qcr1CUxob/H/h7gx7DKThWXsunehbpVg3+LgdtewIbe60A==","signatures":[{"sig":"MEQCIASeWTQvZz90818jHuVELsiNXLF4ZiUlU/jcEfgwj2X0AiAL2VNXaqr+hBu9+TMQ/WKbiQ6J03HYeP9uLMND/cieDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB2wY+l0SxI0sNUwPoucAbDmeLpfqXiJyeb0TqE0AiqNAiBpxGLehYXZNEspFPPWumucPQcx6kYmXqJWZFxXxA2wIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121774},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22.15.0"},"gitHead":"1825e96e8d55257ed3b9a3f37e4806940a5b6fa5","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","release":"[ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || { echo 'Error: not on main branch'; exit 1; } && [ -z \"$(git status --porcelain)\" ] || { echo 'Error: uncommitted changes'; exit 1; } && [ -z \"$(git log @{u}..HEAD --oneline)\" ] || { echo 'Error: unpushed commits'; exit 1; } && [ -z \"$(git log HEAD..@{u} --oneline)\" ] || { echo 'Error: local main is behind origin/main'; exit 1; } && npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"repository":{"url":"git+https://github.com/andygo-develop/typeorm-base-repo.git","type":"git"},"_npmVersion":"11.17.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^1.1.1","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^1.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/typeorm-base-repo_4.0.0_1789482956105_0.21613603019788608","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"_id":"@andygo.dev/typeorm-base-repo@4.1.0","bugs":{"url":"https://github.com/andygo-develop/typeorm-base-repo/issues"},"dist":{"shasum":"dab497cc622e80909b00b0c8e6891b276d810f16","tarball":"https://registry.npmjs.org/@andygo.dev/typeorm-base-repo/-/typeorm-base-repo-4.1.0.tgz","fileCount":51,"integrity":"sha512-gW+n87zIfJsdv9XZ59nwwKxk19UpPlh/mSk1M5iqEoqn9PT7mMO4hBapXG3rwGEuOOZBt5I5VE+9AT1eXaxKDQ==","signatures":[{"sig":"MEYCIQCEhOtSmB51MswhiY2S+gzD9H3xulGWqa40Z46SibLCDAIhAIoG+usEZTjd3QIuKvVDvlLowe0vLj5ON4v4C47WS/hh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC9S7uEU2KMwONWoSGw3iXgS9qkgC+vsVcxIwd3hsAPAAIhAMr8sVV66ly91CliAk3aFSI/AL044wbYv9WSfSQ0SYSi"}],"unpackedSize":121838},"jest":{"rootDir":".","testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"tsconfig":"tsconfig.test.json","diagnostics":true}]},"testEnvironment":"node","collectCoverageFrom":["src/**/*.ts","!src/index.ts"],"moduleFileExtensions":["ts","js","json"]},"main":"dist/index.js","name":"@andygo.dev/typeorm-base-repo","types":"dist/index.d.ts","author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"engines":{"node":">=22.15.0"},"gitHead":"b463f16dea89c87424d7893ad33981fd5456196e","license":"MIT","scripts":{"lint":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0","test":"jest","build":"tsc -p tsconfig.json","clean":"rm -rf dist","release":"[ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ] || { echo 'Error: not on main branch'; exit 1; } && [ -z \"$(git status --porcelain)\" ] || { echo 'Error: uncommitted changes'; exit 1; } && [ -z \"$(git log @{u}..HEAD --oneline)\" ] || { echo 'Error: unpushed commits'; exit 1; } && [ -z \"$(git log HEAD..@{u} --oneline)\" ] || { echo 'Error: local main is behind origin/main'; exit 1; } && npm publish --access public","lint:fix":"eslint \"{src,tests}/**/*.ts\" --max-warnings=0 --fix","test:cov":"jest --coverage","bump:major":"npm version major --no-git-tag-version","bump:minor":"npm version minor --no-git-tag-version","bump:patch":"npm version patch --no-git-tag-version","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"version":"4.1.0","_npmUser":{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"},"homepage":"https://github.com/andygo-develop/typeorm-base-repo#readme","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"repository":{"url":"git+https://github.com/andygo-develop/typeorm-base-repo.git","type":"git"},"_npmVersion":"11.17.0","description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","directories":{},"maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"_nodeVersion":"24.16.0","dependencies":{"@nestjs/typeorm":"^11.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","eslint":"^9.0.0","sql.js":"^1.10.3","ts-jest":"29.2.5","typeorm":"^1.1.1","typescript":"^5.4.0","@types/jest":"29.5.14","@types/node":"^20.0.0","@nestjs/common":"^11.1.3","reflect-metadata":"^0.2.0","typescript-eslint":"^8.0.0"},"peerDependencies":{"typeorm":"^1.0.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/typeorm-base-repo_4.1.0_1790173953237_0.153173406431375"}}},"time":{"created":"2026-05-26T13:14:25.828Z","modified":"2026-09-23T14:32:33.469Z","0.1.0":"2026-05-26T13:14:26.158Z","0.1.1":"2026-05-26T13:21:53.192Z","0.1.2":"2026-05-26T13:24:57.615Z","0.1.3":"2026-05-26T13:39:12.473Z","1.0.0":"2026-05-27T10:18:18.858Z","3.0.0":"2026-06-05T13:07:38.506Z","1.0.1":"2026-06-05T13:15:33.397Z","1.0.2":"2026-06-09T14:57:23.466Z","1.0.3":"2026-06-09T15:01:11.674Z","3.0.1":"2026-06-09T15:02:59.255Z","3.0.2":"2026-06-09T15:16:31.110Z","3.0.3":"2026-06-09T15:22:46.404Z","3.0.4":"2026-06-09T15:27:04.859Z","3.0.5":"2026-08-13T15:08:16.194Z","4.0.0":"2026-09-15T14:35:56.199Z","4.1.0":"2026-09-23T14:32:33.329Z"},"bugs":{"url":"https://github.com/andygo-develop/typeorm-base-repo/issues"},"author":{"name":"Andy Kramar","email":"andygo.develop@gmail.com"},"license":"MIT","homepage":"https://github.com/andygo-develop/typeorm-base-repo#readme","keywords":["typeorm","repository","nestjs","postgres","cache","keyset-pagination"],"repository":{"url":"git+https://github.com/andygo-develop/typeorm-base-repo.git","type":"git"},"description":"Enhanced TypeORM repository base class with scoping, response caching, keyset pagination, and many-to-many helpers.","maintainers":[{"name":"andygo.dev","email":"andygo.develop+npmjs-andygo-dev@gmail.com"}],"readme":"# @andygo.dev/typeorm-base-repo\n\nAn enhanced TypeORM `Repository` base class with scoping, response caching,\nbatched iteration, sub-query operator, and many-to-many helpers.\n\nOriginally extracted from a NestJS + TypeORM production codebase.\n\n## Install\n\n```bash\nnpm install @andygo.dev/typeorm-base-repo\n```\n\nPeer dependencies:\n\n- `typeorm` `^1.0.0`\n- `@nestjs/common` `^10 || ^11` (used for `NotFoundException`)\n\n`@nestjs/typeorm` is bundled as a runtime dependency and used by the\n`RepositoryFor` mixin — no extra install needed.\n\nRequires Node `>= 22.15` (uses `node:util.diff`).\n\n## Quick start\n\nYour entities must satisfy the `IDbEntity` brand. The simplest way is to extend\n`BaseMethodsEntity`, which provides the brand, an `id` / `deletedAt` pair, an\n`extraSelect` static, plus `clone()`, `duplicate()` and `merge()` helpers — see\nthe runnable example at [`src/examples/entities/user.entity.ts`](src/examples/entities/user.entity.ts):\n\n```ts\nimport { Column, CreateDateColumn, Entity } from 'typeorm';\nimport { BaseMethodsEntity } from '@andygo.dev/typeorm-base-repo';\n\n@Entity()\nexport class UserEntity extends BaseMethodsEntity {\n  @Column()\n  email: string;\n\n  @Column({ default: 0 })\n  age: number;\n\n  @CreateDateColumn()\n  createdAt: Date;\n}\n```\n\nOr implement `IDbEntity` directly if you'd rather not pull in the base class:\n\n```ts\nimport { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\nimport { IDbEntity } from '@andygo.dev/typeorm-base-repo';\n\n@Entity()\nexport class User implements IDbEntity {\n  __interfaceName: 'IDbEntity';\n\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column()\n  email: string;\n}\n```\n\n### Create a Nest repository (recommended)\n\nFor a NestJS app, use the `RepositoryFor` mixin. One line gives you a fully\nDI-wired repository class — see [`src/examples/repositories/users.repository.ts`](src/examples/repositories/users.repository.ts):\n\n```ts\n// users.repository.ts\nimport { Injectable } from '@nestjs/common';\nimport { RepositoryFor } from '@andygo.dev/typeorm-base-repo';\n\nimport { UserEntity } from '../entities/user.entity';\n\n@Injectable()\nexport class UsersRepository extends RepositoryFor(UserEntity) {\n  get seniors() {\n    return this.createScopedBy({ age: MoreThan(60) });\n  }\n}\n```\n\nRegister it in your module the usual way:\n\n```ts\n// users.module.ts\nimport { Module } from '@nestjs/common';\nimport { TypeOrmModule } from '@nestjs/typeorm';\n\nimport { UserEntity } from './entities/user.entity';\nimport { UsersRepository } from './repositories/users.repository';\n\n@Module({\n  imports: [TypeOrmModule.forFeature([UserEntity])],\n  providers: [UsersRepository],\n  exports: [UsersRepository],\n})\nexport class UsersModule {}\n```\n\nThen inject and use it — it has the full set of `RepositoryFor` features:\n\n```ts\n// users.service.ts\nimport { Injectable } from '@nestjs/common';\n\nimport { UsersRepository } from './repositories/users.repository';\n\n@Injectable()\nexport class UsersService {\n  constructor(private readonly users: UsersRepository) {}\n\n  listActive() {\n    const { seniors } = this.users;\n\n    return seniors\n      .find({ take: 50, order: { createdAt: 'DESC' } });\n  }\n\n  async getOrFail(id: number) {\n    return this.users.findOneByOrFail({ id }, { notFoundErrorMessage: 'USER_NOT_FOUND' });\n  }\n}\n```\n\nAdd domain-specific scopes or methods directly inside the subclass body:\n\n```ts\n@Injectable()\nexport class UsersRepository extends RepositoryFor(UserEntity) {\n  get verified(): this {\n    return this.createScoped({ where: { emailVerifiedAt: Not(IsNull()) } });\n  }\n\n  findByEmail(email: string) {\n    return this.findOneBy({ email });\n  }\n}\n```\n\n### Or construct manually (no Nest DI required)\n\n`RepositoryFor(Entity, alias?, scopeOptions?)` returns a class whose\nconstructor takes a plain TypeORM `Repository`, so you can `new` it directly\nwhen you're outside a Nest DI container:\n\n```ts\nimport { DataSource } from 'typeorm';\nimport { RepositoryFor } from '@andygo.dev/typeorm-base-repo';\n\nconst dataSource = new DataSource({ /* ... */ });\nawait dataSource.initialize();\n\n// Second arg is the SQL alias ('u' here); third is seed scope options.\nconst UserRepoCtor = RepositoryFor(UserEntity, 'u');\nconst userRepo = new UserRepoCtor(dataSource.getRepository(UserEntity));\n\n// Find with scoped options\nconst users = await userRepo.find({ where: { email: 'x@y.z' } });\n\n// Batch pagination\nfor await (const batch of userRepo.findBatchGenerator({}, 500)) {\n  // ...\n}\n\n// Soft-deleted entities\nconst allIncludingArchived = await userRepo.withArchived.find();\nconst archivedOnly = await userRepo.archivedOnly.find();\n```\n\n## Features\n\n- **Scope chaining** — `withArchived`, `archivedOnly`, `withoutVirtual`, plus\n  arbitrary `createScoped()` / `createScopedBy()`.\n- **Response caching** — opt-in TTL-based cache keyed off the SQL when no `id`\n  given. Per-relation caching is configured independently.\n- **Streaming & batching** — `stream`, `findGenerator`, `findBatchGenerator`.\n- **Sub-query operator** — `InSubQuery(repo)` produces a `WHERE id IN (...)`\n  operator suitable for combining with `find`.\n- **M2M helpers** — `setManyToManyItems`, `attachManyToManyItems`,\n  `deattachManyToManyItems`, plus one-to-many counterparts.\n- **`findOneOrFail`** — throws `NotFoundException` with optional custom message,\n  otherwise TypeORM's `EntityNotFoundError`.\n\n## Runnable examples in `src/examples/`\n\nThe repository ships a minimal Nest-flavoured demo under\n[`src/examples/`](src/examples/):\n\n| File | Demonstrates |\n|---|---|\n| [`entities/user.entity.ts`](src/examples/entities/user.entity.ts) | Entity extending `BaseMethodsEntity` |\n| [`repositories/users.repository.ts`](src/examples/repositories/users.repository.ts) | One-line repository class using the `RepositoryFor` mixin |\n\nThe patterns from those files are also covered in the worked examples below\n(notably **#1** for the entity and **#6** for the repository).\n\n## Complex examples\n\n### 1. Building a reusable scope chain\n\n`createScoped` / `createScopedBy` return a new repo instance with the scope\napplied. Chains compose — each call layers on top of the previous one — and the\noriginal repo is left untouched.\n\n```ts\nconst activeRecentlyEngaged = userRepo\n  .createScopedBy({ status: 'active' })\n  .createScoped({\n    where: { lastLoginAt: MoreThan(thirtyDaysAgo) },\n    order: { lastLoginAt: 'DESC' },\n  });\n\n// Reusable: the same chain can be queried multiple ways without rebuilding.\nconst list  = await activeRecentlyEngaged.find({ take: 50 });\nconst count = await activeRecentlyEngaged.count();\nconst exists = await activeRecentlyEngaged.exists({ where: { email: 'x@y.z' } });\n\n// withArchived/archivedOnly compose too\nconst archivedActive = await userRepo.archivedOnly\n  .createScopedBy({ status: 'active' })\n  .find();\n```\n\n### 2. Response cache with per-relation TTLs\n\nThe query result cache supports a stable `id` plus a TTL per query. Relations\ncan be cached on their own schedule via `responseCache.relations`, which is\nuseful when a parent record changes far less often than its children.\n\n```ts\n// Cache the parent for 60s and the relations on their own schedules.\nconst profile = await userRepo.findOneOrFail({\n  where: { id: 42 },\n  relations: { posts: true, tags: true },\n  responseCache: {\n    id: `user:${42}:profile`,\n    ttl: 60_000,\n    relations: {\n      posts: { id: `user:${42}:posts`, ttl: 30_000 },\n      tags:  { ttl: 5 * 60_000 },\n    },\n  },\n});\n\n// findAndCount auto-suffixes the cache id so the count and the page\n// share the prefix but get distinct cache entries.\nconst [page, total] = await userRepo.findAndCount({\n  take: 20,\n  skip: 0,\n  responseCache: { id: 'users:page-1', ttl: 10_000 },\n});\n// cache entries are stored under: 'users:page-1#find' and 'users:page-1#count'\n```\n\n### 3. Filtering with a correlated sub-query (`InSubQuery`)\n\n`InSubQuery` builds a `WHERE <col> IN (<sub-select>)` operator from any scoped\nrepo. It rewrites parameter names so it can be nested inside another query\nwithout collisions.\n\n```ts\nimport { InSubQuery } from '@andygo.dev/typeorm-base-repo';\n\n// Find users who have at least one post with > 1000 views\nconst popularAuthorIds = postRepo\n  .createScopedBy({ views: MoreThan(1000) })\n  .select({ user: { id: true } });   // sub-query selects post.userId\n\nconst popularAuthors = await userRepo.findBy({\n  id: InSubQuery(popularAuthorIds, { select: { user: { id: true } } as any }),\n});\n\n// deleteBy uses the same trick under the hood:\n//   DELETE FROM \"user\" WHERE id IN (SELECT id FROM \"user\" WHERE ...)\nawait userRepo.deleteBy({ status: 'pending', createdAt: LessThan(cutoff) });\n```\n\n### 4. Batched iteration over large result sets\n\n`findBatchGenerator` paginates a query into fixed-size arrays so you can stream\nthrough a large result without holding the whole set in memory. It accepts any\n`TFindOptions` (`where`, `relations`, `order`, …) and preserves them across\npages. `findGenerator` is the per-entity variant — same options, but yields one\nrow at a time rather than batches.\n\n```ts\nasync function rebuildSearchIndex() {\n  let processed = 0;\n\n  for await (const batch of userRepo.findBatchGenerator(\n    { where: { status: 'active' }, relations: { tags: true } },\n    1_000,\n  )) {\n    await searchClient.bulkUpsert(batch.map(toIndexDocument));\n    processed += batch.length;\n    logger.info(`indexed ${processed} users`);\n  }\n}\n```\n\n### 5. Joined queries with safe pagination (`wrapWithSubquery`)\n\nThe classic TypeORM problem: `find` with joins + `take`/`skip` paginates by\n*joined rows*, not parent rows. Setting `wrapWithSubquery: true` rewrites the\nquery as `WHERE id IN (SELECT id FROM ... LIMIT N OFFSET M)` so pagination\noperates on the parent entity.\n\n```ts\nconst page = await userRepo.find({\n  relations: { posts: true, tags: true },\n  order: { createdAt: 'DESC' },\n  take: 20,\n  skip: 40,\n  wrapWithSubquery: true,   // <- parent-level pagination\n});\n```\n\n### 6. Domain-specific repository with `RepositoryFor`\n\n`RepositoryFor(entityClass, alias?, scopeOptions?)` is a class-mixin factory\nthat wires up `@InjectRepository(entityClass)` for you and returns a base\nclass. The optional second and third arguments bake a SQL alias and seed\nscope options into every instance, so the subclass itself stays\nconstructor-free. Subclass the result and add project-specific scopes inside\nthe body — see [`src/examples/repositories/users.repository.ts`](src/examples/repositories/users.repository.ts):\n\n```ts\nimport { Injectable } from '@nestjs/common';\nimport { RepositoryFor } from '@andygo.dev/typeorm-base-repo';\n\nimport { UserEntity } from '../entities/user.entity';\n\n//                                              alias ─┐\n@Injectable()\nexport class UsersRepository extends RepositoryFor(UserEntity, 'u') {\n  // Reusable domain scope\n  get verified(): this {\n    return this.createScoped({ where: { emailVerifiedAt: Not(IsNull()) } });\n  }\n\n  // Returns a new repo; safe to chain with find/count/etc.\n  withRecentActivity(since: Date): this {\n    return this.createScopedBy({ lastLoginAt: MoreThan(since) });\n  }\n\n  async findOrFailByEmail(email: string): Promise<UserEntity> {\n    return this.findOneByOrFail(\n      { email },\n      { notFoundErrorMessage: `USER_${email}_NOT_FOUND` },\n    );\n  }\n}\n```\n\n`UsersRepository` is now a fully-featured repository for `UserEntity` — scope\nchains, caching, `findOneOrFail`, M2M helpers, all of it.\n\nWire it into a module the usual Nest way:\n\n```ts\n// users.module.ts\nimport { Module } from '@nestjs/common';\nimport { TypeOrmModule } from '@nestjs/typeorm';\n\nimport { UserEntity } from './entities/user.entity';\nimport { UsersRepository } from './repositories/users.repository';\nimport { UserService } from './user.service';\n\n@Module({\n  imports: [TypeOrmModule.forFeature([UserEntity])],\n  providers: [UsersRepository, UserService],\n  exports: [UsersRepository],\n})\nexport class UsersModule {}\n```\n\nThen inject and use it — chain the domain scopes you defined above:\n\n```ts\nconst activeVerified = await this.users.verified\n  .withRecentActivity(thirtyDaysAgo)\n  .find({ take: 100 });\n```\n\nIf you'd rather wire things up manually (no Nest DI), `new` the factory's\nreturn value directly with a plain TypeORM `Repository`:\n\n```ts\nconst UserRepoCtor = RepositoryFor(UserEntity, 'u');\nconst userRepo = new UserRepoCtor(dataSource.getRepository(UserEntity));\n```\n\n### 7. Many-to-many synchronisation patterns\n\n`setManyToManyItems` replaces the entire set in a single transaction, which is\nthe common shape for PATCH-style endpoints (`{ tagIds: [1,4,7] }`). For\nincremental adds, `attachManyToManyItems` is idempotent via `OR IGNORE` so it's\nsafe to call with overlap.\n\n```ts\n// Replace all tags atomically\nawait userRepo.setManyToManyItems(user, newTags, 'tags');\n\n// Add a single tag without checking; duplicates are silently skipped\nawait userRepo.attachManyToManyItems(user, [premiumTag], 'tags');\n\n// Remove a subset\nawait userRepo.deattachManyToManyItems(user, [trialTag], 'tags');\n\n// O2M counterparts manipulate the FK on the child rows instead\nawait postRepo.attachOneToMany(user, [orphanPost], 'posts');\nawait postRepo.deattachOneToMany(user, [orphanPost], 'posts');\n```\n\n### 8. `mergeDeep` for JSONB-style updates\n\n`mergeDeep` performs a structural deep merge that respects TypeORM's tracking,\nso subsequent `save()` only writes columns that actually changed. Combine with\n`mergeJsonb` when the column itself is a JSONB blob and you want to merge a\npatch into it.\n\n```ts\nconst user = await userRepo.findOneByOrFail({ id: 42 });\n\nuserRepo.mergeDeep(user, {\n  email: 'new@example.com',\n  preferences: { theme: 'dark' }, // existing keys preserved, theme overwritten\n});\n\nuserRepo.mergeJsonb(user.preferences, {\n  notifications: { email: true, push: false },\n});\n\nawait userRepo.save(user);\n```\n\n### 9. Streaming with batched side effects\n\n`findBatchGenerator` yields arrays; pair it with `Promise.all` (or a bounded\nqueue) when each row needs an async side effect, so you're not making one\nround-trip per row.\n\n```ts\nfor await (const batch of userRepo.findBatchGenerator({ where: { needsSync: true } }, 200)) {\n  await Promise.all(batch.map(syncToHubspot));\n  await userRepo.save(batch.map((u) => ({ ...u, needsSync: false })));\n}\n```\n\n## API surface\n\nTop-level exports:\n\n- `RepositoryFor(entityClass, alias?, scopeOptions?)` — main entry point.\n  A class-mixin factory that returns a fully-featured repository class with\n  Nest's `@InjectRepository` pre-wired. Subclass the result to add domain\n  methods, or `new` it directly with a TypeORM `Repository` when outside Nest.\n- `BaseMethodsEntity` — opinionated base entity that satisfies `IDbEntity` and\n  adds `clone()`, `duplicate()`, `merge()`, and FK-handling helpers.\n- `IDbEntity` — branding interface for entities (if you'd rather not extend\n  `BaseMethodsEntity`).\n- `InSubQuery` — operator factory.\n- `mergeDeepObjectsOnly` — deep merge utility used by `mergeDeep`.\n- Types: `TFindOptions`, `TCreateScopedOptions`, `TOrFailOptions`,\n  `TRepository`, `TResponseCache`, `TResponseCacheOptions`,\n  `TResponseCacheRelations`, `TResponseCacheRelationsProperty`,\n  `TEntityKeys`, `TEntityProperties`, `TEntityProperty`, `DeepKeys`.\n\n## Upgrading to 4.0 (TypeORM 1.x)\n\n`4.0.0` requires `typeorm@^1.0.0`. Run TypeORM's own codemod for your\napplication code first:\n\n```bash\nnpx @typeorm/codemod v1 src/\n```\n\nOne method was removed from `BaseRepository`:\n\n- **`loadRelationCountAndMap()`** — TypeORM 1.0 deleted the underlying\n  `SelectQueryBuilder.loadRelationCountAndMap()` and the `@RelationCount`\n  decorator, so the wrapper had nothing left to call. Declare the count as a\n  `@VirtualColumn` and list it in `static extraSelect`, and this package will\n  select it on every `find()` automatically:\n\n```ts\n@Entity()\nexport class User extends BaseMethodsEntity {\n  @VirtualColumn({\n    query: (alias) => `SELECT COUNT(*) FROM post WHERE post.\"userId\" = ${alias}.id`,\n  })\n  postsCount: number;\n\n  static extraSelect = { postsCount: true };\n}\n```\n\nUse the `withoutVirtual` scope to skip these columns on queries that don't need\nthem.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}